From bceb1c3f513dde420163f5cc219b0da52c27cc27 Mon Sep 17 00:00:00 2001
From: Tue Herlau <tuhe@dtu.dk>
Date: Sat, 18 Sep 2021 19:56:48 +0200
Subject: [PATCH] Bugfixes

---
 README.md                                     |  13 +-
 .../cs108/Report2_handin_38_of_38.token       | 249 ++++++++++++
 .../example_devel/instructor/cs108/deploy.py  |  19 +
 .../instructor/cs108/homework1.py             |  41 ++
 .../instructor/cs108/report2_grade.py         |   3 +
 .../instructor/cs108/report_devel.py          |  33 ++
 .../instructor/cs108/report_devel_grade.py    |   3 +
 .../instructor/cs108/unitgrade_data/Numpy.pkl | Bin 0 -> 439 bytes
 .../cs108/unitgrade_data/Question2.pkl        | Bin 0 -> 390 bytes
 .../instructor/cs108/unitgrade_data/Week1.pkl | Bin 0 -> 724 bytes
 .../cs108/unitgrade_data/Week1Titles.pkl      | Bin 0 -> 776 bytes
 .../instructor/output}/homework1.py           |   7 +-
 .../instructor/output/report2.py              |  41 ++
 .../instructor/output/report2_b.py            |  21 ++
 .../instructor/output/report2_c.py            |  16 +
 .../instructor/output/report_devel.py         |  26 ++
 .../example_devel/students/cs108/homework1.py |  47 +++
 .../students/cs108/report2_grade.py           |   3 +
 .../students/cs108/report_devel.py            |  33 ++
 .../students/cs108/report_devel_grade.py      |   3 +
 .../students/cs108/unitgrade_data/Numpy.pkl   | Bin 0 -> 439 bytes
 .../cs108/unitgrade_data/Question2.pkl        | Bin 0 -> 390 bytes
 .../students/cs108/unitgrade_data/Week1.pkl   | Bin 0 -> 724 bytes
 .../cs108/unitgrade_data/Week1Titles.pkl      | Bin 0 -> 776 bytes
 dist/unitgrade-devel-0.0.1.tar.gz             | Bin 17133 -> 0 bytes
 dist/unitgrade_devel-0.0.1-py3-none-any.whl   | Bin 18848 -> 0 bytes
 .../home/cs103/Report3_handin_5_of_10.token   | Bin 37420 -> 49849 bytes
 .../unitgrade-docker/home/cs103/report3.py    |   3 +-
 .../home/cs103/report3_complete_grade.py      |   4 +-
 .../home/cs103/report3_grade.py               |   4 +-
 docs/legacy/cs202courseware/ug2report1.py     |   4 +-
 .../cs202courseware/ug2report1_nohidden.py    |   7 +-
 docs/snips/report3.py                         |   3 +-
 docs/snips/report3_complete.py                |   3 +-
 examples/02631/instructor/week5/.coverage     | Bin 53248 -> 0 bytes
 .../week5/Report1Flat_handin_40_of_40.token   | Bin 77467 -> 0 bytes
 .../__pycache__/report1intro.cpython-38.pyc   | Bin 7195 -> 7148 bytes
 examples/02631/instructor/week5/deploy.py     |   4 +-
 .../02631/instructor/week5/report1intro.py    |   3 +-
 .../instructor/week5/report1intro_grade.py    | 342 +----------------
 .../Bacteria.pkl                              | Bin 2050 -> 2008 bytes
 .../ClusterAnalysis.pkl                       | Bin
 .../FermentationRate.pkl                      | Bin
 .../RemoveIncomplete.pkl                      | Bin 1919 -> 1444 bytes
 examples/02631/students/week5/.coverage       | Bin 53248 -> 0 bytes
 .../week5/__pycache__/looping.cpython-38.pyc  | Bin 2019 -> 0 bytes
 .../__pycache__/report1intro.cpython-38.pyc   | Bin 7195 -> 0 bytes
 examples/02631/students/week5/looping.py      |   2 +-
 examples/02631/students/week5/report1intro.py |   9 +-
 .../students/week5/report1intro_grade.py      | 341 +----------------
 .../Bacteria.pkl                              | Bin 2050 -> 2008 bytes
 .../ClusterAnalysis.pkl                       | Bin
 .../FermentationRate.pkl                      | Bin
 .../RemoveIncomplete.pkl                      | Bin 1919 -> 1444 bytes
 examples/autolab_example/readme.md            |   8 +
 .../example_docker/instructor/cs103/.coverage | Bin 53248 -> 0 bytes
 .../cs103/Report3_handin_10_of_10.token       | Bin 1840 -> 0 bytes
 .../cs103/__pycache__/report3.cpython-38.pyc  | Bin 917 -> 945 bytes
 .../report3_complete.cpython-38.pyc           | Bin 1097 -> 1125 bytes
 .../example_docker/instructor/cs103/deploy.py |  15 +-
 .../instructor/cs103/report3.py               |   3 +-
 .../instructor/cs103/report3_complete.py      |   3 +-
 .../cs103/report3_complete_grade.py           |   4 +-
 .../instructor/cs103/report3_grade.py         |   4 +-
 .../cs103/unitgrade/AutomaticPass.pkl         |   1 -
 .../instructor/cs103/unitgrade/Week1.pkl      | Bin 96 -> 0 bytes
 .../cs103/unitgrade_data/AutomaticPass.pkl    | Bin 0 -> 123 bytes
 .../instructor/output/report3.py              |   3 +-
 .../cs103/Report3_handin_10_of_10.token       | Bin 19550 -> 27345 bytes
 .../__pycache__/homework1.cpython-38.pyc      | Bin 833 -> 0 bytes
 .../__pycache__/homework1.cpython-39.pyc      | Bin 833 -> 0 bytes
 .../cs103/__pycache__/report3.cpython-38.pyc  | Bin 917 -> 0 bytes
 .../cs103/__pycache__/report3.cpython-39.pyc  | Bin 1053 -> 0 bytes
 .../report3_complete.cpython-38.pyc           | Bin 1097 -> 0 bytes
 .../report3_complete.cpython-39.pyc           | Bin 1764 -> 0 bytes
 .../report3_complete_grade.cpython-38.pyc     | Bin 64058 -> 0 bytes
 .../report3_complete_grade.cpython-39.pyc     | Bin 57973 -> 0 bytes
 .../__pycache__/report3_grade.cpython-38.pyc  | Bin 50128 -> 23229 bytes
 .../example_docker/students/cs103/report3.py  |   3 +-
 .../students/cs103/report3_grade.py           |   4 +-
 .../cs103/unitgrade/AutomaticPass.pkl         |   1 -
 .../students/cs103/unitgrade/Week1.pkl        | Bin 96 -> 0 bytes
 .../cs103/unitgrade_data/AutomaticPass.pkl    | Bin 0 -> 123 bytes
 .../__pycache__/homework1.cpython-38.pyc      | Bin 835 -> 835 bytes
 .../__pycache__/report1flat.cpython-38.pyc    | Bin 1193 -> 1191 bytes
 .../instructor/cs101flat/deploy.py            |   3 +-
 .../instructor/cs101flat/report1flat_grade.py | 352 +----------------
 .../instructor/output/homework1.py}           |   7 +-
 .../__pycache__/deploy.cpython-38.pyc         | Bin 581 -> 0 bytes
 .../__pycache__/homework1.cpython-38.pyc      | Bin 874 -> 0 bytes
 .../__pycache__/report1flat.cpython-38.pyc    | Bin 1204 -> 0 bytes
 .../students/cs101flat/homework1.py           |  18 +-
 .../students/cs101flat/report1flat.py         |  14 +-
 .../students/cs101flat/report1flat_grade.py   | 354 +-----------------
 .../cs102/Report2_handin_18_of_18.token       | 290 +++++++-------
 .../cs102/__pycache__/report2.cpython-38.pyc  | Bin 2951 -> 2951 bytes
 .../instructor/cs102/report2.py               |   4 +-
 .../instructor/cs102/report2_grade.py         |   4 +-
 .../instructor/cs102/unitgrade_data/Week1.pkl | Bin 101 -> 403 bytes
 .../cs102/unitgrade_data/Week1Titles.pkl      | Bin 173 -> 470 bytes
 .../instructor/output/report2.py              |   2 +-
 .../cs102/Report2_handin_18_of_18.token       | 252 +++++++++++++
 .../cs102/Report2_handin_3_of_18.token        | 249 ++++++++++++
 .../students/cs102/homework1.py               |  17 +-
 .../students/cs102/report2.py                 |   4 +-
 .../students/cs102/report2_grade.py           |   4 +-
 .../students/cs102/unitgrade_data/Week1.pkl   | Bin 101 -> 403 bytes
 .../cs102/unitgrade_data/Week1Titles.pkl      | Bin 173 -> 470 bytes
 examples/example_in_progress/in_progress.py   |   5 +-
 .../instructor/cs105/.coverage                | Bin 53248 -> 0 bytes
 .../cs105/__pycache__/report5.cpython-38.pyc  | Bin 2281 -> 2295 bytes
 .../instructor/cs105/deploy.py                |   2 +-
 .../instructor/cs105/report5.py               |   2 +-
 .../instructor/cs105/report5_grade.py         | 342 +----------------
 .../cs105/unitgrade_data/Question2.pkl        | Bin 0 -> 113 bytes
 .../instructor/cs105/unitgrade_data/Week1.pkl | Bin 0 -> 148 bytes
 .../example_jupyter/students/cs105/.coverage  | Bin 53248 -> 0 bytes
 .../__pycache__/homework1.cpython-38.pyc      | Bin 187 -> 0 bytes
 .../cs105/__pycache__/report5.cpython-38.pyc  | Bin 2281 -> 0 bytes
 .../cs105/__pycache__/week2.cpython-38.pyc    | Bin 466 -> 0 bytes
 .../example_jupyter/students/cs105/report5.py |   2 +-
 .../students/cs105/report5_grade.py           | 341 +----------------
 .../cs105/unitgrade_data/Question2.pkl        | Bin 0 -> 113 bytes
 .../students/cs105/unitgrade_data/Week1.pkl   | Bin 0 -> 148 bytes
 examples/example_moss/report/index.html       |  14 +-
 examples/example_moss/report/match0-0.html    |  32 +-
 examples/example_moss/report/match0-1.html    |  31 +-
 examples/example_moss/report/match0-top.html  |  14 +-
 examples/example_moss/report/match1-0.html    |  92 +++--
 examples/example_moss/report/match1-1.html    |  95 +++--
 examples/example_moss/report/match1-top.html  |  10 +-
 examples/example_moss/report/match1.html      |   2 +-
 examples/example_moss/report/match10-0.html   |  14 +
 examples/example_moss/report/match10-1.html   |  14 +
 examples/example_moss/report/match10-top.html |   9 +
 examples/example_moss/report/match10.html     |   3 +
 examples/example_moss/report/match11-0.html   |  14 +
 examples/example_moss/report/match11-1.html   |  14 +
 examples/example_moss/report/match11-top.html |   9 +
 examples/example_moss/report/match11.html     |   3 +
 examples/example_moss/report/match2-0.html    |  77 ++++
 examples/example_moss/report/match2-1.html    |  77 ++++
 examples/example_moss/report/match2-top.html  |   9 +
 examples/example_moss/report/match2.html      |   2 +-
 examples/example_moss/report/match3-0.html    |  28 ++
 examples/example_moss/report/match3-1.html    |  28 ++
 examples/example_moss/report/match3-top.html  |   9 +
 examples/example_moss/report/match3.html      |   3 +
 examples/example_moss/report/match4-0.html    |  28 ++
 examples/example_moss/report/match4-1.html    |  28 ++
 examples/example_moss/report/match4-top.html  |   9 +
 examples/example_moss/report/match4.html      |   3 +
 examples/example_moss/report/match5-0.html    |  28 ++
 examples/example_moss/report/match5-1.html    |  28 ++
 examples/example_moss/report/match5-top.html  |   9 +
 examples/example_moss/report/match5.html      |   3 +
 examples/example_moss/report/match6-0.html    |  19 +
 examples/example_moss/report/match6-1.html    |  19 +
 examples/example_moss/report/match6-top.html  |   9 +
 examples/example_moss/report/match6.html      |   3 +
 examples/example_moss/report/match7-0.html    |  19 +
 examples/example_moss/report/match7-1.html    |  19 +
 examples/example_moss/report/match7-top.html  |   9 +
 examples/example_moss/report/match7.html      |   3 +
 examples/example_moss/report/match8-0.html    |  19 +
 examples/example_moss/report/match8-1.html    |  19 +
 examples/example_moss/report/match8-top.html  |   9 +
 examples/example_moss/report/match8.html      |   3 +
 examples/example_moss/report/match9-0.html    |  14 +
 examples/example_moss/report/match9-1.html    |  14 +
 examples/example_moss/report/match9-top.html  |   9 +
 examples/example_moss/report/match9.html      |   3 +
 examples/example_moss/report/report.html      |  14 +-
 .../s1001/Report1Flat_handin_0_of_10.token    | Bin 65457 -> 0 bytes
 .../report1flat_grade.py                      | 351 -----------------
 .../s1001/Report2_handin_18_of_18.token       | 246 ++++++++++++
 .../cs102/homework1.py                        |  16 +
 .../cs102/report2.py                          |  65 ++++
 .../cs102/report2_grade.py                    |   3 +
 .../s1002/Report1Flat_handin_5_of_10.token    | Bin 65552 -> 0 bytes
 .../report1flat.py                            |  27 --
 .../report1flat_grade.py                      | 351 -----------------
 .../s1002/Report2_handin_18_of_18.token       | 252 +++++++++++++
 .../cs102/homework1.py                        |  21 ++
 .../cs102/report2.py                          |  65 ++++
 .../cs102/report2_grade.py                    |   3 +
 .../s1003/Report1Flat_handin_5_of_10.token    | Bin 65475 -> 0 bytes
 .../Report1Flat_handin_5_of_10_0/homework1.py |  24 --
 .../report1flat.py                            |  27 --
 .../report1flat_grade.py                      | 351 -----------------
 .../s1003/Report2_handin_18_of_18.token       | 252 +++++++++++++
 .../cs102/homework1.py                        |  21 ++
 .../cs102/report2.py                          |  65 ++++
 .../cs102/report2_grade.py                    |   3 +
 .../homework1.py => tmp/base/0_homework1.py}  |  15 +-
 .../example_moss/tmp/base/0_report1flat.py    |  27 --
 examples/example_moss/tmp/base/1_report2.py   |  65 ++++
 examples/example_moss/tmp/base/2_deploy.py    |   8 -
 .../example_moss/tmp/base/2_report2_grade.py  |   3 +
 .../example_moss/tmp/base/4_report1flat.py    |  21 --
 .../tmp/base/5_report1flat_grade.py           | 349 -----------------
 .../tmp/submissions/s1001/0_homework1.py      |  17 +-
 .../tmp/submissions/s1002/0_homework1.py      |  26 +-
 .../tmp/submissions/s1003/0_homework1.py      |  23 +-
 .../Report1Flat_handin_10_of_10.token         | Bin 65512 -> 0 bytes
 .../Report1Flat_handin_10_of_10_0/deploy.py   |   8 -
 .../report1flat.py                            |  21 --
 .../report1flat_grade.py                      | 349 -----------------
 .../whitelist/Report2_handin_3_of_18.token    | 249 ++++++++++++
 .../cs102}/homework1.py                       |   7 +-
 .../Report2_handin_3_of_18_0/cs102/report2.py |  65 ++++
 .../cs102/report2_grade.py                    |   3 +
 .../example_moss/whitelist/report1flat.py     |  27 --
 .../example_moss/whitelist/report1flat2.py    |  27 --
 setup.py                                      |   2 +-
 src/unitgrade_devel.egg-info/PKG-INFO         |  49 +--
 src/unitgrade_devel.egg-info/requires.txt     |   2 +
 src/unitgrade_private/__init__.py             |  10 +-
 src/unitgrade_private/deployment.py           |  14 +-
 src/unitgrade_private/docker_helpers.py       |  22 +-
 src/unitgrade_private/hidden_create_files.py  |  63 +---
 src/unitgrade_private/hidden_gather_upload.py |  22 +-
 src/unitgrade_private/plagiarism/mossit.py    |  12 +-
 src/unitgrade_private/token_loader.py         |  33 +-
 src/unitgrade_private/version.py              |   2 +-
 225 files changed, 3648 insertions(+), 4583 deletions(-)
 create mode 100644 devel/example_devel/instructor/cs108/Report2_handin_38_of_38.token
 create mode 100644 devel/example_devel/instructor/cs108/deploy.py
 create mode 100644 devel/example_devel/instructor/cs108/homework1.py
 create mode 100644 devel/example_devel/instructor/cs108/report2_grade.py
 create mode 100644 devel/example_devel/instructor/cs108/report_devel.py
 create mode 100644 devel/example_devel/instructor/cs108/report_devel_grade.py
 create mode 100644 devel/example_devel/instructor/cs108/unitgrade_data/Numpy.pkl
 create mode 100644 devel/example_devel/instructor/cs108/unitgrade_data/Question2.pkl
 create mode 100644 devel/example_devel/instructor/cs108/unitgrade_data/Week1.pkl
 create mode 100644 devel/example_devel/instructor/cs108/unitgrade_data/Week1Titles.pkl
 rename {examples/example_moss/whitelist/Report1Flat_handin_10_of_10_0 => devel/example_devel/instructor/output}/homework1.py (74%)
 create mode 100644 devel/example_devel/instructor/output/report2.py
 create mode 100644 devel/example_devel/instructor/output/report2_b.py
 create mode 100644 devel/example_devel/instructor/output/report2_c.py
 create mode 100644 devel/example_devel/instructor/output/report_devel.py
 create mode 100644 devel/example_devel/students/cs108/homework1.py
 create mode 100644 devel/example_devel/students/cs108/report2_grade.py
 create mode 100644 devel/example_devel/students/cs108/report_devel.py
 create mode 100644 devel/example_devel/students/cs108/report_devel_grade.py
 create mode 100644 devel/example_devel/students/cs108/unitgrade_data/Numpy.pkl
 create mode 100644 devel/example_devel/students/cs108/unitgrade_data/Question2.pkl
 create mode 100644 devel/example_devel/students/cs108/unitgrade_data/Week1.pkl
 create mode 100644 devel/example_devel/students/cs108/unitgrade_data/Week1Titles.pkl
 delete mode 100644 dist/unitgrade-devel-0.0.1.tar.gz
 delete mode 100644 dist/unitgrade_devel-0.0.1-py3-none-any.whl
 delete mode 100644 examples/02631/instructor/week5/.coverage
 delete mode 100644 examples/02631/instructor/week5/Report1Flat_handin_40_of_40.token
 rename examples/02631/instructor/week5/{unitgrade => unitgrade_data}/Bacteria.pkl (71%)
 rename examples/02631/instructor/week5/{unitgrade => unitgrade_data}/ClusterAnalysis.pkl (100%)
 rename examples/02631/instructor/week5/{unitgrade => unitgrade_data}/FermentationRate.pkl (100%)
 rename examples/02631/instructor/week5/{unitgrade => unitgrade_data}/RemoveIncomplete.pkl (52%)
 delete mode 100644 examples/02631/students/week5/.coverage
 delete mode 100644 examples/02631/students/week5/__pycache__/looping.cpython-38.pyc
 delete mode 100644 examples/02631/students/week5/__pycache__/report1intro.cpython-38.pyc
 rename examples/02631/students/week5/{unitgrade => unitgrade_data}/Bacteria.pkl (71%)
 rename examples/02631/students/week5/{unitgrade => unitgrade_data}/ClusterAnalysis.pkl (100%)
 rename examples/02631/students/week5/{unitgrade => unitgrade_data}/FermentationRate.pkl (100%)
 rename examples/02631/students/week5/{unitgrade => unitgrade_data}/RemoveIncomplete.pkl (52%)
 create mode 100644 examples/autolab_example/readme.md
 delete mode 100644 examples/example_docker/instructor/cs103/.coverage
 delete mode 100644 examples/example_docker/instructor/cs103/Report3_handin_10_of_10.token
 delete mode 100644 examples/example_docker/instructor/cs103/unitgrade/AutomaticPass.pkl
 delete mode 100644 examples/example_docker/instructor/cs103/unitgrade/Week1.pkl
 create mode 100644 examples/example_docker/instructor/cs103/unitgrade_data/AutomaticPass.pkl
 delete mode 100644 examples/example_docker/students/cs103/__pycache__/homework1.cpython-38.pyc
 delete mode 100644 examples/example_docker/students/cs103/__pycache__/homework1.cpython-39.pyc
 delete mode 100644 examples/example_docker/students/cs103/__pycache__/report3.cpython-38.pyc
 delete mode 100644 examples/example_docker/students/cs103/__pycache__/report3.cpython-39.pyc
 delete mode 100644 examples/example_docker/students/cs103/__pycache__/report3_complete.cpython-38.pyc
 delete mode 100644 examples/example_docker/students/cs103/__pycache__/report3_complete.cpython-39.pyc
 delete mode 100644 examples/example_docker/students/cs103/__pycache__/report3_complete_grade.cpython-38.pyc
 delete mode 100644 examples/example_docker/students/cs103/__pycache__/report3_complete_grade.cpython-39.pyc
 delete mode 100644 examples/example_docker/students/cs103/unitgrade/AutomaticPass.pkl
 delete mode 100644 examples/example_docker/students/cs103/unitgrade/Week1.pkl
 create mode 100644 examples/example_docker/students/cs103/unitgrade_data/AutomaticPass.pkl
 rename examples/{example_moss/tmp/base/3_homework1.py => example_flat/instructor/output/homework1.py} (74%)
 delete mode 100644 examples/example_flat/students/cs101flat/__pycache__/deploy.cpython-38.pyc
 delete mode 100644 examples/example_flat/students/cs101flat/__pycache__/homework1.cpython-38.pyc
 delete mode 100644 examples/example_flat/students/cs101flat/__pycache__/report1flat.cpython-38.pyc
 create mode 100644 examples/example_framework/students/cs102/Report2_handin_18_of_18.token
 create mode 100644 examples/example_framework/students/cs102/Report2_handin_3_of_18.token
 delete mode 100644 examples/example_jupyter/instructor/cs105/.coverage
 create mode 100644 examples/example_jupyter/instructor/cs105/unitgrade_data/Question2.pkl
 create mode 100644 examples/example_jupyter/instructor/cs105/unitgrade_data/Week1.pkl
 delete mode 100644 examples/example_jupyter/students/cs105/.coverage
 delete mode 100644 examples/example_jupyter/students/cs105/__pycache__/homework1.cpython-38.pyc
 delete mode 100644 examples/example_jupyter/students/cs105/__pycache__/report5.cpython-38.pyc
 delete mode 100644 examples/example_jupyter/students/cs105/__pycache__/week2.cpython-38.pyc
 create mode 100644 examples/example_jupyter/students/cs105/unitgrade_data/Question2.pkl
 create mode 100644 examples/example_jupyter/students/cs105/unitgrade_data/Week1.pkl
 create mode 100644 examples/example_moss/report/match10-0.html
 create mode 100644 examples/example_moss/report/match10-1.html
 create mode 100644 examples/example_moss/report/match10-top.html
 create mode 100644 examples/example_moss/report/match10.html
 create mode 100644 examples/example_moss/report/match11-0.html
 create mode 100644 examples/example_moss/report/match11-1.html
 create mode 100644 examples/example_moss/report/match11-top.html
 create mode 100644 examples/example_moss/report/match11.html
 create mode 100644 examples/example_moss/report/match2-0.html
 create mode 100644 examples/example_moss/report/match2-1.html
 create mode 100644 examples/example_moss/report/match2-top.html
 create mode 100644 examples/example_moss/report/match3-0.html
 create mode 100644 examples/example_moss/report/match3-1.html
 create mode 100644 examples/example_moss/report/match3-top.html
 create mode 100644 examples/example_moss/report/match3.html
 create mode 100644 examples/example_moss/report/match4-0.html
 create mode 100644 examples/example_moss/report/match4-1.html
 create mode 100644 examples/example_moss/report/match4-top.html
 create mode 100644 examples/example_moss/report/match4.html
 create mode 100644 examples/example_moss/report/match5-0.html
 create mode 100644 examples/example_moss/report/match5-1.html
 create mode 100644 examples/example_moss/report/match5-top.html
 create mode 100644 examples/example_moss/report/match5.html
 create mode 100644 examples/example_moss/report/match6-0.html
 create mode 100644 examples/example_moss/report/match6-1.html
 create mode 100644 examples/example_moss/report/match6-top.html
 create mode 100644 examples/example_moss/report/match6.html
 create mode 100644 examples/example_moss/report/match7-0.html
 create mode 100644 examples/example_moss/report/match7-1.html
 create mode 100644 examples/example_moss/report/match7-top.html
 create mode 100644 examples/example_moss/report/match7.html
 create mode 100644 examples/example_moss/report/match8-0.html
 create mode 100644 examples/example_moss/report/match8-1.html
 create mode 100644 examples/example_moss/report/match8-top.html
 create mode 100644 examples/example_moss/report/match8.html
 create mode 100644 examples/example_moss/report/match9-0.html
 create mode 100644 examples/example_moss/report/match9-1.html
 create mode 100644 examples/example_moss/report/match9-top.html
 create mode 100644 examples/example_moss/report/match9.html
 delete mode 100644 examples/example_moss/student_submissions/s1001/Report1Flat_handin_0_of_10.token
 delete mode 100644 examples/example_moss/student_submissions/s1001/Report1Flat_handin_0_of_10_0/report1flat_grade.py
 create mode 100644 examples/example_moss/student_submissions/s1001/Report2_handin_18_of_18.token
 create mode 100644 examples/example_moss/student_submissions/s1001/Report2_handin_18_of_18_0/cs102/homework1.py
 create mode 100644 examples/example_moss/student_submissions/s1001/Report2_handin_18_of_18_0/cs102/report2.py
 create mode 100644 examples/example_moss/student_submissions/s1001/Report2_handin_18_of_18_0/cs102/report2_grade.py
 delete mode 100644 examples/example_moss/student_submissions/s1002/Report1Flat_handin_5_of_10.token
 delete mode 100644 examples/example_moss/student_submissions/s1002/Report1Flat_handin_5_of_10_0/report1flat.py
 delete mode 100644 examples/example_moss/student_submissions/s1002/Report1Flat_handin_5_of_10_0/report1flat_grade.py
 create mode 100644 examples/example_moss/student_submissions/s1002/Report2_handin_18_of_18.token
 create mode 100644 examples/example_moss/student_submissions/s1002/Report2_handin_18_of_18_0/cs102/homework1.py
 create mode 100644 examples/example_moss/student_submissions/s1002/Report2_handin_18_of_18_0/cs102/report2.py
 create mode 100644 examples/example_moss/student_submissions/s1002/Report2_handin_18_of_18_0/cs102/report2_grade.py
 delete mode 100644 examples/example_moss/student_submissions/s1003/Report1Flat_handin_5_of_10.token
 delete mode 100644 examples/example_moss/student_submissions/s1003/Report1Flat_handin_5_of_10_0/homework1.py
 delete mode 100644 examples/example_moss/student_submissions/s1003/Report1Flat_handin_5_of_10_0/report1flat.py
 delete mode 100644 examples/example_moss/student_submissions/s1003/Report1Flat_handin_5_of_10_0/report1flat_grade.py
 create mode 100644 examples/example_moss/student_submissions/s1003/Report2_handin_18_of_18.token
 create mode 100644 examples/example_moss/student_submissions/s1003/Report2_handin_18_of_18_0/cs102/homework1.py
 create mode 100644 examples/example_moss/student_submissions/s1003/Report2_handin_18_of_18_0/cs102/report2.py
 create mode 100644 examples/example_moss/student_submissions/s1003/Report2_handin_18_of_18_0/cs102/report2_grade.py
 rename examples/example_moss/{student_submissions/s1002/Report1Flat_handin_5_of_10_0/homework1.py => tmp/base/0_homework1.py} (56%)
 delete mode 100644 examples/example_moss/tmp/base/0_report1flat.py
 create mode 100644 examples/example_moss/tmp/base/1_report2.py
 delete mode 100644 examples/example_moss/tmp/base/2_deploy.py
 create mode 100644 examples/example_moss/tmp/base/2_report2_grade.py
 delete mode 100644 examples/example_moss/tmp/base/4_report1flat.py
 delete mode 100644 examples/example_moss/tmp/base/5_report1flat_grade.py
 delete mode 100644 examples/example_moss/whitelist/Report1Flat_handin_10_of_10.token
 delete mode 100644 examples/example_moss/whitelist/Report1Flat_handin_10_of_10_0/deploy.py
 delete mode 100644 examples/example_moss/whitelist/Report1Flat_handin_10_of_10_0/report1flat.py
 delete mode 100644 examples/example_moss/whitelist/Report1Flat_handin_10_of_10_0/report1flat_grade.py
 create mode 100644 examples/example_moss/whitelist/Report2_handin_3_of_18.token
 rename examples/example_moss/{student_submissions/s1001/Report1Flat_handin_0_of_10_0 => whitelist/Report2_handin_3_of_18_0/cs102}/homework1.py (71%)
 create mode 100644 examples/example_moss/whitelist/Report2_handin_3_of_18_0/cs102/report2.py
 create mode 100644 examples/example_moss/whitelist/Report2_handin_3_of_18_0/cs102/report2_grade.py
 delete mode 100644 examples/example_moss/whitelist/report1flat.py
 delete mode 100644 examples/example_moss/whitelist/report1flat2.py

diff --git a/README.md b/README.md
index 31ef559..1c76cc6 100644
--- a/README.md
+++ b/README.md
@@ -270,13 +270,16 @@ Finally, notice how one of the tests has a return value. This will be automatica
 ## Example 3: Hidden and secure tests
 To use `unitgrade` as part of automatic grading, it is recommended you check the students output locally and use hidden tests. Fortunately, this is very easy.
 
-Let's start with the hidden tests. As usual we write a complete report script (`report3_complete.py`), but this time we use the `@hide`-decorator to mark tests as hidden: 
+Let's start with the hidden tests. As usual we write a complete report script (`report3_complete.py`), but this time we use the `@hide`-decorator to mark tests as hidden:
+
 ```python
 # example_docker/instructor/cs103/report3_complete.py
-from unitgrade import UTestCase, Report, hide 
+from unitgrade import UTestCase, Report
+from unitgrade.utils import hide
 from unitgrade import evaluate_report_student
 import cs103
 
+
 class AutomaticPass(UTestCase):
     def test_automatic_pass(self):
         self.assertEqual(2, 2)  # For simplicity, this test will always pass
@@ -285,6 +288,7 @@ class AutomaticPass(UTestCase):
     def test_hidden_fail(self):
         self.assertEqual(2, 3)  # For simplicity, this test will always fail.
 
+
 class Report3(Report):
     title = "CS 101 Report 3"
     questions = [(AutomaticPass, 10)]  # Include a single question for 10 credits.
@@ -306,12 +310,15 @@ if __name__ == "__main__":
     snip_dir("./", student_directory, exclude=['__pycache__', '*.token', 'deploy.py', 'report3_complete*.py', '.*']) 
 ```
 Just to check, let's have a quick look at the students report script `report3.py`:
+
 ```python
 # example_docker/instructor/cs103/report3.py
-from unitgrade import UTestCase, Report, hide 
+from unitgrade import UTestCase, Report
+from unitgrade.utils import hide
 from unitgrade import evaluate_report_student
 import cs103
 
+
 class AutomaticPass(UTestCase):
     def test_automatic_pass(self):
         self.assertEqual(2, 2)  # For simplicity, this test will always pass
diff --git a/devel/example_devel/instructor/cs108/Report2_handin_38_of_38.token b/devel/example_devel/instructor/cs108/Report2_handin_38_of_38.token
new file mode 100644
index 0000000..d0e33b2
--- /dev/null
+++ b/devel/example_devel/instructor/cs108/Report2_handin_38_of_38.token
@@ -0,0 +1,249 @@
+# This file contains your results. Do not edit its content. Simply upload it as it is. 
+### Content of cs102\deploy.py ###
+
+from cs102.report2 import Report2
+from unitgrade_private.hidden_create_files import setup_grade_file_report
+from snipper.snip_dir import snip_dir
+
+if __name__ == "__main__":
+    setup_grade_file_report(Report2)
+    snip_dir("./", "../../students/cs102", clean_destination_dir=True, exclude=['*.token', 'deploy.py'])
+
+
+### Content of cs102\homework1.py ###
+
+def reverse_list(mylist): #!f #!s;keeptags
+    """
+    Given a list 'mylist' returns a list consisting of the same elements in reverse order. E.g.
+    reverse_list([1,2,3]) should return [3,2,1] (as a list).
+    """
+    return list(reversed(mylist))
+
+def add(a,b): #!f
+    """ Given two numbers `a` and `b` this function should simply return their sum:
+    > add(a,b) = a+b """
+    return a+b
+
+if __name__ == "__main__":
+    # Example usage:
+    print(f"Your result of 2 + 2 = {add(2,2)}")
+    print(f"Reversing a small list", reverse_list([2,3,5,7])) #!s
+
+
+### Content of cs102\report2.py ###
+
+from unitgrade.framework import Report, cache
+from unitgrade.evaluate import evaluate_report_student
+from cs102.homework1 import add, reverse_list
+from unitgrade import UTestCase #!s
+
+class Week1(UTestCase):
+    def test_add(self):
+        self.assertEqualC(add(2,2))
+        self.assertEqualC(add(-100, 5))
+
+    def test_reverse(self):
+        self.assertEqualC(reverse_list([1, 2, 3])) #!s
+
+    def test_output_capture(self):
+        with self.capture() as out:
+            print("hello world 42")                     # Genereate some output (i.e. in a homework script)
+        self.assertEqual(out.numbers[0], 42)            # out.numbers is a list of all numbers generated
+        self.assertEqual(out.output, "hello world 42")  # you can also access the raw output.
+
+class Week1Titles(UTestCase): #!s=b
+    """ The same problem as before with nicer titles """
+    def test_add(self):
+        """ Test the addition method add(a,b) """
+        self.assertEqualC(add(2,2))
+        self.assertEqualC(add(-100, 5))
+
+    def test_reverse(self):
+        ls = [1, 2, 3]
+        reverse = reverse_list(ls)
+        self.assertEqualC(reverse)
+        # Although the title is set after the test potentially fails, it will *always* show correctly for the student.
+        self.title = f"Checking if reverse_list({ls}) = {reverse}"  # Programmatically set the title #!s
+
+    def ex_test_output_capture(self):
+        with self.capture() as out:
+            print("hello world 42")                     # Genereate some output (i.e. in a homework script)
+        self.assertEqual(out.numbers[0], 42)            # out.numbers is a list of all numbers generated
+        self.assertEqual(out.output, "hello world 42")  # you can also access the raw output.
+
+
+class Question2(UTestCase): #!s=c
+    @cache
+    def my_reversal(self, ls):
+        # The '@cache' decorator ensures the function is not run on the *students* computer
+        # Instead the code is run on the teachers computer and the result is passed on with the
+        # other pre-computed results -- i.e. this function will run regardless of how the student happens to have
+        # implemented reverse_list.
+        return reverse_list(ls)
+
+    def test_reverse_tricky(self):
+        ls = (2,4,8)
+        ls2 = self.my_reversal(tuple(ls))                   # This will always produce the right result, [8, 4, 2]
+        print("The correct answer is supposed to be", ls2)  # Show students the correct answer
+        self.assertEqualC(reverse_list(ls))                 # This will actually test the students code.
+        return "Buy world!"                                 # This value will be stored in the .token file  #!s=c
+
+
+import cs102
+class Report2(Report):
+    title = "CS 101 Report 2"
+    questions = [(Week1, 10), (Week1Titles, 8)]
+    pack_imports = [cs102]
+
+if __name__ == "__main__":
+    evaluate_report_student(Report2(), unmute=True)
+---------------------------------------------------------------------- ..ooO0Ooo.. ----------------------------------------------------------------------
+41cf41393a14ea9a555597ad42fa7a922dbd6f3e1cf303d2ce3b3e56481b389490846ff847743732c3b3664b91565acc0471175bd2952c0f992541833eaafe73 26440
+---------------------------------------------------------------------- ..ooO0Ooo.. ----------------------------------------------------------------------
+.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.
\ No newline at end of file
diff --git a/devel/example_devel/instructor/cs108/deploy.py b/devel/example_devel/instructor/cs108/deploy.py
new file mode 100644
index 0000000..da92995
--- /dev/null
+++ b/devel/example_devel/instructor/cs108/deploy.py
@@ -0,0 +1,19 @@
+from cs108.report_devel import Report2
+from unitgrade_private.hidden_create_files import setup_grade_file_report
+from snipper.snip_dir import snip_dir
+
+if __name__ == "__main__":
+    # import pickle
+    # with open("unitgrade_data/Week1.pkl", 'rb') as f:
+    #     rs = pickle.load(f)
+    #
+    # r = Report2()
+    # q = r.questions[0][0]()
+    # for k,v in rs.items():
+    #     print(k, v)
+    # from unitgrade_private import load_token
+    # data, txt = load_token("Report2_handin_38_of_38.token")
+
+    # print(data['details'][1]['items'] )
+    setup_grade_file_report(Report2, with_coverage=True)
+    snip_dir("./", "../../students/cs108", clean_destination_dir=True, exclude=['*.token', 'deploy.py'])
diff --git a/devel/example_devel/instructor/cs108/homework1.py b/devel/example_devel/instructor/cs108/homework1.py
new file mode 100644
index 0000000..9991f74
--- /dev/null
+++ b/devel/example_devel/instructor/cs108/homework1.py
@@ -0,0 +1,41 @@
+import numpy as np
+
+
+
+def reverse_list(mylist): #!f
+    """
+    Given a list 'mylist' returns a list consisting of the same elements in reverse order. E.g.
+    reverse_list([1,2,3]) should return [3,2,1] (as a list).
+    """
+    z = 23234
+    return list(reversed(mylist))
+
+def add(a,b): #!f
+    """ Given two numbers `a` and `b` this function should simply return their sum:
+    > add(a,b) = a+b
+    Hints:
+        * Remember basic arithmetics!
+    """
+    x = 234
+    return a+b
+
+
+def foo(): #!f
+    """ Comment. """
+    bar()
+
+def bar(): #!f
+    return -1
+
+def linear_regression_weights(X, y): #!f
+    weights = np.linalg.solve(X.T @ X, X.T @ y)
+    return weights
+
+def linear_predict(X, w): #!f
+    y = X @ w
+    return y
+
+
+if __name__ == "__main__":
+    print(f"Your result of 2 + 2 = {add(2,2)}")
+    print(f"Reversing a small list", reverse_list([2,3,5,7]))
diff --git a/devel/example_devel/instructor/cs108/report2_grade.py b/devel/example_devel/instructor/cs108/report2_grade.py
new file mode 100644
index 0000000..4cdff0e
--- /dev/null
+++ b/devel/example_devel/instructor/cs108/report2_grade.py
@@ -0,0 +1,3 @@
+''' WARNING: Modifying, decompiling or otherwise tampering with this script, it's data or the resulting .token file will be investigated as a cheating attempt. '''
+import bz2, base64
+exec(bz2.decompress(base64.b64decode('QlpoOTFBWSZTWffiGIgAS4t/gH725FZ7/////+///v////5gWj73vV5576e+74U6qL29e9tmuujlRRBKJ7Yj2aCkHewb2+5zYa+p6OtrC+gwFAfY0UoF897e7by9MnXs3A1QGS+fe91nYer7733vXbDdl97na4d9le7wZmue3z33129ve1bu3Itbe7oco2ZlasbfBMO+6698ACle2DNe5nzpb722Pe8oQWfcs6jlL7O7vGLzenc17eRt9973vhza67Prx549311vbpJD6xx3HLZlFPruzZX3vFOXa2fFJ9xbS8+Eh9NO7y28zPm117mt8Ke6zJu9Tzy1fdup7Pp69PRpavrN955CU0QgATQCaBJ6E9JtE0NGSntUepo00AA0Gg0AAAlNAhBAgUwk8kZU/TJQ9NTynpGnqaPUyeoaeUAaaAAAAJTEU0mpoFMpo2iaaekxB6TTaQyAYmTIPUAaAaDTIACTSiCRoyE0m0p7RT000p4TTIJg1GI0yNBkMQaABpoGgiRIgBBpkIAaJgFTJ6o9T8pNpoZGT1DT1NDQmhkYQPSCQoTSZNJpkAJiYU9NTFT2mqfqm/VR6aZQ9IDTQepoAB6gAHFQ9xERA+qoUCSKL+sggKeyCkZIQPpwPWKioqoqf2ev0uMrP2M/V/pnAfAj3lfHQj270kfF0/rLEKxc/hfLMnv/BCxXzEF8paEyQmR3/2a3n/f2fAvRx1zpzPM03WlLjfplsQMtDVEW07kN7avaUlwr1z4scd6yQWrT4/Tkjm9QMt3dHfZyvSMzx4dmlQpRa9EbQ50RuhyGTlLCcyrH4Qf9nwJTj7v9rsUCX+XF89k9nCcRT/Gc6Tk7pZr5K6VnZWwTHlroY6DZIAGAP966qtpMFFQO1RX4MRZAkEkVkUZFkECBAX8QlMJBkn8UG0RBv/zBpOAyEgWCABa0JBEkhuw22Qcm2GhJzJ9LyHwPZbJ073MHCbzbQK5I6WaxPoSgUFUEBVlkbEEVPusKDEVgKQWAqhMWwj/v5P+ufA3n4+YvTyPg7/16bbMWVn4Q/eXhu6BQw9vG+Qns8LCSOpY8RPNc3ucbPhaGxGtObOoiW6SjblOeMmtlEBO2kohsNejQ9WVPKTmdcdl6VSGyNHC7tV4PwNpVQoHAx/ItljCzhn8H/fs/+7f2EVU4Q+Qjl5bjbJ7oDe2U/yxckVf6zaf5sInwbZnde8mPJHqT7/Z09UL/t260XA3tQxfacDxc9lXOD3QnplFcvTVt8V0nbAi0VsmdqhDpsfRBdMqrf/zuiEz+vG2yD6Xejh7a7jr3CJlwSD5vAa4T21XNrmr6Bg0DCMnWTt73R+HAH4YSsX2LMugmEOlIUXRKHhy1WgicnLkU9FhzqyNsiPr7++V4mhqPX2zPF2mC4Md/lX26qz/rzd0eb531l5iMnc13dcDun+5zNuUdWq+kHWLjWI2YpMeqYu+amm3UnFROrGVVt9MZt9S8S98/sqL9LMc9CmtlsArl/nyI4mp0ciXntx3zHniauD2X38Vd5fPDbC9ff1nyuG280/Aqzv028/98MjMvnLFRW5FNnKcGNONLKb5ltekJdc7+lKU/GlGKSN7mfWO1sfzT8PYm26Gn9+lXhV69MmMZxJfOvdsYWsRluu0NDemXzKMvtmI6IXWMGrLmTC3lOSp80bL71vDUlCd30usZR5Z3vKbD71umofo8FSbFXoUiuA3s/ceMfN9vmIMSmaFBWO5QrLyUcGQa8ClOsOIGOAYVLKyaPvaa/Dk3zvDUvXF/0cDObshDJO+xXFSCEuLeATqIkTpCdNMVMLQkUlyL9aGdGHWaDU/dGfMk6wYNSRCRBrP+vGuDOUflFTkQMkCOy9B+i1iw37N26S4pg8s84x6nCo47XfQ5hAD0a9M+0ijMCEwFqBsPbZ773QjQoaJg0t3+dnQFvTn0kDKGWHak31A9uvx/F7ycQZCcVIIsl/y5bzYlftx1aslphQzHKlAhIVpCrsX/vte516wgucwj603nHc0n3byQm/6BboLQqtHyNJid0ttzms6kcBMwioR+BBf47wcYgxYc8/1SlmTocsjbhR7N4sbra1v3vZ9jYTS1DuvyVvoa+/A+X4qfIyfm4RbKETYtILMcXvo99CsrMiUbbr8fFV7rrqq1wdKNRUcOv+V0t9mHG+6kqBu3mmut7aYj5/BTOdSMbVLcROnwm6I8Hgxwdpm1zlwdssAlicdL6hmD5B/fc8sTG1yELG6c31c9c7X3cwZ4LizIt5fxhoQS1tI/trLULY9ezDfAXaXPLfsekOPV8n9JV+iLMcxUBFOu0N28xnua70af0qCFZ6Bzu+0TpFxYGJczZwsuASKEhwgycql1mribwLCuDIiu0vZPXRUyaPMQOHJlmbiuS8FHHO58/LqdDqZNBJgK3904uFHAIyYMGCmDtJ7iGkRuf/INISJAqsrlJ5PWbDUo47I0Za4fgYZRiCpRaj2bDHlPODsFGIcf3yRv3H8DinFeJ6/GtxISFrix+WLkWVFQt5fjY67J1VlpwuxtMi4xKkWukgZJJtU0qZJ6h6EmRTEwwpq1iCq2re8Iw7bsDDk+maK8wWKtZSPX5TDBZZ8ddXZIQo9wnhoE26DGAeqgddj475LLLfbcNqqYwEoryz1/V08bfOzc8190TRS+bSyd2KjcPrtPRBVcZcy7kIo9jkEr+sn98pFMK+xryMpn3NYTPw+N2A5gHQXsMC+ZJNeV/qGWfnNk6H5HpR1rB190YWU77SHKnaTdQQOu5NOCZtkw7bUHnxttzjaZmZmhz9EH5wr0igSh/TBuyp02/8MRERj25x7ROVaY2gw7sumqNHm6MwR8sEZXncQjE4NsI+e9VijGqY+vYvBR51eRqdvTKiLiEEfZ/Bm07v99cLGSM/jdh4mGbFEk0Hw6Zfv8CDsY3j8RDfbvRztR130bXXR9R8ByzyESaffSnq3P54TKRZRiyNsb7C0jKJywqOrg5Z6d+neX7wwL8zabCC9A049x77KY7DaWNXR3ucjxRSXliVW8eFSXDQKULC+e8nAwyYWwj7JkmTYhkezVEi7y5QhClDdKNS0LzeVObk31oFAaXnXPRjqnlwvv6PfG0tKbLgMdNz8zN2kTKkwpw055GRnb2RIuZhNI3BcffydvSejFBD5mhuRch7pKSHaQEDhynslsntHsR6FeNzHH5Tbk44osNBvyICsmTJCnxMHKwKNczsIhlJfk5idiiGPwg/vI/mWE03GDXc58tA12Y9tk86FjbDJm5SNaONdtjt7MBl5W1q5eAUQ3Y4cQgJ7S8fr0trY0xMSozBVK1sm0VQdFqOp2ODI2OL3bZbECuOSq4PqKMmb1E93HcRvvgvEHN5DAJhDFUIxQ4eOFBFHY9JDHkYgjHXliTCSZok2Wx0o0Nnn6DmOJh6P15H0oJFg4sMJz2zGyo7CpPK66+Eoa4U+ZmUy1g5KRZaD3amWBijHEoSopZOkpk3rC64iyQ9XDDIMjtEWYWluEiQHkXzwtmZZW2pJOW0E5S2bFBHZO2Vwq6xFoRmp5RY7VnlIZENhE7AREAKfsiX3hRbW/c68L1LyLqdI0jr8NL47cB7LAjAsoEmy30EdZn8wjB0tHqbPRmaKVvRLqoTJo1d2LE50m9eE+vZhx6czlaNysHNtbY483eOu/UjGsb0wSZ7QvLaR3UxXJT/k296jfx6TVPoO3nHBrq4rdGh3UkcCdiojcMI2wfW58KB9B4POdcAvZvozZ5Y921eFvT4K2PIsiBxwwxiTBBjmJc37Yr3bbP5x2BTth3PP7pYPPa1xOOs2QmBweVbw503arjsHGqh+vbpu2MXc54edYUj0WsalRngHy4s5TgjQHeq4dIMi2UFQSElMoTC7K/B0O2t63jGm9Ti89qm8e/OSinNjDdJpt6I8Emw5z7bbGOh3463uwtI41R8h6Qbc5WCWPwFRwtlYS+OEtTnswOa2Ut75OZUp1CpVXXLlbGVw/Bar8ZjrN0yk+RfiLiGPnmV1vX1tWWmQnnYYt4yJ8zUqC8QgICpuaFfVqKGtN+XzTx80HMrwEwGvDjL8EZ9g32e+RtK+7PkWbenZZpt3RDepffX6D59XYHL4IUJusEfamkJvU487EJio9z8289MbqtCTWLpwoORaA1/H+JF9h3mgctNWCaqNeehaMVoNTcPGRaghCARjaQ665DYZECmF5fZ878I4ThRa9qjV3iKuESOJWhbjzE3XWnkW6HvHsrph+h1VPraxParMsYlppoZq1UlZJR8sohWVdkoVVz/UuyvWq+oplR591dL0rltpnBZ3h84ONnIdupECwDzBazYyOEYbR163Npzr+ay4MdKyA4fj21/hbjzsrl6YspljLDGqk9lvK7msrppmk72vSqvNOjgEPHPVITJMETJBThh68e+pmAVFq2zYtkMCiVHeqE2CR7v4WS/cJTmiULTlUhJCnUuEd9DXg7sZa5wfQt22Xvw255el7LlWjf+m3PIz7sMDF0YKBNvum7qyWsewlRxMF1OwpKYYmBY2y6tzDB+bnBZPjGqhKGtQr8bXLlmHD+V/OJMprpKYVUY/LttkX+38/6P6tzV4DsNdwo/lljPUycxVhKw7+am25dqP3qtWKXV3cJvtPeVqhCqNsPLDgH/CFMXkAekM9g9D3NiGFP2mZQev3+j8v/5fRt95Mvn8MZiHVEKy4WJoitXr/AjcwDjsfhz9Q4Hd973+CIqqqrDmwOjo34FenXUVE7RlEFVVUhptZJshttphDHLstxQyLPgVFCfDGSvQrXCttltlW2MQqxgVUqFWMlYKFf2WkJIAlXPc8PBInQbujmSlRwEgvB7NaLKMpNOdDQEmiAxJOvSuS5deY0FHfOpOhMFJn5NmhiCv2R39Yfm7e6if+8xvan9bxIYRG69lMb3TFtKs8uSYZGdMMKwujbHT9SGSUvJcPnh1UqZiuH3ULVXBRb4wr8PJgu5n9mKgfDsk1W2Mq6fD6t2usJJYl35+AYLJH4MVCkbtrrrRa1Z78PPaUlRfHGTStMLciBDgTZNpJE3z+0MGrHowfUETseW+DqZHw1YlkTVPDiUwf1igRJ4Jm8oRUwzQukIb22lXKVuHmYlbqQwLon7FId952h3dtpdPkzeh6z8PhtCzesqbnUjiMYadKAcLWWQS7rxWq7MiMBsEHUmIEP1bDi/iFB0LSI4uDHh/iV+OuNWrsLgRUxoZ8jIsMLBVmBUR+YRgFzI+bSF32mbsOzcLJQhFOC6Df3NgliYM6yAPTOpkRZlNO5Yx97dCKhImIzOrc1lpVUREZShpIn2xAauohkfQdk3xT0524+HbmydbxkhOaiypjeWpu66XfWcy1+iPi7pp2plnER8txO0Qs+sx2x0xottoIDBGqjFE7wPgovo5JB6kGfQXu14Wz29NJCD7hx2Ry+KJ/xffj+KjttmK3eqmEcqO7+JcjOkJehd3ncVvZZ2T4eFIFsXXD75PilKSs3rJUVUX0qWLOP1TCxvdLR/yzxyrq1+lNJqOOnTWND5SxmfYSshEv2c44zNZdovpWG+VthWqdN9kPMwOBDkG6dYK7OUuqsOGvKLseqw0uMcd6d0rEOmJrEX0iySjTmdsrSfcv41dK5+nlvYeksGXOrNomh+crSRUborre94Op+ze95jxslgurKsuUrFWVu01D4XyflP+SXiiu4m2so144ZPbrrdZXo+wt7JmoRkV1E0bkkEDs7OEEvRE0zpCP5OTEnyLI859N3pjwJvI9hwQeDEUmjs7G2vTaBSSk6XVHzwl9mpPsT+zrv2jXFQ2xjUMRt8Ho5eq1XKpPz9eJFvzaSrpGZbZRvkUMamSGQ7ORMzmmI7oeUkOORGTMlcUPpaJpe2n7XEXiYb3TV1ym46bwbfKG41twIIND+XDa/b61jV+Unb13h0R13d9U+2pMUvwQ6X4Xxfb2uEncn1smOSnk65+r4axs1YzE7Edvg9Vbjm+XPSnKVp4+Pz6zrptqcpyshI68bY2crzivSvQt2t8JGlpeZnXKCj0nh3j3x6fTsQcpIfj4bqR51zNrdKn4vx31Wl5qfk9ei44crjftmj08X8qrZbdr2mzf636T6LWa4fy2xB7lgVeH67KHdECf7d4Xtvcbquq3uvpeRYxFJ1Lnrgh7J3fgRcp89X222vAsxM3D+XtN17sZ5fWfTibNtexsjKBTrzkfKJSgh3SEgjXr7QWfZ3aM6P3zx0gBJpK6kA312qCxBIFpJJSDagYNJmwIEmsTNlA4hj3RX1Tz+LEWl84kgMd65cPh2lwdYOO6Q/RtHYRMEqAa+a0vKqyjoxpKCVTj81IUhx3JXOq5laG70dGqQbllfe/dftV0j88TPDQ4n6cuO3T/lOtSvk3nRJPtxDcls6aKqqXGnzwSm5WzZ3eaRE86maVJPxClYTxu9PKqn011YTfaHTDTFmOnofd22nHMqIZbkjT93fvmvVx2y46ddOXJN57NArVBuRJ7ORGyJSBOx2W2qyYh5wcr+kY0lfXN/bbHjSl07rJ1JeQ9NS4w3Tx31GwEW30IYxlMwCWOEPOx5ktLGlS5U5XbrppYz8ntGFXz0yE15PHK6svXjdye0ENcxDkdkK8UQSyB0yZjY2wZkRw414rn1VF1Y++N5fIrJS64xkZ/06VmlRfc4+zcXzrr7uSnnKvlXddnP3nci8Qql4eaG0uuL26O5s76+bN7Ol2XOzbx5EaM9SS3K4M+6WlBI/pH4V65YOnGGrG5AbnKuwkJ+2jSbdwXddIsRnU4WoaEWt15V6irnrp2WNebOMN009IelMN+jEPGLxCBvsdvIRLzCEJNcbiR8LiTbk5pw9RxKwONVQVI65jZkBUIttOX1q1SUdV5BMdl43xJH2PjBfVIiSj4wRB5JuLXXxcngeQ0Mu63DS0oesTNeWXHIUtp8x4+BQeIHPd7gxNtwYCYBMLFhpO2QZw8iBSSFlHDbEcaHth3K8olS9KLTe/MUzzrH1zkX0ukgR9icEhKoyU4GyPtJ8HCF9pl9/uYZM5LNNXTLszhLgwphqNxZK4+MqOITRnSCaJMMxNmpfAUMGLBlWkjUQwoRWIezYrlwDgFc+ARozHQocsL8Q1HxHLbACRHr2GNewyzS0Ka8TJ+f3fd5G/GQZ0B7IcimSmWFJSxQvH87IW05Nie+bXW1osEwSoe+cxMa8xTIQvliGq5UW/gWYth7FvYKoMeJOgyekTTDEzF6GUOlB87JTAdAahmZQ0VBFD1GxxDjSgCbEuC4BiGDC2iQIUFxiwpoSY+394zBTgYO2hzSUpnR8i2cD+U8BemM1YejPrWIhJY4+6cUzpmFYWyPY8h+iFhz18KMolJzjtuguQqAxOJfUFdWy3pb0MFQ5Fb13FlksL0xI5UODjgthHs3Kwo1xzJXlczlyrGQStPWOaWtSgEhy4TCEad/rwNeoMjYXHtYrD9U5YgoBwehIPmSlB5WbQu/WCeQUPrbNfoPhLvfz0P4lX2n0tcGvzsPfRGobAJvG+um8t/Vx84/PQa2qrsGtQh9VjZwmaZ0DwTT0S2JQuvVHLQmb9Qsdxxq/gPU7HyEBcx2/DQ7R/j077nqaM5aL2VCpFQp12xzej0lOrAnZNL42eWCkFhe/G9qohtokyZIST2JVTvsOwz4YNMoVRFUaOiB5NsmngthhO/a20UpNibiqSLhDiSgYMyo2hX/9d3MtzIVvIY/IJ1eNfH0KarjLvaPpprZTGGmvLSnUEsG/X7l97zerw86sWIiKs1S4ElFiyltbimBZ2mGY9Y9nOIKziLpy83hO8bp7uxOlG4BfmseIZhYcUlvxhL0BpXZqrIRjPbTfFX7VHjthxavU3pPWH1mZ7XrBToT2lMaxWplKIjRcrK1rLBaYnGHWYah0OhbPYhKcxALOtO+ii8Yt51bp0+2oqKL1ZNGcskmxkdEMYVO84HHQhCILrGr0sVrWh6a9aksWMRiMziknatPCqaTvjCrFmZh7kxh1l2eII1TJC1lMjFLVK+p5+jod/ATzvjazu4ONwwp6NMpgoiiIzjSor35A3XOUcFKsUcYhM4WuqfF1KAZBGZ5PT9drJz0XuyYK4g+W54HQ6dJyVA/DaxWPx0vM1wTCjqmXXMoSHSt5Gck6ENx6KseN619cZb3e5LmUlsZ5mcaFXPGahXvHGn1OmdFqbzGVey1OaNqWpsiSEXdxnGIhY1KqSQxkgIFF5WVU1fiXQQJkKGMWrzV7Z2rMvM4qsRa1MlTivrCNW6xZWc7TjFKVxGr1xeVri8ZyrRs/tvvgJdM+77bPnc3UzgzmMPJAmvGJ3vFXz40bmtZ/Y+RcZvbAFcbDmeMbzbpuNbEFtnu2Z89dmqdzGhEZI0zN63cIu9QyVQ76ERdLKRnZJlhY0ftoPxTaJtleaLFcS4XyMx/yI5G7p0qqPxtDeJIqSyZjDErUExBimdNHPr3dkqWZXrbYrQ7lO7WuUkVTnjPxDc0xKKbY9mzvwXPXRGTkvG3EYm8D77xaRgW+dpzopUzIKKvKA+YOP8X2u3tf9n4bo1+h2/1t/CPbdfOqH+97Cr4KUdHoInFl7NejhEkAcDPoIleSMXqyvXPd83vnYcepftbV0c79kUFXdlw67wtiTfej+IP8Br5xXniozTqVOUU0xbI98Oc2w66rLBdvfFcRuAxfPwTHnc4TLgHbsxA4CZZ5EhVYzgvq8JkjUw3xmPjVcIVdLcnqRCEa47w1iYpFrpI6QrTbXSpXQryzqlQUsTWMaOZx50zPlGJnXs9V2v5TX7Lz91ei7TMYymJhxVEeRJ5fR/Gg3Tt04cz73z++iSC/OhWRZKr90tJ+hyOUCZAzZBYElYTKAVgoQWChALg3BuIqUSrqVgtAMeI4bA8vtkcEeH6bzftjsh21xBPrkZn3300iYo47+/H06Wd++N6O8HYGOPb+NG525T7CB4O8fJRxFKZKciXlquhTZauCL++OxRUqnqh81KHwZQpifKIzdQoTxbb8uei2xp42bcTG125TG98BXpX9s7dIM+m50Ph9VC6asUcLSbaV5rKvOkT6WZVzusWnXiG5i50M5lWRlKOn69jhvorJ2yaxvBK7m577lV8PyEZ8rHt2Ojlx3Jnnw41GM7YNCH1uI0yJ4rMejYSaisi1TdpIp2LqQmH4hkPvOMaaYynaxsy1ZdqxQ8DArbj6K5eb64Ljd+uBK/v756P+vwHh2quR0gzgwsgqs8EOgDc1C/vsMj6GjIx910aIeUFgXXzkewJHFkczhwv4v+yWbQ+b2fEPhi2oKq8YHT3BvPXHBxob5zeXn9iP6z18nD4JLX/y/4UrDs+OWjAaOOzkxBnCMS/PKVXtsxAMDpPM5CkIQ/Q6h7liWfp7adyMMj84RtE0BIdHe5WVug5hvMO1JmrzYnoKrqAOjayj/L9gev9l4Pv0Hgail1nEPSeQtqJM1CGbyEPWlZ7usDcFgF1iGwG0hDDNeI7M4I6rLmD7SW0+brHOflV2n4l+4LRtGgxhJhzi8d28UOd2zwloZypLkCuvZy6HNsliDEe3E5hBIdkzbvN6ewMdc8xWnRB5LiCQI2HRkxr53kWMLt8M0ZoJUWJI7SZhSluq+5vAwEySU1ML5GmowlqZG9+AaEDo0NMctkWEFr90swdp7yvEyZFUe8hLIdr/L6QsyPocWqqSTRQHM2G7iCBsOYQEMVpIuPaSi2fWVnvgmfRYcFy/KOzihBC/XKaVqI7tgfV/NgWDKCPG2uZl+2jZMak3NK43OT1vLkFlHCGB08XmCMciEf1D7SHp68YQkmUj8VkisWVhyv4T6GeqcwbnGXb+7kxpv5O5/sjHKrY+1miYUeN5KTEzekRUJ5aSiFtgvjwMYrb88/Z9H5uANvv7MMLB1upwTIrcTuxuzJd998/NcF2vF1DtiIxIcrfsyZm+AJmQv2rRGCBrKWCHt6JgOaGdWlpTtr2f1lRQSbgfzrnOSEyh0vslHKUBsvY8OC1C5Oj49876FmvqpplVEUJlgFfc4UsVgbITx74tZXuQ+FOPb7OLwf00YnILZ9fiu7zU2vEvdOO6eyVZ292SprJrPfu/NPgWBPlUnRS/jqeZXe0/E2kg4RaHp+93C+b4UC3x0qTlXAnVE8Lax7vaQ/iE389qHXkJzGH31UISNxJHFkwPKCFp1T9GyrMlc3Djc1yU+DwqFahxDQrFkhCFqwkENHcbT2h523PamsyeZcX39psi+E9XIg3Hehx5Poi/LF8Ke/Tqpbb8L7acfhX+7nMSPu/TJ9MSVOyCO9NCZITZdxZ+Md+9e3LlCbfe5jiut+TZcEk8bWyvyHR1crqdXTCVe06NZKjEzhzKORM6r36vEnFvNQ6/keMUUEPaeM5rE2+0JUlJstHaYuzOgdQehlKaoo7NTqmeUWTymFNUIh6LVES66SqjlFDcnSSQu190PzTit2xCwccrnXGQ6clww0SeZOpNc2TRhUU/JTm7plYPg3H3LumfNS/L1XCiw+Slehs83RjCvhSmb7qGFQ1ZFLFGKCeF7DTsNc+GvJxnovBHLRiii+FuBlGdNpzaKcem45a+PZ06BnnercsY8aCHqOPvQUiiPVoaptRRSIY2zEwf+I7ZnVUuWPUxah/Nm5YK8/rovzeltelli5xRHTtm5iwTuyvFr1OqDa6csRGXY8Z9HHbBO6lU5iTSRis+t4KJ6l59XJ4Z9JXwk5CafKrI83BzwIWGdnnRalc+uT6TfJbNboCtBws6RK5StpVT28sE73LNeuhwzYsmzOhNmeGL7Xh3Fnik/IyehMMdiana7tLdGS2+7CKLdFdVJwvwnBPvedbnzzpHpfi34v19tjUAOy3/H+Pn6/L1VYxOZM+MVnNbNlz4e52Pt/b9kfZD6WFWYifq4/dwvpnrfhfPRXexUX1ejBi7wG9hJIOmMRtOZ0ZWR0dnY0q614vEzjtZ4PHO3r2jC1z70V8OP8lut1VW7q30o/L6OOdC3WWyOOM8bWDkdh9L+SHB8jqKHtIgYNFA1P9v1U3EQyo1NoGxxCfKpXyvUj74FJibFiwBycNWZ3WCNwmjPaBDojyT7KVPsZoIDCGGIyXV9jcyWYjyPMYqgwCBivrCyQue4FhbSv5bhSDnWwo3TFoYpkNY7W8BUMOOgUM7NA9yodBkHEAG2NBnZDaQ2PQWQdofULZuTsMgu05FyMkCSLqgO0KWoSLqPmeKDgY+obQeJ03mAhkhnPxz1Gt9eCDBKli4PZYMeI3rbFNkNmXotYvYv46HzgijlwxdwFDUwpplnAekdDkLtIQIrwNzu6/kSZhViiMdQ6e6gyDN4RhxDPQqinghmLPOCzIogqMAxBEF0MYcodJYMg58lceyVDkDmBBgUkLZrGw5HQdgcMzQRQ4gXwYggGpJ2O8RAyFpjQTsEXNv4i6wG+jcJTZOA5BpIMMLnAMwsYYCQZMSWegKE+zkId3b7q1lr3TILksQUWCk1ghCEdANoDszUA0bQg2sSxWuJsRSh+8ECoXNIZUSiY0aFYIOV0VQneRNhoLFGX6K5Ppd/x6w6E3UfVCL5YU4pA5qwDWZeOQ0msT8cAWEVXoLcKLDy/yyFGlfevj89nhqPSfo8KCVdl0BTISDIQYCgGnmB+gM7hQB4gTSSaiwRBkT6hk7jyIe+bAxBGe5a1IqrAqAgMZaVh/HrNTmDBQRgfllIbnnMglUUpUKg6QNhenIGly9BId3/iyEQ9ZQwaNg9WCLUA9QQIl4mHg3tg1bKJPsr38xEGGGRWZ21rNlVGbUi5lHcdgKWHQiEf19kL4lJ5Z3w4Acg/HTIwlEFCCMYgBCBAiV7o0Ai9dSgzhA57JC+IwY2mA8hjFAi2PcODniBNrrkbIkBkLhLAulK8qBKtrodSnaGxS4C7CEfOdwaipjeHsh1ccHzCIJ6DmHieZWAkPFLpJqxkjEnMhmATvP50rxJv6g4CH3hBToSARAIkTXnAcjRtidyRBk6U6wH3W57U5i0E7ZSwGFJBzAXd2oEIkhCCMICEQNByhJ9+uuIbQCpJJ8yW4wukWtoRpQHmKMR0TqPmwJUEF6cZxENR3HPWA1c712BQLhiSYIKhkw1DUWFzEDiOhuCrIP6fOpToDu0ybNslhZdBaPTtFCswLlzqATA9YYhj9fMk53buUNUkS0PuDQR5NL11bBxHACIHIZdnUO7K/JfQLCe+II/xDwfDcXM+33pZcgfozRpqFwQpNRstiKTRqNv90pIfXr1HtJ3RjkbKxoUA/XgLq9v3KZ+RCoh1Ffl7DtSwftSaovEwgUfi7egs6/lP/nPJTePzG0NkgxJJBN9FDIMAMvs3eJXaH98zRgkI30aH4DqBWBVbiMa/S8/YYsvp30tQuWMB3Xz2oS304h9ow/KkfS0dPkDcX26Ye5mt7PXQORkOru+sh3Nezg4xLD/2youKpKCkBV0Qyg5pDLAfGEbEQE4JYlCyhg1UdCRjHxoz0vFJDYFvDzn7DA1f90lGzt9AyTh2FEMJ6ahQQeNgYdfngGcQyLCRU7F3xTqPK7WGzS9WA1AgE/bo8/yxpZsO8OF2jGEkaSSn6LZ8HaB+ZDdGdHh6B5ZSgQ8abzkeFJmHFmvnED5fUGDr2fGxjZmFYMqVUQlAq3noJUDM6pgIZaBMShDmD6VYT3FhWR6FxKDSwF7aQYwZZ9zCwkHSkQDaH/AYUa74f2/hMhLQkQayamGSQume8GD5LJMfXUT1okURSCArGHrLF7WhbRv0svBKGGYHr1HUcO8z06WfM84XJUVc+utoJSwhz2WBY2lcLSQShOZLxBtCVjEJW622dVUitZYMEBdxShDC79DKuo6xNQFVE7yMWgpaUjL5BrQNXSwGwTGhEHtesppbTZxNsLkSdm3KHLR4kqVOYib290U2wQkxGhb/qMCfU9N+mn+BiGTsXKhJRSFM0uyiNAS20tImuSbYBkAZGYtxSgpi+5LTr8R5Y/D0X2mT2xULLaxVvoMT5hn1fT1Aagkhze0+XFRmMJcRoCQrMEtlAxAWwxaRNg6z7AlEVh7HPcrk5Q/mSSd3zO2ETGIraW4uFHGMTDhGW1tbRW0qNpI2LuqvT4E59pdrWOBtisaHcDQHhTeG2HkcvRQ0f6oz3P/AqEykTWbAm+8EFi2dYWRiO7oErL0WWPeH7Y7DreviQqGwfz+mh95AOE2BOSl3zcbnezF1x8Ql+83bQ2Ft/J+xQHQHcSAQQJtYynl82DcTxkA5XcmlN/MKjzCgtFlHDWSmuZAQI+Qjt3CYLGYaoLCCTHh6+h1cp235E9Ttxz+S1ulm1F8i2gEpcixUew7slUqJhNLPkejLvBpVdFDm1PRdxKLRCyhJow8pIEI2Z8mPTWaWGWB952ArH3pzmHNGG2Lc3EUfPfHzfX6tG2TK4y7Xvsa2N7Dct9bhZqMMFBKaDTt/cR+hbTx0YznqVyKQxxp/0dDVmTWIC04ktJ5xjFG2/TB0RryNPnk6HLOd9r0IWAyQ3foOMUs0yduyISvpUmcjlJttOxIZMap80UIh7auByZOr4OIJNwvS1I9+Xa+u++ICRuTLeRN/Kx+HT7s3iNpw/SCLZn8iHMfbGc1qHZYHpoB5IPGqG6l0oHuIKEJbCgfUGVfdyXiGm4OzToRLbvjOCC04VFySw+HkwyCSAmupnjabnWWVkiitpGkgkpNURUmr4LMU94gglDgJwfdMs6uq7NWgoeHpKCdN24sdKWtzEntxM1vx8rN6s4etakQWitjKIJorMyvhw7UrSw7Jkn6LeVnfmECktVbyPSiDCgak+qrQFuUG2IsHKNnvSLmQdsWxKrBbN5y1CJniF1UlfTlvyaH46kh4OuXZoBCeit06jdcb9CqAqwH7mxTGAmS8AzHUENobcsmMV04DQrzB+L2aU/DE0RZtlHMrhNNpqmLqUiK7qiqIWI7YRoMKEhIOqZDvTzi4lBRhFIh4e+kd16Gr29XenHcETD+IeR06dGUUmbAhNTVzPFs3sxwOG7eAxxQOJuUaXLPujiJnEEooUjyhHvbfHPbONRmp07TzmiRp0l1qVG1u7uXs+sTfOMqDenkzGC0VlNrVHmiYWRN/LJmB0yGgkIsiYDc5pA2BYGSm2JRucxyFwMFhIIcApj0Ga6RiZhmCUDbmXVAqCB00EODgrYLM0VVmuoMLjZR7SLJypbsDOKas/7ODOG5Ms0o0FfEnYGnQbEzZ1wh+msEFEgiKDEsz/RuDKAxgGxDNkOUxbujIl+Ep6mLoiVihzlT9NuVJopGEEU7iEITPqyAJpwZxrHHD0VA5RwZlnZ30R2GgNa/3GTd/oKPUGDHk4ms6WHkNwiugydA52h2sOgmpi9AQ0R0kE/Bw/dRC47awECPeXuuPMy5w0GIPvBi1hdIP4Wke8yEZo+PHfI4mkE3kp0Ljsi1gwGaJRLHcmMZZ9C8AsTA0okqIEogMAqCU4h4nsPIwALsfy3C+Djm6Frh4o/gWZokHYlhDQ39PxRnxG0sNgEFBwWQNEB2udga3R0KrWpCpDYO7vghHTuyuuHypCMRBhBkFMtqBkbH0hkPkNPfsPr9WXHPxdNk7hPviZKZD5R4yJE2oNAmHLg5QoHLGKHlKFw8jmDi/EAEmctAZHYcnEE3nC2xEMQcBZF2oPacw1JkSOFcks0GlhmbcywHbcCZr4I9v2k46xCSB2SMzC/OBJkixM41zMBwwzHUWIGXTy7+tqvEz9/GJuzOalD2oLJJ1AYLf87GftkKEXZvnZtsB+BlaZ2TrYbA+rh44Tw+iIcxNx8nJpFWM1mR2GsqgLmE448pfCl4pQgsGLUzGxZ0ay1aZWyfL7RMHGb7AUYBwQNE2pZFIiLADYlBowvxj4hppFIARYLJAYpBTl5PCzBN6K6NYNrhi2noAgQkRgAY1dSfiLRfXaCggw7o3QbI5QmMIkKToBIFrDp6UP5SSEUgu0DBo5V/T48CbxV4QCOQYsD3+c4wYQ9serJWnposT748EMPSRzDVz/N/3xmPsNDZ4g9ZIEDwkLKGq5onjVZkWlIdon7IIHvOvx98rzfUeo9i1yjuSTGQsQY0sEYrSlYVLBCpCwhi0wziZbhCGQYIoyEqiQogUssiogirGBGCIqiRZbWShf8BClpgZEZhLGFPRp8RpjGIqo/cG/IO08cnXIAmVaAYQJ2jCSBxkUTUZGYWoPmonn/Mfaz9MujIAzNXQW75+OG0fX8INrpbSfEHWZCXGHMMGAwh9hBcqXuDUfTkTzy+P0Hn0MuCLDRjA+fr7ig5y51yGQfl/KnVC0ugx2PYyzDIxCOgRCZAVJKtMNF8xkAwaAiRGM4NNjMzkKowftGSaGRFGMEF9w0Jmbdd0Y9xHgzd7BiEl6qPV9uyPutJ4zxYzEZ6T9BYx1Q6wbRJAl4tqZkw2pi7OS9MvzTXiKGzChTmPMgb2qvev2mtxvrWsTeB2GIbhX3YPlmaaPu9h6zs0Q0NqivZC7pTcQKbKRuA2sYBEN5HLYEAIDsWUCERBLBSNgQWziziZytwOmOlHQEAhBR2FvmNQ0nCBh6ZGTfdwjG1qiKdnjzMHQeDqTZNhtXgh16bMh13vtAooHse/rxc7SBHqAgcL3tAjuDUbUEEJFkgiCWwhe+Hj3cDHBxiethnIYwVAL22jIYiEXyQagshBmjG1Ep6iU2RWBRW9zDCYUbymmNly5zmRRcWUgJgRZT5dw+6wLmFA4EH5krArCqlYtIljIKClSjIIlIrGKDp0mWkcH6n0B/ObQMwMx1BsDTQzShOofAYFh4HWNU1Wq0VjNKsI48noyy3c/TIzmsv8+1Do9xEQVBIoy8TPaaICBDOU54AhmRT50RGTNAAxsh4GoM0DwzgUPBo/OtCEhBw5iUBnaFT7evUBH8EH9jK2CSKMN0zIn0Orx/Y6foK6PsAkSJBDx8dnNmYWvrtM2E0sNjB9JmGHuVMOt9Dk5zRM7IeHicVpemWQstDH3+/IrY3ra2O9ZIkl39qTqXcqH0t8C9K5RsiKPZJKDazN5aElj5KKrsFjIgGxjQy3ut7aLWKhKcNXWJkZFJkTtB8CBvOhf2hsfZj4MyGl7R0vhqDW/I9EU8SfSGsAJFfRB/sICLsCAnR5V1ZhqFqIwET8nh9PUUB0yfE9aUP4TBEkM8pssVkGPvQYqUaclMjptjQxCWxQUUtuYTCSH7xeLJA9bJIooLAPmQ7xMs8T6swyAobyixYE+P1HgEzIB3ZgHcP01hZKK6eOMemJR5FDcqESQe8tzWO46WuVNbTqpWu2Q48D8dbcklVCdcxvjqzlA4C+emaLDJfjMyCmewyC1hnS5dPV2I8LGLxYdMqDqCBk6eEGEJZSgEips2MbBtlU2/RHJYkKvaGyrQhSV3BEKKh1HhIanbF3oLYzv6i69UQFIIyIJBVUCLCQVgwQEgKQOO3iQU/On+5BoYPEOwtR5Kvr1kShfGyHEJO2QRYIMkBFgrFFRD3ocuQHMckGQ28B26MdBAd4seLBANjQwTiYRM0OqNXZTAyIh0HSDA0UfcJ4efSdAvqY76kG5CD0GkcGezazpBAehuQfPsPUaalohGQQvAmoAzzQUDoL4MYwD4e3fpDxbRF4iPoDGvp9ZRTCSD0GC35BkJ5jWaFR8t/iICaQrNC4ohkY8W8/AWHu31BkkISQhWwxA4Bp3nzO+xXS+3ZQbgP1g1kt9HX1C1k3eQPtxnhORMrRDQLNlc0Jqng+5EMmgRBl2g7yosKxeyWoIzTE01L4TJvkdZWQs5HWi+dXETuRm4MtoU/kfy9qPzTCRtg8OzbhAn1s6bujpQwLECgJtTuDu11niXdFH624GgCKbvLnsPOMQfKDlxjsez7eYBCBCMggSBDIEACBMcOBT/3jLu6/rp/ignKIbMvA4TYhU0KdAc+HGy7Vapb/JzrdHJYKxNlY0lSlVlpVqGDOcSCu2mEF/aGgZlL7mKCjbCiRwVLaiKMKrCVWsUbQrVmjQdQoMmZTQRYlziRUolCtLBqVLTbQ0zRCaACBkWAOShR/dmG82v1Pr1ZZHfAH8lU8ggbSEDebq3RYSiIV7uAPQPVtHMoBBPepdCyXiMxIDBk9TiXZ9XT7w4EGrFYN4RYgbtQUcJ0wh1e7FiDODUUWSVIHaWDYlBpcwY5/kxKM5lQCDCLIgUVVtfZNlFUuFG7Oe8tGmZhMzDsa2ZldoAGg4GPVm3rWF9lZRnEaaNQrGsIk3exR77AQd9BDaSYgIAwH17/GiEWBq0ffYLmIbFCKGpG2MXwF3DvMx2XPFxybkhEhB0U547lqILjZk+HPWyNq1lZBOpu0E2xeFGesqoEOJmIY0WMqO6EyNHV9KiHH6mm1/YHMsdbc2lovmhj9+0CQLqp0/FUjYiGn6yAsbqC9pQBIDtW/2ONqI64eWAdvmDHERHiJYiVi0oJSKiQRKILEpBQqoRSIxJBaiywUrYJJE16sSzHM3APQRCnIrEBpDFgYsR8sTWSIIcvkjeV44rUusRpzXCcSQ9y39NMU6tag3dQajNgGZrLhkzpOYi4YeOqNpiu3k9W6h5nIgOA4OSXQxQPzRFShyMNKNAdRoLjN4fDa+zd0TlSUZkKYJxmJNxRYryrbfdt1byv60EVYdTroMaaQme3WWu/lWOKyQgQIEhhwd/DZBxDQ1pYBBlZUEzpmGQ95NPIkpsDpBllEqk6NSqlu9BlYQRYIHVYqxkgWDGQQEEVIwzm4Fc0o1yaZ1NNMzOEzMJiBeGUbTIwViqZUaVvFIJVlsQb8GMO9DMiiklSFFeksKAIgmbxSxUh1clNUNLHY7njLmM7Ak1nVualjzd6XpBrJNEGJsVy0IUpRAmzNJ9p3uDgOmcE9JaCzypnaIb2FgEFkmiQ1wTbExNkVMQRSq+hXpMZJIJvHULQJNAhYUBKIoIb0xw6OPoL5fE3DYZNDtEBFFPvaGmTg9qAIoJ58FJ3XqhN6nWnTWrmJLFsA7SwvRmmZILNBShWVAltljoYBCFRja0sIGBLGUGaGsCUkpoWBYXNKShikWAKLFgKCyKCkWIMCCiyRmrJAjF1i4AoAPS4A6yBZmuupHUBBUdQxA0kvPxeWgjLFDYHWkM9oT/EiO8okgDrUK38dnPoP8CHiHfrJBWTpYBGDNhyid3d1npJZOcLL1hdBAXkRIQVIdjhxQbNT2VBVNJoATDpi5FFtQaDG/U4sjp68FEC0qMgmRY3coGiC91p+qZoGAlFgyACAiAhBYAjBYIhC2BQ0KFBBi0lhShVkxE8ucmNs5wxRLawRGIgMVQSGlOXN6XY4MfCQlwtwUFdIxTD5jfH7TdU6k1VzpiP1hpjLvc/sPCFhsGrsO0M+Yxzfdhntqok2XMDayVMy+ANa4GaBH5BppNAajjRmmtNZdq6C4S4jkdxYQHxlHwUoZFlGggLcuCZCDEcqULA+sDjFTHMQPmFoaSkHQOQAdRqHrM0R/pEfD8J2gI7VIxhCEYxihq2lFnfA3/8JXkyNihg4OVhhoMggmlyWBPtoQPQBkEFkSMihOmhQQLKqwgUERgBWG/cWTJDcKEmsifzI6IJo0NCoVdKYWvdDMUt3kHWRL4b1C4GyRcbiozAJDMcb2asQOmJE5neAZJjFE6A7qUMRhfwWBWFBgGyGEhkZGCZtKhnKgLokKJ0Uood2JuKGkzK74/0aNTZrlwrYFq4WGDcngAZZOYQKDIN2iSLID3Ko7yIq9qwEccWCdZ7H2/kp9FyespUrhgUcMWLUnknpXWQCIhq4HZEH74j5SIFxAILO5OH1IRcjAQNOwvM/4qXGup7Y9nOQgQd+ajyEHmD5g19p+j3bpFMQkOZ7Cr+6WSyGAZVkjiAPkPip6lEMmKeOw0+t1wDsgyeuMiNcTmclkT89CUCvmYE9pfTFmeNBj5fPB9D0Qs71C59cLJmacTBCBITSuCSzWNAEFhLaASAwGkzSQEaNM2Vl0iRwzBozHMQ8bYc+8gHanYR5hAoCCCfukeoGQYHEBAegqIEBWwm+Dd3XWpHlWP2KjjTHs4d3lTusS5yw1AESQaQ11KVnSarq6o6oUGhCbZ1nqB5kAj2bxf4hawc1e+wTQpIRLXuHVvnv/HwLeUkyjYfqDFvG8LmuyNmtZXVwvhNu3FUjEXxmrICaNTJhODs3f1whmQ6tdT76LoB2bmBNRVVkggwBBJBBkikUECSIqxSMgMjERYLOtGMHuMpKHyR+rEChITqbJvlz3JmDklEqXt0nfHmROrroZkPGzMTPrxi5xgUfP96RJP4fXlpCEs3ZEs00SmtQ9LVhpDNPNM5SX2s+azWaNLMvCJtO6iluzeZLskCbuQYLSjX987+g+idbacUIGkKoCA0RLVzzc2vbWoCCGFHWsTTQ0RTPmMPFMQBwHz8WXjMkqZekYe27h2ZoUkQk/co8Hm5K0ntp9ST9YOO11UMa3f9wpFow+M4eqVT2nU3kQ9LJp03V0b52n5CEGRDkvrLDA6N9AbytlyEiayM37y68hbcQ1DRxO/uCRMFj8tofScr4l0KaFcZIIWj7SlxSDEiIaGMYICJY3I2SUkElYVqokZCBCEuGxsArkSgzoLWF3ahUtA00GSgk0sumrGyKxblws2cytnbyGLm4aZcwSBRCI0aFHQNDMxM02QQLG6wRlTQPhSkryRiYthA0XuNDTFo+wjCHoA+wguEHjrOju43jY8BNODc7YU+zAME1BUYsCKoomDnDkdhmSdpAmA1ERBbcX4S40jNMWXSoCfEpMbDtQG5VIgg+WYHTFZlD6TkORI25ngezVwrnbS0ZsuPbhicRkqlUug4SZJTzpENnixsRzU7OIJ49sDacxvJFhXV1uAtjgskiDAaDgiuLgHFLKNE0oXpoXFComX5IoxBh6/jhR0KewKqPV3E7DJy8mtJi57nRBg+RhrLbGEJAgMMhlUzl4CF85tYvRkXUnX54TgDJARLpDiinRzs2QyhRrJ1c7EylfZ9W5MtEpaUbF+HGH/ly4rRWs1BRDum3KOJPIDEmi9q2H6TNp1HeDh0Zhk9YQwYX7adWeELkgd8kSEVpgDpFANFAvqUfqB+5hO8/j0BrU9oETYTbFNoMCwqCAST0Kbkt+hp0Q1QGMRD2gx8mRznyQcEuPIiFWekZm+GPmDAnozBJjYGhifLBiyRG4osFjmvdjESVbgxIUtUhRAgsXAMoFiJryVMhMOCkphRhFgRIhWCAwARkGIDQaCkkIosWSkhYllGVAZQEgUARIQgsYMSjvO8WAMgm4XmCBfJpow8ub7lmt7iB3TQRBAUIM9LyDH5uVNhvcZ4PHVnRvyh560ieGEG5Glnb9OPjfW9aMH4cz8znaHRuyEcOGoMoP2+gzDg3W+HeRvHE2R674Y6OUN75Lt41c4cgpywx/AOzNixqwOhDsh+m0cINW0F7HkIKaDOCEbDuUJ0DM6QbDyxBO2wS1BQLHA7OgNKTZvcWpm7O8s0++s0M6WQxm/L3fMGzho2fIbW1yuOcOqkTtNSs6xNmPSpo2NqZV0n4YdZDrsIpMyOzFEHFmR4Km5d6KhoJPm8O/pLlMs5FyZqrIi3M3SJ0zoKe4w5ioaaxOJwYcwrxFCl+YPy+cwZdzcwMPmTZ94beKudIPtxnNmrbMUa2qrl6yZ2yBtOmweB2wmRnfbBdxLT36/isrhiloQA6zgMyDLCgkGfCFAeZgLI2PkjkGJYb2LHMHAD8fSm4bRHFeb2QUhvCFnxMwJejFRxNpS+YISFTocml5bzXaG6reIuUfz7l/93er0WWlxjB0jd1XeODcxbdFeR3Vjs5VuWpsd0JDinLiacRB7700hKFTyW9+UxzWN1OZfB6Cj0LABxhMwzLMfNvIe1hNege9IOZACw8qVAGvBhd6uEsFarIfO/RiLgDPOpBa9+g0jMaM6VA3TJorNIlPdlMGDtlmwhlgjUoKsIsI0BApM5KQLYYCYkXJMgUIk0MEweJ3LSAbGRPcurHdnrK1eHyPUT2TMzDW2RRCHLjRJfG7kaIXVIT2YokyzKGgljEEcsihcFKkciGEBCoDRZ36VxF04kIaEJWnY1JBEchTIzJijiIXdVkVyoqgqIoJpgh06jcoMUUHWdrsg+fFdg7d1CmOpOEVDtgNpQSaq5fXUeeHKYqqDYw1dx7PMiHQpwSMm5vKElm6IHNVRFYqx7rxyEvz6f4uFMuo6Zmn3NREdzthA7oJN9lbxiIIOZBmDEDjU0F0YPkUvapixrA7WSTH5Qsocw2jcEFDb3ObzOiIJodhujyUCOTVlwNHTaia71yTaYOWvRNtBnhQwshAjBjGEYiOoqOMBifEJgxCkWspbWADBYEGAEiKQ5RDkiFja2UlNHZEzumMwVoV5Gqq6BUiWOA0kEcgy4JZYBIIWXSqyBQBAN5Ail2s+AoaJwY3GTXE+WLYyrHZHXe5beLJGBswYK5XTGGKmGp0dRCzEz8u0IBnCl9JJZ7H4gHOzHvVk25Gjx0xRyGKc01D5I/G9QYxI0GG4FgxdApkZkMw3gxGmsZ/CnpHpHeQcce7SZ3gAezZDGp9tnLBQa4kcrSD3HYhjKrWYDJeRJpnp3dR38PXy7rbDqyov5EYh5dHY885va3HwsXS0qh7NXI+Jrd6CEHnmDusUZ+8JbdgZAl0SdRJ9FBTBdyfqVBsPJAqe0cKRSjqYsgQU8IMEhEzDYQOMsYBz59XCkmDkrjGd7DLmYcqDDKobWUIMaLjDMxIF2WBhejCBbOFZeOWN+boOHGd9FRKDGnbTqxDqB0wtCmGMpsMpd3jhpN1RVfmwlXN5YtJDITMwYKhqqBcVyEjlTRz0RuYbDpANm01brY2LIFWaLsYDaKzXUpNdKlGpvYbVQtzRhlKgYq0K0EsXVyNZfbNEetTi8uiiKkmn5FfBh8Yw2riBVNjylUwElzJMYdm3yDgYHs87okNatVIy3sgp0ObczAoRN+hwatEyJEGMYw1NTNAxJqgozAUiISiGlFN5gogbiG5Ek2BDXBuoyLL0TDuTY5ktTOk9Fc+UxWjdYrWsxhXsMzVAJAxhtyghimGJCGdITFKkqJgSmIp0VuVw9stFx6mkbp9I7RycavckjdaF7serdx5ZBqGkXC5TEGkMcYwkSOm+DGMGiy6aDAwg5FrRhGQqKJh4cfkZThEWWG4EGzcaY83XroWJMGVIbo5ExCwT2KJxG+hA2g/pd9OqJZFGRHMNJZY440nDk9AugwroIoXlCEOwQoJp0mBBESJgMmIIDFgsio0chSGGLMBOJr3d/Xqb7FOu3SqrS0RTOQhMISghQAmk0WgYhB8Q9ijZHGf02Kh2IpwggTHByj6nTKaNWNBuIb94UeOp8/DhhJ5IiCWEWlPhe9hjJS+a0QzUmCPbJC4Nd5XtnTFi8AMw7orJ15PQqczymTsgbjIfWSEoQrAhRDxZLA0Kidt6IpdzBXZYBjIBLATbucjRrQqNZYSkC34oLqZDWqCGMzv5BQAoFA2nDdYx0EzXpjMNlOc8dl8EeyUneBj5gO41PCuTFjhG2oSEblAULZiwogRw0lmElHJYxIbbnqL5H8vbyMOoPJlNM4pR+/nsbhlmGdlqE3huYhvVQrhK8AyTXADnIG8TyKqq8zpoIOQNfGYWojNH5DjkwaG9+tTtxLbA1xVUVYcCFlDkmAOKRDyIptHxq+eVXumibdXRmHhrBBBBlDJPLQaoaTuO5NIpxwWayKSBAIhED1FsKV6Ygm4CApQuHs2/i93s9HOqhTCSqDyTyyVOikWJ9sl2HlKJKjQRyCECoVvO3LCmIZNIYiSF2JC2FyVVKcNm7jq0J6jY88ECQaRKNqWI8zcphfDVOCtiMFgJjc5A9+GIOeGYXn+0SEIocr4PIoOhXt84pwQ43a9ghx6zRO6C6SZIGhCGnrLEkQYCMVQhWnAiTT9RggKRIAGMz3Ca5gcx9Y+3AGQ7AHSTNHnASMQD4kHcgaUTvAocwifnJ/a7ZrIRByRhCQGRIzSW9fd3e2i5+iJo7WRK3zTw7MFh88i29JJCqMVf+/DgsG8b6e9Yapg5I4bHzMLzRQh4ZJ5QtKHtqyEWwsgiEckc+VYSEeR1niMyEOPZXCKbEjzDe+L7vs+nloIAqqLf04kwKAisRkIsEHOhYp0sULAbZcgzxmvh+UgkJmKacV+5QVOZ5ONzDg+v8AWPwF+0IDzNPeEHyDD49icl9SGAWIYCwKG+IE0nz8i+hODzjLpKkPVBcdG5uRCzZlrpSIPVCpQK45kysGqvUJUB+oFDTXWnzmSak2DaGAJOJ9NCueT0DAwDvLlgOLaoeCwYxgmESLssgIW5Bqti/b5v93LpSSSX1/mfUUlkwZsOJNvDIFtiC9UqbhpSJpi/kGXp7PdnTeegZnH1k6UDPFTO0wetGKwYRkNBkkRnJgixBZICwDs9sqDDt3PH06QbuGbD32ftswx3WBDfTSyManPFFqq9T+RRiecj1GU/urMcBrNieHDWp1dnOJBYhoS1RHS5ghioZrDeSbYGM8N0ViiFZYbcAa3gaUwusgeqwTzPVkgmwU0ZaIagmhU1HQbMwEsOa6CK6/T4Q6ug86LyY3xIMip11TGfg/cwvjFPD5BQufGYs8QyAggpY8D3tG9ruJ6H1zzHvXT/cWTIzrrpT9esdMZ/7ofs832T/+LuSKcKEh78QxEA==')))
\ No newline at end of file
diff --git a/devel/example_devel/instructor/cs108/report_devel.py b/devel/example_devel/instructor/cs108/report_devel.py
new file mode 100644
index 0000000..79c4ba4
--- /dev/null
+++ b/devel/example_devel/instructor/cs108/report_devel.py
@@ -0,0 +1,33 @@
+from unitgrade.framework import Report
+from unitgrade.evaluate import evaluate_report_student
+from cs108.homework1 import add, reverse_list, linear_regression_weights, linear_predict, foo
+from unitgrade import UTestCase, cache
+import time
+import numpy as np
+
+class Numpy(UTestCase):
+    def test_weights(self):
+        """
+            Hints:
+            * Try harder!
+        """
+        n = 3
+        m = 2
+        np.random.seed(5)
+        X = np.random.randn(n, m)
+        y = np.random.randn(n)
+        foo()
+        self.assertL2(linear_regression_weights(X, y), msg="the message")
+        return "THE RESULT OF THE TEST"
+
+
+import cs108
+class Report2(Report):
+    title = "CS 101 Report 2"
+    questions = [
+        (Numpy, 10),
+        ]
+    pack_imports = [cs108]
+
+if __name__ == "__main__":
+    evaluate_report_student(Report2())
diff --git a/devel/example_devel/instructor/cs108/report_devel_grade.py b/devel/example_devel/instructor/cs108/report_devel_grade.py
new file mode 100644
index 0000000..735cf35
--- /dev/null
+++ b/devel/example_devel/instructor/cs108/report_devel_grade.py
@@ -0,0 +1,3 @@
+''' WARNING: Modifying, decompiling or otherwise tampering with this script, it's data or the resulting .token file will be investigated as a cheating attempt. '''
+import bz2, base64
+exec(bz2.decompress(base64.b64decode('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')))
\ No newline at end of file
diff --git a/devel/example_devel/instructor/cs108/unitgrade_data/Numpy.pkl b/devel/example_devel/instructor/cs108/unitgrade_data/Numpy.pkl
new file mode 100644
index 0000000000000000000000000000000000000000..b4022f8f0291c5381c53ff5f48a913744063fac6
GIT binary patch
literal 439
zcmZo*nYxCN0Ss!VX!Nl9mF5;yPU+z)PAv&7aL!3AE}qghrH7>?GdFcg+Z1>EfC#YK
z48|UwlGNgo`0~`u^o$a)BG!`3k{pn#47Lo$47Ro@J#2}^#i>OlQ`)A~PVr{w5zPY`
zu9uu&l&Y6onp2XQSX7i)Ii-guz9=<0Kd-o?s5H4`%H%0MtYC#xdf4+)AW9}r@n&e9
z;>?&drF}}!6b)}iZ>H8M8G=2mDJ7K!sUR&(X%<sDJ0P;mJ&ZO}{QUg9{{R2~A53^N
zluSwLbQY-C?VrH6>Eix<8R<`=f1I|TQZgl}7~<Fr7LfPmZn^;SA4I5!BRRh;wJ0$i
z<f+;zJwnOFh6WZf8Tq-X<@rU~hI$2+Q$T^nosycSkd~jXp=qTs#ap6BLIDbtl#~>l
z^K)}k^Gfs-l$4Y}K?zozlvo5&EZxHZ5>y45kdv90nphNHl$u_YT3no&p9c$EjR+lu
QO0e1T8G3C~N{dVN03v~=)c^nh

literal 0
HcmV?d00001

diff --git a/devel/example_devel/instructor/cs108/unitgrade_data/Question2.pkl b/devel/example_devel/instructor/cs108/unitgrade_data/Question2.pkl
new file mode 100644
index 0000000000000000000000000000000000000000..311bfdfa0bb8c5828abc27fc4c12b052ca9fc61a
GIT binary patch
literal 390
zcmZo*nOe=r00y;FG<rA#OH+$WGV}9{ru1+Xr<Q~kIOil57f)%M(!)}cnVUMLZHhZs
zF#`ib24jzKNosLPd{JsyYEf}&d`VGea&{$1En8x7acWV?l(s3gQ@j~sr)YR{c(Zsj
zr50x}X0WwQ$zW-l;%=Xi4K@iP)WeaSUzS>wm=3a{c1n*>a<QR-MNCG1ZfbdcQMRF8
zLFJU%DLqmtsc8x@`*JdiOEhvTL6oMI!W3_go(&36proY41!B5qmZjz?Br1T^D5yi!
zsw)(wmXsFd6~n}n^Ye-`i%T-|(iQU46iPBu6^avcQx#HkQgc)DN{SUS^I%pg<QJu+
z7U?Ot>ZR*}%|~%cw4siXj&ZD}LUBfZX-*2%8ii<M9U~pXSOtwln2nkc%}Pp2Q`)8!
I7nkY*0C{48v;Y7A

literal 0
HcmV?d00001

diff --git a/devel/example_devel/instructor/cs108/unitgrade_data/Week1.pkl b/devel/example_devel/instructor/cs108/unitgrade_data/Week1.pkl
new file mode 100644
index 0000000000000000000000000000000000000000..3cab27cb3b4d5eb3a94382101e00c41a02129e06
GIT binary patch
literal 724
zcmZo*nR=3m0Ss!VX!Nj#r>15bPU+z)PAv&7aL!3AE}qghrH7>?GdFcg+Z1>EopZN<
z6lXB@aFnDLm&7Ngq<|E#mSmRXfK>GGgM>5l(iIX@QWOle4X0!<X0WwQ>0wJOE>0~f
znbJ0;c8Z2KgExyequ0X!|Noal<vEh`%TkLH(?N#RPU#U!E;cl<h{?#$O)bwa$~M$1
zsGL$erH3yiH4S94MxsuVrj^1JZ^53W3Q(Y=q@>`US(cioP*R?+kXM?Ulv-4*kdT<5
zkeHXEkdTz1P?C{ZtdLfkmt2yWpQliqkzbmVqEMWfTaZ(!P?TCyT9l_yl98HOq)=R%
zYsCdJ)(&o&f~`WLb`n_7BQvk07$Of+qooj(nwtu;O(7|<I5Sxxu_&`7BR91qGr3q1
ztU*ahX-eCa;^GX(9v)Ee#22NOr4|)~yqduS3J`CG*eM#`%-&4ijH$&Lj2RMbQ!-dU
z!JW_u3T+0ckN`+6uAq?u1r5~T_?*n*5{=wS5Csk<j-Cx5r-HDOk`mZakf2Ib0I5+>
zhp1JD21Bs|R6IF9uQ;=~1Qeh7X`sMSC{D~xRY=WA%}vcKDOSkLQ-E5jkYALNTBN7o
zs+X<@HXkYuaZ0qIj**UWtR^hbp`jgZtYf5O7^|R>2(wWWq8TZ~gux+}Us_U7S`wd}
ZSWr@0gb26{#td~>SQTVDfC8&j4*;a6^yL5m

literal 0
HcmV?d00001

diff --git a/devel/example_devel/instructor/cs108/unitgrade_data/Week1Titles.pkl b/devel/example_devel/instructor/cs108/unitgrade_data/Week1Titles.pkl
new file mode 100644
index 0000000000000000000000000000000000000000..1d504805985e2823d43b8b5d7e190dc05e59ec67
GIT binary patch
literal 776
zcmZo*nfjNB0Ss!VX!LN0r>15bhGdrHq!v%<;VMoo2`zBWNh~g&(l(`sr6e;qbxPY5
zcd&8>28ImA9*&aK;*$8ploXHx))J6L5KA#6wYWr~BqLQJF(oClBr`uxAvd)oBR>Vi
z*GSY!(wvgPn8DUIrH3uCxHz?_WJ=qV+9?{|4Bjl>j9v@>|NmbKk<Va3u@9_;BRRh;
zwJ0$i<d)hgJwnOFh6WZf8Tq-X<@rU~hI$2+Q);L5@TH`t!ELirnBpzivs3{Jl$4Yd
z+%wBk^At+T^A+++bCXhwiWL$P6BH8jQWO%B5)?`@GK&?`O7oJzZZFQrFU?6&D9+3+
z$f;B)N-ZfZ$^-c>vq+)1G}np?WUL+BG6h?OMC~N7phsq2Nijqoq()02C^a_~WSc@#
zVsU1&LSj*7Nk(pJNoI1fB3OfxlG2p6DaFMZj6FQype;%*OD!q}c{PIv6h__*u~Rg>
znZ2338B>ch7&D~WretumP3h5h&PYwp&df_!$V^j!YKqUvEH2TAHq=ot(oryu)l{%m
zh&Bdu3}Zpz57G+?U;BV~aFjxg69U<TD_EsK!HQyjZY9VXO;8YX^lSim6NHtNl)xT>
z1aqPSNR5IzM6EhB2#Xb<;>r1W#hJw=AlK)ofdW>cI59U>AvGs8H#M)MSRpeH<|T#v
yqLkDkJq1_2bUm>7C{Bqs)G^Wlc@!F9(3pxg)-lpCj8)J`gxRPG(F_aiQau3uTmPE?

literal 0
HcmV?d00001

diff --git a/examples/example_moss/whitelist/Report1Flat_handin_10_of_10_0/homework1.py b/devel/example_devel/instructor/output/homework1.py
similarity index 74%
rename from examples/example_moss/whitelist/Report1Flat_handin_10_of_10_0/homework1.py
rename to devel/example_devel/instructor/output/homework1.py
index 286b79f..4412ca4 100644
--- a/examples/example_moss/whitelist/Report1Flat_handin_10_of_10_0/homework1.py
+++ b/devel/example_devel/instructor/output/homework1.py
@@ -1,4 +1,5 @@
-def reverse_list(mylist): #!f
+# homework1.py
+def reverse_list(mylist): #!f 
     """
     Given a list 'mylist' returns a list consisting of the same elements in reverse order. E.g.
     reverse_list([1,2,3]) should return [3,2,1] (as a list).
@@ -11,6 +12,6 @@ def add(a,b): #!f
     return a+b
 
 if __name__ == "__main__":
-    # Problem 1: Write a function which add two numbers
+    # Example usage:
     print(f"Your result of 2 + 2 = {add(2,2)}")
-    print(f"Reversing a small list", reverse_list([2,3,5,7]))
+    print(f"Reversing a small list", reverse_list([2,3,5,7])) 
\ No newline at end of file
diff --git a/devel/example_devel/instructor/output/report2.py b/devel/example_devel/instructor/output/report2.py
new file mode 100644
index 0000000..ec424f4
--- /dev/null
+++ b/devel/example_devel/instructor/output/report2.py
@@ -0,0 +1,41 @@
+# report2.py
+        self.title = f"Checking if reverse_list({ls}) = {reverse}"  # Programmatically set the title 
+
+    def ex_test_output_capture(self):
+        with self.capture() as out:
+            print("hello world 42")                     # Genereate some output (i.e. in a homework script)
+        self.assertEqual(out.numbers[0], 42)            # out.numbers is a list of all numbers generated
+        self.assertEqual(out.output, "hello world 42")  # you can also access the raw output.
+
+
+class Numpy(UTestCase):
+    def test_weights(self):
+        """
+            * Try harder!
+        """
+        n = 3
+        m = 2
+        import numpy as np
+        np.random.seed(3)
+        X = np.random.randn(n, m)
+        y = np.random.randn(n)
+
+        self.assertL2(linear_regression_weights(X, y))
+        # assert False
+        return "THE RESULT OF THE TEST"
+
+class Question2(UTestCase):
+    @cache
+    def my_reversal(self, ls):
+        # The '@cache' decorator ensures the function is not run on the *students* computer
+        # Instead the code is run on the teachers computer and the result is passed on with the
+        # other pre-computed results -- i.e. this function will run regardless of how the student happens to have
+        # implemented reverse_list.
+        return reverse_list(ls)
+
+    def test_reverse_tricky(self):
+        ls = (2,4,8)
+        ls2 = self.my_reversal(tuple(ls))                   # This will always produce the right result, [8, 4, 2]
+        print("The correct answer is supposed to be", ls2)  # Show students the correct answer
+        self.assertEqualC(reverse_list(ls))                 # This will actually test the students code.
+        return "Buy world!"                                 # This value will be stored in the .token file  
\ No newline at end of file
diff --git a/devel/example_devel/instructor/output/report2_b.py b/devel/example_devel/instructor/output/report2_b.py
new file mode 100644
index 0000000..f42d83d
--- /dev/null
+++ b/devel/example_devel/instructor/output/report2_b.py
@@ -0,0 +1,21 @@
+# report2.py
+class Week1Titles(UTestCase): 
+
+
+    # @classmethod
+    # def setUpClass(cls):
+    #     time.sleep(4)
+
+    """ The same problem as before with nicer titles """
+    def test_add(self):
+        """ Test the addition method add(a,b) """
+        self.assertEqualC(add(2,2))
+        # time.sleep(5)
+        self.assertEqualC(add(-100, 5))
+
+    def test_reverse(self):
+        ls = [1, 2, 3]
+        reverse = reverse_list(ls)
+        self.assertEqualC(reverse)
+        # Although the title is set after the test potentially fails, it will *always* show correctly for the student.
+        self.title = f"Checking if reverse_list({ls}) = {reverse}"  # Programmatically set the title 
\ No newline at end of file
diff --git a/devel/example_devel/instructor/output/report2_c.py b/devel/example_devel/instructor/output/report2_c.py
new file mode 100644
index 0000000..8b38638
--- /dev/null
+++ b/devel/example_devel/instructor/output/report2_c.py
@@ -0,0 +1,16 @@
+# report2.py
+class Question2(UTestCase): 
+    @cache
+    def my_reversal(self, ls):
+        # The '@cache' decorator ensures the function is not run on the *students* computer
+        # Instead the code is run on the teachers computer and the result is passed on with the
+        # other pre-computed results -- i.e. this function will run regardless of how the student happens to have
+        # implemented reverse_list.
+        return reverse_list(ls)
+
+    def test_reverse_tricky(self):
+        ls = (2,4,8)
+        ls2 = self.my_reversal(tuple(ls))                   # This will always produce the right result, [8, 4, 2]
+        print("The correct answer is supposed to be", ls2)  # Show students the correct answer
+        self.assertEqualC(reverse_list(ls))                 # This will actually test the students code.
+        return "Buy world!"                                 # This value will be stored in the .token file  
\ No newline at end of file
diff --git a/devel/example_devel/instructor/output/report_devel.py b/devel/example_devel/instructor/output/report_devel.py
new file mode 100644
index 0000000..2e9b424
--- /dev/null
+++ b/devel/example_devel/instructor/output/report_devel.py
@@ -0,0 +1,26 @@
+# report_devel.py
+        self.title = f"Checking if reverse_list({ls}) = {reverse}"  # Programmatically set the title 
+
+    def ex_test_output_capture(self):
+        with self.capture() as out:
+            print("hello world 42")                     # Genereate some output (i.e. in a homework script)
+        self.assertEqual(out.numbers[0], 42)            # out.numbers is a list of all numbers generated
+        self.assertEqual(out.output, "hello world 42")  # you can also access the raw output.
+
+
+
+class Question2(UTestCase):
+    @cache
+    def my_reversal(self, ls):
+        # The '@cache' decorator ensures the function is not run on the *students* computer
+        # Instead the code is run on the teachers computer and the result is passed on with the
+        # other pre-computed results -- i.e. this function will run regardless of how the student happens to have
+        # implemented reverse_list.
+        return reverse_list(ls)
+
+    def test_reverse_tricky(self):
+        ls = (2,4,8)
+        ls2 = self.my_reversal(tuple(ls))                   # This will always produce the right result, [8, 4, 2]
+        print("The correct answer is supposed to be", ls2)  # Show students the correct answer
+        self.assertEqualC(reverse_list(ls))                 # This will actually test the students code.
+        return "Buy world!"                                 # This value will be stored in the .token file  
\ No newline at end of file
diff --git a/devel/example_devel/students/cs108/homework1.py b/devel/example_devel/students/cs108/homework1.py
new file mode 100644
index 0000000..7cc6255
--- /dev/null
+++ b/devel/example_devel/students/cs108/homework1.py
@@ -0,0 +1,47 @@
+import numpy as np
+
+
+
+def reverse_list(mylist): 
+        """
+    Given a list 'mylist' returns a list consisting of the same elements in reverse order. E.g.
+    reverse_list([1,2,3]) should return [3,2,1] (as a list).
+    """
+    # TODO: 1 lines missing.
+    raise NotImplementedError("Implement function body")
+    return list(reversed(mylist))
+
+def add(a,b): 
+        """ Given two numbers `a` and `b` this function should simply return their sum:
+    > add(a,b) = a+b
+    Hints:
+        * Remember basic arithmetics!
+    """
+    # TODO: 1 lines missing.
+    raise NotImplementedError("Implement function body")
+    return a+b
+
+
+def foo(): 
+        """ Comment. """
+    # TODO: 1 lines missing.
+    raise NotImplementedError("Implement function body")
+
+def bar(): 
+    # TODO: 1 lines missing.
+    raise NotImplementedError("Implement function body")
+
+def linear_regression_weights(X, y): 
+    # TODO: 1 lines missing.
+    raise NotImplementedError("Implement function body")
+    return weights
+
+def linear_predict(X, w): 
+    # TODO: 1 lines missing.
+    raise NotImplementedError("Implement function body")
+    return y
+
+
+if __name__ == "__main__":
+    print(f"Your result of 2 + 2 = {add(2,2)}")
+    print(f"Reversing a small list", reverse_list([2,3,5,7]))
diff --git a/devel/example_devel/students/cs108/report2_grade.py b/devel/example_devel/students/cs108/report2_grade.py
new file mode 100644
index 0000000..4cdff0e
--- /dev/null
+++ b/devel/example_devel/students/cs108/report2_grade.py
@@ -0,0 +1,3 @@
+''' WARNING: Modifying, decompiling or otherwise tampering with this script, it's data or the resulting .token file will be investigated as a cheating attempt. '''
+import bz2, base64
+exec(bz2.decompress(base64.b64decode('QlpoOTFBWSZTWffiGIgAS4t/gH725FZ7/////+///v////5gWj73vV5576e+74U6qL29e9tmuujlRRBKJ7Yj2aCkHewb2+5zYa+p6OtrC+gwFAfY0UoF897e7by9MnXs3A1QGS+fe91nYer7733vXbDdl97na4d9le7wZmue3z33129ve1bu3Itbe7oco2ZlasbfBMO+6698ACle2DNe5nzpb722Pe8oQWfcs6jlL7O7vGLzenc17eRt9973vhza67Prx549311vbpJD6xx3HLZlFPruzZX3vFOXa2fFJ9xbS8+Eh9NO7y28zPm117mt8Ke6zJu9Tzy1fdup7Pp69PRpavrN955CU0QgATQCaBJ6E9JtE0NGSntUepo00AA0Gg0AAAlNAhBAgUwk8kZU/TJQ9NTynpGnqaPUyeoaeUAaaAAAAJTEU0mpoFMpo2iaaekxB6TTaQyAYmTIPUAaAaDTIACTSiCRoyE0m0p7RT000p4TTIJg1GI0yNBkMQaABpoGgiRIgBBpkIAaJgFTJ6o9T8pNpoZGT1DT1NDQmhkYQPSCQoTSZNJpkAJiYU9NTFT2mqfqm/VR6aZQ9IDTQepoAB6gAHFQ9xERA+qoUCSKL+sggKeyCkZIQPpwPWKioqoqf2ev0uMrP2M/V/pnAfAj3lfHQj270kfF0/rLEKxc/hfLMnv/BCxXzEF8paEyQmR3/2a3n/f2fAvRx1zpzPM03WlLjfplsQMtDVEW07kN7avaUlwr1z4scd6yQWrT4/Tkjm9QMt3dHfZyvSMzx4dmlQpRa9EbQ50RuhyGTlLCcyrH4Qf9nwJTj7v9rsUCX+XF89k9nCcRT/Gc6Tk7pZr5K6VnZWwTHlroY6DZIAGAP966qtpMFFQO1RX4MRZAkEkVkUZFkECBAX8QlMJBkn8UG0RBv/zBpOAyEgWCABa0JBEkhuw22Qcm2GhJzJ9LyHwPZbJ073MHCbzbQK5I6WaxPoSgUFUEBVlkbEEVPusKDEVgKQWAqhMWwj/v5P+ufA3n4+YvTyPg7/16bbMWVn4Q/eXhu6BQw9vG+Qns8LCSOpY8RPNc3ucbPhaGxGtObOoiW6SjblOeMmtlEBO2kohsNejQ9WVPKTmdcdl6VSGyNHC7tV4PwNpVQoHAx/ItljCzhn8H/fs/+7f2EVU4Q+Qjl5bjbJ7oDe2U/yxckVf6zaf5sInwbZnde8mPJHqT7/Z09UL/t260XA3tQxfacDxc9lXOD3QnplFcvTVt8V0nbAi0VsmdqhDpsfRBdMqrf/zuiEz+vG2yD6Xejh7a7jr3CJlwSD5vAa4T21XNrmr6Bg0DCMnWTt73R+HAH4YSsX2LMugmEOlIUXRKHhy1WgicnLkU9FhzqyNsiPr7++V4mhqPX2zPF2mC4Md/lX26qz/rzd0eb531l5iMnc13dcDun+5zNuUdWq+kHWLjWI2YpMeqYu+amm3UnFROrGVVt9MZt9S8S98/sqL9LMc9CmtlsArl/nyI4mp0ciXntx3zHniauD2X38Vd5fPDbC9ff1nyuG280/Aqzv028/98MjMvnLFRW5FNnKcGNONLKb5ltekJdc7+lKU/GlGKSN7mfWO1sfzT8PYm26Gn9+lXhV69MmMZxJfOvdsYWsRluu0NDemXzKMvtmI6IXWMGrLmTC3lOSp80bL71vDUlCd30usZR5Z3vKbD71umofo8FSbFXoUiuA3s/ceMfN9vmIMSmaFBWO5QrLyUcGQa8ClOsOIGOAYVLKyaPvaa/Dk3zvDUvXF/0cDObshDJO+xXFSCEuLeATqIkTpCdNMVMLQkUlyL9aGdGHWaDU/dGfMk6wYNSRCRBrP+vGuDOUflFTkQMkCOy9B+i1iw37N26S4pg8s84x6nCo47XfQ5hAD0a9M+0ijMCEwFqBsPbZ773QjQoaJg0t3+dnQFvTn0kDKGWHak31A9uvx/F7ycQZCcVIIsl/y5bzYlftx1aslphQzHKlAhIVpCrsX/vte516wgucwj603nHc0n3byQm/6BboLQqtHyNJid0ttzms6kcBMwioR+BBf47wcYgxYc8/1SlmTocsjbhR7N4sbra1v3vZ9jYTS1DuvyVvoa+/A+X4qfIyfm4RbKETYtILMcXvo99CsrMiUbbr8fFV7rrqq1wdKNRUcOv+V0t9mHG+6kqBu3mmut7aYj5/BTOdSMbVLcROnwm6I8Hgxwdpm1zlwdssAlicdL6hmD5B/fc8sTG1yELG6c31c9c7X3cwZ4LizIt5fxhoQS1tI/trLULY9ezDfAXaXPLfsekOPV8n9JV+iLMcxUBFOu0N28xnua70af0qCFZ6Bzu+0TpFxYGJczZwsuASKEhwgycql1mribwLCuDIiu0vZPXRUyaPMQOHJlmbiuS8FHHO58/LqdDqZNBJgK3904uFHAIyYMGCmDtJ7iGkRuf/INISJAqsrlJ5PWbDUo47I0Za4fgYZRiCpRaj2bDHlPODsFGIcf3yRv3H8DinFeJ6/GtxISFrix+WLkWVFQt5fjY67J1VlpwuxtMi4xKkWukgZJJtU0qZJ6h6EmRTEwwpq1iCq2re8Iw7bsDDk+maK8wWKtZSPX5TDBZZ8ddXZIQo9wnhoE26DGAeqgddj475LLLfbcNqqYwEoryz1/V08bfOzc8190TRS+bSyd2KjcPrtPRBVcZcy7kIo9jkEr+sn98pFMK+xryMpn3NYTPw+N2A5gHQXsMC+ZJNeV/qGWfnNk6H5HpR1rB190YWU77SHKnaTdQQOu5NOCZtkw7bUHnxttzjaZmZmhz9EH5wr0igSh/TBuyp02/8MRERj25x7ROVaY2gw7sumqNHm6MwR8sEZXncQjE4NsI+e9VijGqY+vYvBR51eRqdvTKiLiEEfZ/Bm07v99cLGSM/jdh4mGbFEk0Hw6Zfv8CDsY3j8RDfbvRztR130bXXR9R8ByzyESaffSnq3P54TKRZRiyNsb7C0jKJywqOrg5Z6d+neX7wwL8zabCC9A049x77KY7DaWNXR3ucjxRSXliVW8eFSXDQKULC+e8nAwyYWwj7JkmTYhkezVEi7y5QhClDdKNS0LzeVObk31oFAaXnXPRjqnlwvv6PfG0tKbLgMdNz8zN2kTKkwpw055GRnb2RIuZhNI3BcffydvSejFBD5mhuRch7pKSHaQEDhynslsntHsR6FeNzHH5Tbk44osNBvyICsmTJCnxMHKwKNczsIhlJfk5idiiGPwg/vI/mWE03GDXc58tA12Y9tk86FjbDJm5SNaONdtjt7MBl5W1q5eAUQ3Y4cQgJ7S8fr0trY0xMSozBVK1sm0VQdFqOp2ODI2OL3bZbECuOSq4PqKMmb1E93HcRvvgvEHN5DAJhDFUIxQ4eOFBFHY9JDHkYgjHXliTCSZok2Wx0o0Nnn6DmOJh6P15H0oJFg4sMJz2zGyo7CpPK66+Eoa4U+ZmUy1g5KRZaD3amWBijHEoSopZOkpk3rC64iyQ9XDDIMjtEWYWluEiQHkXzwtmZZW2pJOW0E5S2bFBHZO2Vwq6xFoRmp5RY7VnlIZENhE7AREAKfsiX3hRbW/c68L1LyLqdI0jr8NL47cB7LAjAsoEmy30EdZn8wjB0tHqbPRmaKVvRLqoTJo1d2LE50m9eE+vZhx6czlaNysHNtbY483eOu/UjGsb0wSZ7QvLaR3UxXJT/k296jfx6TVPoO3nHBrq4rdGh3UkcCdiojcMI2wfW58KB9B4POdcAvZvozZ5Y921eFvT4K2PIsiBxwwxiTBBjmJc37Yr3bbP5x2BTth3PP7pYPPa1xOOs2QmBweVbw503arjsHGqh+vbpu2MXc54edYUj0WsalRngHy4s5TgjQHeq4dIMi2UFQSElMoTC7K/B0O2t63jGm9Ti89qm8e/OSinNjDdJpt6I8Emw5z7bbGOh3463uwtI41R8h6Qbc5WCWPwFRwtlYS+OEtTnswOa2Ut75OZUp1CpVXXLlbGVw/Bar8ZjrN0yk+RfiLiGPnmV1vX1tWWmQnnYYt4yJ8zUqC8QgICpuaFfVqKGtN+XzTx80HMrwEwGvDjL8EZ9g32e+RtK+7PkWbenZZpt3RDepffX6D59XYHL4IUJusEfamkJvU487EJio9z8289MbqtCTWLpwoORaA1/H+JF9h3mgctNWCaqNeehaMVoNTcPGRaghCARjaQ665DYZECmF5fZ878I4ThRa9qjV3iKuESOJWhbjzE3XWnkW6HvHsrph+h1VPraxParMsYlppoZq1UlZJR8sohWVdkoVVz/UuyvWq+oplR591dL0rltpnBZ3h84ONnIdupECwDzBazYyOEYbR163Npzr+ay4MdKyA4fj21/hbjzsrl6YspljLDGqk9lvK7msrppmk72vSqvNOjgEPHPVITJMETJBThh68e+pmAVFq2zYtkMCiVHeqE2CR7v4WS/cJTmiULTlUhJCnUuEd9DXg7sZa5wfQt22Xvw255el7LlWjf+m3PIz7sMDF0YKBNvum7qyWsewlRxMF1OwpKYYmBY2y6tzDB+bnBZPjGqhKGtQr8bXLlmHD+V/OJMprpKYVUY/LttkX+38/6P6tzV4DsNdwo/lljPUycxVhKw7+am25dqP3qtWKXV3cJvtPeVqhCqNsPLDgH/CFMXkAekM9g9D3NiGFP2mZQev3+j8v/5fRt95Mvn8MZiHVEKy4WJoitXr/AjcwDjsfhz9Q4Hd973+CIqqqrDmwOjo34FenXUVE7RlEFVVUhptZJshttphDHLstxQyLPgVFCfDGSvQrXCttltlW2MQqxgVUqFWMlYKFf2WkJIAlXPc8PBInQbujmSlRwEgvB7NaLKMpNOdDQEmiAxJOvSuS5deY0FHfOpOhMFJn5NmhiCv2R39Yfm7e6if+8xvan9bxIYRG69lMb3TFtKs8uSYZGdMMKwujbHT9SGSUvJcPnh1UqZiuH3ULVXBRb4wr8PJgu5n9mKgfDsk1W2Mq6fD6t2usJJYl35+AYLJH4MVCkbtrrrRa1Z78PPaUlRfHGTStMLciBDgTZNpJE3z+0MGrHowfUETseW+DqZHw1YlkTVPDiUwf1igRJ4Jm8oRUwzQukIb22lXKVuHmYlbqQwLon7FId952h3dtpdPkzeh6z8PhtCzesqbnUjiMYadKAcLWWQS7rxWq7MiMBsEHUmIEP1bDi/iFB0LSI4uDHh/iV+OuNWrsLgRUxoZ8jIsMLBVmBUR+YRgFzI+bSF32mbsOzcLJQhFOC6Df3NgliYM6yAPTOpkRZlNO5Yx97dCKhImIzOrc1lpVUREZShpIn2xAauohkfQdk3xT0524+HbmydbxkhOaiypjeWpu66XfWcy1+iPi7pp2plnER8txO0Qs+sx2x0xottoIDBGqjFE7wPgovo5JB6kGfQXu14Wz29NJCD7hx2Ry+KJ/xffj+KjttmK3eqmEcqO7+JcjOkJehd3ncVvZZ2T4eFIFsXXD75PilKSs3rJUVUX0qWLOP1TCxvdLR/yzxyrq1+lNJqOOnTWND5SxmfYSshEv2c44zNZdovpWG+VthWqdN9kPMwOBDkG6dYK7OUuqsOGvKLseqw0uMcd6d0rEOmJrEX0iySjTmdsrSfcv41dK5+nlvYeksGXOrNomh+crSRUborre94Op+ze95jxslgurKsuUrFWVu01D4XyflP+SXiiu4m2so144ZPbrrdZXo+wt7JmoRkV1E0bkkEDs7OEEvRE0zpCP5OTEnyLI859N3pjwJvI9hwQeDEUmjs7G2vTaBSSk6XVHzwl9mpPsT+zrv2jXFQ2xjUMRt8Ho5eq1XKpPz9eJFvzaSrpGZbZRvkUMamSGQ7ORMzmmI7oeUkOORGTMlcUPpaJpe2n7XEXiYb3TV1ym46bwbfKG41twIIND+XDa/b61jV+Unb13h0R13d9U+2pMUvwQ6X4Xxfb2uEncn1smOSnk65+r4axs1YzE7Edvg9Vbjm+XPSnKVp4+Pz6zrptqcpyshI68bY2crzivSvQt2t8JGlpeZnXKCj0nh3j3x6fTsQcpIfj4bqR51zNrdKn4vx31Wl5qfk9ei44crjftmj08X8qrZbdr2mzf636T6LWa4fy2xB7lgVeH67KHdECf7d4Xtvcbquq3uvpeRYxFJ1Lnrgh7J3fgRcp89X222vAsxM3D+XtN17sZ5fWfTibNtexsjKBTrzkfKJSgh3SEgjXr7QWfZ3aM6P3zx0gBJpK6kA312qCxBIFpJJSDagYNJmwIEmsTNlA4hj3RX1Tz+LEWl84kgMd65cPh2lwdYOO6Q/RtHYRMEqAa+a0vKqyjoxpKCVTj81IUhx3JXOq5laG70dGqQbllfe/dftV0j88TPDQ4n6cuO3T/lOtSvk3nRJPtxDcls6aKqqXGnzwSm5WzZ3eaRE86maVJPxClYTxu9PKqn011YTfaHTDTFmOnofd22nHMqIZbkjT93fvmvVx2y46ddOXJN57NArVBuRJ7ORGyJSBOx2W2qyYh5wcr+kY0lfXN/bbHjSl07rJ1JeQ9NS4w3Tx31GwEW30IYxlMwCWOEPOx5ktLGlS5U5XbrppYz8ntGFXz0yE15PHK6svXjdye0ENcxDkdkK8UQSyB0yZjY2wZkRw414rn1VF1Y++N5fIrJS64xkZ/06VmlRfc4+zcXzrr7uSnnKvlXddnP3nci8Qql4eaG0uuL26O5s76+bN7Ol2XOzbx5EaM9SS3K4M+6WlBI/pH4V65YOnGGrG5AbnKuwkJ+2jSbdwXddIsRnU4WoaEWt15V6irnrp2WNebOMN009IelMN+jEPGLxCBvsdvIRLzCEJNcbiR8LiTbk5pw9RxKwONVQVI65jZkBUIttOX1q1SUdV5BMdl43xJH2PjBfVIiSj4wRB5JuLXXxcngeQ0Mu63DS0oesTNeWXHIUtp8x4+BQeIHPd7gxNtwYCYBMLFhpO2QZw8iBSSFlHDbEcaHth3K8olS9KLTe/MUzzrH1zkX0ukgR9icEhKoyU4GyPtJ8HCF9pl9/uYZM5LNNXTLszhLgwphqNxZK4+MqOITRnSCaJMMxNmpfAUMGLBlWkjUQwoRWIezYrlwDgFc+ARozHQocsL8Q1HxHLbACRHr2GNewyzS0Ka8TJ+f3fd5G/GQZ0B7IcimSmWFJSxQvH87IW05Nie+bXW1osEwSoe+cxMa8xTIQvliGq5UW/gWYth7FvYKoMeJOgyekTTDEzF6GUOlB87JTAdAahmZQ0VBFD1GxxDjSgCbEuC4BiGDC2iQIUFxiwpoSY+394zBTgYO2hzSUpnR8i2cD+U8BemM1YejPrWIhJY4+6cUzpmFYWyPY8h+iFhz18KMolJzjtuguQqAxOJfUFdWy3pb0MFQ5Fb13FlksL0xI5UODjgthHs3Kwo1xzJXlczlyrGQStPWOaWtSgEhy4TCEad/rwNeoMjYXHtYrD9U5YgoBwehIPmSlB5WbQu/WCeQUPrbNfoPhLvfz0P4lX2n0tcGvzsPfRGobAJvG+um8t/Vx84/PQa2qrsGtQh9VjZwmaZ0DwTT0S2JQuvVHLQmb9Qsdxxq/gPU7HyEBcx2/DQ7R/j077nqaM5aL2VCpFQp12xzej0lOrAnZNL42eWCkFhe/G9qohtokyZIST2JVTvsOwz4YNMoVRFUaOiB5NsmngthhO/a20UpNibiqSLhDiSgYMyo2hX/9d3MtzIVvIY/IJ1eNfH0KarjLvaPpprZTGGmvLSnUEsG/X7l97zerw86sWIiKs1S4ElFiyltbimBZ2mGY9Y9nOIKziLpy83hO8bp7uxOlG4BfmseIZhYcUlvxhL0BpXZqrIRjPbTfFX7VHjthxavU3pPWH1mZ7XrBToT2lMaxWplKIjRcrK1rLBaYnGHWYah0OhbPYhKcxALOtO+ii8Yt51bp0+2oqKL1ZNGcskmxkdEMYVO84HHQhCILrGr0sVrWh6a9aksWMRiMziknatPCqaTvjCrFmZh7kxh1l2eII1TJC1lMjFLVK+p5+jod/ATzvjazu4ONwwp6NMpgoiiIzjSor35A3XOUcFKsUcYhM4WuqfF1KAZBGZ5PT9drJz0XuyYK4g+W54HQ6dJyVA/DaxWPx0vM1wTCjqmXXMoSHSt5Gck6ENx6KseN619cZb3e5LmUlsZ5mcaFXPGahXvHGn1OmdFqbzGVey1OaNqWpsiSEXdxnGIhY1KqSQxkgIFF5WVU1fiXQQJkKGMWrzV7Z2rMvM4qsRa1MlTivrCNW6xZWc7TjFKVxGr1xeVri8ZyrRs/tvvgJdM+77bPnc3UzgzmMPJAmvGJ3vFXz40bmtZ/Y+RcZvbAFcbDmeMbzbpuNbEFtnu2Z89dmqdzGhEZI0zN63cIu9QyVQ76ERdLKRnZJlhY0ftoPxTaJtleaLFcS4XyMx/yI5G7p0qqPxtDeJIqSyZjDErUExBimdNHPr3dkqWZXrbYrQ7lO7WuUkVTnjPxDc0xKKbY9mzvwXPXRGTkvG3EYm8D77xaRgW+dpzopUzIKKvKA+YOP8X2u3tf9n4bo1+h2/1t/CPbdfOqH+97Cr4KUdHoInFl7NejhEkAcDPoIleSMXqyvXPd83vnYcepftbV0c79kUFXdlw67wtiTfej+IP8Br5xXniozTqVOUU0xbI98Oc2w66rLBdvfFcRuAxfPwTHnc4TLgHbsxA4CZZ5EhVYzgvq8JkjUw3xmPjVcIVdLcnqRCEa47w1iYpFrpI6QrTbXSpXQryzqlQUsTWMaOZx50zPlGJnXs9V2v5TX7Lz91ei7TMYymJhxVEeRJ5fR/Gg3Tt04cz73z++iSC/OhWRZKr90tJ+hyOUCZAzZBYElYTKAVgoQWChALg3BuIqUSrqVgtAMeI4bA8vtkcEeH6bzftjsh21xBPrkZn3300iYo47+/H06Wd++N6O8HYGOPb+NG525T7CB4O8fJRxFKZKciXlquhTZauCL++OxRUqnqh81KHwZQpifKIzdQoTxbb8uei2xp42bcTG125TG98BXpX9s7dIM+m50Ph9VC6asUcLSbaV5rKvOkT6WZVzusWnXiG5i50M5lWRlKOn69jhvorJ2yaxvBK7m577lV8PyEZ8rHt2Ojlx3Jnnw41GM7YNCH1uI0yJ4rMejYSaisi1TdpIp2LqQmH4hkPvOMaaYynaxsy1ZdqxQ8DArbj6K5eb64Ljd+uBK/v756P+vwHh2quR0gzgwsgqs8EOgDc1C/vsMj6GjIx910aIeUFgXXzkewJHFkczhwv4v+yWbQ+b2fEPhi2oKq8YHT3BvPXHBxob5zeXn9iP6z18nD4JLX/y/4UrDs+OWjAaOOzkxBnCMS/PKVXtsxAMDpPM5CkIQ/Q6h7liWfp7adyMMj84RtE0BIdHe5WVug5hvMO1JmrzYnoKrqAOjayj/L9gev9l4Pv0Hgail1nEPSeQtqJM1CGbyEPWlZ7usDcFgF1iGwG0hDDNeI7M4I6rLmD7SW0+brHOflV2n4l+4LRtGgxhJhzi8d28UOd2zwloZypLkCuvZy6HNsliDEe3E5hBIdkzbvN6ewMdc8xWnRB5LiCQI2HRkxr53kWMLt8M0ZoJUWJI7SZhSluq+5vAwEySU1ML5GmowlqZG9+AaEDo0NMctkWEFr90swdp7yvEyZFUe8hLIdr/L6QsyPocWqqSTRQHM2G7iCBsOYQEMVpIuPaSi2fWVnvgmfRYcFy/KOzihBC/XKaVqI7tgfV/NgWDKCPG2uZl+2jZMak3NK43OT1vLkFlHCGB08XmCMciEf1D7SHp68YQkmUj8VkisWVhyv4T6GeqcwbnGXb+7kxpv5O5/sjHKrY+1miYUeN5KTEzekRUJ5aSiFtgvjwMYrb88/Z9H5uANvv7MMLB1upwTIrcTuxuzJd998/NcF2vF1DtiIxIcrfsyZm+AJmQv2rRGCBrKWCHt6JgOaGdWlpTtr2f1lRQSbgfzrnOSEyh0vslHKUBsvY8OC1C5Oj49876FmvqpplVEUJlgFfc4UsVgbITx74tZXuQ+FOPb7OLwf00YnILZ9fiu7zU2vEvdOO6eyVZ292SprJrPfu/NPgWBPlUnRS/jqeZXe0/E2kg4RaHp+93C+b4UC3x0qTlXAnVE8Lax7vaQ/iE389qHXkJzGH31UISNxJHFkwPKCFp1T9GyrMlc3Djc1yU+DwqFahxDQrFkhCFqwkENHcbT2h523PamsyeZcX39psi+E9XIg3Hehx5Poi/LF8Ke/Tqpbb8L7acfhX+7nMSPu/TJ9MSVOyCO9NCZITZdxZ+Md+9e3LlCbfe5jiut+TZcEk8bWyvyHR1crqdXTCVe06NZKjEzhzKORM6r36vEnFvNQ6/keMUUEPaeM5rE2+0JUlJstHaYuzOgdQehlKaoo7NTqmeUWTymFNUIh6LVES66SqjlFDcnSSQu190PzTit2xCwccrnXGQ6clww0SeZOpNc2TRhUU/JTm7plYPg3H3LumfNS/L1XCiw+Slehs83RjCvhSmb7qGFQ1ZFLFGKCeF7DTsNc+GvJxnovBHLRiii+FuBlGdNpzaKcem45a+PZ06BnnercsY8aCHqOPvQUiiPVoaptRRSIY2zEwf+I7ZnVUuWPUxah/Nm5YK8/rovzeltelli5xRHTtm5iwTuyvFr1OqDa6csRGXY8Z9HHbBO6lU5iTSRis+t4KJ6l59XJ4Z9JXwk5CafKrI83BzwIWGdnnRalc+uT6TfJbNboCtBws6RK5StpVT28sE73LNeuhwzYsmzOhNmeGL7Xh3Fnik/IyehMMdiana7tLdGS2+7CKLdFdVJwvwnBPvedbnzzpHpfi34v19tjUAOy3/H+Pn6/L1VYxOZM+MVnNbNlz4e52Pt/b9kfZD6WFWYifq4/dwvpnrfhfPRXexUX1ejBi7wG9hJIOmMRtOZ0ZWR0dnY0q614vEzjtZ4PHO3r2jC1z70V8OP8lut1VW7q30o/L6OOdC3WWyOOM8bWDkdh9L+SHB8jqKHtIgYNFA1P9v1U3EQyo1NoGxxCfKpXyvUj74FJibFiwBycNWZ3WCNwmjPaBDojyT7KVPsZoIDCGGIyXV9jcyWYjyPMYqgwCBivrCyQue4FhbSv5bhSDnWwo3TFoYpkNY7W8BUMOOgUM7NA9yodBkHEAG2NBnZDaQ2PQWQdofULZuTsMgu05FyMkCSLqgO0KWoSLqPmeKDgY+obQeJ03mAhkhnPxz1Gt9eCDBKli4PZYMeI3rbFNkNmXotYvYv46HzgijlwxdwFDUwpplnAekdDkLtIQIrwNzu6/kSZhViiMdQ6e6gyDN4RhxDPQqinghmLPOCzIogqMAxBEF0MYcodJYMg58lceyVDkDmBBgUkLZrGw5HQdgcMzQRQ4gXwYggGpJ2O8RAyFpjQTsEXNv4i6wG+jcJTZOA5BpIMMLnAMwsYYCQZMSWegKE+zkId3b7q1lr3TILksQUWCk1ghCEdANoDszUA0bQg2sSxWuJsRSh+8ECoXNIZUSiY0aFYIOV0VQneRNhoLFGX6K5Ppd/x6w6E3UfVCL5YU4pA5qwDWZeOQ0msT8cAWEVXoLcKLDy/yyFGlfevj89nhqPSfo8KCVdl0BTISDIQYCgGnmB+gM7hQB4gTSSaiwRBkT6hk7jyIe+bAxBGe5a1IqrAqAgMZaVh/HrNTmDBQRgfllIbnnMglUUpUKg6QNhenIGly9BId3/iyEQ9ZQwaNg9WCLUA9QQIl4mHg3tg1bKJPsr38xEGGGRWZ21rNlVGbUi5lHcdgKWHQiEf19kL4lJ5Z3w4Acg/HTIwlEFCCMYgBCBAiV7o0Ai9dSgzhA57JC+IwY2mA8hjFAi2PcODniBNrrkbIkBkLhLAulK8qBKtrodSnaGxS4C7CEfOdwaipjeHsh1ccHzCIJ6DmHieZWAkPFLpJqxkjEnMhmATvP50rxJv6g4CH3hBToSARAIkTXnAcjRtidyRBk6U6wH3W57U5i0E7ZSwGFJBzAXd2oEIkhCCMICEQNByhJ9+uuIbQCpJJ8yW4wukWtoRpQHmKMR0TqPmwJUEF6cZxENR3HPWA1c712BQLhiSYIKhkw1DUWFzEDiOhuCrIP6fOpToDu0ybNslhZdBaPTtFCswLlzqATA9YYhj9fMk53buUNUkS0PuDQR5NL11bBxHACIHIZdnUO7K/JfQLCe+II/xDwfDcXM+33pZcgfozRpqFwQpNRstiKTRqNv90pIfXr1HtJ3RjkbKxoUA/XgLq9v3KZ+RCoh1Ffl7DtSwftSaovEwgUfi7egs6/lP/nPJTePzG0NkgxJJBN9FDIMAMvs3eJXaH98zRgkI30aH4DqBWBVbiMa/S8/YYsvp30tQuWMB3Xz2oS304h9ow/KkfS0dPkDcX26Ye5mt7PXQORkOru+sh3Nezg4xLD/2youKpKCkBV0Qyg5pDLAfGEbEQE4JYlCyhg1UdCRjHxoz0vFJDYFvDzn7DA1f90lGzt9AyTh2FEMJ6ahQQeNgYdfngGcQyLCRU7F3xTqPK7WGzS9WA1AgE/bo8/yxpZsO8OF2jGEkaSSn6LZ8HaB+ZDdGdHh6B5ZSgQ8abzkeFJmHFmvnED5fUGDr2fGxjZmFYMqVUQlAq3noJUDM6pgIZaBMShDmD6VYT3FhWR6FxKDSwF7aQYwZZ9zCwkHSkQDaH/AYUa74f2/hMhLQkQayamGSQume8GD5LJMfXUT1okURSCArGHrLF7WhbRv0svBKGGYHr1HUcO8z06WfM84XJUVc+utoJSwhz2WBY2lcLSQShOZLxBtCVjEJW622dVUitZYMEBdxShDC79DKuo6xNQFVE7yMWgpaUjL5BrQNXSwGwTGhEHtesppbTZxNsLkSdm3KHLR4kqVOYib290U2wQkxGhb/qMCfU9N+mn+BiGTsXKhJRSFM0uyiNAS20tImuSbYBkAZGYtxSgpi+5LTr8R5Y/D0X2mT2xULLaxVvoMT5hn1fT1Aagkhze0+XFRmMJcRoCQrMEtlAxAWwxaRNg6z7AlEVh7HPcrk5Q/mSSd3zO2ETGIraW4uFHGMTDhGW1tbRW0qNpI2LuqvT4E59pdrWOBtisaHcDQHhTeG2HkcvRQ0f6oz3P/AqEykTWbAm+8EFi2dYWRiO7oErL0WWPeH7Y7DreviQqGwfz+mh95AOE2BOSl3zcbnezF1x8Ql+83bQ2Ft/J+xQHQHcSAQQJtYynl82DcTxkA5XcmlN/MKjzCgtFlHDWSmuZAQI+Qjt3CYLGYaoLCCTHh6+h1cp235E9Ttxz+S1ulm1F8i2gEpcixUew7slUqJhNLPkejLvBpVdFDm1PRdxKLRCyhJow8pIEI2Z8mPTWaWGWB952ArH3pzmHNGG2Lc3EUfPfHzfX6tG2TK4y7Xvsa2N7Dct9bhZqMMFBKaDTt/cR+hbTx0YznqVyKQxxp/0dDVmTWIC04ktJ5xjFG2/TB0RryNPnk6HLOd9r0IWAyQ3foOMUs0yduyISvpUmcjlJttOxIZMap80UIh7auByZOr4OIJNwvS1I9+Xa+u++ICRuTLeRN/Kx+HT7s3iNpw/SCLZn8iHMfbGc1qHZYHpoB5IPGqG6l0oHuIKEJbCgfUGVfdyXiGm4OzToRLbvjOCC04VFySw+HkwyCSAmupnjabnWWVkiitpGkgkpNURUmr4LMU94gglDgJwfdMs6uq7NWgoeHpKCdN24sdKWtzEntxM1vx8rN6s4etakQWitjKIJorMyvhw7UrSw7Jkn6LeVnfmECktVbyPSiDCgak+qrQFuUG2IsHKNnvSLmQdsWxKrBbN5y1CJniF1UlfTlvyaH46kh4OuXZoBCeit06jdcb9CqAqwH7mxTGAmS8AzHUENobcsmMV04DQrzB+L2aU/DE0RZtlHMrhNNpqmLqUiK7qiqIWI7YRoMKEhIOqZDvTzi4lBRhFIh4e+kd16Gr29XenHcETD+IeR06dGUUmbAhNTVzPFs3sxwOG7eAxxQOJuUaXLPujiJnEEooUjyhHvbfHPbONRmp07TzmiRp0l1qVG1u7uXs+sTfOMqDenkzGC0VlNrVHmiYWRN/LJmB0yGgkIsiYDc5pA2BYGSm2JRucxyFwMFhIIcApj0Ga6RiZhmCUDbmXVAqCB00EODgrYLM0VVmuoMLjZR7SLJypbsDOKas/7ODOG5Ms0o0FfEnYGnQbEzZ1wh+msEFEgiKDEsz/RuDKAxgGxDNkOUxbujIl+Ep6mLoiVihzlT9NuVJopGEEU7iEITPqyAJpwZxrHHD0VA5RwZlnZ30R2GgNa/3GTd/oKPUGDHk4ms6WHkNwiugydA52h2sOgmpi9AQ0R0kE/Bw/dRC47awECPeXuuPMy5w0GIPvBi1hdIP4Wke8yEZo+PHfI4mkE3kp0Ljsi1gwGaJRLHcmMZZ9C8AsTA0okqIEogMAqCU4h4nsPIwALsfy3C+Djm6Frh4o/gWZokHYlhDQ39PxRnxG0sNgEFBwWQNEB2udga3R0KrWpCpDYO7vghHTuyuuHypCMRBhBkFMtqBkbH0hkPkNPfsPr9WXHPxdNk7hPviZKZD5R4yJE2oNAmHLg5QoHLGKHlKFw8jmDi/EAEmctAZHYcnEE3nC2xEMQcBZF2oPacw1JkSOFcks0GlhmbcywHbcCZr4I9v2k46xCSB2SMzC/OBJkixM41zMBwwzHUWIGXTy7+tqvEz9/GJuzOalD2oLJJ1AYLf87GftkKEXZvnZtsB+BlaZ2TrYbA+rh44Tw+iIcxNx8nJpFWM1mR2GsqgLmE448pfCl4pQgsGLUzGxZ0ay1aZWyfL7RMHGb7AUYBwQNE2pZFIiLADYlBowvxj4hppFIARYLJAYpBTl5PCzBN6K6NYNrhi2noAgQkRgAY1dSfiLRfXaCggw7o3QbI5QmMIkKToBIFrDp6UP5SSEUgu0DBo5V/T48CbxV4QCOQYsD3+c4wYQ9serJWnposT748EMPSRzDVz/N/3xmPsNDZ4g9ZIEDwkLKGq5onjVZkWlIdon7IIHvOvx98rzfUeo9i1yjuSTGQsQY0sEYrSlYVLBCpCwhi0wziZbhCGQYIoyEqiQogUssiogirGBGCIqiRZbWShf8BClpgZEZhLGFPRp8RpjGIqo/cG/IO08cnXIAmVaAYQJ2jCSBxkUTUZGYWoPmonn/Mfaz9MujIAzNXQW75+OG0fX8INrpbSfEHWZCXGHMMGAwh9hBcqXuDUfTkTzy+P0Hn0MuCLDRjA+fr7ig5y51yGQfl/KnVC0ugx2PYyzDIxCOgRCZAVJKtMNF8xkAwaAiRGM4NNjMzkKowftGSaGRFGMEF9w0Jmbdd0Y9xHgzd7BiEl6qPV9uyPutJ4zxYzEZ6T9BYx1Q6wbRJAl4tqZkw2pi7OS9MvzTXiKGzChTmPMgb2qvev2mtxvrWsTeB2GIbhX3YPlmaaPu9h6zs0Q0NqivZC7pTcQKbKRuA2sYBEN5HLYEAIDsWUCERBLBSNgQWziziZytwOmOlHQEAhBR2FvmNQ0nCBh6ZGTfdwjG1qiKdnjzMHQeDqTZNhtXgh16bMh13vtAooHse/rxc7SBHqAgcL3tAjuDUbUEEJFkgiCWwhe+Hj3cDHBxiethnIYwVAL22jIYiEXyQagshBmjG1Ep6iU2RWBRW9zDCYUbymmNly5zmRRcWUgJgRZT5dw+6wLmFA4EH5krArCqlYtIljIKClSjIIlIrGKDp0mWkcH6n0B/ObQMwMx1BsDTQzShOofAYFh4HWNU1Wq0VjNKsI48noyy3c/TIzmsv8+1Do9xEQVBIoy8TPaaICBDOU54AhmRT50RGTNAAxsh4GoM0DwzgUPBo/OtCEhBw5iUBnaFT7evUBH8EH9jK2CSKMN0zIn0Orx/Y6foK6PsAkSJBDx8dnNmYWvrtM2E0sNjB9JmGHuVMOt9Dk5zRM7IeHicVpemWQstDH3+/IrY3ra2O9ZIkl39qTqXcqH0t8C9K5RsiKPZJKDazN5aElj5KKrsFjIgGxjQy3ut7aLWKhKcNXWJkZFJkTtB8CBvOhf2hsfZj4MyGl7R0vhqDW/I9EU8SfSGsAJFfRB/sICLsCAnR5V1ZhqFqIwET8nh9PUUB0yfE9aUP4TBEkM8pssVkGPvQYqUaclMjptjQxCWxQUUtuYTCSH7xeLJA9bJIooLAPmQ7xMs8T6swyAobyixYE+P1HgEzIB3ZgHcP01hZKK6eOMemJR5FDcqESQe8tzWO46WuVNbTqpWu2Q48D8dbcklVCdcxvjqzlA4C+emaLDJfjMyCmewyC1hnS5dPV2I8LGLxYdMqDqCBk6eEGEJZSgEips2MbBtlU2/RHJYkKvaGyrQhSV3BEKKh1HhIanbF3oLYzv6i69UQFIIyIJBVUCLCQVgwQEgKQOO3iQU/On+5BoYPEOwtR5Kvr1kShfGyHEJO2QRYIMkBFgrFFRD3ocuQHMckGQ28B26MdBAd4seLBANjQwTiYRM0OqNXZTAyIh0HSDA0UfcJ4efSdAvqY76kG5CD0GkcGezazpBAehuQfPsPUaalohGQQvAmoAzzQUDoL4MYwD4e3fpDxbRF4iPoDGvp9ZRTCSD0GC35BkJ5jWaFR8t/iICaQrNC4ohkY8W8/AWHu31BkkISQhWwxA4Bp3nzO+xXS+3ZQbgP1g1kt9HX1C1k3eQPtxnhORMrRDQLNlc0Jqng+5EMmgRBl2g7yosKxeyWoIzTE01L4TJvkdZWQs5HWi+dXETuRm4MtoU/kfy9qPzTCRtg8OzbhAn1s6bujpQwLECgJtTuDu11niXdFH624GgCKbvLnsPOMQfKDlxjsez7eYBCBCMggSBDIEACBMcOBT/3jLu6/rp/ignKIbMvA4TYhU0KdAc+HGy7Vapb/JzrdHJYKxNlY0lSlVlpVqGDOcSCu2mEF/aGgZlL7mKCjbCiRwVLaiKMKrCVWsUbQrVmjQdQoMmZTQRYlziRUolCtLBqVLTbQ0zRCaACBkWAOShR/dmG82v1Pr1ZZHfAH8lU8ggbSEDebq3RYSiIV7uAPQPVtHMoBBPepdCyXiMxIDBk9TiXZ9XT7w4EGrFYN4RYgbtQUcJ0wh1e7FiDODUUWSVIHaWDYlBpcwY5/kxKM5lQCDCLIgUVVtfZNlFUuFG7Oe8tGmZhMzDsa2ZldoAGg4GPVm3rWF9lZRnEaaNQrGsIk3exR77AQd9BDaSYgIAwH17/GiEWBq0ffYLmIbFCKGpG2MXwF3DvMx2XPFxybkhEhB0U547lqILjZk+HPWyNq1lZBOpu0E2xeFGesqoEOJmIY0WMqO6EyNHV9KiHH6mm1/YHMsdbc2lovmhj9+0CQLqp0/FUjYiGn6yAsbqC9pQBIDtW/2ONqI64eWAdvmDHERHiJYiVi0oJSKiQRKILEpBQqoRSIxJBaiywUrYJJE16sSzHM3APQRCnIrEBpDFgYsR8sTWSIIcvkjeV44rUusRpzXCcSQ9y39NMU6tag3dQajNgGZrLhkzpOYi4YeOqNpiu3k9W6h5nIgOA4OSXQxQPzRFShyMNKNAdRoLjN4fDa+zd0TlSUZkKYJxmJNxRYryrbfdt1byv60EVYdTroMaaQme3WWu/lWOKyQgQIEhhwd/DZBxDQ1pYBBlZUEzpmGQ95NPIkpsDpBllEqk6NSqlu9BlYQRYIHVYqxkgWDGQQEEVIwzm4Fc0o1yaZ1NNMzOEzMJiBeGUbTIwViqZUaVvFIJVlsQb8GMO9DMiiklSFFeksKAIgmbxSxUh1clNUNLHY7njLmM7Ak1nVualjzd6XpBrJNEGJsVy0IUpRAmzNJ9p3uDgOmcE9JaCzypnaIb2FgEFkmiQ1wTbExNkVMQRSq+hXpMZJIJvHULQJNAhYUBKIoIb0xw6OPoL5fE3DYZNDtEBFFPvaGmTg9qAIoJ58FJ3XqhN6nWnTWrmJLFsA7SwvRmmZILNBShWVAltljoYBCFRja0sIGBLGUGaGsCUkpoWBYXNKShikWAKLFgKCyKCkWIMCCiyRmrJAjF1i4AoAPS4A6yBZmuupHUBBUdQxA0kvPxeWgjLFDYHWkM9oT/EiO8okgDrUK38dnPoP8CHiHfrJBWTpYBGDNhyid3d1npJZOcLL1hdBAXkRIQVIdjhxQbNT2VBVNJoATDpi5FFtQaDG/U4sjp68FEC0qMgmRY3coGiC91p+qZoGAlFgyACAiAhBYAjBYIhC2BQ0KFBBi0lhShVkxE8ucmNs5wxRLawRGIgMVQSGlOXN6XY4MfCQlwtwUFdIxTD5jfH7TdU6k1VzpiP1hpjLvc/sPCFhsGrsO0M+Yxzfdhntqok2XMDayVMy+ANa4GaBH5BppNAajjRmmtNZdq6C4S4jkdxYQHxlHwUoZFlGggLcuCZCDEcqULA+sDjFTHMQPmFoaSkHQOQAdRqHrM0R/pEfD8J2gI7VIxhCEYxihq2lFnfA3/8JXkyNihg4OVhhoMggmlyWBPtoQPQBkEFkSMihOmhQQLKqwgUERgBWG/cWTJDcKEmsifzI6IJo0NCoVdKYWvdDMUt3kHWRL4b1C4GyRcbiozAJDMcb2asQOmJE5neAZJjFE6A7qUMRhfwWBWFBgGyGEhkZGCZtKhnKgLokKJ0Uood2JuKGkzK74/0aNTZrlwrYFq4WGDcngAZZOYQKDIN2iSLID3Ko7yIq9qwEccWCdZ7H2/kp9FyespUrhgUcMWLUnknpXWQCIhq4HZEH74j5SIFxAILO5OH1IRcjAQNOwvM/4qXGup7Y9nOQgQd+ajyEHmD5g19p+j3bpFMQkOZ7Cr+6WSyGAZVkjiAPkPip6lEMmKeOw0+t1wDsgyeuMiNcTmclkT89CUCvmYE9pfTFmeNBj5fPB9D0Qs71C59cLJmacTBCBITSuCSzWNAEFhLaASAwGkzSQEaNM2Vl0iRwzBozHMQ8bYc+8gHanYR5hAoCCCfukeoGQYHEBAegqIEBWwm+Dd3XWpHlWP2KjjTHs4d3lTusS5yw1AESQaQ11KVnSarq6o6oUGhCbZ1nqB5kAj2bxf4hawc1e+wTQpIRLXuHVvnv/HwLeUkyjYfqDFvG8LmuyNmtZXVwvhNu3FUjEXxmrICaNTJhODs3f1whmQ6tdT76LoB2bmBNRVVkggwBBJBBkikUECSIqxSMgMjERYLOtGMHuMpKHyR+rEChITqbJvlz3JmDklEqXt0nfHmROrroZkPGzMTPrxi5xgUfP96RJP4fXlpCEs3ZEs00SmtQ9LVhpDNPNM5SX2s+azWaNLMvCJtO6iluzeZLskCbuQYLSjX987+g+idbacUIGkKoCA0RLVzzc2vbWoCCGFHWsTTQ0RTPmMPFMQBwHz8WXjMkqZekYe27h2ZoUkQk/co8Hm5K0ntp9ST9YOO11UMa3f9wpFow+M4eqVT2nU3kQ9LJp03V0b52n5CEGRDkvrLDA6N9AbytlyEiayM37y68hbcQ1DRxO/uCRMFj8tofScr4l0KaFcZIIWj7SlxSDEiIaGMYICJY3I2SUkElYVqokZCBCEuGxsArkSgzoLWF3ahUtA00GSgk0sumrGyKxblws2cytnbyGLm4aZcwSBRCI0aFHQNDMxM02QQLG6wRlTQPhSkryRiYthA0XuNDTFo+wjCHoA+wguEHjrOju43jY8BNODc7YU+zAME1BUYsCKoomDnDkdhmSdpAmA1ERBbcX4S40jNMWXSoCfEpMbDtQG5VIgg+WYHTFZlD6TkORI25ngezVwrnbS0ZsuPbhicRkqlUug4SZJTzpENnixsRzU7OIJ49sDacxvJFhXV1uAtjgskiDAaDgiuLgHFLKNE0oXpoXFComX5IoxBh6/jhR0KewKqPV3E7DJy8mtJi57nRBg+RhrLbGEJAgMMhlUzl4CF85tYvRkXUnX54TgDJARLpDiinRzs2QyhRrJ1c7EylfZ9W5MtEpaUbF+HGH/ly4rRWs1BRDum3KOJPIDEmi9q2H6TNp1HeDh0Zhk9YQwYX7adWeELkgd8kSEVpgDpFANFAvqUfqB+5hO8/j0BrU9oETYTbFNoMCwqCAST0Kbkt+hp0Q1QGMRD2gx8mRznyQcEuPIiFWekZm+GPmDAnozBJjYGhifLBiyRG4osFjmvdjESVbgxIUtUhRAgsXAMoFiJryVMhMOCkphRhFgRIhWCAwARkGIDQaCkkIosWSkhYllGVAZQEgUARIQgsYMSjvO8WAMgm4XmCBfJpow8ub7lmt7iB3TQRBAUIM9LyDH5uVNhvcZ4PHVnRvyh560ieGEG5Glnb9OPjfW9aMH4cz8znaHRuyEcOGoMoP2+gzDg3W+HeRvHE2R674Y6OUN75Lt41c4cgpywx/AOzNixqwOhDsh+m0cINW0F7HkIKaDOCEbDuUJ0DM6QbDyxBO2wS1BQLHA7OgNKTZvcWpm7O8s0++s0M6WQxm/L3fMGzho2fIbW1yuOcOqkTtNSs6xNmPSpo2NqZV0n4YdZDrsIpMyOzFEHFmR4Km5d6KhoJPm8O/pLlMs5FyZqrIi3M3SJ0zoKe4w5ioaaxOJwYcwrxFCl+YPy+cwZdzcwMPmTZ94beKudIPtxnNmrbMUa2qrl6yZ2yBtOmweB2wmRnfbBdxLT36/isrhiloQA6zgMyDLCgkGfCFAeZgLI2PkjkGJYb2LHMHAD8fSm4bRHFeb2QUhvCFnxMwJejFRxNpS+YISFTocml5bzXaG6reIuUfz7l/93er0WWlxjB0jd1XeODcxbdFeR3Vjs5VuWpsd0JDinLiacRB7700hKFTyW9+UxzWN1OZfB6Cj0LABxhMwzLMfNvIe1hNege9IOZACw8qVAGvBhd6uEsFarIfO/RiLgDPOpBa9+g0jMaM6VA3TJorNIlPdlMGDtlmwhlgjUoKsIsI0BApM5KQLYYCYkXJMgUIk0MEweJ3LSAbGRPcurHdnrK1eHyPUT2TMzDW2RRCHLjRJfG7kaIXVIT2YokyzKGgljEEcsihcFKkciGEBCoDRZ36VxF04kIaEJWnY1JBEchTIzJijiIXdVkVyoqgqIoJpgh06jcoMUUHWdrsg+fFdg7d1CmOpOEVDtgNpQSaq5fXUeeHKYqqDYw1dx7PMiHQpwSMm5vKElm6IHNVRFYqx7rxyEvz6f4uFMuo6Zmn3NREdzthA7oJN9lbxiIIOZBmDEDjU0F0YPkUvapixrA7WSTH5Qsocw2jcEFDb3ObzOiIJodhujyUCOTVlwNHTaia71yTaYOWvRNtBnhQwshAjBjGEYiOoqOMBifEJgxCkWspbWADBYEGAEiKQ5RDkiFja2UlNHZEzumMwVoV5Gqq6BUiWOA0kEcgy4JZYBIIWXSqyBQBAN5Ail2s+AoaJwY3GTXE+WLYyrHZHXe5beLJGBswYK5XTGGKmGp0dRCzEz8u0IBnCl9JJZ7H4gHOzHvVk25Gjx0xRyGKc01D5I/G9QYxI0GG4FgxdApkZkMw3gxGmsZ/CnpHpHeQcce7SZ3gAezZDGp9tnLBQa4kcrSD3HYhjKrWYDJeRJpnp3dR38PXy7rbDqyov5EYh5dHY885va3HwsXS0qh7NXI+Jrd6CEHnmDusUZ+8JbdgZAl0SdRJ9FBTBdyfqVBsPJAqe0cKRSjqYsgQU8IMEhEzDYQOMsYBz59XCkmDkrjGd7DLmYcqDDKobWUIMaLjDMxIF2WBhejCBbOFZeOWN+boOHGd9FRKDGnbTqxDqB0wtCmGMpsMpd3jhpN1RVfmwlXN5YtJDITMwYKhqqBcVyEjlTRz0RuYbDpANm01brY2LIFWaLsYDaKzXUpNdKlGpvYbVQtzRhlKgYq0K0EsXVyNZfbNEetTi8uiiKkmn5FfBh8Yw2riBVNjylUwElzJMYdm3yDgYHs87okNatVIy3sgp0ObczAoRN+hwatEyJEGMYw1NTNAxJqgozAUiISiGlFN5gogbiG5Ek2BDXBuoyLL0TDuTY5ktTOk9Fc+UxWjdYrWsxhXsMzVAJAxhtyghimGJCGdITFKkqJgSmIp0VuVw9stFx6mkbp9I7RycavckjdaF7serdx5ZBqGkXC5TEGkMcYwkSOm+DGMGiy6aDAwg5FrRhGQqKJh4cfkZThEWWG4EGzcaY83XroWJMGVIbo5ExCwT2KJxG+hA2g/pd9OqJZFGRHMNJZY440nDk9AugwroIoXlCEOwQoJp0mBBESJgMmIIDFgsio0chSGGLMBOJr3d/Xqb7FOu3SqrS0RTOQhMISghQAmk0WgYhB8Q9ijZHGf02Kh2IpwggTHByj6nTKaNWNBuIb94UeOp8/DhhJ5IiCWEWlPhe9hjJS+a0QzUmCPbJC4Nd5XtnTFi8AMw7orJ15PQqczymTsgbjIfWSEoQrAhRDxZLA0Kidt6IpdzBXZYBjIBLATbucjRrQqNZYSkC34oLqZDWqCGMzv5BQAoFA2nDdYx0EzXpjMNlOc8dl8EeyUneBj5gO41PCuTFjhG2oSEblAULZiwogRw0lmElHJYxIbbnqL5H8vbyMOoPJlNM4pR+/nsbhlmGdlqE3huYhvVQrhK8AyTXADnIG8TyKqq8zpoIOQNfGYWojNH5DjkwaG9+tTtxLbA1xVUVYcCFlDkmAOKRDyIptHxq+eVXumibdXRmHhrBBBBlDJPLQaoaTuO5NIpxwWayKSBAIhED1FsKV6Ygm4CApQuHs2/i93s9HOqhTCSqDyTyyVOikWJ9sl2HlKJKjQRyCECoVvO3LCmIZNIYiSF2JC2FyVVKcNm7jq0J6jY88ECQaRKNqWI8zcphfDVOCtiMFgJjc5A9+GIOeGYXn+0SEIocr4PIoOhXt84pwQ43a9ghx6zRO6C6SZIGhCGnrLEkQYCMVQhWnAiTT9RggKRIAGMz3Ca5gcx9Y+3AGQ7AHSTNHnASMQD4kHcgaUTvAocwifnJ/a7ZrIRByRhCQGRIzSW9fd3e2i5+iJo7WRK3zTw7MFh88i29JJCqMVf+/DgsG8b6e9Yapg5I4bHzMLzRQh4ZJ5QtKHtqyEWwsgiEckc+VYSEeR1niMyEOPZXCKbEjzDe+L7vs+nloIAqqLf04kwKAisRkIsEHOhYp0sULAbZcgzxmvh+UgkJmKacV+5QVOZ5ONzDg+v8AWPwF+0IDzNPeEHyDD49icl9SGAWIYCwKG+IE0nz8i+hODzjLpKkPVBcdG5uRCzZlrpSIPVCpQK45kysGqvUJUB+oFDTXWnzmSak2DaGAJOJ9NCueT0DAwDvLlgOLaoeCwYxgmESLssgIW5Bqti/b5v93LpSSSX1/mfUUlkwZsOJNvDIFtiC9UqbhpSJpi/kGXp7PdnTeegZnH1k6UDPFTO0wetGKwYRkNBkkRnJgixBZICwDs9sqDDt3PH06QbuGbD32ftswx3WBDfTSyManPFFqq9T+RRiecj1GU/urMcBrNieHDWp1dnOJBYhoS1RHS5ghioZrDeSbYGM8N0ViiFZYbcAa3gaUwusgeqwTzPVkgmwU0ZaIagmhU1HQbMwEsOa6CK6/T4Q6ug86LyY3xIMip11TGfg/cwvjFPD5BQufGYs8QyAggpY8D3tG9ruJ6H1zzHvXT/cWTIzrrpT9esdMZ/7ofs832T/+LuSKcKEh78QxEA==')))
\ No newline at end of file
diff --git a/devel/example_devel/students/cs108/report_devel.py b/devel/example_devel/students/cs108/report_devel.py
new file mode 100644
index 0000000..79c4ba4
--- /dev/null
+++ b/devel/example_devel/students/cs108/report_devel.py
@@ -0,0 +1,33 @@
+from unitgrade.framework import Report
+from unitgrade.evaluate import evaluate_report_student
+from cs108.homework1 import add, reverse_list, linear_regression_weights, linear_predict, foo
+from unitgrade import UTestCase, cache
+import time
+import numpy as np
+
+class Numpy(UTestCase):
+    def test_weights(self):
+        """
+            Hints:
+            * Try harder!
+        """
+        n = 3
+        m = 2
+        np.random.seed(5)
+        X = np.random.randn(n, m)
+        y = np.random.randn(n)
+        foo()
+        self.assertL2(linear_regression_weights(X, y), msg="the message")
+        return "THE RESULT OF THE TEST"
+
+
+import cs108
+class Report2(Report):
+    title = "CS 101 Report 2"
+    questions = [
+        (Numpy, 10),
+        ]
+    pack_imports = [cs108]
+
+if __name__ == "__main__":
+    evaluate_report_student(Report2())
diff --git a/devel/example_devel/students/cs108/report_devel_grade.py b/devel/example_devel/students/cs108/report_devel_grade.py
new file mode 100644
index 0000000..735cf35
--- /dev/null
+++ b/devel/example_devel/students/cs108/report_devel_grade.py
@@ -0,0 +1,3 @@
+''' WARNING: Modifying, decompiling or otherwise tampering with this script, it's data or the resulting .token file will be investigated as a cheating attempt. '''
+import bz2, base64
+exec(bz2.decompress(base64.b64decode('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')))
\ No newline at end of file
diff --git a/devel/example_devel/students/cs108/unitgrade_data/Numpy.pkl b/devel/example_devel/students/cs108/unitgrade_data/Numpy.pkl
new file mode 100644
index 0000000000000000000000000000000000000000..b4022f8f0291c5381c53ff5f48a913744063fac6
GIT binary patch
literal 439
zcmZo*nYxCN0Ss!VX!Nl9mF5;yPU+z)PAv&7aL!3AE}qghrH7>?GdFcg+Z1>EfC#YK
z48|UwlGNgo`0~`u^o$a)BG!`3k{pn#47Lo$47Ro@J#2}^#i>OlQ`)A~PVr{w5zPY`
zu9uu&l&Y6onp2XQSX7i)Ii-guz9=<0Kd-o?s5H4`%H%0MtYC#xdf4+)AW9}r@n&e9
z;>?&drF}}!6b)}iZ>H8M8G=2mDJ7K!sUR&(X%<sDJ0P;mJ&ZO}{QUg9{{R2~A53^N
zluSwLbQY-C?VrH6>Eix<8R<`=f1I|TQZgl}7~<Fr7LfPmZn^;SA4I5!BRRh;wJ0$i
z<f+;zJwnOFh6WZf8Tq-X<@rU~hI$2+Q$T^nosycSkd~jXp=qTs#ap6BLIDbtl#~>l
z^K)}k^Gfs-l$4Y}K?zozlvo5&EZxHZ5>y45kdv90nphNHl$u_YT3no&p9c$EjR+lu
QO0e1T8G3C~N{dVN03v~=)c^nh

literal 0
HcmV?d00001

diff --git a/devel/example_devel/students/cs108/unitgrade_data/Question2.pkl b/devel/example_devel/students/cs108/unitgrade_data/Question2.pkl
new file mode 100644
index 0000000000000000000000000000000000000000..311bfdfa0bb8c5828abc27fc4c12b052ca9fc61a
GIT binary patch
literal 390
zcmZo*nOe=r00y;FG<rA#OH+$WGV}9{ru1+Xr<Q~kIOil57f)%M(!)}cnVUMLZHhZs
zF#`ib24jzKNosLPd{JsyYEf}&d`VGea&{$1En8x7acWV?l(s3gQ@j~sr)YR{c(Zsj
zr50x}X0WwQ$zW-l;%=Xi4K@iP)WeaSUzS>wm=3a{c1n*>a<QR-MNCG1ZfbdcQMRF8
zLFJU%DLqmtsc8x@`*JdiOEhvTL6oMI!W3_go(&36proY41!B5qmZjz?Br1T^D5yi!
zsw)(wmXsFd6~n}n^Ye-`i%T-|(iQU46iPBu6^avcQx#HkQgc)DN{SUS^I%pg<QJu+
z7U?Ot>ZR*}%|~%cw4siXj&ZD}LUBfZX-*2%8ii<M9U~pXSOtwln2nkc%}Pp2Q`)8!
I7nkY*0C{48v;Y7A

literal 0
HcmV?d00001

diff --git a/devel/example_devel/students/cs108/unitgrade_data/Week1.pkl b/devel/example_devel/students/cs108/unitgrade_data/Week1.pkl
new file mode 100644
index 0000000000000000000000000000000000000000..3cab27cb3b4d5eb3a94382101e00c41a02129e06
GIT binary patch
literal 724
zcmZo*nR=3m0Ss!VX!Nj#r>15bPU+z)PAv&7aL!3AE}qghrH7>?GdFcg+Z1>EopZN<
z6lXB@aFnDLm&7Ngq<|E#mSmRXfK>GGgM>5l(iIX@QWOle4X0!<X0WwQ>0wJOE>0~f
znbJ0;c8Z2KgExyequ0X!|Noal<vEh`%TkLH(?N#RPU#U!E;cl<h{?#$O)bwa$~M$1
zsGL$erH3yiH4S94MxsuVrj^1JZ^53W3Q(Y=q@>`US(cioP*R?+kXM?Ulv-4*kdT<5
zkeHXEkdTz1P?C{ZtdLfkmt2yWpQliqkzbmVqEMWfTaZ(!P?TCyT9l_yl98HOq)=R%
zYsCdJ)(&o&f~`WLb`n_7BQvk07$Of+qooj(nwtu;O(7|<I5Sxxu_&`7BR91qGr3q1
ztU*ahX-eCa;^GX(9v)Ee#22NOr4|)~yqduS3J`CG*eM#`%-&4ijH$&Lj2RMbQ!-dU
z!JW_u3T+0ckN`+6uAq?u1r5~T_?*n*5{=wS5Csk<j-Cx5r-HDOk`mZakf2Ib0I5+>
zhp1JD21Bs|R6IF9uQ;=~1Qeh7X`sMSC{D~xRY=WA%}vcKDOSkLQ-E5jkYALNTBN7o
zs+X<@HXkYuaZ0qIj**UWtR^hbp`jgZtYf5O7^|R>2(wWWq8TZ~gux+}Us_U7S`wd}
ZSWr@0gb26{#td~>SQTVDfC8&j4*;a6^yL5m

literal 0
HcmV?d00001

diff --git a/devel/example_devel/students/cs108/unitgrade_data/Week1Titles.pkl b/devel/example_devel/students/cs108/unitgrade_data/Week1Titles.pkl
new file mode 100644
index 0000000000000000000000000000000000000000..1d504805985e2823d43b8b5d7e190dc05e59ec67
GIT binary patch
literal 776
zcmZo*nfjNB0Ss!VX!LN0r>15bhGdrHq!v%<;VMoo2`zBWNh~g&(l(`sr6e;qbxPY5
zcd&8>28ImA9*&aK;*$8ploXHx))J6L5KA#6wYWr~BqLQJF(oClBr`uxAvd)oBR>Vi
z*GSY!(wvgPn8DUIrH3uCxHz?_WJ=qV+9?{|4Bjl>j9v@>|NmbKk<Va3u@9_;BRRh;
zwJ0$i<d)hgJwnOFh6WZf8Tq-X<@rU~hI$2+Q);L5@TH`t!ELirnBpzivs3{Jl$4Yd
z+%wBk^At+T^A+++bCXhwiWL$P6BH8jQWO%B5)?`@GK&?`O7oJzZZFQrFU?6&D9+3+
z$f;B)N-ZfZ$^-c>vq+)1G}np?WUL+BG6h?OMC~N7phsq2Nijqoq()02C^a_~WSc@#
zVsU1&LSj*7Nk(pJNoI1fB3OfxlG2p6DaFMZj6FQype;%*OD!q}c{PIv6h__*u~Rg>
znZ2338B>ch7&D~WretumP3h5h&PYwp&df_!$V^j!YKqUvEH2TAHq=ot(oryu)l{%m
zh&Bdu3}Zpz57G+?U;BV~aFjxg69U<TD_EsK!HQyjZY9VXO;8YX^lSim6NHtNl)xT>
z1aqPSNR5IzM6EhB2#Xb<;>r1W#hJw=AlK)ofdW>cI59U>AvGs8H#M)MSRpeH<|T#v
yqLkDkJq1_2bUm>7C{Bqs)G^Wlc@!F9(3pxg)-lpCj8)J`gxRPG(F_aiQau3uTmPE?

literal 0
HcmV?d00001

diff --git a/dist/unitgrade-devel-0.0.1.tar.gz b/dist/unitgrade-devel-0.0.1.tar.gz
deleted file mode 100644
index 9a8b82a9d4e5c3c61bd6ced6cace4b2a6bfb40b9..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 17133
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
I;9z0^0CmcBxc~qF

diff --git a/dist/unitgrade_devel-0.0.1-py3-none-any.whl b/dist/unitgrade_devel-0.0.1-py3-none-any.whl
deleted file mode 100644
index 6e566dfa026e00890940fe2102371f73794be2be..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 18848
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%0Dr|
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%0Dv<2BZ>`#AK
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
L!oa}b3gQ6(fkJ0l

diff --git a/docker_images/unitgrade-docker/home/cs103/Report3_handin_5_of_10.token b/docker_images/unitgrade-docker/home/cs103/Report3_handin_5_of_10.token
index 49a5e8987133efea8696a371faede808ab5d22b6..45f7a30a3831f832fe9793a9c280f2d41a015048 100644
GIT binary patch
literal 49849
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

literal 37420
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

diff --git a/docker_images/unitgrade-docker/home/cs103/report3.py b/docker_images/unitgrade-docker/home/cs103/report3.py
index 69e9d06..e08f7a0 100644
--- a/docker_images/unitgrade-docker/home/cs103/report3.py
+++ b/docker_images/unitgrade-docker/home/cs103/report3.py
@@ -1,4 +1,5 @@
-from unitgrade import UTestCase, Report, hide
+from unitgrade import UTestCase, Report  
+from unitgrade.utils import hide
 from unitgrade import evaluate_report_student
 import cs103
 
diff --git a/docker_images/unitgrade-docker/home/cs103/report3_complete_grade.py b/docker_images/unitgrade-docker/home/cs103/report3_complete_grade.py
index 9c9fe41..3f4755e 100644
--- a/docker_images/unitgrade-docker/home/cs103/report3_complete_grade.py
+++ b/docker_images/unitgrade-docker/home/cs103/report3_complete_grade.py
@@ -1,3 +1,3 @@
-'''WARNING: Modifying, decompiling or otherwise tampering with this script, it's data or the resulting .token file will be investigated as a cheating attempt.'''
+''' WARNING: Modifying, decompiling or otherwise tampering with this script, it's data or the resulting .token file will be investigated as a cheating attempt. '''
 import bz2, base64
-exec(bz2.decompress(base64.b64decode('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')))
\ No newline at end of file
+exec(bz2.decompress(base64.b64decode('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')))
\ No newline at end of file
diff --git a/docker_images/unitgrade-docker/home/cs103/report3_grade.py b/docker_images/unitgrade-docker/home/cs103/report3_grade.py
index 5ca4f8c..619c0dc 100644
--- a/docker_images/unitgrade-docker/home/cs103/report3_grade.py
+++ b/docker_images/unitgrade-docker/home/cs103/report3_grade.py
@@ -1,3 +1,3 @@
-'''WARNING: Modifying, decompiling or otherwise tampering with this script, it's data or the resulting .token file will be investigated as a cheating attempt.'''
+''' WARNING: Modifying, decompiling or otherwise tampering with this script, it's data or the resulting .token file will be investigated as a cheating attempt. '''
 import bz2, base64
-exec(bz2.decompress(base64.b64decode('QlpoOTFBWSZTWZDt+tIAN0//gHb2RFR//////+//vv////5gQh7ufcvt3B9gt5PrvJk2w2sarRe7ukhrTtLvuHV22PZrFXW7U5mO0knJ7a7Sexudt7dTfc1fL7n3ndckg+56Rxr7KkjWsqW3Z3bLJr2d1t60+rVUtFtvbVivY5yswXbW5yduuuZtmxmozbDa7bZzs1AJLNRdNdltMVt2DOMGt2xObF9H3TGvtoUkCFJ7b0b7BPs47bNWbTUr1vQlAhNCYQyEyaTCGlPTJM0p+Ueqek8oND1DQAAAyAw00BCaECBT0p4U9TaTyjTEaDAmgGj1AAANAACVPIiITUZD1NAPUDQGhoNAAABoAGgGgACTSREIJiTEaRtGppop7San5Eh6QNqPUPUNPUaDQaAA0aCJJAmgCNNCMTQTJPTU2VPyjJk2qND01D9U9NENPUGmhkBgkRCATQI0ZEaZTaRpoNCPSaao0/EKHqaafqmgzUNB5Rspm5UEDxQFXr/AH/P7LW/b91WkIEJIsl2H8JaUvM0h01n9lEp3Co0qCEbn1Y8M+2MyLjuN6uCzlMwTsQxoqlGS26hm2ZsKpSbsWCjIWsmWTJg7UolVHyEJxMkUckXK2VP62EuOHs+0w/2PaDw3s7zIHt4zJ175rGcEfNRBJE78zNAIBfypqpAEEeKgeOAqQihIhAgskigSK+kCokJD3ywiIfsuGkBYkFGQQBVFWJ6EFkNNIek9rwGZx2zytHdFXJHvPLDtJ7E7wfdJQoxBg2RqM/UySixSMJJJJEtAf+Of/vdi/m5TYcf+rrr2b+2BrgFlK2lJ2VjRGRILrh6Dn+gIuJOCAzKCaDKN9Czhi74pKOGiG12OulMqIDV6dkGv/c2l9iocjdch7NVH7bv8vtpXi8xnP+O+eGMhxNPvgrZbzXS6+KHF+Tj2cvi6n/OF2MySRebxn8qwe0eUbJ9PXw9T6q6SMwlQhtMvuXZ/S6Z+KzPyiKwrjt3kq4KB8vcNW8qHswj4yqaTIZD7/wZ4cdn/i3i7NfRtLQMiGx543Sn9EjGnN8RTtODdY5pCLom5Zy8P++j81X3jWs3472WooPmXgRrTqIyo9Ba97YAHIgTHrcjLiI1e2kauPoH1gd4EY22D+aV6hYn+XYODLcf65DPCeQlnWCnzbvEGcpYHyasRXWV6h3bTYYFeo6aAsZIadexiIcR1SorK9/LHe7d7nFQTF37m3hB+fshoA1FL12jciM0Impcd2thELUu6a2ZGEqCJWFUF6NOVd+JokjZJxXUUlR4VLWnZ60pXTlW2YDVbejdT0esp9XoJ0Nhf2DHJQiLGyGSEy8SIMFmLXAJZVQws/Hmztx+bJQw5iJLx17bmxd2WvWZmNEbKxmmRZevTpu/Hk7YcdNGU6XT6hofa+ZfKcotfselgiryxxHfCrczrpAL930+RNkA2CPl9t30Ywxm6xuYG3Df7FDAx4cJQXMTtCo+QRWGYJCNnII4Nk8VKWpWC9sEQy0Tkm/KtXSxhgDkM3DGf4g/lkqF5A3nEdmlFxGIZUZ+gk1WKBanujQiRvqu/CBN8lpjgpYexqzErVrssAo6ULL34GkkSML13xt6DXnxi1sDQigjJj/nEuL1RZkYCTxNuKyWNC4Zhm535BvTLgjlzWgMQwI7D8eghpjDOWtu3PvieW1OE032jJhQ8/69YCRW2BvlLuJtO+0WQKS41TZjFfPP9CuOtNRvrOYxodmCXCagpmKEDJnkcIGvFcLp2F+Jkovq7mSiSMrkGTxwNtigXGJiKwTv6VqZi0Ly4LiyqIw5KFKZkf+q9RRSEnWrusY50YZKtilzZfaSxxtCabbrtpBhwnk5kEzD+px8hdp8qYZdXuFUWl+xC1TKZMX8Zs3O3h4zcZGm1xuMDYWokhASSTzyN8pRAmY61FM4z9OOe70Rs2BfseCfMkInWcNdnLc022yPoHz31kiSOKisw+JbCWhhO1pCRdzx5a5VxLTb47IkpNdlCUsNIdD1qRU2cStgpNt7EV5kfKICfS45dbQt+tLSZ8PsvmbCw0xmQqNP5GTvRPzRmVn2nRkknIHGUIjY6DDhWdtHd3erbvcFmk5A+VC1IZsn+bszT6+tK0kAi9NkWWgsqR4I8a4uXIbeL3UJAQ8MOrCfN4Df3euFFrSHxVKFKh163x1mhbFrxwdpPGctnsFtBwT2lkXXOC+ya+2BiUGK5dLDHUq7SF6lE9Me+Frv8AriaG4dD4n12Zm02TSkmarHpg9t88eGo7lSuL1QQUFO/gxiQCmvo0gdSBRRUOlDjcGw3FzHNRWMuMZpfZZzar7ShwsC7ntL8ZE1QWHSLafJ6Npig3hifDthfqOxRpqbTi0ZMh8qOjIUpDgwQuWTZ0JbqWkwYKlQLBbCwsXF2N60V65XVxHRXXB4BHaT/weLVMJvNSVzq4DtiE2xxCEyGCGVlV88s8qhDYly/MIUTtYNQcOmUIcMC+4Bg9EhwN3WAMmG3G4wMXCWWcJg4DAy1xKWR3EikqvkKVlD2hcCoKIUJQMG25bnqbTSgWbixyyLGvQgRy1bTZCWBJp/SX24M0sD3qDFQvh9sYKhfhS7c91wLbxMiiik8ArtKlzq64zZL0oaOrt5gbga4tv84Yaaka7a3JJUYkFQhB41dHnvy0HZngJpGPSl4c+ZKDBNdQMzBOPXMUpvONaaEVZn2aX4Bxdhlh3MG12YXwzrJZzif0jVM9LMYsd1XvghTaySwjDf6JcuBnhaI2tr76sJ4zZyQA9bNxu4VSzR0EL5zffn3a3A5rowgKq0e0XBqhRSaWuC0BrA3mnQx42UWCzYbxmUMQYkMnG3DOnFsQV6pt2CXTbNzC56KhAxYylEfYDB21xm6O6iJOQt06A5NwIVDzGWIvsLrbZbtNJyw87cZrrtIsCMCRrUJ0gMw0HAdLC8IN7Pqcxr1C64mOh2EzS6LSN75nZliRS78nA08p2WQuzRvtcw3qXlYXwcpvafNKJSLzJPVBLiZFAuFFAcKcebDX2aEmgNcfCMe505FEQ3a/PLHUPq/Yn1wz49Lc9uX5fdgqJ6cnHV1OwPgxAqetixKH2ap30wtn4kJevLWZOS/q/E8DgXhrULhzG1g4ITbPKIWABFNheMDym2Hop5w61WrbXZ35WPE9x6hY6LXQ+A1lKEn5iRTHRctr722ttjb3l7Tepnjn2G7zD8ra6TvmPFjWcLCrcu6MnLtbg6qcVGFuDqFqJhBwfZvPoc30qHjjlMgNfzZ9/z5Su9tbMdsM22lIOTWQqI7PSHoahxRGYOoUvFvy1KAVr5GUmCFR8iwt/oMlyAyAwrBCTh/CfVZU8B23tro8bHf9vwYGng3GmSRktBPxIuDhH0ENOtT0MlE1okuOLqYeMhNQ+t/I41P3JDWUVGVNBa/4Bpq/y/5diUeBI+MsjEyU/CyG6myxPpinKlHhApW4BT9XYKB8APjIP1nn+NiSpC+wsQHb5f0FhA5+TxpVJbIGmA4xGvf8R9Wd6B5tBhd6jQb/n7dEISSSSKoH1MDtz07K93HConmMogqqqgPNgcoccPq83rhv6lSRVPi22W2VbQqjCqikqFf6bTMzAxCs45Id8E7dAzB+v+3DOBA0w2yYkUJ3OxDN+PiWi5tFw6AEoL7N0XRnVV/sacsyfEhe0+uwiFVQqezcxkZ2hiLC7bX9XEXhd91cxy9u7OddO6iEmhHBYEiLP8VPNFCRE0LGoWlvK0oIKrOvMLz6gscN/czrxVx+GnvpbYbGbVpgBVMWjawgqeqzz7GzgvE1k2b1ugucomtYBjdzrN8r0ImuItRsbCQQQ1yBSqVgYmgsUN++XFnSLBhlMBKgDG1L1R0cs+yxgFDNF0yMungmcftJLLHK0374/UV9ddPwNqxY2YwXB1GvYakZmmIzNXp+l2yDOSEMYrEjzLv9Vgmg4CDMkCKZDgO6UJjQKpcZplQkpJrr4SSkWsTlEnNwwU7SsKPvSwtYLAYqJaBC2ZHTU4jRhVu2h2qpR8Rchb2aHC4KnvjMUJRQqCUpyVYOFA4uXTcM44F2+L5qpJYeZBCZjF1R7IVjN3uebmjbbSJJPi7vCwcjH2iFPIr7e68dINnUN75u/bLsD5/S+dZWffeuG59YZUF/IUNLmPvxbRuh77tXrLn2UdrjaajsOcZbEub3vQM9Pue3ZjuLd64DKoQoXnNlyvOb2GIVavD8XYNMuThPNKyUbhFpBQYnQ7N0RRda8CyNDYSLMm5eepvK6zdg3PGJffYx3KMgNcVSIQUISfycjNNrsonIgpjHsxJIKihiKGUK0KJTZQqF1dncnv38bDy8+HA7w5sNrFh2uw1V9L5aYbPidi+Hgaert5b08Xu1DTMKZb10GeaXSpaZyL3eG4LfVrK6q7SwGkF4yqY4WYFL3QUFEhe1u+2qpXDQw/zt5rTVhrCZK54YlNex+rPwWbN01xfXSKKMa57OcFsotY2PFnXSEYRv6899MzJtnO+7Dm/J+L37rgjXTGARDxmlVuDWt0UMLEEhRPfZ34quJv3wX59c0y347pOLs9j5zG9ms9zlswDR3j65jCr2RDDAr5bMeXatjUaHSpLA60zlS6igT0zln8i9hFcb5DlabpPW08KC854dq57NdDfQUwcgFtff61g0YK5mSw6+WzZ8fIznp4pD6nNZchPu35GScKq8BOHo6hOjJyILNiHohRkuvjmL7kNbJ4Z+zsAvAk/bksRibAw4JQlviLNc6eMTc+12GyaZQ76F7F6Gu4uaOD2517ssP7+OOr10NvEPDXIojgTnt2NrRaqDqkfK6QOLyiNo24FgL+g4deCdVZzIrTiMhYyzKyXDhG8m+X40oSzhSpydCHgP1bwE6A26AqoBVBNS4IV7eKMY9DfLvY480YPTTk+eeCYKUnMdC2MAe7a7RVpEdliRdSetu+6/zW0WnDA2rMrs1uMXxxg12ySrUlkasdroJTSsBuayLtfVPYWYr6+y0wF1s2FYLCI5vhBjMxlbVhs95FKdOC3yu47LT3CYJanHFjDpoiPFc0gshwUYlMZGUGIjueTKhsvsqTeSG+1xI451VFrw6SXs6WgMGicFwz2k6U569uCzO3jK5eAL8/HAkYJrmmvf5F5ubHgZkwNYDFRxLRgkKWaFW1qOKnevu4XuWuM6/BinI97eLUeAfpF2VpJAqWZ+wurM9CePoFUU+oNDbkHmmJp7AVIDVLKYoS6N5ydURJwKxFNlKB1qbvTy43eIn4P1SkmaF7HVaDXrhEfEUZ6ZDMv4mOzhunlnWXDHHGVxLCaRQWdo70Sm0JvVAnQSk0U8Js2Ab/QCfjViBWIEGDQtbj28KVRhAQlb9+/0Zq2SAawD0sINBsoKCBsxI9qY95yW4+jLG94DDAsfLfeQebkTEMry8ebY5j5OEGynJzzYwwNBJ0ZZ1EH3MlMDoHAamt1QRQ4PaHt3sTWeIYoEpQZ4WbBjkxNEOpoMhL1XwVgDk46FOhpIeMC8w3rkPOXnil4dZKwHQQpgLVCd6zUh88KyJCIQz/QGhdoXLMrSoKxo6yCBtta3iGQaOo47Cxzuio9TPBUvAkDJmimzu9N5dqGwxLj2IWB8TXAFcGBpkB1VYc9Nbgu+QYBL4mP94/b5R7P3Wd6e0KSuUm5NT+f4fw/OtmeF1q5k4JX7C+UfW7QL9QxY5HcfV9naacMqZxUdLRwKTajeHwgudhrbtOE0Zm7zQ12jIEGYR/63chBYeIMpJKHjEbqYAbl1UxAJKPOR9Nsk9wcdyptNUkDz069sJwsdF4UvjupfOnLBVa6xd154w2nXHH88NJlsZv4/jQygtyCyuwlMpyPaKpj6WTMhH5y9rNP2cWhId/ZCMqKBQYbmwwYDC+b/YfdroeVcSPhZZVf6SsDDfNJL6VTp8sR/7D+IXfKgqjVDYI4Qnt8b2fbbJ7WQscy+117mWLIIj6UCgvZ92URm9YZxdGF1WCb8+ubYbZ39xmAguSTg3cKKWA8hYcFS6rbwKKhYk+40OV1r80/XMxEorEDzmdhQ8f+XFGTKX8j3/T4MYIbS94h+9MEgfeBlgLISpAWBjCVgMii2gWg2ijIAhXQHkDqI7s8LtU4mME2ErteikaKdSdaabbmZCXHG532GESZTzc9Ggu4hQzq6RMEvEKseVsh2Lq7hZhDQhW2WsKS5cTZfbnH3YkYLIaL8MoKoytmFftKlxic/m4FQRrnDaQz5XST4LpJITiONBqJbHuJcYShIo6HIsOpn7fgg429SkTNtB1+JUapGrXZO4NBYbu8H3YYeF0qQPxPrN5GMIW7oSGeXa5F5eafTMvH84TG3bKOn01j6/jrmlYC8xg6YsRYrIitNGDcXUaI8kUP9ZdRT2zBZnRCGmdaVMb6/vaqj5fZ7B8piIYNtt4iNwelMLxZ+o/t/4nn17f6Yc/0ZaLSCFBUJNCCSrPoUC4D1t/mN5CFz8JeHodH39d/g1n2hZgGql3a2DelExs6D0SD+HpcH5dxUyS7cDQI2AJ93QBqCwh/VyWRaiEAHlr0vg2gdn/htMvZLkWZh9RsDJIDf5bxZMcsu6MHk/QFtRelzH6IXAAe87UYcYFRN3h49obM7Oah56gc0yy72mbmd2Z2H/mnhoPa//ZskuDiYXRhGymb6AwR2YNRngA+Mp6j4q9xo0Ko+gQpD3pR+Zy1ttTQI0PEklGMBAXntJ7CqxLFuH7BkKHJlV/dPb7vsRcnB8UKBNutMcQZCgfViVEZH1kF/IjRqlGlCuwWqAjzDkEy4eiBbgHPw8bdXwpzJOdhivJQosmh6C2gzZPsFeMYbtYvl2mD2J/NLz9X59EROF/5b7Niqukw4FjCsyGmRHW/8Vd3Evc2CmwxwIH6V/TaIjIi/HrPHQa220s86+r+U0SwG4D8+zqgjGOff8/lTfUItCbUfjIryaxUnpSsttiLCbYSvsRjAvd8+cPyp19Tp5+W/DfBxmui9ERDhpLkQVeD5BKy5HGtdV+3SmoZnNzY8Ixo52lWgk0RmFUyXgeFhjR8utwVxpG8QTKHdTH9rdURFL4depnY8+eTXS47OXKIdE7hm4y83x1Vxn1XIvRrp/d352TTvMxOC3sX1ZAacOraNRs7cbS4k0HaijF0BBIOOTaaRzbRhAIvesx9nOWFrOpNF+aoLsa0YOjw2HVFUFR1pvLqdXM1lb55fXs2DwrrM3dXyxcx8N11Xh3g+spke4tFMt/sJw8azLXPs163SojPzNfG3lPVhnpmjQyeidmYgumFRRPF5TFBG++melNZYs97mHD680flT17N/DR387yKoL0SLRX3NiPyUu7VLhTGDEteh5rwxn+jHtZtbC4wty6DcxEhvzFlBKhksWRrA2NkIY2zHA/gPN9sliTmxYD9WTipkzpxzk/d9Vtjomx9UI7d8cGj0tT15Xugo7oCGsTWPbwq5BPe8QyOqdVseayPLdExd172mDdvRk8urV63SzPV0g8SXf2NYZzx20gqmyX27Yp4dXiz+toq02OrhjyZDG8KR1f7YrnqSepoS5aVMNMul1GaPfH2yXj+Pg9LWSX7Stl3VHcBhfV5M3RuEaM9Ep/CeVia9zUU3q9HjtWv4bH6b7SkkMJ+ibUKS4UM4B3dxhirZXXpmUTNQy/D8LC2zy0zhgq+x828cWhpVshtRDQ+hmET7D3FJ6CENDCbtf5s/yakAu9lJgB0mkfyUb+fPoAPrQs7kNbuQWQMmoXIcZdDMYbZ8CAdo+xPvQqfdk1gID7hCG0GNKbn0d6OZ5DFAMAgstPtDUQuUgVJ5mvk5DadOo3STwE2XdwO7IUqDkslkh53ymYcRGeUPcPQZhyAiaYboJkFlqDaUnmbqh6xahrPADATGKD7qaCtF+pJcqURiF4LjmLQwZejDDQ7BlYMRZilXCSyRe5bPMSaQqmQkkZrxcVYPNllZcimkNBACwIgXFk8jAOWCqco3iRcAxMKI64KKZrcnMc5cXkUOAPoIAUBisTFdOFhiw47rDNcdI3mIQvW+IdYXCUsNYUDqd6GbAsDckJg2NocrYBgJcFoao1xCvGiP2BIbg1GYQiE8jOQDjKoT3kAVbI440Wk5KVOIUKa2IW5kPogoQgK4vIUDwn2FjWvsX8fl7t3afX+WiRlkpkZBkIQAyN5IAZgllbiQIQgQ4t+84QO85iQWB8iKCwKgMGIiw/k4PGcr/Y0PIsEYqEgYjpLYxe8vjypT1n+kJckx3BCIS8Q19TesDq0sO+nD0EIKIZUiw8CSGkKW45HMolOxAI70nWUPM9CaF1MMGBD9oxIgBShQocB3yUfCHt7Qn8AgjCfDQJ7hDk8sGbD4igcBrBdyTwrKZtdK9AaBQ3kO05Bj3mrTY9JCBDrNofOf6VYCQ/Al2ThirGD7hOAB9//6F+c37w2iH2hBTcQCCESZ3GrJ6iLCISbzqBPks/G46k5IUHTVRSFJB6hdhAgz1WkqQokIgHXr++35DwL+cyayTmHcwzkNiFzjvPNygVuo6oPIUKh8S8AkKosRFgLh0kyDIDgc0ZAUJF+HetF48nRnCUAoiVACAJF5zBDwChmfLiIvB/DbqFWVPuDQXxtLwNo4RtBELDoV/XzZVqvVTpxqF20vIJjwo7G8WaadBwoYOAgS/lIR+T0/vhUGHI1POGpP0wQsh3U+763/38mthYHosEFUgoyDED25c6uHz3hiomy6JPAXIXFgud5UGvX6S5lucaSUKr1S7rAf3Dt6byS53wEqQyR2fzvblrD+ilRNJLINbtMEUhjA+WSWxEBOjYJY2JtNKI/XDsd3NijmV5/TH/5gYf4zEtnehYct09cSwYZtFvrQoBLnR3nJ0sMWg0CozpuK3nAMCsGEDZBALAEn6qd21fugaHy8vYTpuhQr1htOJAvDgngvL0hJvYYMKt34oJWBsilghfKvYpE9SoqnuMhFhUp6HRCDkkQjYH8Qsg+q9VaIIqw4ITmfMGfsz7VPnqKiwGDEPeUk9lEpnopoOUrwO/Yb+Ra64PW1DWOxVlSURJXGoSNkyTFHFSZqizpWVLsgo4UwMQEthqU+CZMaCF9r02yFOcutTYYCG6XN606lR4xqoJZvpoz91Yzru14SKCJKl/6S4P6fvP9SzpXGhJEITF+aiNASzZJBmLzbgIAqAVItAQDXkiyojfzR9HfzlCECTqKfpI5oms+Pa2AlpKBq5M2J2uvUrqfbD/qhJ6v6jziJTFbaNzJUSKNjmAHELvovf8hHXldqQa1NDvGgPST8YbYPiNpcJySA4ApohBgXBIT76MJ4CoHnUGvQDOTiQjJB7w/JV57zD56QHAO0lDPR0kuHyBA+Sap3+0VH2FBaLLSZ57T8JgYJ/iE+f1jQYAK4MCSiPPmdXunV83MxSjeoOWgctDpJ9wmUllFYdf8IiSsklb6xU8LTQGWavaC0sEGFCLXjli6ErQT1YjLYbKQRcEMPHgYt7d5azyb92ORSw9AvuzSoGbbJGHz6X+WoXXVMxgk21yKkVQSSVZhow+IiH1G2g3hIAwCoQVGph3pV8dYcPLO8ON0oj2E8eTwph5B0KvsuwFwjr4WFzuvJE52alVXRFUv6WaqVDzVQDv0yGCbtMFcw65vXHhtze+MPXqGRDjRTqqBZmDIINkVFAp/OHtyxFPAUQr4dEcMji5TZv1YZx3nOnjnDDhLAoMDprM6HJoqraysXUs5kQSHa3idqItIW91YgSVFxYhg8CKej3nYiDJNlBJUYa9tnIBdHhWCuWYSWE28gXRo67ziU2dL05NZvC6o8GSbHi2bbGZZ0y51IsGVoQ6Kg3BhdjNRGhYqEoxDwDoCHYO29qQ0aDmFYbOQ4atWoUercDwcYYKqcheHEYeCdsuXlqZNt1zdds73rvr426pbEurhWtQxk9QzR33SXFGJAXrrC2tSBhcPOMmY0JtNSo6QGGuph5LmVQRJNhSmQoeqppkiXctQl3kkwK66ML0xyf62YcUqCAyIkUDQd84h2CqAoSKRJSJNarQmyVkWCQCkgqKxcoRCwZgWMjEW/UFIe+FhiBh/fvyTLZTyL+sfQ4Os33kP9tYMUSCIoMSzX9dzUCFhKW8NGi0Qy8b9I4gZdY07630sXhyhdWiIjL03MA1uhKTkpYJDSGFVw5VG8S4MBf3UJ/AZBQ3F5sZiJJFSoqQPOxC4h69X02F335CAh1ePgdAh8Ag5IZgH2RD43WvyPy4aBSdJ0sLHOTSNG64tY6uLGQIBCAkKBlcCFLiT2bRryj4vrxPBy+VNog2iYqgwncesKxRCeYb1tddaN1l9zSSRUGEGQQv0o9wWHtMOWZ7PFfvwh0dpK4QcpEh4RHFQYqHB1cYohM9cOtrQMULZ7XAKF96kLyEQUukpa+6zhGJkEjXmhdQXkJKUWChJCSOWAYwk5J9pSOg22QjQ00IbTFgCNgg2Gki6tj47bteclq2ToJv5wpKMOeeOT53bLE5JwXmtG3kOa15zWwNnBSG9yJd0tpd74LEIvOt5tnr+yRBjO/haIg3RJBhCQAL2gMl9DAWCRYjIwGKRXv5j16hFyvXBi0HaBGCwEJPD3n7Tys+i0PRoMLG7GgOnMRSmbiBZY7h+sISMUiOkCxhPhSGkRGbQygefebmJjAqbAMQ0XUNVLvV/hPgM6w8BsGHobJIFEckhUIDgLzD+jSRt5D5/aH8Pl+Qkn1AxXRYIxWthWwGoFkn47Sd+WSYMTTSAUtkWMVCCCIqxtEP5zAo4MRlSxhT5uPyG8zqahU/rD+bG+IiQjMUsCpIKCrCAFEgTuC2BB+v+7owFFDR3F+UZ7IPgH59peg4G0sKANwHmGB7X44e75Dw4MyQFRq+A8ep6hxW43RaLYiwkEcc3weFVaSeBqDkEKF0QpxvIMQ5SbH5jQSzZEYzhetUNMD3lBVUsY31lRXbLVafmYQXvcDGMf7d8iP8f6aXV0zP3X4pqlIczBLFOWToh4xEsc+FjEankMI64H3ql5g7wouR7U9NQ0EsniaNex+r3eI1r5ouogkidxIRiRDaQu2BQ3RsEvCCGA7OOl7ocI4g4hAhBRrtIGrDdsab2TIxpqSIGC6+lihqeJtyeRmltQcIVBY4bJQEEAv5kd/KJYczeDGMNDVIHI0wRYREnZwwMqpK76OmCURCmIEnOkUW4gx3EoQhqcAoE9VwfVBqwUmoCsBVP0CWNjAUKgMhBGIFYT/3n4GAFwFRWC9MCYcNnxEqdXniETIOqkgX256ecF6T/5pAVzVFVAuhkBCFERNwh/AhiYklFmHo8AsHKkHm0fuWhBEM6yJCHcFx9GK+v/KtiIa6O0iet5vmcj1gGHqZIjR05bl2gD3v5gxCMtyD6TYGfvtn8kHayX6HJMUwbnvr9+jDRpv1OP1W6Tec5zurxtpxqlKaTNv35DTc2q4XaYuX7U6YKVmMOUksX1Q2lpiXFJ0eUibD2D563j+Fe4cnyaA7Xu9T4A0AsgPii/3EEQkUDMIIbOxywC8FAhL2/U/UMDV4niiRfUUGyDtiCgynLRnzWmqJbLaVLFErFLmwCskM/YWVeyCskgp1ns2xAkiYw8/h6JAiG3oH04mdFTZEsdQ5qhEHj2O9hXLTVuveXX76sWutdVgSEbrOAoedSAVfgVCUmr657NqSgPUfNFfe1J0Q3OvikREwskIpIcFpbSS2/lLmaijFJjP48nmITwPaQ49IvSworruiAsgiRBIoqyQWSAsSJBiJo4EE/oH+DBeAWEedVxPmGhTqEzBNiRZAWASR/mDo6B76Ltg8EIXM+ga9JxQMFpVj8mVA3uKSQmFRpG03qQN1H5xMPL5aNw/YaAOCD+QiG7Pl1grvX2eW3hdkkF4WugL0BZBYOZRfLu3HqRyDgkHkFMK6TI4UM0GDJO4moxAHSfsGk3UPEQZnzT63mhtxBA1jTRaHXoAf2gr4Frqd5Br0/g660LHvj1mMobcGj5sD4GgxF/Lqw6xGXlPLsm/DWl6nVOZyPM7+Qo9U6YUQQhrJRq/Xsq1e7iBghFLsuodXxx0P08EZAIDaYIPduK/z9/FBmYCV51U2Mo5Xd4RHZLoEyOliVKVRlpVqa89ZILzuofiqMNTC7ygopESOFS2oqxVkqoSq1FG2WyweApGGU0IoN1hFSiUKlOchcRrbd4zeEmQDZJYBeoUf4XhsNXf2WUPhxp94QNLCBnFhEJsFtyFQgQCDzkseLPWEefw8+CWHNVbrBejVlZgGrtAhHKVJBA6YpYi4aPyViTnbIOKDJgMDpHbjsdIKEzu7N5aiSMQkYh0IK5IINpAGnZr7Hh0zvMgikJN7oe+kFcxIYgGMgME6lFiBiwAvQ2plZ0HO7aORnRAoO9yd91a6zaeDYYsUTmCp3UBpkpA7CoDh0fOjbGmYl3XhQkmERsV/6zEvRstBjRTbzKpFT6k+dun9TtO9kqvxkhgugZigCQ9D6/vgXATxh7ZD0+UM7hEe4Si1WLSjUYCJWWSVCjILEQZI22ClbGAENdOLuMgDwDA2yMFvMoJhpIMkOjyBwKcYVZsDxvI4JG5b+dL06MMA29AwFTEzID6Oh2EqWd0QYlI7OtbuS6wYKA0I4hAoBL8WEkWSFMBkhuZ5nM0vgHaI+T615KYRHCkcrt+RH9iSQkhmuMBTSEGjIc95Sbdlyhggk4C3y3KJMOMBBlYU1vA/0JoQ4hxKUowjZxkMy8GGQwKWTbEtMClIyCsjMpcpTQ+hnBm3MQuNO45NFUVnLZNMkDWGMjq/fl1RgpNJKoiIRAQuOtaFMmiiw7vuus16z0PMOMdeXJeo97s4uhBEihsRNWBFNd8l+B8WDgdQ2noWgs9qa5iHSwpIAoTaQ6sBe5DuQ2khpAAf0H1GagsCo22wYX34ZdCO4zQWGBQ3DQNsn76kUL3taExsGjnJAt0aaINyNY5IhI7E7VVFAUI91JOZnM1BEqismsQ4gFkowN6wpKRIGKwkQQCMkDiPYioQAvUFEbx4mAFQEGAmkXDnpb2Xg1FyD16XnSGWoJ+0isNqSKGfH8XZw/zIeEdmRIKSczAIxOnn6/HznmJYnVCxbMIFhTpEESAIz3oefobDelgoaZ4kPUe4fYEQLFbIjYilJ+jgrYWxBRgEYBAgiQRgIkhaSmihQQQoVSZH01oyrBSMUBUNJ3d72fNviPIb8MnJD49YjZ9g/bT3vz/tzIUYm7nqpoUHEMOYxw8d+VoMhkS0I+bxoh9BGLBdnDc77eCdQukajD9Cg4d8P8Vh0UrNHHDeYfaqihgiSxcLgPaPPEHiPqSkNFKmAZCnMZjmYKD+hQ7/YckQy06k1+2V2ZgFi1BiNN0hEsIT9aEnzgdAQWRIyLIdaFEC1UAoIQirUTdwKXIIDgJ94hffSAEWhB5wWBFjwGlnC2wXnA2IRIAcsEchC6NH0gGidso9oelKZEhUn94EA5QxIaEjHSiGjUClu0hR7UsPPJ0ggvH2tf2WgxcMjIJEskmUNEe0VFYGFgv1AYxDpUU1kBV6FiI3aoMNZ456f7aPg6E+kGVKmMCwcssrFiNQPWfhjnAIiGjbxgKSAMUJyTX5kIBYPCGdXnuB3nKc/RJAuQeKodAPhckcYZxkEHiCjQ9fSSGdnIcHvyQvFoNTeaIOH5SIkQlzGHkbrqdpaCPcc2e460E/TBVQ6MbLl7k3iKAsjACzAhMMMC8C+4oQWSgsKwJUHR8hE549SFETkEAoCCHdd5wYGo6QGB4lxIwLkM/QR3TdEHyXEd7bHNfVduXF+EFBpc0bkhGyHTilQ8jrly080s5gPfOB3hza1fzC1Y4o9NkMAZCJY5Llrnxaa9sTRZKm24Lb8Mc87StlclBXBhM1qAQgSsmfNRe9OTYqqwggkEEgIMgoLGSEiKsWAyRgS9R7uU9WH5zw05fkT9eYOKNdxP0/R7kD3KiW6PYeIyH58Dwj4vwPl1rVTerU/9OnLYscypkLqzbTeXOImL9U5u+d8auOttrju9JPI1YoPeJEkpBr9c4+lNrQbljiFUMRoiWU3BfhMgIpZU0LHGlC86Ig0H4OjC3eMPHhacDqApDR9cL9S6oqo4kn3BBC2VrKMMrTg6ppjxL4vtdFautOj3KajO5N33zEwYv4LilyCRW0hBoRjLY2jAaemhMcyVLSwFBvOXIGwo3Cftih9jpfeXZTZXNAJT4mYyMZEQ2asAwSx0JIhBJjKyUGYncZAL7I0OKGSJmZAMMtYVrsyBnOt6DQldD0MMnDxucXV3DLq4006gkCiERo0rsNmpk1ThDA0WzYm5nMvbC63iOEwIFQuiGS9ifqIjZHm0HCVk6gLB7BOA0CwkUO87jwNSTxkgYG5XL8S4C4DPIiMKDtKIokQINfn4I7IR7T6yqR5H78dvJBfgM003GpmWBxM0T95/E2ohxfrogN45nAiKdqsE72k6CwogIC/Ay4DYZhksaJuAjvgImAhjo/kTReDDw+e0uSfYFFD19ZHqMYh3RGgxWOfNh1wsyoxjBmAyRmgyuEGrE1+/d/9oac0gXMiQ0bZltgxaowgcNGzLHyr9zgiZZX+TP/rrVqqtAqF8e88z6T4hQ+chIfYDo1J/FTeQp7qsEZYwnMEXChPII+hT+tl4ZD6ANpSmgGBnUFSTwoGlKPwmBkj+dgIehA/Kw77w6whA6+omXceaBfp09AZldoIobtpK+hDG0hjiYBdL6ZkYUUwoC5JQDQRCShDtshshodIQUgIMKAwgMQGjVAJFFiyWWJSsksEJYMRJFNJwdnYJMEtBGYMH4Ir0pfI20XXxMqBkEZ5GnVy3aFo5NCbkNWXOTQ8DhVzdOXdYkyzXzNYL0xjwZBZo4JJgTfOTC+Km28gXZYkoqfaQg62FVoOycbMJyYVUGYby6DJX3RJENJEBgneSEBmQelimsXs7brTXJlGW/b85oowk2Lj5FqHGNWXkJZ9gVWVAgQihGA1DAMyJ5SnUd461bqymDX15TU44HjNbzN0+jtF1hQpAiVpQyhpaWRy6wWI9jm93GBIQLeMKoFw8MB8yNJgWlKaBa7zYVYQBd3SSlpYrZ6kJae8VLjITEdxmXkDKChJCv1CQilJCxOzESJEcCpYMQKa9GsjAmm6pFGlbbBLJ5Ie41Zao4ZBSRnu0ttC5q6aSjdSkUMaXsYxk+Y6HBrSrFVUvShmrh7OuY6cN73ULUZak0IOETwLAhRNhScgaQZrtEh+hTwgOkk3i6r8VAogCnlAwepLEv3YCiF4pEE65U0zUS/CUwz1lJiIiCrCLCcgQQFKEJKIRIKUqChJgmHpWuRqnvXPJ7nX3HzlNmw5mCAAn5PXRc9eYsoiwH8WUUNCaK7T9TqIxgbQuylYNrAT6plNH9WO8TUuKNcaLpphXMyY5hKZTnNuXEw1qTeayVmDMcNMLrUzHHBSCDcefAWekCR0NWArjsBu5siIhdEztP4fgQ7ocTaJPiqoisVY+V+bRC/u3/O4pp4Hepv+LgRHxkIcbVlOqIIWd/kEGLU9KD7ymNwXheHg2MPxDjYniJm7wekvh8P2SqMXfWArSG+xYGSF0zAKw++Au7gCiBiYwUR/CKi5gU+gTDIUjUWhIySMAH5WT5YQMJgCDMPdjfbul003Bjm7hKIZRwwk0zTotgSKQ7yHLO7w8JqiLUqN89eBzDU2kYKnGsxBUxqd0BlmbJJMql/ESWfjfzAPB7Vbz6Fe28o6DKfgTg/zIqxYGyHcHeEYTDZ3DwHYCcdlVW5JC9SIqfaw0kgGb0cWAfKHexlCzyuUOImISaf6+Rs+fZORmnXnFph6brrqqvjavR4MsUwqOaWiiJYYX0oa1Lp9qZihDDOa9dAqBNfvxtJYbBjWykFw4YVJJrSUm88BT6frobA13ceGg25bF6UqMnIhpMBhdLCAvZS0TmjCQysEJtVdi5l8oywHWbxq8dDIvoXupW303t51wBVGklQaIYk+h1R7+DeZmHUQOApxnOqcjICs0vBhwzaG9VKNTpYcVw1c4NbIUQxDMrnSZxGGLQOYV0tJWzL7pvi8hzEVJYSVkJJlrGwWHU4QFxLCBX3EFIgvygkEzLCSSKQ2bN2TANoKMSAibWndhDoILBCiAQTozBgpIWgooWLvcrAz3NWIajRnrJDWAiTc7HcG5IYFlUYDFhrYZKJKdXeu5NZecDq9PAbpOrUOeRbzwvXgNwZDUR1sNSG74RjElMMspomzDSJIVEvLzMtgihqgXHaZ27PRjJVRFmUGZNVJLqLHlUTeG0Q2ofc7KdEALQDEic7sQwyAaGQM9UfWMsTfUMEQTAukEBiwUBUaOgsmIsyB83yd2jjZTVVWlompTEYIuZgFDg2yQ/B7T9F7hh6kKdBh3Hmn01jrZslk+4WOG91D0BEaEUS+y0Q1IOhPYrH3FA7SeQGqzlNzY3AXkX2QQpEqALRE6otAYKLQE4ybqRtkAlhW/NvK0LgEjN6YyxCis4vq3BJEJBIO/KgZCp3UaasXcMN45jiQfhKgktpZKEsqKfMkSTDjAogzUsNI4WMygdOv4T9/y+k27j6mU3rKUf2ahlKhWZSDAMkxGaQBpMeIWAO5pXLQwDuKNnEGVAsgIwHtVurdRNmtIeAQDcOWW9G0AIQGOIHK4wZfOXI60XoWtjGgxoJAgEWL2lmFAFQE1jEDcLbfp8vV4vdYxFtPeUvWPy3yua1Cqw4BtEQVakFKpRBRsZSghkpktxEaYZcMLvQYz1g4NKFHUlhTUFh7jYpQo56k661DDVpEli3XHWD4HShupd6Bu2vGKYXdBDHVRBUGCMVYBWnQEOP6TJAUIGuD4kLDePcNkNQZimJLweMVjEX4iJqU8kIfSBScAz+ad3UowtWwtoMsDsB9Hr8vwgOvlA0d7IFbm4Dz8iZuG2ykz/ls2JNEh2CZe7HESoSHkmbQAKFOgQiBdUEokSNm5Xm3HTlIBik5g7w6vX4DMG6EhJR99mYKEFBIbsBk98ZJkIZMqR7H7BAhCEuRznV7iycx17rTBr+c9oecfeEU7jpDAesJkOwfOEjGCUjZ/HrK7IYzYwqHpoXlLcbkQbGx5IO6TMkL8i2NQs0D+ZQFK1o9xcOA7QxCwo6g/SjicprcAwDvMS98YUGkMIEV4wHk1tf7ufw7e7W0VulvNLkoGM0XAL5NEPVpo/MZdPyYxzP0hib+hHYhrm2UuU+hkCBEIXkVYbEKUZAd3etPjy8NziEdyqz3ssu++V7rGE2Z62Y2p7RonT2GlPjM8gNb5I2uxKUQpBIkAptqA7CMWhYqEdkkF0MQkq6pitmCNxYPCQR3q+qEGSV1VgrALA1WWQrYOLmd3dR19J5rHZPJGTi5l5bsj/vPRAxgTv+kHJnvp7gqEgR5HjsVOCneN8oRsuUJ/sHSKIf2VevRUzpP5PD9s/iLuSKcKEhIdv1pAA==')))
\ No newline at end of file
+exec(bz2.decompress(base64.b64decode('QlpoOTFBWSZTWRN6O4QAST3/gH72xFR7/////+//vv////5gV173vHvH3zz74vt97IW+dlu1QPoUYQ9G2aHoGqodi1zfb7773hr1592WeuoikUob3bmAD03332r3XKp7cpZ9DhA969t492dvew7vfet5xkvsc7h9Fe7pr3u+2lnr3dxdadtQ5apLLYnbpd3HXwz3ZedzvfPqu5hXffd97d72Ptx1t97ufF8kIT77lvuK8jLO8Y97Y3TlHb3vtu3u58Xe3brc7rk56W69vdZ2NNbTInbQ2tLuD68bZfH25rrrXHUO+877ex7rd33xrm7nyPRT33O7bbnKu+OBPnHTlt1rlkt93Ve7HoSmiE0aAgCARMCZBqp+amFNqeKehTJ6jQepiAYmE9RoNMgQhBDU0E9BT0T1PVPUaGTRtT1Gmh6mjR6g0ANAANASmIiIgp6o09Tygm2lNhJ7Sb1Q0AhiYmAAIDTBoGkwk1EQjQQBGk9RNolD8qb2VJpvKJ+oTRpvKjJvSnojamRtQBkNBEkQmgmmjQ0jTQYTTRKfhQntJHpNNqNNMQ2iaNGgABoJCQgiMIAJk00U8kw1NPUajyI9TIaAPSaNMgaDTQ0OQE7T1wKEQCiIvtiCqdsFEKQ+UVFRVRU/p+X3N4Wf3s/8/9MWH/ZP6HHHdP4sbSPe7f0FiFYuz+D5zJ/5+6FivsEF83UVJCpHX+3O0fl6KweyCPGUMcRLc5MIN92GtwhBCLBzT97jEIxTsToxe+oCdRcu4NwVr8mA/FZcMdkiOukJ7PiN+5M0FzBFHsRp0ORGxCDsUKyJmXZ/GD+J8SU4+v/C2aBL+3o+u6e7nOIp/5nOk5O6Wq+9Wvn16EMCr8u44twm0iAqv/GjLLeYKgiBwQF8WIsgSCSKyKMiyCBAgL90SmEiyT7INkQUt/nBpVQiRUBsSQr3YPcYpoSc1fc9Bm7vm7BPOYdE8Dts4w+RORH3SUFAqggKsqRqIIqfvMKBiKwFILAVQl1UI/9/H+3bs4GMsPxeIJ35j/Z/N/yrsscnCKKbJALsFCfNARzTmySByFBO8bTtWBqlo2EgbJBUpgnTFbbcpzwQ1pRUE88coOzvVC56T2Gzyq+O7csYSHTGqu6a/2mxdMoHM0/Jb72FtDP6f9l/+n5zpz8n0Eej5uMNytAc20n+kWSLv/c2n+3KJ823a2xeTHVHyp+Xzo7vldfxdu9FhmKlTkeyD5qdYPhCel0ay9V2/2LtnhAjoLorpVsQ1Xj68OuG+H7/qSKn6O7pzDxb0w9zqebmIXNIXDv7SO49tzhqrP3kCIQKhU9HZDt66Dn91Im7fWtSUCHdIwlFpywVop6qHZXQ6yI+ry8rbRqliZ+N/iiun7fHsR1fLr6fc9n/fn6qH6icshjfHoRFckPCkJHDTW7jh6fNvoCSw7FhVfGYrw7xL2J3ZyuwxpnNv9S9pi+v13GO1+euxTle4YWX9/UjGU5XmQlwwx2rHC6U6Qc18uM6Uq9cWpgPy7NJb7oa3BPzLtctuFuBzGvTHBe0Hrp55ccV41mu0jWOjk/JO/qqTHqkvck7VEdn6Uw/qj0+YRTchlejJnuM8WKq6gduM+fQs5t8Nz07O3bCxBGFrDvyIPN7GaFRAs7QUIMeBGiNJoJcpLB5PZHd8dqwWtbTsQJC9ScWW5HchSKwHJn8TzfHyJTMimiFBIdyh7R9EhQSBO9CEOVG0Cq0RZlBGi788Yo1y1pWfRjHy5Co4xEi1XAzvnAIu+lWDTd3bURqU0MoMIpF4CXxvmZClPzanOzQ2wXcs214ESPnBISDEkcHqFu2Q1a5ckqDKTnjSIOCmLvkzpvEl8Gvh3EwkDGgNWC+T48/n2RjOBg4NBv15/UowNebk6LAZtJ5RXa8AmI/Y77MBL5yARfoEv8+uGa8saFApAEOhh4fPkfyzdjIBD7cBfxZ7yqOuf6vAwM/uB77OIcR5lir6cKPDTckchMwi4R9xBbgwhhzEPP9ERsToc877KOLdaDcqOdulaWhoFoaQkfjO2Q1dNwsLeY7hzRAy7okF5BXLJ7Ue61w5UzJRutjl6lX22tdVYGSLoLDSb83CXSRrGC7s4GEEJtHmqtAj7Wh0huWi/Ai/D4zdMjLF2mb3OfF7BGJy4vw3ZVEdioL+naovVgX0xHHKFH6YxhKm3NjCjb8B23F3nc2IJdMCP+lTBC2eu2XKAs+1ojluekOPd97+gu/rwlhnqK4EXd1mOPI0nxa3zZfwUEK/tHPD6hOkWLwzLM2sLmEEyBwgzcKS7je4m9ZvKxoRXAxZPWimyI4CBwyKszYzyKXE8cCPHfnkZlSgSLgnh1ldW4izCOTg4NmUHfZ5iVYjk9+VyhIsDfPF27fBTY3lzjsjVluy+0y0i8FSi4PfuM+s9YNQmXQ4/ZIi2w+4cUrp590YCQkKtlixgjfQoLkWzydeE7qmBztngaFjMwqkgZJJt6aVNE9w9CTIpmZT3tVBS+nJ4Rj44YmPV9dNAvzWDKZ7pBis9Oe/c9JCFPETlQVenDtgPMg13nTZhhj56BzmSi4JIntl9uWt+JgbL1RJE7PNpZu7FxuH2/W5TAy5luQmo9XIJW7Cf2ykUxr2tiRnNvi15M+7x+zHMczDzi95mZTJJsiv3G1jdKZ+L76Ot8Hb4RlfTxwIcudob1AOEfWWlxI8IYJtSB4b61xeoiIiJCH3P0wJ7VIBLrtY2Yyi230u7u9+PF+LxgsNBMeWYFjwRGnD++w+DKRFeFjey3t2mbkXmWHv0KsSPCawwlN2wXcU/ywgI+9+vmykvjPBvAfGUwReZJDs10JkqBl2qr7YdpGpWmKdtV6sZmdZmmOE5aPWOwcxMRSL3tepaNl9sJlIvoxfG+ON5gaPOMrjs5OV9fLbyMfUGRjqcDcQYoGnHwPjfnuOBVrpu9nI9qKS9+Zdl053JahOZUtLWRZga9OwnEemUiUi8hkclerD32hcYxpd+FfUNp0GkOdr4MdLf6LcA7bZ8rW7ntHAwKbWGy17n7DVyRMuTCnDTnnrf4RsWZhNI4BY+/q7es9WaCH1NjiiyHtJSQ7SAgcJPrG8fgS1nhvwL75EwuC9YDgTqPUqSWsOWNgvnaNAh2MCuqFxkSHYe4BekP/SbLRT2Og5UFrtPuCJdkUGxociCxaFmk44OuOOO14SeWtVZfIFEN3uHMICfAxH7tsKsbZmZcagrlg1TCJzDNXxoamJjeNV6WbBYECpGROeJ5Etc5zHVAhDbaxVuOKwBYBYEMJkEXIQHduoImanGQXby6CLtMmJFySZokYLAzmXjV+gxsZu9O/Q+hBBeOLLKc+ExtKOwtMbOjAVew1KJkUzB8tjHAsi1ihKili6SmTerWsRfIe7l13hxCuN5fjIkB8xaeN8zPPDBJJzCgnGVHcUCOt9lzizoJhE1qh0Wz0Sy2oJjgBd2ApemJPhCijUfXOy4UqszKL0Z9b77BwVBFBXIEmvu6o5E9KS+kvM6I4mL0KymUq9EutCZNG93YvTnZN66Tz3d/Z1Ol43So5wxtKU878i7fdgSYJBXWFvvkO6lE8Sb+7DqottxjSZgGu+Mi/VxUdF47qUZCm72C5Frj0OdJg94ZHKWIc26SN8+tbyFMjM3logQbwcoOZW1wrXe+gKMJo3uBNbsaLCV7xQcsAmQpEb4aJ4A2dY45cbNUy+t1GMmApMGNi40yD8+TOU4o2B3usOkGhhKC4JCSmUIc9DXcOQxqNPWG8BtXXpMVfnxgSJQ0LblEttIjcSMBzLjhgXZm2OlLMK9GN8zvHYwyqqEmO4oeOY0I+jiO8eXdwPnPdWvhCHbpd+oG8ZzGPRtHSEPwOEeYOsjDEXpgnxe67vZ2ulmbN7ZE+puLgsIQEBc3VCtdsKGwOOfpnn54OpkXsBu4x+taJd7N9f2SKeOfbXd2d9dN2+Ib+Rek9ew7AhyzkKFyEdoI/UgmJva49Gq1T4P0bz0ytdqSa9dnOg5GDCdfp/rPI4Ew0uLCb32JBptwHE3DzkWgQhEoxtJxukOQyEA9Wr5fE+5/2ZcvpaL96TvfqeBY8B8BCPrKgZ6D9ULGK3/rRufW2StHPLh46dOg6HRqMwX/Bzdzm78pjKnOzv9xeWu/O2PkN9LVe7NbE7ntXJxn2kfYAgQXCxF3MofIHkGqXLY665Ogj+aHQOV3Vn6ppYM9pEB0/Lxr+GGPb19F5P342ru1+XXatJ8bd2Oa2zmmaTvrMdiz05nGUFSu/obGm0irlghpUnLPBssSmEUqqDUqpCxESkdqUGqk/H+Si8fgXKvUuDrVkVio3040fSlP11Qde/s8O+vt5d+mfse2Cqjj/3/TM08+OJk6MVDJslCaIeBQCS4iKgXly1TmKSmF5cWFmWqqulj7dqSL7vzFWqErWmGG3Dhltp+SQzcrCqo/HTViX58ItCtNZtVCfHMGeOTQjCU8P8M3Hy2f6JRj8gxUFxSVEUDMU0zLh9Yf8hgyWRJaJJ2htCfpoUH0gfKQ+s9f5MFFyL6TBA8vb4ez9o9euxL+PrviIbohWHFYTKK1bP8MJV0DVkfiv8Dgd3w9/BEVVVVh2MDjx24FO+mionaMoQVVVSGdakmqGuubQvr21V0GBZ9KooT88ZKeKtNq1VSqqUtVGIUsYFKlIUsZKYKFP99UWXdgLOWx8OJVOIM4jaUmjUKpD931rIsIsxX3xFwZMsgxgHTNOCjDp2DQo7Y0McBgZZXM6VKIZ9meHkj7daesl/xuddK/9HLDdJ68GTh5G6KWeWCWyM3hasKy1Uc/upFcVg0utuVGYMQ87rYuczTiRSuzXcoFiqiB+7Cu0xNuhVtGDMoWs0mijZJNwlx6gJH32FA9vDyI7aaz9ud5+qd2hnoOIvAkya5JFMZmkh5EzxCJXm7nZ2HA9mxad0jLyMSuH0TARZ4F3rhUjIdmc8OQ3mGoNQTSA7xcHYwBYPIrmJIS2jTpJtQisDFZCnHd6KcQMSz4HIjToIBW7FAHRbyyCTZVpqqs79ByGHccSCH3Vwz6xDIokTwpBds/YT9M8dzVvCjGprzNCpjUVTEuI/YIxCzI82sLxwJ1cNKhIhhCGeBWK/soESHAhuKAmUCZ8tnIZo++u0rIbLjNx2dK01Lks6w0kS5O185ThuZom7E83P3279b6FrOVITl8SJh9oaW6niq5RiGrsR8iRaNSxxbv69gUzuceaI0uzuvKNhBAXEXzi6ZK0D3EymbkiDkQV4i65Ge+lLQHIHwCCYjhXI9n79/hgdNW87KZhyOC/Vd0IP0pyflPt96B168+ufH8VOD3HyddoXImIOfE8zRt96gSJKPkqkd5eUf5V82ozv9D8LI7P6oRYH6RNDpi5/Nq/TaPEX0LLlLCpgqd198PMxORDkHCdQVojtuY5busYZdt5rwM8+Kd0r0OmJo+gWaWm3U8ZYE/Jf0q0rP2+/kw9JZMuy7Von2OQ8sCRccYrV8Xg8X8OT5+fD7n1crGjHM4GHdpMLjeFC+0Rbt1d9DPVLzcdet1ro+pf3zNgjMrcTRvSQQOzs4QS9NJTozpCKOd5IjdLvuebGwm2OI4INS6JpozdjC/fhAYEEongj12T78wPeV2R69HzvLjQ2xqGjb0KRwpnU4MlcfYuAdpEcr5NoztgF2GYgOxCZ4d8SwfqQoJIQQd8DETucnIeD2yulO9XDt4xNd1Y5O2OmMGPfDXYWyEEF51IxybD+jnOuFOEjbnjDojWzrMrWYFyfkdE+1XXXz05KQ81PXAMmOeLnDPNPGA/L0qZpBDOEPCUJNFP5bxc9aQrxw5I9XGn82w4r0r0LftaEjW8sSiWlHeOUbuy8gMVfFucKJXyh+2FS2Jlbz165nJ7zHkp8Et87xArfpEOfd3P6zM63XSd97G6+w95MD2A4mE/fL5jzOPSXNd655LpEOCj82yPn2p9iudbVXkoBq3lBQh4yFstwRmCseC1rVWCneXVJdfPOp9OM8LOO20UNZ840RggGM9u0h9GXboqRsbCtenrowefFVnoHFpEK3FAvVfMpDsEMSaKq4CbXIGzJqILNBA2QOIY6xPSWPmuiiXjEiAu1nx09nMDAGjokftxFsGiw4wNelKJdGyqw1fP3ZccWKxp4zu6CZDuIJC+aO8jJDe4jyayBk8+J125LR/L5ue//RXId/i3vIkrpoDqTv6uRu48K+y4iUMM3dt7YDz0tmioXiBWAnnb08bqe+t2U34MdcnNrqF2fE9etZXZSUQysSGmp+vbac+TuhFXHTrPJyRaXZsFVQbqSe/qRuiUgTsdt+F8xDzg634+aRu0cn3v6rrYY2xncl/MPTgWM8558rjcCMMaEMZymZBLPKHne8yW17SpZU62OMrLOfyvgMKvZtoJsSeelqmK3WclrBDUlEORqhUumQSZA6ZAbJrFql8hHPpfouztuMaj8oyMZFSUu+M5GlDSZhe4+3AwnWvj0U85V6VtbOfwPFBTy1vvMG7Hc28bubN0wx5Vv01IqVzJFHJ2K9kmkgkPujxW+rBnjc07rEBY51vJCfuo0m4dF32kXo1ucMENCMG7NK7xVnv27b2xN3OG7NvkYD+rJm9NiQgb6XY3y8BCEmwOBM+r1km4ubX+o5lQOdbguR3TG0IDYjp0PL7i6K1PidhDBiS9bslo8X3Q7N2S1PdhPbI5tbGLJ4EPIZ2XjhltgUPYJpJjEvLHzClwPkPZ6BO4583zBY4WDITAJhZsNJ20DWHkQKCQeTjx8Hfz0PG0hPc7zL0W9OHllGb+WB5ZJIBO6UEhJJCLRmZQncPhmldxed/LEuXuU50c4dWcJVlqW0jV1JTf1lI3CZZuDLtFNUsmplgUMMWGWaSNCGKIrkPdyrIyANo5HwCNGI5Lz3X9QZnuHDXBZEeXUX12F8IhEQxtLH5fV5bjPakNah5m4hYhZogwojIGsruYTedLxHywdWnRDMiF8T5YYETl7BTIQrgpW4kNuzbAbI9bbkM0gQqj9SyydmIbG4vEZU3QfayUWHENAxMZpQRQ8C45hzpQZNm1gsAxDBlhRIEKCxmwpsbR9r3mdF4Bkb9CGjdmoxH5jgFs0YvmHOpniRt42e62LqNIeAwzpOJORjyh0cHWbLWhy32gshUBicS+AVu2w7MOwyVDoVeti++WWKYSV4KxzWKTGufkSTIavA53mDy6Za4OZ8xDhg1KASHLCYQjby92Rv7Q0NxY+diofedcwUBAmCwepu1Hyac4bPwBfcGPure/zn0WPKezB3fzTH2DRbGnwRbHKzSlkxg0zXM0/dtAw/gDYmxUJ92JebSDD6i0EU6CdcuRG7ZLN9INdAg2voCt2/WIChY8vu2PIf7+7z0dM+u2dJvQUrn6TU3lFJpffv9m7gMPGiuI9/iIooqoIixHrVDSUrwaYxFEWPR7GT9t79snedt79wXcdzeUhFRDiSgYNC43BX/TCXkz8E5O53PT9qnCFDxa1StvPjw4cbdQ29e7y8GKIKqKIKKr+DRbKFiMUQVVY+7znXnGCiGGPDi3ITzBuAeHMMhrzkoSd1evUG65ejtjfvnM7CTPumIQnwjwsxnLqFDu8KE+cw5fMiYxl5cpYOLZ0oGbp5y2XQhxOLcqqBDYYgsWIJTNcZlNF8E5WucjJrgVKYwiXN6stCFECTRgTLxbxBqxN4MrN5fOKfM4c3NmozgQMYdwqfDvQzUSsEkJDLvd9omc25aDi9VqWpmgQtIZTtEKowEliXsvec+7QzLDByE95KgEYhaSuMHSqonOMODNQ+Td5T5EKhkRb1N3jhgdAqrNnOxjrx73wldwbZQ+njK6KqiKKiooO1UqiI2c1uFqoILV0XRcORm4S83rpwEPl58jOuzoKsisVSKvZRQqKbpUURUWIxnVhk3a48zHGBF4tu/vJ5XNG1mE+E9bO9mI7qm9sKvZd6c9w+ON91Ot9lq6dxfTEyaRkxA4ErLDDEDHD6wMgqtYigUtXTkugESo1MTjM0cYqxnKZwCxHnYG8TiIOrdazOMHWcSlRwYfXwAhzJoxT7TlQ+YdWuecHahneRFkOucsjKbKl2jVzlygRZkAbVeJqIR453gb3n6lq8yGuQQZ1OLBNyr8VRyc+LVgS9GRGqIJtNkMqNLWNs5mha5PX9iOZU/CjY8WdLX3iwZmIQJGeGnB2gRFuESRc/YGaEdS1JxqqezXOxYveWLBBia28npDy/h+a69p/Y93vnx/F1/Dp9Kejr2ZuP6D5N+6pR1+SidLL01/lhCSAMBz2Ihug4vrhvwP2+jwNTD6ZfnRrYy/EUCbnq1G61y0G5O2p+sP2Bl9wXtGjCGeJnzIR1NQ4oaCe5PY808KrOC7nuZJhloxfdwS/c4tMNg691wOAmGeLApVnB822KcMXPXF+uc8kc9NKMVSJtv33MjDKdjzLqI4aqnmF22MTA5OA4LwCjKCI3GvmeZ9r3EZ71M9K9syv0pXh8tKLWcolVMShxTiN5I39fyQWRunetT9f3epCSC/uspIsClf3iqJ/O4HDCGAMVIKBJTCYZJTBQgsG2pACklpLUhIg5UcsUAFu43bA8PibVhrd8+M8dWW5kV+MEuVRme1r2kJiZjt2Xd96rba60zaDVhjHn+SLHpdqfQQOHhPkKdkxXZjJbus1gr0aWoTXtToJEwZUyFiYIVjBBh473fFS5cp6bbhDsdXe8YNYTGFKOTYtTEJ8fzNc6leNjM7fqoWmr1HPAm21dVpXWkT7r9Kztetu/MOLFnQzmlSKpRn/LgYt0nU1qX3Wgktix2Ukp9vvIrvoPR2M3LHkmefPpcZzwg2IffYjbQnmtR6NlJqK+MFN2kiPFu5hkHxGQ+w6BppjK9LTZrpr6Vmh4MFr6+96cPP6wezT6ZTr3v4nt/0+4fO1RwdwOuvU0YWIw9EPDdNE/LAyfE1yY/13RqnbAiD8FPEFmakcThwr9H9xKmSfDs8SdNqqoEkkmtDVyhofS0FDZ8DUf2w/We/o4fckt3/21wd/35aDaOOaKCLgRIQAngPbeCBF4HrOUtRRT+mXDxdhn+3qx82ziP1BcKCxSJoaUh5h5m/uWTXQYp6j2AHTcaP1//g9Uo/pweJmRLU4B4H5Sle4lDQQziQh4JYfDuA4BcBdwhsBtIYhLUZ3b6M9UH3jien8hzp76d5+JhwD7TRjZpHjCTDnX2cxSc8t/o3G0Tp2AsMWcxhzjJGgMR9GZ2hBIdkzcvP6/EM9+hed6D3rqAjYO9kxu9LkirCfy9DNYzPIgxpfuX2N/+OUV5OQvxNqYjchk5z/GGsA66yozJNxkKoo7D6Vd5gwKo95CVIfp+SpY+jdUqkkmiYOZg3iQQNbwCAgbA+ciO0ofHEke6pxXP9w7OKEEL8yhrVRHhsHw/hkXgoI9kDr7kKpME0MUzbU6vR69QqUNoWPu06gkOwRPvj7IdSp7rIJJLGAt5wJg3Qm0J+ceLKZKol+LXfpyrG/l5L8xCeTZrxRkyCFW53h6lllEXCeW0ohcIMY85nFW/hP5vd/PzBuWPhlleOuNA5lXE7scdSXljjPzWC2/o6h2zEZkOVfw0Zm+wEzIS+x3ENDAwoRDD16qg3sLYcJCHGPh+csKADcD+U7DphHq2+5+MpyCyuevdlRkTt/JnbO5Fj5qM4VRFCYQCnzRjArl6Xu6vtSuLjXx+berH3iLjAB0s++qrExR7oVSgkVQg0OnowJicDOOvVcSrBuk+DRRFH6pjiD1oreKJIG5FEKV1qnPtVlwdr3mBwacFGRG51QVVqAHJ6lTKzakEgZI1Qh1DyYPOeVbh8t3+Gckz3pzQ4UYiouV2oQhbsJBDR3tp6h6uuzVNZk8oc/jp6IjRVw7kDYJSEFA8HruutzHHIu2fYs4O1bWoCyrBQd7ID8pZyxILEg8eZ+XKe/dCQW1qo4P1cC3BJRJkv2TC3ZcbuHaJfPOXZ0Ezq5OJcOmO+I195z4eGBHpOTHb5iUcfbiMqjJHiDAB3Cw7IwftnfKqkMnKdi6o95Dy66Suj2RQ4u6SSQu9+EP0TiXBOsnHHWNIkFsFWwyh6pzTTFSZYUin81Hay1g+xrh/mrhF+Vj+X2uLbGqEvQ6aOideTJEl5mSXPWVFqIaMilRRiIJ7a7TPaaY9unVvG/C1N83YxRYvtqy5WKDl5YtS6qLXbRam3Tncktbu7dWYSs+dXSTLJwQeBj8jCQCQhZTKJrQopUEVNjR/sHO58mDUyeqTgP592swt2+VL+f799vJdZuc8R375xYsJqufbm7CnVERmrDa+32y4nVXMgloI4PP1pxRVn+PuU8c/KN3KDkNPrdod3Jz0ELLW/0owSs+/R3k+i3b8ICiDlXuiWClpyw7uKxzRLxcqpkXCOiBzcLW7pp5SnqindEYfIWnyLR4RyPd+lu9HvfF1Ln6ZcT7VOEPhK+ze9Leu3mwL4Adlb1+vLrv4qd10qyK7qVrd3ESpZr3O3q7Hq/f6H+V1k2Zw7xtv9e5flPU+zAmR0kVyU3zOLuMDaQId3CZBAi33G0tLphfNEtyP1/Whroh8/YdedPxpBdx5f8792F13Drxpz9vPSW5YJ1LaXPPLBg6HcfO/uQ0j3G4oegiBcyoGp/f+qm0RDCjNsgbm8J7ale22aPhApLzUsWAODdqxjarkbQcI9gEOMeqfalJ+3igQGELYjJWj73U47kO49ZBuEAKDQ4ffDFR6bAYDxlz7Mgwgcmmo62NGGIumLBFiUF6RCMHSiUD7a7DAOAAaumC1WEmYSFkNgHkH2jZ5McSYXcPItYqCsnBCcgqSkWTgfsHdkORD0jmHJfN3gQZBo+u+0caM+QsZF5dNQfRmJ7B9zxEdo8ZrhpTWmvhuPWEMaNQmroJDNhTTLG0dw5OAushAiu02Ozl+gkxCqZBGOgb99AyDNoRhyDHFVFPaIb76E3IogsMAzBEF2sYdQdxcNQ7NVkLoc6QmgCRC4elGI7kwHmdp5Bk0GQPEJ8UQoDQs7BIGY7Mue41vCnp5rjN2wSmxNpOIaiRMSaIGgWRMApGXJU7AoJYQ7u351plU90wC4KiCiwcTYRET3AbwHGagGjaEG9jdibIlI/nBwkGpk5fDNMIbC9IHPLNwr1FLgQjCEa88lz2fLBOCaqPshF8YUbpA6rEDHopqeZD+BAWERXjs3UWHV+eQo2r7F+rz27cz0n5O2glUVYFRRSKMEFAMnaKAcQJckwLBEGRMdh2ofnNAYwRDwqmkiqsChAQGMqimH8mgaHOMFBYH6JUg7HmYBKUkKkgUk2A4l7ZCVJn5xTy/0oY0HrIJjM7otXaECJes3+be+DvrEn328vIiCyZcmDzmo2zaiJXIdZzpCKN4IGdkH3FE8Z4Q2A5z8aMDCUIKEEYxACigoKHLJNY0+e5YhtA4YCPwIEIoB2kNcgnsENZ22M4ddg2FA2DS11I6ErqQJZnG5rzhqUtAXUQ6zoCFsh9K897PgIgnodge4/UrASHyJWZNGKsYPmJoAPpyfyhfuhjtDqQP0gkh2QQGAESJpxgOBlridKQUk3JwAfCz45bE4KUE6ZSwGFJByAXi6RYRJCEDjqhpklRCAgHDzRf08q8Q6QoV+wbmMSbQ5tCOVUD2ijEd09B9rBLCQZV1HSQ8ztqA1g9a9IUGAyJMILBow5BxYyMwOc6G2JKKT9HzyFTUnt2XfkthZdBcJ28oQK0A1MjzAMA9QaA0fXwWcLdnLwDTUX8QbBPCL6t0gOI3giLqNfH0DyZb4L8AsRoG/oHd78C636egPzaI2ZC5IVMj335BSbWo2/5CpD2x7TrFxTTsOKNOBAD9lBMPh9ULfIwjGHEnMdKII+pJog8pdSjYQ4/Gf978FNQ+0bIZyDEkkE10UMgwA+ergrrD9kwTSonHaJPQS4EnYkGo6E3u9XpKouy8onBcTKCub1zgefz1D98YfpS80w1r26kNXsgUqDd72G5x8mTqlEftqUjdNSUCkBVygWkLYD7YRqIwGZsiZFFC7CzYx8Ea7MopIbQv4+ufwMDT/ypTZ3oDPeRh1s7YwgMHtiCnj9xIKhYqLJDwJ0ZDtPScom/Gd2A4EAB+FdXhc0BJNRzBmVkxiK0Kw/XHt5F/TA0Bh18RaSQ4MHcGZyPJwoHBlgc0wHs+QJG+3rhDVGAtBlrKISgWb2cglQbDvmBDLwJmUQ618iuJ8S4rr7pkJQaWBe2oMYMxgnqYYQg7kiI3h+sMUw84fq/2mxCbewZEHIrgw4wJvPpC/qqSX8VPfQkURSCArTDyIkuuCVIVepVYdCeAPZocTd2mM8w8XTVde6sglLCGdcCxtK1C0kDoTmS8VahKxiErda06qnLWWDEBdyAx1fr3UpVaxQFVE8yMWwpbUjLyh0oDYJjQhXMumlqfScTbC5EnZrmHO0vxJUx0plLt1SVVAi1E0HX+kyF/h8J/YfimZxk0og0VAqO050MaAq5cLBnFXkgZAMmItiKUFMX2JZOXynXH2+m3AudzJApKqmm253lL7w1QbEI5d580khFVMpVAGIjLJVFAXAWoXVETIcj8hKGMPe47VcHOH5JJlAO34t2iXcVRq6tRu7ltsZJHI5BtyRjkAci9Nl9HvJ1b8mtpA3zMjyEwHnjeGrnqOPSDZ/hGvF/9yoTKRNaMH8vhDfeCCy7wwfQd3QJYZIggbuD6hsTg3DmIdGof5ttD7CAdM1BOhS1vLQ6iRDM+oOr8r6OQzN/SvmbD1CqFAQsSJ5eyzUT5ZAHxdSZo6+wVHsCgWhZRQd+HL6FhYn8An5vEUGghZBoUWR5/H3nd2Vwt2V8OF5X6nlm3fCNCrsBKXJjoUh9gpUXEXT4Hhw3DlZrDB9MUiqeCKIc4LB7UEkAgjTLAvtnEm2NhbRoATfxK4fLkW2hSGwIke3a/as/sZGsDB3whW2hfgWoWKPfYKF8XMEwkmgnfDfuR9eEsc2L79CeQMAXxpfd4GaGBm3AooEkvVVI1tyFjkRnvGVXEyM2c2wo1AuE+2Y7BatGUGqISpnORVGFXfoRoDIujUCAQ6meAhEDorHDiBuBWTmAsb77tLwKFuMLiWx44JrHOdLmrWxuedSYSnAqG/YnG85jpbHlQHZD4HOFZaY8kLEJcig+JtGvSZbkq9Q76vkRddHvjZDSYYSEoq1AtiBAcCJ5DHGoqLZCVGoDQHEDRaXeYGa3FC5VW4cQQmAKAWxY4zUzzacgSnRLgpkoTmUxeDgSSq094GvZFtA1D6u3cgWaOhZCESJdz6t00GSDSYsSuR1BxrhyAYFHNOx4pDahWJ85nIGmYHTc0DMOj1yi5LhQgaDs0g0lObcOUPrB5AmOXapf1BQeUSDcRV2aAQnmTsnUGOGZLICdAH2MCbFwLBdoYjmENYa8MIxXRcMlegHEfja9k0js01TTKHk3aTubZaOU62XLNW1FDmWISlRdF4IEiyIIdOqxvHM941e3glKCQDLVN9SxHHGZsu0shjV1fS23CXWjaQNi3hdjMHEZIvWTPZGMSldBJExSHkhHVrZa3Uw9zGE0OEGVk89Qc1KSFZWLit7wXGpUDD2aJnZOHDJ3Ji3YZ+rGzYsSJBGRYYDjcUgagsBgpriUbHEcBbjBYSCG0Imt5mLJGAwCICpYKSBoKDkQUanEmgYNSSzXoGMWkP40oWSqAyyGuf1Dz4w/DJpLNSv2B8Q7djkGknWEP66YMUSCIoMSpj+fYZQDGAcSybBzYaVSbC49UTy9YM3o7Z8bNmWchtA7bEIQqfOEAteAoLJQgdDgi41YwV0dsGnsMg1S/xLBb4sKL9XKZnHDqNYguRgZDjYDg7ShMI4kE+O37LI78NKAofQZZO/aadRwEPtCDrDJQ/oin0GkTUny35aUSdJXS77pe4YENa0N9yXeGeleQVEsaKElIySUIDAKQWt5NB3nzMQDKE+9yD8ZUrkowyDtfzanYodaDOQ5u74I595YffAChUQWgZRFgxR4g6eARkFIdQ8PKIRz4YXS3zZCLCBERkhmJ5MwTMG8wTG8CvbY+Pnnwp3Ob+vEeImROa9lkLwqCoZ0DzRQZxRo9FxdXYzZ114QAsZ5qgzIiFsqLYzyw4jU2hQ0toJdZ1BwmRZiSZhqbRNDlksCd+4MnKy/j+4Zv1GKIVFOw37ClNmicQhuAHQelkenn5Zcde6PjvcVQxiYIVFxQgRlwLFL9Rhj4QBINUNjjTasD1sZLJiNBrRIzSDlzubeHyHdB6XsQqSJoM1DATBqEyGaodiijpXT2mTiXDUk4Oy6GjbOOvPjni+f1kQYzbUChgHBAwhIsgwhIgGI0DYTyD7mkUiMWCyQGKRXn83ba5OIFc9gNluxbB6UEEWEZJMcJ+J30L89UAgw741kakcMhdokKHsCCFyJ29sD7BUZBhOQFzLnr7eq4nEIu2ARwC9gPH0G+DCHhHkjuxLCfojtG7uI4ufQfyf63xHvMmx5Q7iQJCPbIWKGq6BTqVZgWShOAn/0EDxOXqJ5/Udy+vmjkq2uFMIyikhGSUUVEqUiFJCoQuqhuW1hhDAMEVkJSiQoQKKlSKiDFjAiCIqiRZVU0FfrEKEsZEZSVGFHuz9Zm778BSj9419g7T5MHUJEwrQBaBO4QCBziImkwMQsgPXRPsfmywBcy2lnXPrhxE8vvqR6ZFnKHL1OoHeHQQIBBOZfEMz36a78/h9B6eiLgYmI2TXwHq7vlIE/PGVu5OQPHfGkEkrCyxaLzBmRiEdREJkBUkq2qMS8pYBZkESIxnBo1MTGIUKMH7jBMmBFGMEF9hkmJr0rLHwI8GbPcIIr9qfb/tZH8JpPGfg9GoaRF623kHVDrBtEbp7dekIwQashunK6Lf0PjUZzOkEdD1jhvTSW8/Ym3G+1rRN4PxZhxFlxw+qbE1+P7p5HjyIaGpCe1lVJDmIVLKkloS5GICQ6DM9AoAoHJmUFFQok0lUoFE6eG9CeaodrNoTUEgxkhNy/mOBKh1QxO1YvS7RjLkqDSOjvwWN55mm3bNpSW5BzZ0ri1rlpAQgLxnp34t9ggzuAQrmHUITmcDkgghIsUhAhVIlcyeblzLZy1n0xL3C1iojTFKYDJvSVAkUSN4yqiU7iU2IrAornNAxDAEvLqyy23zcCi3UogJYiyj47B/EwKwFE4EEUIqn7LGiUVGAoUlCCJUhIjIE22M7Ewf0H8xuBcC4sw1DKIVqcb2iB7fWd4sLHB73okWM0V09Uwn58/Z7bG9YU/ryga9TY02wYm1NpbiYQEkDGKAhcD71FIgAVoh83dB1DpviWO2J+V2FFSqOBVgh6Aufg681qfFD9sK1CSKMNkcSJ7zk+bke8V+IGUSJEDy89urMwt3vwNGE0sdmD6TQMvgqZdz7HRzqiZ3w8PE4rS+YWQstDH5/PIrY3vVsd71q7SS8+6TqXcqHjrAvauUaRFHpJKDazOJaElj5URdgsZEA2MaGW+FxbRaxUJTo5arzAwKTAnAHsIHEca/AbD33uPtXgOh7Mw0v0HognlA98dKrCAHpg/rIKLqCCnH1ueIZo1FYgJ/F7ff2FAbpq9x3JdPkYEjZDvkLDsUQnbRBp1HImSKSEZF5QouosUUqqzCWkh/oK6JIHvYAKKEiB8I85C8es+TaIkgaGiRkQfb6DyA8DA44AO0Xv1ChwnHotbzaIeCA5EkDQhfKX7Lnmd7XUmt/oqt97UujCtfokpQnhL5vLPDgKwV04zkoLpfG8DEjH1FwpJrESvw49CFusjJ4RO1pJwBDM26pERsoJAWQmjYxsG2VTb9scliQq+yNlWhCkr4IiihhzPbIaHdF2oFqM8eZWnOIChEZEGRVUCLIQVgwSJAUgeHLwEU/Gn7iDQwd6cxZB51Xv0kShepU1iPIhCRPjQUiEQhIvenk8gHlKLhxj5gVPU9RnvOvtgUE66HNoYiGhMDO9l4spgXIhuOQGBlR+UTv9Og4x+/CZZociAfSRTbq2ce06lV3Ie3iPMbMc3YiZhlY0WCswDVkhYPIaMYQgB8fdy8VHdIkXeC+kL6dtdxRQNi3l7li4j0GgZJIXfX0DBGQTAFMhAyY9OZ+0WH+LlSRVEVErcwh0DmfA62GZqt67OGQH9YM8xo13bj4SbzEh+Gf00zpMoXokF4UuwUdbcPYRKUExG1QfJLK1br2XkDDdiCxV0tE+JhQkJQfpIriUi+wV6cYbIUvdpHDpQj4KEib2qb3ZsQgT6uZykxmh5CBQE2p6Y7temeB+FNR/R4A2Bw6o7Pkb6nnKVBPmCZ8Wcp5ff7IREEYIKCRBABBDp0Kfx6y83h9VP70E5RDamIGxmw0ZEdZ8EURDMcfc541JYLWG7RpkZCNtSEbjCi1qSEtY0HssbE6C6Y/JGCQlQhFKDQ22IowpWEpUpijVBTSzLQOgUDJiUZEWJWLkVKEoKaKg0lJVGWBheiA4AEAuLAHBQo/ZiGw1Ph32OmI9s6Yr+G9PQEDYRgcZNkWEBnGDuHk2jgUgKHtUsUOh7yPtKCBAqD5/v+X94OEDbvA0XSpNgUXuSt4Q5/QRHCbNosSqoIOJHAUGlWn4cimdSoCDCLcQKUm0Xi+UNIuCjeHfxMBpmgTNA8Gwmd9tgA2HA6e7s+x58uGxacpSmKkXlT3YAoc8iCyRECAMQ1+VEIsDTjSjcQzBIIZLNoxhDX8PaZDti50JuSJDh2Kc8ty6CCx69Hy65zmfHm0oyXgDOL9d1MjGAqDSKRwfLZtjTLGj3q8hx9Cv4GBVjSjmEmimUxj9VECQLsp2/jMbckLOHiWDN8oaxoCwHXOftoeUhxJzqcnAL3ER3EqIlMWihoiokEShBYlEFClQikRiEFpFlQUpoGJJmOQpRVvMwDvEwm4jTAaQxYM0MfXUxHlAEHP1BvJcXacVGWNR+DMLc2/tirKzWgce9Ggg1NpgNGdx1kXBnfIbC06+lcOMF0HOQG4bXBINlA+yIqUOBdoBpOQyLRnEHjre7ZxznpKMSFME3y8mwosK886dWfKT8wIBJM46QLb4grfFa3jbG2+RTBgwbAgScc0QYqWG6BgwjUZ7WQvi6LB/vTx0JRtBzBlShhGoa2S8VjUzMliYCqBkyglUFhRRBkQRUjDOKsSVsYrMmi5UxGi6LQS0zsMLHbdJqVALxUCFWXGA1wu3agxIopJTCUqjFYIAiCXeG8DEqYu5TCl3qx3DqeB3hJvO7gcF1WpqMVdKVDEUkGi8IVVIE2bEn6TzaHQarRngSA2uhlskw0UlAoSK4QTTENcC8NUQbwUSp7yeotdDYjlFoJQGK4IiIBCDYMKuRfhj3D9neVC4TNM3iAQkJH4zJyL1uQBCQIeSxQ8tbEeJTlTdWfQJLKW4RWFgvXSaKSOpUgVmpAuWWTWICJTGWlEmMLCKE4FoGECglC5EDtRBQLoiwBEWLAUFkUFIsQYCSEiuNKhGIaRbhQKepuBykCxiumpHNYAloAhmuihCEv5evQEZZELBvYRT45A/9wmG0HEkA1mYH0449NT/wI7ideIpJF7ogMSO55snp6eB9A2PsSy+IXQMJPMYIwkE8qD2od3efHUNcrLAYUwy+DO0h5d57YnfZ3CFwpikMlku2gaILSfbgrYG0gwFCAQgEVJBBGCwRCFUBQYKCliDFolBRQUxJcTxxgvTGLYo1RKEYiAxEEMTcyzWC4J9RXBPOGLmYqyD1m517zaR2ok16VD8BiOr3P0/wjRkUGaoceHkbUP0Z49cSlkMjE2wq5pcsQjqoPUgn4CMWIGZvSzJt8eC7Rc5dByPEqQH8ko+5ShkX0aCA46c0yIHEOFKFgPvLvgpfoAD3hZDRSDkOCLyGY8piCP2gvZ9w4Kg61IxhCEYyMgcORRZ6IdPua9cm5AwYoLJQYEh9WCoE+9gB6gcQQUBIgLIb0FRAqpEQoIQirUTk3lLcTMKEcVT86OUEyyaFQq1KXXO3shkKXdpB1EXZZ8ScDluaznMjWAXFOnWuggVEuYYPqALjd0Jxh4UUFxh/GwLYUCQNULSGBkYOCqKQxhQFykKE40UKHfc2hAzME7mvsy0KNXTJsChKyTLHIj2AXusAwoMNhlJEJAfIqjxERV4LARvriQ6H0v+D8qPncHvKKSm2BQ2xYtJPCfNJxQIiGe05og/ogvWRAsQAIjOlNvghFwLhA1VgfSDOQ4Q5uiQgQdmKjziD0A+cNXA/j8dkil4SHQesq35pYliSRWUgTlPb57NQ82glH3eIQ3JF7okgtbzoOdJA/JQkBJeKYPf7i0aTxbIt83vsfcPSyjtBFfeiwZ25EQUdpMC2cSXCzQMTgAoGs4MligrQ0AyzbLEDAKGBYEHeqDp7RgdiOYj0BAoCCEqdl3xBgbDgBAO8xLEAzQ19Knp9Fs5D5cyeDbHV/PPm6Wc0TJazRcAYxIcEZ4IRrgaVKkOLIGSB7XzHmC6CAR5uIX+UWrnQr5LAmSkhEsvSOfFPH8dCG5JKaaA/gEobhiFgtobt9St3PGE3HiXSMx+/LwsMp39YNBRPF6QhiQ56aH+lFyB26liaCqqSCDAEGEEEAUigwJIirFIyAyQrgPZsnSz/IdcN11T+G7G1GnMT/P6eKQPaKiV1ou8niPUic+lBiQ9amImGfPdVi7FH0/G7Vn/pKVUXGvwp2ETaIdh9bppIFkWXa1eWQon4MtSVFoZOuKtMaNU3l3k8DFRQegkSSpCV/U+3sPjDiqFzJNGYSAMFBopIxhYnumgDBWAWqTDOIDHUJnc7sBWD5u6/eXRHf1CZ7qpnRhBENA3+GHrXVCz0cwrdJY/GEIsXvSM7L1gwDkWrxamTMdD3M8gj3MTjDp0OR84/CCEU8pPoLDBNelQOhW9qLDiMenQuvUuWoNBQ5zt7AbRZuJ/NIHxuzfoJchcjqwhqQftJKgmwaYmMLlRIKGROWIkkkElMKSkWKIMtN5YBXkNBpQSqRJKoGogaaDJQSbWXTVjZFYuC4WacytO3lEduJlq6EUDEFITEwYsDC6lWzSCBY3WCMqbB9FBXjjFRMSBUL6BpGHzIwh6QPmQW4Lv0nH077xvOpCzUZ90AomAUFAiqKJ1h0N5SS4CBUFwabkqfESrpq9RS7YQ+Ik0uO9rBHVJEEHw6QO6K7KPuHSdKR0es+PPh2J2Rm0hfF3mgNxcfITcu72WpJDuhIJwt594T2emBvOtcxIGLaeDgLlcS1SIMBoNGNqOAox0xMRjB9WDjBoRa9FKjgEHl8+KdFe4LKPT1E8TVzKTakxdmR2wYdMDaX6IUVQUCHETEV8+pRrvXYk+5KnyJ09ITQGkgZLhtY2a74ZMLMIONLk3xWkfn87stMQxsYnSXypF76tRpiSZWhSNqvhOusvyiOY7TyCB3JCR7AZYsL6Yr0gjtIHTJEhFaYA5KCF6BexB9YP5mE6T8mQaQPADUVyxTWDAtUQAknoU2JZ95joRzYiHgofwsOLoxOaPVJw6C1pmd6AfTt9AdDPdIGId/cXPjBFWAI1dCIrinwu2AVJViyklLQBcGAtAmnBUwEvMVCkKGEWBEiFIICQBGQRUBoGgUkhFFiyUQqJUoZSAygEQoAYIiSMSMKPQ9CRAikOchyBB98pMnre2xgpQ2uUhaFwbIM9z4hj9XKmhbIejyK+nDPWWl81MQ31jSzw92PC19p3lx56y8xlhDosyEYuF8FUx/t4jMOBpTGSwcdtsFdOzJHKQuLtsXc0q5G7QyRj6SJLGEXzIRMnLrW1hphUY1L8xAws7EZqSFh0hJShxMBRx4heQwHLZuUk4uBc1aehi/e+bHBCEob5P4/aEhpEUlkO/+iuYbbhxzYiuJlSvvHIXmTUZgwoKwfBm8scBl2kzgiyHZo4HJi1beGSoWedxs8luspccC3C1JLvKc3w5jLIgTStC4dot3t4oUhJhQxcj9HtDikhoUGGdSNJ3bV1mAPmrF0M02HkZ1M1CnAxrAA1GWsd4TWWIxtqLFl2br+hv91rsDDNkOzXCYPE0LDiKDOMwW2CAeUoChFjyRoCLIXWYIZG0CbfBraaFW57xtFmBxY8t0pQJcWJxaVCT6wQkKboclNb6xdsFU1YRJ2Hc/5rVRQgQTmUAmItM3oGYOBbtwawEiWReMxXg2hKmK+GKr3IebXNWFoXp6mG3bLmva+WxlZ2mDMdc5gAIIaQmXwLx5BnuUJpyHpSClPWlQBrsYYzPjMAvdzJwn0wDUAT6sFE137ugyG4wxgDZLMKzESj3yiyzulSWiMQVYRYR1AQKJjBRAqoWEsi4JgC5KCIbHvnOgOiVHiu7PYSO3wO8hcuGSoYIBnRxg3XGqbUGXVQH8+KFziUGRKjEEcMihVlFMEWSioRFnqUriLpxCxkQhLE8GpIKOQpkZcxRxELuqyK5UVQVEUE0wZFI6cC0IG46V7WLxtOYW3kgkW7A3NIeEBs0Emdc33A57uEwqqDUw6Tu60Q41NqMk1NZQSVNUSdiqiKxVj31vgJX8uf1tqYdBziZ+/QRHY7YQO6CTbVUrlEQQO2gbwYQ1NheDB+BPGoXteHikm/cF9DsDgNzQUOHk5yNaIgmh2G7nkoEdWqWBo7sWIcb4q8jB5cdXlQaYAMSKIKRiCCojoKi3YVPqEsuFEWmUVVJAGEiCRAFkkTyYHlCBZLkQZZ420eBjIS41QZQqUscBpII2IaKIQoCy6CSLKAEnSE1Zv1LOcaEWkrlUfOp0TCOYfLrqZ7ycYaGrBgrhc3bFS2k5kGVL+OkgBi1K+Uko+h+oBxqx8VZW+4xdcjFYRnejQe2q9qchdpUwuoggUyakhk0E0DoEYStInqPEdZBvftzMagAe/VC9D9xnSygTxh5RAPrPlgiYnxeZqMmciTTD6u48+Ho6eN+U3J48CYqZRm85888a4hMjdScmXVDNQFcT71IDkDthx1NyMfnMIGzAMQS7mKeWwug1ln1VgdB2c2PT2jsVitHecaIIMcQcFhLuVSKWtAz1O90YlQdDO3XffQE1qjFmiYgs40UIhoIcBDRMAwxTCBqy2UrkRrQa4FJkWqzFjbFmYGQiBcCuUcKt0rbZ1CHRWXnjuN52a4o2koCISGRhSEHjOApwlJy1l1m3CaFDAkMVlaIyMiAiMau3kUjJrGCCxeMYmjh0bahbhswylQMVbFaCy+3k3l+D2HV2+omJEh5gRKE7UqqmxTiXpSTMOBDVECHtBtYAQAsKh4VIgDOaMwGOqDiUQhx5YsYRNuLYWJEGMYwyZMUBcmUFGJARDNCm0soQNhDYiE0BApxsXF4kQ6QighgUYjJUid++HnI2NznOHs6acZCaYBYFzcyFhmEMBcpRhGLB5AdkCGQDYDaVTBEOreyMFcBQRkotdiSN2oyyb049GuoaDSMgmWYQFE0xtDWdtrGMGixamguMIOBZbpYouJ283rNNbhMHkFDi5DZlw69VjAqsYXIa44EvCwJ3qJvG3GgcYP43ipziWIoyI4hoLFhvvqHXynYSamJJqMgXlETxEKBM7ksRIlhguCAxYLIqNDgKIWxZYTl3vj0ya6FLilVoqhMSi0YItXYDOhsaIQtD1DzMnJPtwWMLQo2GHI5J89McZNtCWcRJ+yKO+h9/DhaTwiIJUItFH1PiwvBRXsqhDSQcCexWPoUdjIydAMQ4clK1KMHOSG03lzjQ0EE+UVKBKiCUQOqLSGSIFYxSumXKvvurhYULAMZNIpeBQ3SxhpJlxyQYUzGwUEMe083UKAFAoHPhVjITNOrF0Fycx0x7Uc4d5GsDHmYbCQTjgxRCijGxrDgoJUYoIMGrKIoshQdiJpiMs/E5vs7dxh4T3NQvaoQf124OmXwGKKSDlDkTQcoCDdU9aMI1ZJ5sDaJ4Kqq9ghuDgDT1lrSIzL9htsUXM58IcaUkQYqNtjbaNBEUDcygNqRD2kFN4+hZbNbPjORNuzpmPWbUgIgNNGlefIzhoOk6U0C77ljSRSQIBEIgdhZhQC6wICm4W5zazw9nf3dFMYSVT5Tu8CyttTLk4yrWRG2jIHIMYNDqXpUkWmJm4GEFMYIJcS1qqkOpvz8OGsPoOL0XIEg0iUbEsI9Gwbr2m1ShQMAExYyA7MmIMsQZcP3iQhExyfa8hQag3TyZNqG+l5hDfymU6SC5TAQ0BDRxFEFgMBGKoQpo4ESZ/tLkBSQMaH1SFjgPcPhcDWmoB0ExR6ICRgAe4g7FM0I7QILANH6FsegxickYQkBkQapLivxeX26XX2RNHiyJX9k8/CxQfLcpVmNskLSv3bdqwbX4qelYZy5zI3LD1sMUULnZh5ktCiPmligWFiSAMzCaeVYgjPI7z0NBE8PGurIbwZ5h0np/L9vr1gGVVFr+u5LGISCkiQTGhYpuYoWRLMtIM6jTt/ERCEITEW0+qgqdB5t9pcLn3PgFh8RfmCE8z0DgT1In16k6L8yFgsZYVAoNrBK6+ncTvZo96ZGeiC56bnFENWzXbVRB6IWQL46j6YGhUkUvEGF5jPpllaK7w3RAF1n0I5HrmxxMQ7DIwA3x7TCEIpAoJomELfFDve1/H0+72/Jpoq/tfhVvSB6QoWeQdEdtDvuW5CLVMYP2kMreHurVOU/fDUc3WV5UGeqmNZfzoxUiSMhkSBTJKGdUiSMCRUJBDd2tQImR5uu4SsgvSd0PuwhvKoQ3t+i7CVyPajCl3zFGJZ0PcZzuMbDV0UIJvu6NIIIaEtBHS6Ai4OiHNm5JrKL1dtRV6IVhds3AzDJLLuIHqsCdbuwVDSKbsMoZhko5m01YgJYOZcSK6fT2UeTgeFnvhJvQ0lzquwh/tPbAyjPV8gsYnxysdgZgQQVc9R8jRzNeRPvn4PaVxXd/mXTDwtmj9Gos2n+6h+nz/on/4u5IpwoSAm9HcIA==')))
\ No newline at end of file
diff --git a/docs/legacy/cs202courseware/ug2report1.py b/docs/legacy/cs202courseware/ug2report1.py
index 8b4540e..bea93ce 100644
--- a/docs/legacy/cs202courseware/ug2report1.py
+++ b/docs/legacy/cs202courseware/ug2report1.py
@@ -1,10 +1,10 @@
 # from unitgrade_v1.unitgrade_v1 import QuestionGroup, Report, QPrintItem
 # from unitgrade_v1.unitgrade_helpers import evaluate_report_student
 
-from src.unitgrade.framework import UTestCase, cache
+from src.unitgrade.framework import UTestCase
 from unittest import TestCase
 # from unitgrade.unitgrade import cache
-from src.unitgrade.framework import hide
+from unitgrade import hide, cache
 
 import random
 from cs202courseware.homework1 import my_sum
diff --git a/docs/legacy/cs202courseware/ug2report1_nohidden.py b/docs/legacy/cs202courseware/ug2report1_nohidden.py
index be7f2e8..4d51ad3 100644
--- a/docs/legacy/cs202courseware/ug2report1_nohidden.py
+++ b/docs/legacy/cs202courseware/ug2report1_nohidden.py
@@ -1,11 +1,10 @@
 # from unitgrade_v1.unitgrade_v1 import QuestionGroup, Report, QPrintItem
 # from unitgrade_v1.unitgrade_helpers import evaluate_report_student
 
-from src.unitgrade.framework import UTestCase, cache
+from src.unitgrade.framework import UTestCase
 # from unitgrade.unitgrade import cache
-from src.unitgrade.framework import methodsWithDecorator, hide
-
-
+from unitgrade.utils import methodsWithDecorator
+from unitgrade import hide, cache
 
 import random
 from cs101courseware_example.homework1 import my_sum
diff --git a/docs/snips/report3.py b/docs/snips/report3.py
index 062410f..d163046 100644
--- a/docs/snips/report3.py
+++ b/docs/snips/report3.py
@@ -1,5 +1,6 @@
 # example_docker/instructor/cs103/report3.py
-from unitgrade import UTestCase, Report, hide 
+from unitgrade import UTestCase, Report
+from unitgrade.utils import hide
 from unitgrade import evaluate_report_student
 import cs103
 
diff --git a/docs/snips/report3_complete.py b/docs/snips/report3_complete.py
index ce4db32..f525710 100644
--- a/docs/snips/report3_complete.py
+++ b/docs/snips/report3_complete.py
@@ -1,5 +1,6 @@
 # example_docker/instructor/cs103/report3_complete.py
-from unitgrade import UTestCase, Report, hide 
+from unitgrade import UTestCase, Report
+from unitgrade.utils import hide
 from unitgrade import evaluate_report_student
 import cs103
 
diff --git a/examples/02631/instructor/week5/.coverage b/examples/02631/instructor/week5/.coverage
deleted file mode 100644
index ad913a755651443efae803b9092cf83d99e52536..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 53248
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

diff --git a/examples/02631/instructor/week5/Report1Flat_handin_40_of_40.token b/examples/02631/instructor/week5/Report1Flat_handin_40_of_40.token
deleted file mode 100644
index 1bed43cdd75a5b10dc6150345c4bebe1432a0c18..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 77467
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%0Afm{pfKo;fam*{|I
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
bj}Sy2S>Kez9u`odoYKP%jfN?u#ie=xuq&*V

diff --git a/examples/02631/instructor/week5/__pycache__/report1intro.cpython-38.pyc b/examples/02631/instructor/week5/__pycache__/report1intro.cpython-38.pyc
index 5ff8b50a504bd3e8d030c9362fc1ae6c760e7ac1..973212c8b860749648a8babf5e0b932a0ff87cc0 100644
GIT binary patch
delta 622
zcmbPj@y47tl$V!_fq{X6CCfQ6awD%Zhmeqhb53b-NotWoVqRiSWpQTl<{}O?cE($q
zXYy}iR1RTaU`RIxgU|Lwz6=ZuMZqA#4@CHbi15i5BqSy$2nkG{CRoZA2oegNEGQ(#
z7%*8wNS+ZU-L3~R3f+V-kn$i95d|UwKtwc%fN2w$Y%5&B=mWRoo^YU)4@f}-h=>Fc
zF(4uqM8r>C$1X8BQDnBTu!37^QEqBpNn%N6ex5>6VoB;|MbUCbQ7@1>0XQKDV);y7
zE7r^yGTBhv8th!9$^GKR#>pV56c7P+cq)jM1|rfyL<We+1QA9I3=A(%fLI_mD@_iU
zr~sQXRgXv$UWy<zZ<X{G1$!?CB$fvv@<Bu)$Y+cRll7!z851V^NX=(VnEXb{s=kPU
zfuWg!fuWd<fq{X8k%du)u?Qq~iz7ZhH!(9WK3-EKO1LyHvn0JJF(p+mttc@!wLHHl
zyNC&7EHj8;VPIg05<;j+ElbQPO)N<*Vr5`pxW$@Rnp;p=WDHVS3?e`_6|sX@91N2;
ZNy~62fY=~Qi*zTiV;7(NL0XHE5di+{mRbM+

delta 605
zcmaE3KHGvfl$V!_fq{WRAlE4I@kU-}4kaapkksN5g_4X^h2)&l;*!)Ng~YtXoXX<N
zVujq)l8pS6%}E?;?2J*HJNY*;DhD$#Fr*uU!Dss-9|i`7q973A3nKhLMA+m)Nr}k;
zLIRW91WVZhKtdst8HL0c{U=KZ$uq*F+x0+3p_>p2QXU8*B0+>dh=>9aFl_>pb%iS!
zz2SD86AqN}1}O*!5fLCF8bri^h`7n?*d-<hip*A3Mffr;wJ0|=uOzV~Ge1wED6u3}
zp|CWy7{uHBU!<Io(R1=gDPczM$=zbjjKP!n#jU|kR+^kEUM!FVGBp`QfE}MQ*-uh}
z+lYaI;pGXCAjpwQlT9Tmpjs|SVAUed{!#>{JXaL#`fLzC7ewTNhyswq8RIAONXatB
zPu7x}&lo@Xl$2F{Ap-+LGXn!dF&hH|0|z4uqYPsaNbD9ze0*+VW?p=}rbv`%X<lYY
zdQoCZs*xUoS;Pb~m>EQ{FfcGg$s(i>s^T+Ja|%+6ij9g`L26j@N^=V;i;O{<iWnFe
bCYMQTa>s*sAWMsMC$D1{pL|eSi;)=s$3mPR

diff --git a/examples/02631/instructor/week5/deploy.py b/examples/02631/instructor/week5/deploy.py
index cf11dcd..3457b7f 100644
--- a/examples/02631/instructor/week5/deploy.py
+++ b/examples/02631/instructor/week5/deploy.py
@@ -6,6 +6,4 @@ if __name__ == "__main__":
     setup_grade_file_report(Report1Flat, minify=False, obfuscate=False, execute=False, with_coverage=True)
 
     # Deploy the files using snipper: https://gitlab.compute.dtu.dk/tuhe/snipper
-    snip_dir.snip_dir(source_dir="", dest_dir="../../students/week5", clean_destination_dir=True, exclude=['__pycache__', '*.token', 'deploy.py'])
-    # import os
-    # os.system("python report1intro_grade.py")
+    snip_dir(source_dir="", dest_dir="../../students/week5", exclude=['*.token', 'deploy.py'])
diff --git a/examples/02631/instructor/week5/report1intro.py b/examples/02631/instructor/week5/report1intro.py
index 0ac789d..d4abb8b 100644
--- a/examples/02631/instructor/week5/report1intro.py
+++ b/examples/02631/instructor/week5/report1intro.py
@@ -1,4 +1,5 @@
-from unitgrade.framework import Report, UTestCase, cache
+from unitgrade.framework import Report, UTestCase
+from unitgrade import cache
 from unitgrade.evaluate import evaluate_report_student
 import numpy as np
 import looping
diff --git a/examples/02631/instructor/week5/report1intro_grade.py b/examples/02631/instructor/week5/report1intro_grade.py
index ccd6231..88d3b50 100644
--- a/examples/02631/instructor/week5/report1intro_grade.py
+++ b/examples/02631/instructor/week5/report1intro_grade.py
@@ -1,339 +1,3 @@
-
-import numpy as np
-from tabulate import tabulate
-from datetime import datetime
-import pyfiglet
-import unittest
-import inspect
-import os
-import argparse
-import time
-
-parser = argparse.ArgumentParser(description='Evaluate your report.', epilog="""Example: 
-To run all tests in a report: 
-
-> python assignment1_dp.py
-
-To run only question 2 or question 2.1
-
-> python assignment1_dp.py -q 2
-> python assignment1_dp.py -q 2.1
-
-Note this scripts does not grade your report. To grade your report, use:
-
-> python report1_grade.py
-
-Finally, note that if your report is part of a module (package), and the report script requires part of that package, the -m option for python may be useful.
-For instance, if the report file is in Documents/course_package/report3_complete.py, and `course_package` is a python package, then change directory to 'Documents/` and run:
-
-> python -m course_package.report1
-
-see https://docs.python.org/3.9/using/cmdline.html
-""", formatter_class=argparse.RawTextHelpFormatter)
-parser.add_argument('-q', nargs='?', type=str, default=None, help='Only evaluate this question (e.g.: -q 2)')
-parser.add_argument('--showexpected',  action="store_true",  help='Show the expected/desired result')
-parser.add_argument('--showcomputed',  action="store_true",  help='Show the answer your code computes')
-parser.add_argument('--unmute',  action="store_true",  help='Show result of print(...) commands in code')
-parser.add_argument('--passall',  action="store_true",  help='Automatically pass all tests. Useful when debugging.')
-parser.add_argument('--noprogress',  action="store_true",  help='Disable progress bars.')
-
-def evaluate_report_student(report, question=None, qitem=None, unmute=None, passall=None, ignore_missing_file=False, show_tol_err=False):
-    args = parser.parse_args()
-    if question is None and args.q is not None:
-        question = args.q
-        if "." in question:
-            question, qitem = [int(v) for v in question.split(".")]
-        else:
-            question = int(question)
-
-    if hasattr(report, "computed_answer_file") and not os.path.isfile(report.computed_answers_file) and not ignore_missing_file:
-        raise Exception("> Error: The pre-computed answer file", os.path.abspath(report.computed_answers_file), "does not exist. Check your package installation")
-
-    if unmute is None:
-        unmute = args.unmute
-    if passall is None:
-        passall = args.passall
-
-
-    results, table_data = evaluate_report(report, question=question, show_progress_bar=not unmute and not args.noprogress, qitem=qitem, verbose=False, passall=passall, show_expected=args.showexpected, show_computed=args.showcomputed,unmute=unmute,
-                                          show_tol_err=show_tol_err)
-
-
-    if question is None:
-        print("Provisional evaluation")
-        tabulate(table_data)
-        table = table_data
-        print(tabulate(table))
-        print(" ")
-
-    fr = inspect.getouterframes(inspect.currentframe())[1].filename
-    gfile = os.path.basename(fr)[:-3] + "_grade.py"
-    if os.path.exists(gfile):
-        print("Note your results have not yet been registered. \nTo register your results, please run the file:")
-        print(">>>", gfile)
-        print("In the same manner as you ran this file.")
-
-
-    return results
-
-
-def upack(q):
-    # h = zip([(i['w'], i['possible'], i['obtained']) for i in q.values()])
-    h =[(i['w'], i['possible'], i['obtained']) for i in q.values()]
-    h = np.asarray(h)
-    return h[:,0], h[:,1], h[:,2],
-
-class UnitgradeTextRunner(unittest.TextTestRunner):
-    def __init__(self, *args, **kwargs):
-        super().__init__(*args, **kwargs)
-
-class SequentialTestLoader(unittest.TestLoader):
-    def getTestCaseNames(self, testCaseClass):
-        test_names = super().getTestCaseNames(testCaseClass)
-        # testcase_methods = list(testCaseClass.__dict__.keys())
-        ls = []
-        for C in testCaseClass.mro():
-            if issubclass(C, unittest.TestCase):
-                ls = list(C.__dict__.keys()) + ls
-        testcase_methods = ls
-        test_names.sort(key=testcase_methods.index)
-        return test_names
-
-def evaluate_report(report, question=None, qitem=None, passall=False, verbose=False,  show_expected=False, show_computed=False,unmute=False, show_help_flag=True, silent=False,
-                    show_progress_bar=True,
-                    show_tol_err=False,
-                    big_header=True):
-
-    from src.unitgrade.version import __version__
-    now = datetime.now()
-    if big_header:
-        ascii_banner = pyfiglet.figlet_format("UnitGrade", font="doom")
-        b = "\n".join( [l for l in ascii_banner.splitlines() if len(l.strip()) > 0] )
-    else:
-        b = "Unitgrade"
-    dt_string = now.strftime("%d/%m/%Y %H:%M:%S")
-    print(b + " v" + __version__ + ", started: " + dt_string+ "\n")
-    # print("Started: " + dt_string)
-    s = report.title
-    if hasattr(report, "version") and report.version is not None:
-        s += " version " + report.version
-    print(s, "(use --help for options)" if show_help_flag else "")
-    # print(f"Loaded answers from: ", report.computed_answers_file, "\n")
-    table_data = []
-    t_start = time.time()
-    score = {}
-    loader = SequentialTestLoader()
-
-    for n, (q, w) in enumerate(report.questions):
-        if question is not None and n+1 != question:
-            continue
-        suite = loader.loadTestsFromTestCase(q)
-        qtitle = q.question_title() if hasattr(q, 'question_title') else q.__qualname__
-        q_title_print = "Question %i: %s"%(n+1, qtitle)
-        print(q_title_print, end="")
-        q.possible = 0
-        q.obtained = 0
-        q_ = {} # Gather score in this class.
-        from src.unitgrade.framework import UTextTestRunner
-        UTextResult.q_title_print = q_title_print # Hacky
-        UTextResult.show_progress_bar = show_progress_bar # Hacky.
-        UTextResult.number = n
-        UTextResult.nL = report.nL
-
-        res = UTextTestRunner(verbosity=2, resultclass=UTextResult).run(suite)
-
-        possible = res.testsRun
-        obtained = len(res.successes)
-
-        assert len(res.successes) +  len(res.errors) + len(res.failures) == res.testsRun
-
-        obtained = int(w * obtained * 1.0 / possible ) if possible > 0 else 0
-        score[n] = {'w': w, 'possible': w, 'obtained': obtained, 'items': q_, 'title': qtitle}
-        q.obtained = obtained
-        q.possible = possible
-
-        s1 = f" * q{n+1})   Total"
-        s2 = f" {q.obtained}/{w}"
-        print(s1 + ("."* (report.nL-len(s1)-len(s2) )) + s2 )
-        print(" ")
-        table_data.append([f"q{n+1}) Total", f"{q.obtained}/{w}"])
-
-    ws, possible, obtained = upack(score)
-    possible = int( msum(possible) )
-    obtained = int( msum(obtained) ) # Cast to python int
-    report.possible = possible
-    report.obtained = obtained
-    now = datetime.now()
-    dt_string = now.strftime("%H:%M:%S")
-
-    dt = int(time.time()-t_start)
-    minutes = dt//60
-    seconds = dt - minutes*60
-    plrl = lambda i, s: str(i) + " " + s + ("s" if i != 1 else "")
-
-    from src.unitgrade.framework import dprint
-    dprint(first = "Total points at "+ dt_string + " (" + plrl(minutes, "minute") + ", "+ plrl(seconds, "second") +")",
-           last=""+str(report.obtained)+"/"+str(report.possible), nL = report.nL)
-
-    # print(f"Completed at "+ dt_string + " (" + plrl(minutes, "minute") + ", "+ plrl(seconds, "second") +"). Total")
-
-    table_data.append(["Total", ""+str(report.obtained)+"/"+str(report.possible) ])
-    results = {'total': (obtained, possible), 'details': score}
-    return results, table_data
-
-
-import bz2
-import pickle
-import os
-
-
-def bzwrite(json_str, token): # to get around obfuscation issues
-    with getattr(bz2, 'open')(token, "wt") as f:
-        f.write(json_str)
-
-def gather_imports(imp):
-    resources = {}
-    m = imp
-    # for m in pack_imports:
-    # print(f"*** {m.__name__}")
-    f = m.__file__
-    # dn = os.path.dirname(f)
-    # top_package = os.path.dirname(__import__(m.__name__.split('.')[0]).__file__)
-    # top_package = str(__import__(m.__name__.split('.')[0]).__path__)
-
-    if hasattr(m, '__file__') and not hasattr(m, '__path__'):  # Importing a simple file: m.__class__.__name__ == 'module' and False:
-        top_package = os.path.dirname(m.__file__)
-        module_import = True
-    else:
-        top_package = __import__(m.__name__.split('.')[0]).__path__._path[0]
-        module_import = False
-
-    # top_package = os.path.dirname(__import__(m.__name__.split('.')[0]).__file__)
-    # top_package = os.path.dirname(top_package)
-    import zipfile
-    # import strea
-    # zipfile.ZipFile
-    import io
-    # file_like_object = io.BytesIO(my_zip_data)
-    zip_buffer = io.BytesIO()
-    with zipfile.ZipFile(zip_buffer, 'w') as zip:
-        # zip.write()
-        for root, dirs, files in os.walk(top_package):
-            for file in files:
-                if file.endswith(".py"):
-                    fpath = os.path.join(root, file)
-                    v = os.path.relpath(os.path.join(root, file), os.path.dirname(top_package) if not module_import else top_package)
-                    zip.write(fpath, v)
-
-    resources['zipfile'] = zip_buffer.getvalue()
-    resources['top_package'] = top_package
-    resources['module_import'] = module_import
-    return resources, top_package
-
-    if f.endswith("__init__.py"):
-        for root, dirs, files in os.walk(os.path.dirname(f)):
-            for file in files:
-                if file.endswith(".py"):
-                    # print(file)
-                    # print()
-                    v = os.path.relpath(os.path.join(root, file), top_package)
-                    with open(os.path.join(root, file), 'r') as ff:
-                        resources[v] = ff.read()
-    else:
-        v = os.path.relpath(f, top_package)
-        with open(f, 'r') as ff:
-            resources[v] = ff.read()
-    return resources
-
-import argparse
-parser = argparse.ArgumentParser(description='Evaluate your report.', epilog="""Use this script to get the score of your report. Example:
-
-> python report1_grade.py
-
-Finally, note that if your report is part of a module (package), and the report script requires part of that package, the -m option for python may be useful.
-For instance, if the report file is in Documents/course_package/report3_complete.py, and `course_package` is a python package, then change directory to 'Documents/` and run:
-
-> python -m course_package.report1
-
-see https://docs.python.org/3.9/using/cmdline.html
-""", formatter_class=argparse.RawTextHelpFormatter)
-parser.add_argument('--noprogress',  action="store_true",  help='Disable progress bars')
-parser.add_argument('--autolab',  action="store_true",  help='Show Autolab results')
-
-def gather_upload_to_campusnet(report, output_dir=None):
-    n = report.nL
-    args = parser.parse_args()
-    results, table_data = evaluate_report(report, show_help_flag=False, show_expected=False, show_computed=False, silent=True,
-                                          show_progress_bar=not args.noprogress,
-                                          big_header=not args.autolab)
-    # print(" ")
-    # print("="*n)
-    # print("Final evaluation")
-    # print(tabulate(table_data))
-    # also load the source code of missing files...
-
-    sources = {}
-    print("")
-    if not args.autolab:
-        if len(report.individual_imports) > 0:
-            print("By uploading the .token file, you verify the files:")
-            for m in report.individual_imports:
-                print(">", m.__file__)
-            print("Are created/modified individually by you in agreement with DTUs exam rules")
-            report.pack_imports += report.individual_imports
-
-        if len(report.pack_imports) > 0:
-            print("Including files in upload...")
-            for k, m in enumerate(report.pack_imports):
-                nimp, top_package = gather_imports(m)
-                _, report_relative_location, module_import = report._import_base_relative()
-
-                # report_relative_location = os.path.relpath(inspect.getfile(report.__class__), top_package)
-                nimp['report_relative_location'] = report_relative_location
-                nimp['report_module_specification'] = module_import
-                nimp['name'] = m.__name__
-                sources[k] = nimp
-                # if len([k for k in nimp if k not in sources]) > 0:
-                print(f" * {m.__name__}")
-                # sources = {**sources, **nimp}
-    results['sources'] = sources
-
-    if output_dir is None:
-        output_dir = os.getcwd()
-
-    payload_out_base = report.__class__.__name__ + "_handin"
-
-    obtain, possible = results['total']
-    vstring = "_v"+report.version if report.version is not None else ""
-
-    token = "%s_%i_of_%i%s.token"%(payload_out_base, obtain, possible,vstring)
-    token = os.path.normpath(os.path.join(output_dir, token))
-
-
-    with open(token, 'wb') as f:
-        pickle.dump(results, f)
-
-    if not args.autolab:
-        print(" ")
-        print("To get credit for your results, please upload the single unmodified file: ")
-        print(">", token)
-        # print("To campusnet without any modifications.")
-
-        # print("Now time for some autolab fun")
-
-def source_instantiate(name, report1_source, payload):
-    eval("exec")(report1_source, globals())
-    pl = pickle.loads(bytes.fromhex(payload))
-    report = eval(name)(payload=pl, strict=True)
-    # report.set_payload(pl)
-    return report
-
-
-
-report1_source = 'import os\nimport lzma\nimport pickle\n\n# DONT\'t import stuff here since install script requires __version__\n\n# def cache_write(object, file_name, verbose=True):\n#     # raise Exception("bad")\n#     # import compress_pickle\n#     dn = os.path.dirname(file_name)\n#     if not os.path.exists(dn):\n#         os.mkdir(dn)\n#     if verbose: print("Writing cache...", file_name)\n#     with lzma.open(file_name, \'wb\', ) as f:\n#         pickle.dump(object, f)\n#     if verbose: print("Done!")\n#\n#\n# def cache_exists(file_name):\n#     # file_name = cn_(file_name) if cache_prefix else file_name\n#     return os.path.exists(file_name)\n#\n#\n# def cache_read(file_name):\n#     # import compress_pickle # Import here because if you import in top the __version__ tag will fail.\n#     # file_name = cn_(file_name) if cache_prefix else file_name\n#     if os.path.exists(file_name):\n#         try:\n#             with lzma.open(file_name, \'rb\') as f:\n#                 return pickle.load(f)\n#         except Exception as e:\n#             print("Tried to load a bad pickle file at", file_name)\n#             print("If the file appears to be automatically generated, you can try to delete it, otherwise download a new version")\n#             print(e)\n#             # return pickle.load(f)\n#     else:\n#         return None\n\n\n"""\ngit add . && git commit -m "Options" && git push &&  pip install git+ssh://git@gitlab.compute.dtu.dk/tuhe/unitgrade_v1.git --upgrade\n"""\nimport numpy as np\nimport sys\nimport re\nimport threading\nimport tqdm\nimport pickle\nimport os\nfrom io import StringIO\nimport io\nfrom unittest.runner import _WritelnDecorator\nfrom typing import Any\nimport inspect\nimport textwrap\nimport colorama\nfrom colorama import Fore\nfrom functools import _make_key, RLock\nfrom collections import namedtuple\nimport unittest\nimport time\n\n_CacheInfo = namedtuple("CacheInfo", ["hits", "misses", "maxsize", "currsize"])\n\ncolorama.init(autoreset=True)  # auto resets your settings after every output\n\ndef gprint(s):\n    print(f"{Fore.GREEN}{s}")\n\nmyround = lambda x: np.round(x)  # required.\nmsum = lambda x: sum(x)\nmfloor = lambda x: np.floor(x)\n\n\ndef setup_dir_by_class(C, base_dir):\n    name = C.__class__.__name__\n    return base_dir, name\n\n\nclass Logger(object):\n    def __init__(self, buffer):\n        assert False\n        self.terminal = sys.stdout\n        self.log = buffer\n\n    def write(self, message):\n        self.terminal.write(message)\n        self.log.write(message)\n\n    def flush(self):\n        # this flush method is needed for python 3 compatibility.\n        pass\n\n\nclass Capturing(list):\n    def __init__(self, *args, stdout=None, unmute=False, **kwargs):\n        self._stdout = stdout\n        self.unmute = unmute\n        super().__init__(*args, **kwargs)\n\n    def __enter__(self, capture_errors=True):  # don\'t put arguments here.\n        self._stdout = sys.stdout if self._stdout == None else self._stdout\n        self._stringio = StringIO()\n        if self.unmute:\n            sys.stdout = Logger(self._stringio)\n        else:\n            sys.stdout = self._stringio\n\n        if capture_errors:\n            self._sterr = sys.stderr\n            sys.sterr = StringIO()  # memory hole it\n        self.capture_errors = capture_errors\n        return self\n\n    def __exit__(self, *args):\n        self.extend(self._stringio.getvalue().splitlines())\n        del self._stringio  # free up some memory\n        sys.stdout = self._stdout\n        if self.capture_errors:\n            sys.sterr = self._sterr\n\n\nclass Capturing2(Capturing):\n    def __exit__(self, *args):\n        lines = self._stringio.getvalue().splitlines()\n        txt = "\\n".join(lines)\n        numbers = extract_numbers(txt)\n        self.extend(lines)\n        del self._stringio  # free up some memory\n        sys.stdout = self._stdout\n        if self.capture_errors:\n            sys.sterr = self._sterr\n\n        self.output = txt\n        self.numbers = numbers\n\n\n# @classmethod\n# class OrderedClassMembers(type):\n#     def __prepare__(self, name, bases):\n#         assert False\n#         return collections.OrderedDict()\n#\n#     def __new__(self, name, bases, classdict):\n#         ks = list(classdict.keys())\n#         for b in bases:\n#             ks += b.__ordered__\n#         classdict[\'__ordered__\'] = [key for key in ks if key not in (\'__module__\', \'__qualname__\')]\n#         return type.__new__(self, name, bases, classdict)\n\n\nclass Report:\n    title = "report title"\n    version = None\n    questions = []\n    pack_imports = []\n    individual_imports = []\n    nL = 120  # Maximum line width\n\n    @classmethod\n    def reset(cls):\n        for (q, _) in cls.questions:\n            if hasattr(q, \'reset\'):\n                q.reset()\n\n    @classmethod\n    def mfile(clc):\n        return inspect.getfile(clc)\n\n    def _file(self):\n        return inspect.getfile(type(self))\n\n    def _import_base_relative(self):\n        if hasattr(self.pack_imports[0], \'__path__\'):\n            root_dir = self.pack_imports[0].__path__._path[0]\n        else:\n            root_dir = self.pack_imports[0].__file__\n\n        root_dir = os.path.dirname(root_dir)\n        relative_path = os.path.relpath(self._file(), root_dir)\n        modules = os.path.normpath(relative_path[:-3]).split(os.sep)\n        return root_dir, relative_path, modules\n\n    def __init__(self, strict=False, payload=None):\n        working_directory = os.path.abspath(os.path.dirname(self._file()))\n        self.wdir, self.name = setup_dir_by_class(self, working_directory)\n        # self.computed_answers_file = os.path.join(self.wdir, self.name + "_resources_do_not_hand_in.dat")\n        for (q, _) in self.questions:\n            q.nL = self.nL  # Set maximum line length.\n\n        if payload is not None:\n            self.set_payload(payload, strict=strict)\n\n    def main(self, verbosity=1):\n        # Run all tests using standard unittest (nothing fancy).\n        loader = unittest.TestLoader()\n        for q, _ in self.questions:\n            start = time.time()  # A good proxy for setup time is to\n            suite = loader.loadTestsFromTestCase(q)\n            unittest.TextTestRunner(verbosity=verbosity).run(suite)\n            total = time.time() - start\n            q.time = total\n\n    def _setup_answers(self, with_coverage=False):\n        if with_coverage:\n            for q, _ in self.questions:\n                q._with_coverage = True\n                q._report = self\n\n        self.main()  # Run all tests in class just to get that out of the way...\n        report_cache = {}\n        for q, _ in self.questions:\n            # print(self.questions)\n            if hasattr(q, \'_save_cache\'):\n                q()._save_cache()\n                print("q is", q())\n                q()._cache_put(\'time\', q.time) # = q.time\n                report_cache[q.__qualname__] = q._cache2\n            else:\n                report_cache[q.__qualname__] = {\'no cache see _setup_answers in framework.py\': True}\n        if with_coverage:\n            for q, _ in self.questions:\n                q._with_coverage = False\n        return report_cache\n\n    def set_payload(self, payloads, strict=False):\n        for q, _ in self.questions:\n            q._cache = payloads[q.__qualname__]\n\n\ndef rm_progress_bar(txt):\n    # More robust version. Apparently length of bar can depend on various factors, so check for order of symbols.\n    nlines = []\n    for l in txt.splitlines():\n        pct = l.find("%")\n        ql = False\n        if pct > 0:\n            i = l.find("|", pct + 1)\n            if i > 0 and l.find("|", i + 1) > 0:\n                ql = True\n        if not ql:\n            nlines.append(l)\n    return "\\n".join(nlines)\n\n\ndef extract_numbers(txt):\n    # txt = rm_progress_bar(txt)\n    numeric_const_pattern = r\'[-+]? (?: (?: \\d* \\. \\d+ ) | (?: \\d+ \\.? ) )(?: [Ee] [+-]? \\d+ ) ?\'\n    rx = re.compile(numeric_const_pattern, re.VERBOSE)\n    all = rx.findall(txt)\n    all = [float(a) if (\'.\' in a or "e" in a) else int(a) for a in all]\n    if len(all) > 500:\n        print(txt)\n        raise Exception("unitgrade_v1.unitgrade_v1.py: Warning, too many numbers!", len(all))\n    return all\n\n\nclass ActiveProgress():\n    def __init__(self, t, start=True, title="my progress bar", show_progress_bar=True, file=None):\n        if file == None:\n            file = sys.stdout\n        self.file = file\n        self.t = t\n        self._running = False\n        self.title = title\n        self.dt = 0.01\n        self.n = int(np.round(self.t / self.dt))\n        self.show_progress_bar = show_progress_bar\n        self.pbar = None\n\n        if start:\n            self.start()\n\n    def start(self):\n        self._running = True\n        if self.show_progress_bar:\n            self.thread = threading.Thread(target=self.run)\n            self.thread.start()\n        self.time_started = time.time()\n\n    def terminate(self):\n        if not self._running:\n            raise Exception("Stopping a stopped progress bar. ")\n        self._running = False\n        if self.show_progress_bar:\n            self.thread.join()\n        if self.pbar is not None:\n            self.pbar.update(1)\n            self.pbar.close()\n            self.pbar = None\n\n        self.file.flush()\n        return time.time() - self.time_started\n\n    def run(self):\n        self.pbar = tqdm.tqdm(total=self.n, file=self.file, position=0, leave=False, desc=self.title, ncols=100,\n                              bar_format=\'{l_bar}{bar}| [{elapsed}<{remaining}]\')\n\n        for _ in range(self.n - 1):  # Don\'t terminate completely; leave bar at 99% done until terminate.\n            if not self._running:\n                self.pbar.close()\n                self.pbar = None\n                break\n\n            time.sleep(self.dt)\n            self.pbar.update(1)\n\ndef dprint(first, last, nL, extra = "", file=None, dotsym=\'.\', color=\'white\'):\n    if file == None:\n        file = sys.stdout\n\n    # ss = self.item_title_print\n    # state = "PASS" if success else "FAILED"\n    dot_parts = (dotsym * max(0, nL - len(last) - len(first)))\n    # if self.show_progress_bar or True:\n    print(first + dot_parts, end="", file=file)\n    # else:\n    # print(dot_parts, end="", file=self.cc.file)\n    last += extra\n    # if tsecs >= 0.5:\n    #     state += " (" + str(tsecs) + " seconds)"\n    print(last, file=file)\n\n\nclass UTextResult(unittest.TextTestResult):\n    nL = 80\n    number = -1  # HAcky way to set question number.\n    show_progress_bar = True\n    cc = None\n\n    def __init__(self, stream, descriptions, verbosity):\n        super().__init__(stream, descriptions, verbosity)\n        self.successes = []\n\n    def printErrors(self) -> None:\n        self.printErrorList(\'ERROR\', self.errors)\n        self.printErrorList(\'FAIL\', self.failures)\n\n    def addError(self, test, err):\n        super(unittest.TextTestResult, self).addFailure(test, err)\n        self.cc_terminate(success=False)\n\n    def addFailure(self, test, err):\n        super(unittest.TextTestResult, self).addFailure(test, err)\n        self.cc_terminate(success=False)\n\n    def addSuccess(self, test: unittest.case.TestCase) -> None:\n        self.successes.append(test)\n        self.cc_terminate()\n\n    def cc_terminate(self, success=True):\n        if self.show_progress_bar or True:\n            tsecs = np.round(self.cc.terminate(), 2)\n            self.cc.file.flush()\n            ss = self.item_title_print\n\n            state = "PASS" if success else "FAILED"\n\n            dot_parts = (\'.\' * max(0, self.nL - len(state) - len(ss)))\n            if self.show_progress_bar or True:\n                print(self.item_title_print + dot_parts, end="", file=self.cc.file)\n            else:\n                print(dot_parts, end="", file=self.cc.file)\n\n            if tsecs >= 0.5:\n                state += " (" + str(tsecs) + " seconds)"\n            print(state, file=self.cc.file)\n\n    def startTest(self, test):\n        # j =self.testsRun\n        self.testsRun += 1\n        # item_title = self.getDescription(test)\n        item_title = test.shortDescription()  # Better for printing (get from cache).\n        if item_title == None:\n            # For unittest framework where getDescription may return None.\n            item_title = self.getDescription(test)\n        self.item_title_print = " * q%i.%i) %s" % (UTextResult.number + 1, self.testsRun, item_title)\n        estimated_time = 10\n        if self.show_progress_bar or True:\n            self.cc = ActiveProgress(t=estimated_time, title=self.item_title_print, show_progress_bar=self.show_progress_bar, file=sys.stdout)\n        else:\n            print(self.item_title_print + (\'.\' * max(0, self.nL - 4 - len(self.item_title_print))), end="")\n\n        self._test = test\n        self._stdout = sys.stdout\n        sys.stdout = io.StringIO()\n\n    def stopTest(self, test):\n        sys.stdout = self._stdout\n        super().stopTest(test)\n\n    def _setupStdout(self):\n        if self._previousTestClass == None:\n            total_estimated_time = 1\n            if hasattr(self.__class__, \'q_title_print\'):\n                q_title_print = self.__class__.q_title_print\n            else:\n                q_title_print = "<unnamed test. See unitgrade_v1.py>"\n\n            cc = ActiveProgress(t=total_estimated_time, title=q_title_print, show_progress_bar=self.show_progress_bar)\n            self.cc = cc\n\n    def _restoreStdout(self):  # Used when setting up the test.\n        if self._previousTestClass is None:\n            q_time = self.cc.terminate()\n            q_time = np.round(q_time, 2)\n            sys.stdout.flush()\n            if self.show_progress_bar:\n                print(self.cc.title, end="")\n            print(" " * max(0, self.nL - len(self.cc.title)) + (" (" + str(q_time) + " seconds)" if q_time >= 0.5 else ""))\n\n\nclass UTextTestRunner(unittest.TextTestRunner):\n    def __init__(self, *args, **kwargs):\n        stream = io.StringIO()\n        super().__init__(*args, stream=stream, **kwargs)\n\n    def _makeResult(self):\n        # stream = self.stream # not you!\n        stream = sys.stdout\n        stream = _WritelnDecorator(stream)\n        return self.resultclass(stream, self.descriptions, self.verbosity)\n\n\ndef cache(foo, typed=False):\n    """ Magic cache wrapper\n    https://github.com/python/cpython/blob/main/Lib/functools.py\n    """\n    maxsize = None\n    def wrapper(self, *args, **kwargs):\n        key = (self.cache_id(), ("@cache", foo.__name__, _make_key(args, kwargs, typed)))\n        if not self._cache_contains(key):\n            value = foo(self, *args, **kwargs)\n            self._cache_put(key, value)\n        else:\n            value = self._cache_get(key)\n        return value\n\n    return wrapper\n\n\ndef get_hints(ss):\n    if ss == None:\n        return None\n    try:\n        ss = textwrap.dedent(ss)\n        ss = ss.replace(\'\'\'"""\'\'\', "").strip()\n        hints = ["hints:", ]\n        j = np.argmax([ss.lower().find(h) for h in hints])\n        h = hints[j]\n        ss = ss[ss.find(h) + len(h) + 1:]\n        ss = "\\n".join([l for l in ss.split("\\n") if not l.strip().startswith(":")])\n        ss = textwrap.dedent(ss)\n        ss = ss.strip()\n        return ss\n    except Exception as e:\n        print("bad hints", ss, e)\n\n\nclass UTestCase(unittest.TestCase):\n    _outcome = None  # A dictionary which stores the user-computed outcomes of all the tests. This differs from the cache.\n    _cache = None  # Read-only cache. Ensures method always produce same result.\n    _cache2 = None  # User-written cache.\n    _with_coverage = False\n    _report = None  # The report used. This is very, very hacky and should always be None. Don\'t rely on it!\n\n    def capture(self):\n        if hasattr(self, \'_stdout\') and self._stdout is not None:\n            file = self._stdout\n        else:\n            # self._stdout = sys.stdout\n            # sys._stdout = io.StringIO()\n            file = sys.stdout\n        return Capturing2(stdout=file)\n\n    @classmethod\n    def question_title(cls):\n        """ Return the question title """\n        return cls.__doc__.strip().splitlines()[0].strip() if cls.__doc__ is not None else cls.__qualname__\n\n    @classmethod\n    def reset(cls):\n        print("Warning, I am not sure UTestCase.reset() is needed anymore and it seems very hacky.")\n        cls._outcome = None\n        cls._cache = None\n        cls._cache2 = None\n\n    def _callSetUp(self):\n        if self._with_coverage:\n            if not hasattr(self._report, \'covcache\'):\n                self._report.covcache = {}\n            import coverage\n            self.cov = coverage.Coverage()\n            self.cov.start()\n        self.setUp()\n\n    def _callTearDown(self):\n        self.tearDown()\n        if self._with_coverage:\n            from pathlib import Path\n            from snipper import snipper_main\n            self.cov.stop()\n            data = self.cov.get_data()\n            base, _, _ = self._report._import_base_relative()\n            for file in data.measured_files():\n                file = os.path.normpath(file)\n                root = Path(base)\n                child = Path(file)\n                if root in child.parents:\n                    with open(child, \'r\') as f:\n                        s = f.read()\n                    lines = s.splitlines()\n                    garb = \'GARBAGE\'\n\n                    lines2 = snipper_main.censor_code(lines, keep=True)\n                    assert len(lines) == len(lines2)\n\n                    for l in data.contexts_by_lineno(file):\n                        if lines2[l].strip() == garb:\n                            if self.cache_id() not in self._report.covcache:\n                                self._report.covcache[self.cache_id()] = {}\n\n                            rel = os.path.relpath(child, root)\n                            cc = self._report.covcache[self.cache_id()]\n                            j = 0\n                            for j in range(l, -1, -1):\n                                if "def" in lines2[j] or "class" in lines2[j]:\n                                    break\n                            from snipper.legacy import gcoms\n                            fun = lines2[j]\n                            comments, _ = gcoms("\\n".join(lines2[j:l]))\n                            if rel not in cc:\n                                cc[rel] = {}\n                            cc[rel][fun] = (l, "\\n".join(comments))\n                            self._cache_put((self.cache_id(), \'coverage\'), self._report.covcache)\n\n    def shortDescriptionStandard(self):\n        sd = super().shortDescription()\n        if sd is None:\n            sd = self._testMethodName\n        return sd\n\n    def shortDescription(self):\n        sd = self.shortDescriptionStandard()\n        title = self._cache_get((self.cache_id(), \'title\'), sd)\n        return title if title is not None else sd\n\n    @property\n    def title(self):\n        return self.shortDescription()\n\n    @title.setter\n    def title(self, value):\n        self._cache_put((self.cache_id(), \'title\'), value)\n\n    def _get_outcome(self):\n        if not (self.__class__, \'_outcome\') or self.__class__._outcome is None:\n            self.__class__._outcome = {}\n        return self.__class__._outcome\n\n    def _callTestMethod(self, testMethod):\n        t = time.time()\n        self._ensure_cache_exists()  # Make sure cache is there.\n        if self._testMethodDoc is not None:\n            self._cache_put((self.cache_id(), \'title\'), self.shortDescriptionStandard())\n\n        self._cache2[(self.cache_id(), \'assert\')] = {}\n        res = testMethod()\n        elapsed = time.time() - t\n        self._get_outcome()[self.cache_id()] = res\n        self._cache_put((self.cache_id(), "time"), elapsed)\n\n    def cache_id(self):\n        c = self.__class__.__qualname__\n        m = self._testMethodName\n        return c, m\n\n    def __init__(self, *args, **kwargs):\n        super().__init__(*args, **kwargs)\n        self._load_cache()\n        self._assert_cache_index = 0\n\n    def _ensure_cache_exists(self):\n        if not hasattr(self.__class__, \'_cache\') or self.__class__._cache == None:\n            self.__class__._cache = dict()\n        if not hasattr(self.__class__, \'_cache2\') or self.__class__._cache2 == None:\n            self.__class__._cache2 = dict()\n\n    def _cache_get(self, key, default=None):\n        self._ensure_cache_exists()\n        return self.__class__._cache.get(key, default)\n\n    def _cache_put(self, key, value):\n        self._ensure_cache_exists()\n        self.__class__._cache2[key] = value\n\n    def _cache_contains(self, key):\n        self._ensure_cache_exists()\n        return key in self.__class__._cache\n\n    def wrap_assert(self, assert_fun, first, *args, **kwargs):\n        # sys.stdout = self._stdout\n        key = (self.cache_id(), \'assert\')\n        if not self._cache_contains(key):\n            print("Warning, framework missing", key)\n            self.__class__._cache[\n                key] = {}  # A new dict. We manually insert it because we have to use that the dict is mutable.\n        cache = self._cache_get(key)\n        id = self._assert_cache_index\n        if not id in cache:\n            print("Warning, framework missing cache index", key, "id =", id)\n        _expected = cache.get(id, f"Key {id} not found in cache; framework files missing. Please run deploy()")\n\n        # The order of these calls is important. If the method assert fails, we should still store the correct result in cache.\n        cache[id] = first\n        self._cache_put(key, cache)\n        self._assert_cache_index += 1\n        assert_fun(first, _expected, *args, **kwargs)\n\n    def assertEqualC(self, first: Any, msg: Any = ...) -> None:\n        self.wrap_assert(self.assertEqual, first, msg)\n\n    def _cache_file(self):\n        # The filename-directory stuff is a bit tricky but this seems robust.\n        return os.path.dirname(inspect.getabsfile(type(self))) + "/unitgrade_v1/" + self.__class__.__name__ + ".pkl"\n\n    def _save_cache(self):\n        # get the class name (i.e. what to save to).\n        cfile = self._cache_file()\n        if not os.path.isdir(os.path.dirname(cfile)):\n            os.makedirs(os.path.dirname(cfile))\n\n        if hasattr(self.__class__, \'_cache2\'):\n            with open(cfile, \'wb\') as f:\n                pickle.dump(self.__class__._cache2, f)\n\n    # But you can also set cache explicitly.\n    def _load_cache(self):\n        if self._cache is not None:  # Cache already loaded. We will not load it twice.\n            return\n            # raise Exception("Loaded cache which was already set. What is going on?!")\n        cfile = self._cache_file()\n        if os.path.exists(cfile):\n            try:\n                # print("\\ncache file", cfile)\n                with open(cfile, \'rb\') as f:\n                    data = pickle.load(f)\n                self.__class__._cache = data\n            except Exception as e:\n                print("Bad cache", cfile)\n                print(e)\n        else:\n            print("Warning! data file not found", cfile)\n\n    def _feedErrorsToResult(self, result, errors):\n        """ Use this to show hints on test failure. """\n        if not isinstance(result, UTextResult):\n            er = [e for e, v in errors if v != None]\n\n            if len(er) > 0:\n                hints = []\n                key = (self.cache_id(), \'coverage\')\n                if self._cache_contains(key):\n                    CC = self._cache_get(key)\n                    for id in CC:\n                        if id == self.cache_id():\n                            cl, m = id\n                            gprint(f"> An error occured while solving: {cl}.{m}. The files/methods you need to edit are:")  # For the test {id} in {file} you should edit:")\n                            for file in CC[id]:\n                                rec = CC[id][file]\n                                gprint(f">   * {file}")\n                                for l in rec:\n                                    _, comments = CC[id][file][l]\n                                    hint = get_hints(comments)\n\n                                    if hint != None:\n                                        hints.append(hint)\n                                    gprint(f">      - {l}")\n\n                er = er[0]\n                doc = er._testMethodDoc\n                if doc is not None:\n                    hint = get_hints(er._testMethodDoc)\n                    if hint is not None:\n                        hints = [hint] + hints\n                if len(hints) > 0:\n                    gprint("> Hints:")\n                    gprint(textwrap.indent("\\n".join(hints), ">   "))\n\n        super()._feedErrorsToResult(result, errors)\n\n    def startTestRun(self):\n        # print("asdfsdaf 11", file=sys.stderr)\n        super().startTestRun()\n        # print("asdfsdaf")\n\n    def _callTestMethod(self, method):\n        # print("asdfsdaf")\n        super()._callTestMethod(method)\n\n\ndef hide(func):\n    return func\n\n\ndef makeRegisteringDecorator(foreignDecorator):\n    """\n        Returns a copy of foreignDecorator, which is identical in every\n        way(*), except also appends a .decorator property to the callable it\n        spits out.\n    """\n\n    def newDecorator(func):\n        # Call to newDecorator(method)\n        # Exactly like old decorator, but output keeps track of what decorated it\n        R = foreignDecorator(func)  # apply foreignDecorator, like call to foreignDecorator(method) would have done\n        R.decorator = newDecorator  # keep track of decorator\n        # R.original = func         # might as well keep track of everything!\n        return R\n\n    newDecorator.__name__ = foreignDecorator.__name__\n    newDecorator.__doc__ = foreignDecorator.__doc__\n    return newDecorator\n\nhide = makeRegisteringDecorator(hide)\n\ndef methodsWithDecorator(cls, decorator):\n    """\n        Returns all methods in CLS with DECORATOR as the\n        outermost decorator.\n\n        DECORATOR must be a "registering decorator"; one\n        can make any decorator "registering" via the\n        makeRegisteringDecorator function.\n\n        import inspect\n        ls = list(methodsWithDecorator(GeneratorQuestion, deco))\n        for f in ls:\n            print(inspect.getsourcelines(f) ) # How to get all hidden questions.\n    """\n    for maybeDecorated in cls.__dict__.values():\n        if hasattr(maybeDecorated, \'decorator\'):\n            if maybeDecorated.decorator == decorator:\n                print(maybeDecorated)\n                yield maybeDecorated\n# 817\n\n\nimport numpy as np\nfrom tabulate import tabulate\nfrom datetime import datetime\nimport pyfiglet\nimport unittest\nimport inspect\nimport os\nimport argparse\nimport time\n\nparser = argparse.ArgumentParser(description=\'Evaluate your report.\', epilog="""Example: \nTo run all tests in a report: \n\n> python assignment1_dp.py\n\nTo run only question 2 or question 2.1\n\n> python assignment1_dp.py -q 2\n> python assignment1_dp.py -q 2.1\n\nNote this scripts does not grade your report. To grade your report, use:\n\n> python report1_grade.py\n\nFinally, note that if your report is part of a module (package), and the report script requires part of that package, the -m option for python may be useful.\nFor instance, if the report file is in Documents/course_package/report3_complete.py, and `course_package` is a python package, then change directory to \'Documents/` and run:\n\n> python -m course_package.report1\n\nsee https://docs.python.org/3.9/using/cmdline.html\n""", formatter_class=argparse.RawTextHelpFormatter)\nparser.add_argument(\'-q\', nargs=\'?\', type=str, default=None, help=\'Only evaluate this question (e.g.: -q 2)\')\nparser.add_argument(\'--showexpected\',  action="store_true",  help=\'Show the expected/desired result\')\nparser.add_argument(\'--showcomputed\',  action="store_true",  help=\'Show the answer your code computes\')\nparser.add_argument(\'--unmute\',  action="store_true",  help=\'Show result of print(...) commands in code\')\nparser.add_argument(\'--passall\',  action="store_true",  help=\'Automatically pass all tests. Useful when debugging.\')\nparser.add_argument(\'--noprogress\',  action="store_true",  help=\'Disable progress bars.\')\n\ndef evaluate_report_student(report, question=None, qitem=None, unmute=None, passall=None, ignore_missing_file=False, show_tol_err=False):\n    args = parser.parse_args()\n    if question is None and args.q is not None:\n        question = args.q\n        if "." in question:\n            question, qitem = [int(v) for v in question.split(".")]\n        else:\n            question = int(question)\n\n    if hasattr(report, "computed_answer_file") and not os.path.isfile(report.computed_answers_file) and not ignore_missing_file:\n        raise Exception("> Error: The pre-computed answer file", os.path.abspath(report.computed_answers_file), "does not exist. Check your package installation")\n\n    if unmute is None:\n        unmute = args.unmute\n    if passall is None:\n        passall = args.passall\n\n\n    results, table_data = evaluate_report(report, question=question, show_progress_bar=not unmute and not args.noprogress, qitem=qitem, verbose=False, passall=passall, show_expected=args.showexpected, show_computed=args.showcomputed,unmute=unmute,\n                                          show_tol_err=show_tol_err)\n\n\n    if question is None:\n        print("Provisional evaluation")\n        tabulate(table_data)\n        table = table_data\n        print(tabulate(table))\n        print(" ")\n\n    fr = inspect.getouterframes(inspect.currentframe())[1].filename\n    gfile = os.path.basename(fr)[:-3] + "_grade.py"\n    if os.path.exists(gfile):\n        print("Note your results have not yet been registered. \\nTo register your results, please run the file:")\n        print(">>>", gfile)\n        print("In the same manner as you ran this file.")\n\n\n    return results\n\n\ndef upack(q):\n    # h = zip([(i[\'w\'], i[\'possible\'], i[\'obtained\']) for i in q.values()])\n    h =[(i[\'w\'], i[\'possible\'], i[\'obtained\']) for i in q.values()]\n    h = np.asarray(h)\n    return h[:,0], h[:,1], h[:,2],\n\nclass UnitgradeTextRunner(unittest.TextTestRunner):\n    def __init__(self, *args, **kwargs):\n        super().__init__(*args, **kwargs)\n\nclass SequentialTestLoader(unittest.TestLoader):\n    def getTestCaseNames(self, testCaseClass):\n        test_names = super().getTestCaseNames(testCaseClass)\n        # testcase_methods = list(testCaseClass.__dict__.keys())\n        ls = []\n        for C in testCaseClass.mro():\n            if issubclass(C, unittest.TestCase):\n                ls = list(C.__dict__.keys()) + ls\n        testcase_methods = ls\n        test_names.sort(key=testcase_methods.index)\n        return test_names\n\ndef evaluate_report(report, question=None, qitem=None, passall=False, verbose=False,  show_expected=False, show_computed=False,unmute=False, show_help_flag=True, silent=False,\n                    show_progress_bar=True,\n                    show_tol_err=False,\n                    big_header=True):\n\n    from src.unitgrade.version import __version__\n    now = datetime.now()\n    if big_header:\n        ascii_banner = pyfiglet.figlet_format("UnitGrade", font="doom")\n        b = "\\n".join( [l for l in ascii_banner.splitlines() if len(l.strip()) > 0] )\n    else:\n        b = "Unitgrade"\n    dt_string = now.strftime("%d/%m/%Y %H:%M:%S")\n    print(b + " v" + __version__ + ", started: " + dt_string+ "\\n")\n    # print("Started: " + dt_string)\n    s = report.title\n    if hasattr(report, "version") and report.version is not None:\n        s += " version " + report.version\n    print(s, "(use --help for options)" if show_help_flag else "")\n    # print(f"Loaded answers from: ", report.computed_answers_file, "\\n")\n    table_data = []\n    t_start = time.time()\n    score = {}\n    loader = SequentialTestLoader()\n\n    for n, (q, w) in enumerate(report.questions):\n        if question is not None and n+1 != question:\n            continue\n        suite = loader.loadTestsFromTestCase(q)\n        qtitle = q.question_title() if hasattr(q, \'question_title\') else q.__qualname__\n        q_title_print = "Question %i: %s"%(n+1, qtitle)\n        print(q_title_print, end="")\n        q.possible = 0\n        q.obtained = 0\n        q_ = {} # Gather score in this class.\n        from src.unitgrade.unitgrade import UTextTestRunner\n        UTextResult.q_title_print = q_title_print # Hacky\n        UTextResult.show_progress_bar = show_progress_bar # Hacky.\n        UTextResult.number = n\n        UTextResult.nL = report.nL\n\n        res = UTextTestRunner(verbosity=2, resultclass=UTextResult).run(suite)\n\n        possible = res.testsRun\n        obtained = len(res.successes)\n\n        assert len(res.successes) +  len(res.errors) + len(res.failures) == res.testsRun\n\n        obtained = int(w * obtained * 1.0 / possible ) if possible > 0 else 0\n        score[n] = {\'w\': w, \'possible\': w, \'obtained\': obtained, \'items\': q_, \'title\': qtitle}\n        q.obtained = obtained\n        q.possible = possible\n\n        s1 = f" * q{n+1})   Total"\n        s2 = f" {q.obtained}/{w}"\n        print(s1 + ("."* (report.nL-len(s1)-len(s2) )) + s2 )\n        print(" ")\n        table_data.append([f"q{n+1}) Total", f"{q.obtained}/{w}"])\n\n    ws, possible, obtained = upack(score)\n    possible = int( msum(possible) )\n    obtained = int( msum(obtained) ) # Cast to python int\n    report.possible = possible\n    report.obtained = obtained\n    now = datetime.now()\n    dt_string = now.strftime("%H:%M:%S")\n\n    dt = int(time.time()-t_start)\n    minutes = dt//60\n    seconds = dt - minutes*60\n    plrl = lambda i, s: str(i) + " " + s + ("s" if i != 1 else "")\n\n    from src.unitgrade.unitgrade import dprint\n    dprint(first = "Total points at "+ dt_string + " (" + plrl(minutes, "minute") + ", "+ plrl(seconds, "second") +")",\n           last=""+str(report.obtained)+"/"+str(report.possible), nL = report.nL)\n\n    # print(f"Completed at "+ dt_string + " (" + plrl(minutes, "minute") + ", "+ plrl(seconds, "second") +"). Total")\n\n    table_data.append(["Total", ""+str(report.obtained)+"/"+str(report.possible) ])\n    results = {\'total\': (obtained, possible), \'details\': score}\n    return results, table_data\n\n\nimport bz2\nimport pickle\nimport os\n\n\ndef bzwrite(json_str, token): # to get around obfuscation issues\n    with getattr(bz2, \'open\')(token, "wt") as f:\n        f.write(json_str)\n\ndef gather_imports(imp):\n    resources = {}\n    m = imp\n    # for m in pack_imports:\n    # print(f"*** {m.__name__}")\n    f = m.__file__\n    # dn = os.path.dirname(f)\n    # top_package = os.path.dirname(__import__(m.__name__.split(\'.\')[0]).__file__)\n    # top_package = str(__import__(m.__name__.split(\'.\')[0]).__path__)\n\n    if hasattr(m, \'__file__\') and not hasattr(m, \'__path__\'):  # Importing a simple file: m.__class__.__name__ == \'module\' and False:\n        top_package = os.path.dirname(m.__file__)\n        module_import = True\n    else:\n        top_package = __import__(m.__name__.split(\'.\')[0]).__path__._path[0]\n        module_import = False\n\n    # top_package = os.path.dirname(__import__(m.__name__.split(\'.\')[0]).__file__)\n    # top_package = os.path.dirname(top_package)\n    import zipfile\n    # import strea\n    # zipfile.ZipFile\n    import io\n    # file_like_object = io.BytesIO(my_zip_data)\n    zip_buffer = io.BytesIO()\n    with zipfile.ZipFile(zip_buffer, \'w\') as zip:\n        # zip.write()\n        for root, dirs, files in os.walk(top_package):\n            for file in files:\n                if file.endswith(".py"):\n                    fpath = os.path.join(root, file)\n                    v = os.path.relpath(os.path.join(root, file), os.path.dirname(top_package) if not module_import else top_package)\n                    zip.write(fpath, v)\n\n    resources[\'zipfile\'] = zip_buffer.getvalue()\n    resources[\'top_package\'] = top_package\n    resources[\'module_import\'] = module_import\n    return resources, top_package\n\n    if f.endswith("__init__.py"):\n        for root, dirs, files in os.walk(os.path.dirname(f)):\n            for file in files:\n                if file.endswith(".py"):\n                    # print(file)\n                    # print()\n                    v = os.path.relpath(os.path.join(root, file), top_package)\n                    with open(os.path.join(root, file), \'r\') as ff:\n                        resources[v] = ff.read()\n    else:\n        v = os.path.relpath(f, top_package)\n        with open(f, \'r\') as ff:\n            resources[v] = ff.read()\n    return resources\n\nimport argparse\nparser = argparse.ArgumentParser(description=\'Evaluate your report.\', epilog="""Use this script to get the score of your report. Example:\n\n> python report1_grade.py\n\nFinally, note that if your report is part of a module (package), and the report script requires part of that package, the -m option for python may be useful.\nFor instance, if the report file is in Documents/course_package/report3_complete.py, and `course_package` is a python package, then change directory to \'Documents/` and run:\n\n> python -m course_package.report1\n\nsee https://docs.python.org/3.9/using/cmdline.html\n""", formatter_class=argparse.RawTextHelpFormatter)\nparser.add_argument(\'--noprogress\',  action="store_true",  help=\'Disable progress bars\')\nparser.add_argument(\'--autolab\',  action="store_true",  help=\'Show Autolab results\')\n\ndef gather_upload_to_campusnet(report, output_dir=None):\n    n = report.nL\n    args = parser.parse_args()\n    results, table_data = evaluate_report(report, show_help_flag=False, show_expected=False, show_computed=False, silent=True,\n                                          show_progress_bar=not args.noprogress,\n                                          big_header=not args.autolab)\n    # print(" ")\n    # print("="*n)\n    # print("Final evaluation")\n    # print(tabulate(table_data))\n    # also load the source code of missing files...\n\n    sources = {}\n    print("")\n    if not args.autolab:\n        if len(report.individual_imports) > 0:\n            print("By uploading the .token file, you verify the files:")\n            for m in report.individual_imports:\n                print(">", m.__file__)\n            print("Are created/modified individually by you in agreement with DTUs exam rules")\n            report.pack_imports += report.individual_imports\n\n        if len(report.pack_imports) > 0:\n            print("Including files in upload...")\n            for k, m in enumerate(report.pack_imports):\n                nimp, top_package = gather_imports(m)\n                _, report_relative_location, module_import = report._import_base_relative()\n\n                # report_relative_location = os.path.relpath(inspect.getfile(report.__class__), top_package)\n                nimp[\'report_relative_location\'] = report_relative_location\n                nimp[\'report_module_specification\'] = module_import\n                nimp[\'name\'] = m.__name__\n                sources[k] = nimp\n                # if len([k for k in nimp if k not in sources]) > 0:\n                print(f" * {m.__name__}")\n                # sources = {**sources, **nimp}\n    results[\'sources\'] = sources\n\n    if output_dir is None:\n        output_dir = os.getcwd()\n\n    payload_out_base = report.__class__.__name__ + "_handin"\n\n    obtain, possible = results[\'total\']\n    vstring = "_v"+report.version if report.version is not None else ""\n\n    token = "%s_%i_of_%i%s.token"%(payload_out_base, obtain, possible,vstring)\n    token = os.path.normpath(os.path.join(output_dir, token))\n\n\n    with open(token, \'wb\') as f:\n        pickle.dump(results, f)\n\n    if not args.autolab:\n        print(" ")\n        print("To get credit for your results, please upload the single unmodified file: ")\n        print(">", token)\n        # print("To campusnet without any modifications.")\n\n        # print("Now time for some autolab fun")\n\ndef source_instantiate(name, report1_source, payload):\n    eval("exec")(report1_source, globals())\n    pl = pickle.loads(bytes.fromhex(payload))\n    report = eval(name)(payload=pl, strict=True)\n    # report.set_payload(pl)\n    return report\n\n\n__version__ = "0.0.3"\n\nimport numpy as np\nimport looping\nfrom looping import bacteriaGrowth, clusterAnalysis, removeIncomplete, fermentationRate\n\ndef trlist(x):\n    s = str(list(x))\n    if len(s) > 30:\n        s = s[:30] + "...]"\n    return s\n\nclass Bacteria(UTestCase):\n    """ Bacteria growth rates """\n\n    def stest(self, n0, alpha, K, N):\n        g = bacteriaGrowth(n0=n0, alpha=alpha, K=K, N=N)\n        self.title = f"bacteriaGrowth({n0}, {alpha}, {K}, {N}) = {g} ?"\n        self.assertEqualC(g)\n\n    def test_growth1(self):\n        """ Hints:\n        * Make sure to frobulate the frobulator.\n        """\n        self.stest(100, 0.4, 1000, 500)\n\n    def test_growth2(self):\n        self.stest(10, 0.4, 1000, 500)\n\n    def test_growth3(self):\n        self.stest(100, 1.4, 1000, 500)\n\n    def test_growth4(self):\n        self.stest(100, 0.0004, 1000, 500)\n\n    def test_growth5(self):\n        """\n        hints:\n        * What happens when n0 > N? (in this case return t=0) """\n        self.stest(100, 0.4, 1000, 99)\n\nclass ClusterAnalysis(UTestCase):\n    """ Test the cluster analysis method """\n\n    def stest(self, n, seed):\n        np.random.seed(seed)\n        x = np.round(np.random.rand(n), 1)\n        I = clusterAnalysis(x)\n        self.title = f"clusterAnalysis({list(x)}) = {list(I)} ?"\n        self.assertEqualC(list(I))\n\n    def test_cluster1(self):\n        """ Hints:\n        * Make sure to frobulate the frobulator.\n        * Just try harder\n        """\n        self.stest(3, 10)\n\n    def test_cluster2(self):\n        self.stest(4, 146)\n\n    def test_cluster3(self):\n        self.stest(5, 12)\n\n    def test_cluster4(self):\n        """\n        Cluster analysis for tied lists\n        Hints:\n        * It may be that an observations has the same distance to the two clusters. Where do you assign it in this case?\n        """\n        x = np.array([10.0, 12.0, 10.0, 12.0, 9.0, 11.0, 11.0, 13.0])\n        self.assertEqualC(list(clusterAnalysis(x) ) )\n\n\nclass RemoveIncomplete(UTestCase):\n    """ Remove incomplete IDs """\n\n    def stest(self, x):\n        I = list( removeIncomplete(x) )\n        self.title = f"removeId({trlist(x)}) = {trlist(I)} ?"\n        self.assertEqualC(I)\n\n    @cache\n    def rseq(self, max, n):\n        np.random.seed(42)\n        return np.random.randint(max, size=(n,) ) + (np.random.randint(2, size=(n,) )+1)/10\n\n    def test_incomplete1(self):\n        self.stest( np.array([1.3, 2.2, 2.3, 4.2, 5.1, 3.2, 5.3, 3.3, 2.1, 1.1, 5.2, 3.1]) )\n\n    def test_incomplete2(self):\n        self.stest( np.array([1.1, 1.2, 1.3, 2.1, 2.2, 2.3]) )\n\n    def test_incomplete3(self):\n        self.stest(np.array([5.1, 5.2, 4.1, 4.3, 4.2, 8.1, 8.2, 8.3]) )\n\n    def test_incomplete4(self):\n        self.stest(np.array([1.1, 1.3, 2.1, 2.2, 3.1, 3.3, 4.1, 4.2, 4.3]) )\n\n    def test_incomplete5(self):\n        self.stest(self.rseq(10, 40))\n\n\nclass FermentationRate(UTestCase):\n    """ Test the fermentation rate question """\n\n    def stest(self, x, lower, upper):\n        I =  fermentationRate(x, lower, upper)\n        s = trlist(x)\n        self.title = f"fermentationRate({s}, {lower}, {upper}) = {I:.3f} ?"\n        self.assertEqualC(I)\n\n    @cache\n    def rseq(self, max, n):\n        np.random.seed(42)\n        return np.random.randint(max, size=(n,) ) + (np.random.randint(3, size=(n,) )+1)/n\n\n    def test_rate1(self):\n        self.stest(np.array([20.1, 19.3, 1.1, 18.2, 19.7, 121.1, 20.3, 20.0]), 15, 25)\n\n    def test_rate2(self):\n        self.stest(np.array([20.1, 19.3, 1.1, 18.2, 19.7, 121.1, 20.3, 20.0]), 1, 200)\n\n    def test_rate3(self):\n        self.stest(np.array([1.75]), 1, 2)\n\n    def test_rate4(self):\n        self.stest(np.array([20.1, 19.3, 1.1, 18.2, 19.7, 121.1, 20.3, 20.0]), 18.2, 20)\n\n\nclass Report1Flat(Report):\n    title = "Week 4: Looping"\n    questions = [(ClusterAnalysis, 10), (RemoveIncomplete, 10), (Bacteria, 10),  (FermentationRate, 10),]\n    pack_imports = [looping]'
-report1_payload = '800495ea140000000000007d94288c0f436c7573746572416e616c79736973947d942868018c0d746573745f636c7573746572319486948c057469746c659486948c2e636c7573746572416e616c79736973285b302e382c20302e302c20302e365d29203d205b312c20322c20315d203f946801680386948c066173736572749486947d944b005d94288c156e756d70792e636f72652e6d756c74696172726179948c067363616c61729493948c056e756d7079948c0564747970659493948c02693494898887945294284b038c013c944e4e4e4affffffff4affffffff4b007494624304010000009486945294680f68154304020000009486945294680f68154304010000009486945294657368018c0d746573745f636c757374657232948694680586948c36636c7573746572416e616c79736973285b302e352c20302e362c20302e332c20302e335d29203d205b322c20322c20312c20315d203f94680168218694680986947d944b005d9428680f68154304020000009486945294680f68154304020000009486945294680f68154304010000009486945294680f68154304010000009486945294657368018c0d746573745f636c757374657233948694680586948c3e636c7573746572416e616c79736973285b302e322c20302e372c20302e332c20302e352c20302e305d29203d205b312c20322c20312c20322c20315d203f94680168358694680986947d944b005d9428680f68154304010000009486945294680f68154304020000009486945294680f68154304010000009486945294680f68154304020000009486945294680f68154304010000009486945294657368018c0d746573745f636c757374657234948694680986947d944b005d9428680f68154304010000009486945294680f68154304020000009486945294680f68154304010000009486945294680f68154304020000009486945294680f68154304010000009486945294680f68154304010000009486945294680f68154304010000009486945294680f6815430402000000948694529465738c0474696d6594473fe8ac0200000000758c1052656d6f7665496e636f6d706c657465947d9428686a8c10746573745f696e636f6d706c65746531948694680586948c5372656d6f76654964285b312e332c20322e322c20322e332c20342e322c20352e312c20332e322c2e2e2e5d29203d205b322e322c20322e332c20352e312c20332e322c20352e332c20332e332c2e2e2e5d203f94686a686c8694680986947d944b005d9428680f68128c02663894898887945294284b0368164e4e4e4affffffff4affffffff4b0074946243089a999999999901409486945294680f6876430866666666666602409486945294680f6876430866666666666614409486945294680f687643089a999999999909409486945294680f6876430833333333333315409486945294680f687643086666666666660a409486945294680f68764308cdcccccccccc00409486945294680f68764308cdcccccccccc14409486945294680f68764308cdcccccccccc084094869452946573686a8c10746573745f696e636f6d706c65746532948694680586948c4b72656d6f76654964285b312e312c20312e322c20312e332c20322e312c20322e322c20322e335d29203d205b312e312c20312e322c20312e332c20322e312c20322e322c20322e335d203f94686a68938694680986947d944b005d9428680f687643089a9999999999f13f9486945294680f68764308333333333333f33f9486945294680f68764308cdccccccccccf43f9486945294680f68764308cdcccccccccc00409486945294680f687643089a999999999901409486945294680f68764308666666666666024094869452946573686a8c10746573745f696e636f6d706c65746533948694680586948c4f72656d6f76654964285b352e312c20352e322c20342e312c20342e332c20342e322c20382e312c2e2e2e5d29203d205b342e312c20342e332c20342e322c20382e312c20382e322c20382e335d203f94686a68ad8694680986947d944b005d9428680f6876430866666666666610409486945294680f6876430833333333333311409486945294680f68764308cdcccccccccc10409486945294680f6876430833333333333320409486945294680f6876430866666666666620409486945294680f687643089a9999999999204094869452946573686a8c10746573745f696e636f6d706c65746534948694680586948c4072656d6f76654964285b312e312c20312e332c20322e312c20322e322c20332e312c20332e332c2e2e2e5d29203d205b342e312c20342e322c20342e335d203f94686a68c78694680986947d944b005d9428680f6876430866666666666610409486945294680f68764308cdcccccccccc10409486945294680f68764308333333333333114094869452946573686a8c10746573745f696e636f6d706c657465359486948c06406361636865948c0472736571948c0966756e63746f6f6c73948c0a5f486173686564536571949394298194284b0a4b28654e7d948c096861736876616c7565948a0884d8ef03874d7f467386946287948694680d8c0c5f7265636f6e73747275637494939468108c076e6461727261799493944b0085944301629487945294284b014b288594687689424001000066666666666618409a99999999990940cdcccccccccc1c40cdcccccccccc1040cdcccccccccc184033333333333322409a999999999901406666666666661840cdcccccccccc1c40cdcccccccccc10409a999999999909406666666666661c40cdcccccccccc1c40cdcccccccccc0040cdcccccccccc14406666666666661040333333333333f33f6666666666661c406666666666661440333333333333f33f66666666666610409a9999999999c93f6666666666662240cdcccccccccc144066666666666620409a9999999999c93f66666666666622409a99999999990140cdcccccccccc18409a9999999999094066666666666620409a999999999901406666666666661040cdcccccccccc0040cdcccccccccc1840cdcccccccccc10406666666666662040cdcccccccccc1840333333333333f33f9a9999999999094094749462686a68d88694680586948c5372656d6f76654964285b362e312c20332e322c20372e322c20342e322c20362e322c20392e312c2e2e2e5d29203d205b392e312c20352e322c20312e322c20352e312c20312e322c20392e322c2e2e2e5d203f94686a68d88694680986947d944b005d9428680f6876430833333333333322409486945294680f68764308cdcccccccccc14409486945294680f68764308333333333333f33f9486945294680f6876430866666666666614409486945294680f68764308333333333333f33f9486945294680f6876430866666666666622409486945294680f68764308cdcccccccccc14409486945294680f6876430866666666666620409486945294680f6876430866666666666622409486945294680f6876430866666666666620409486945294680f6876430866666666666620409486945294680f68764308333333333333f33f948694529465736869473fd9ba5e00000000758c084261637465726961947d94286a1b0100008c0c746573745f67726f77746831948694680586948c29626163746572696147726f777468283130302c20302e342c20313030302c2035303029203d2037203f946a1b0100006a1d0100008694680986947d944b004b07736a1b0100006a1d01000086948c08636f7665726167659486947d94286a1b0100006a1d01000086947d948c0a6c6f6f70696e672e7079947d948c2564656620626163746572696147726f777468286e302c20616c7068612c204b2c204e293a20944b158ce72222220a2020202043616c63756c6174652074696d6520756e74696c2062616374657269612067726f77746820657863656564204e207374617274696e672066726f6d206120706f70756c6174696f6e206f66206e302062616374657269612e0a2020202068696e74733a0a20202020202020202a20636f6e7369646572206e300a20202020202020202a20616c706861203e20300a202020203a706172616d206e303a0a202020203a706172616d20616c7068613a0a202020203a706172616d204b3a0a202020203a706172616d204e3a0a202020203a72657475726e3a0a2020202022222294869473736a1b0100008c0c746573745f67726f777468329486947d948c0a6c6f6f70696e672e7079947d948c2564656620626163746572696147726f777468286e302c20616c7068612c204b2c204e293a20944b158ce72222220a2020202043616c63756c6174652074696d6520756e74696c2062616374657269612067726f77746820657863656564204e207374617274696e672066726f6d206120706f70756c6174696f6e206f66206e302062616374657269612e0a2020202068696e74733a0a20202020202020202a20636f6e7369646572206e300a20202020202020202a20616c706861203e20300a202020203a706172616d206e303a0a202020203a706172616d20616c7068613a0a202020203a706172616d204b3a0a202020203a706172616d204e3a0a202020203a72657475726e3a0a2020202022222294869473736a1b0100008c0c746573745f67726f777468339486947d948c0a6c6f6f70696e672e7079947d948c2564656620626163746572696147726f777468286e302c20616c7068612c204b2c204e293a20944b158ce72222220a2020202043616c63756c6174652074696d6520756e74696c2062616374657269612067726f77746820657863656564204e207374617274696e672066726f6d206120706f70756c6174696f6e206f66206e302062616374657269612e0a2020202068696e74733a0a20202020202020202a20636f6e7369646572206e300a20202020202020202a20616c706861203e20300a202020203a706172616d206e303a0a202020203a706172616d20616c7068613a0a202020203a706172616d204b3a0a202020203a706172616d204e3a0a202020203a72657475726e3a0a2020202022222294869473736a1b0100008c0c746573745f67726f777468349486947d948c0a6c6f6f70696e672e7079947d948c2564656620626163746572696147726f777468286e302c20616c7068612c204b2c204e293a20944b158ce72222220a2020202043616c63756c6174652074696d6520756e74696c2062616374657269612067726f77746820657863656564204e207374617274696e672066726f6d206120706f70756c6174696f6e206f66206e302062616374657269612e0a2020202068696e74733a0a20202020202020202a20636f6e7369646572206e300a20202020202020202a20616c706861203e20300a202020203a706172616d206e303a0a202020203a706172616d20616c7068613a0a202020203a706172616d204b3a0a202020203a706172616d204e3a0a202020203a72657475726e3a0a2020202022222294869473736a1b0100008c0c746573745f67726f777468359486947d948c0a6c6f6f70696e672e7079947d948c2564656620626163746572696147726f777468286e302c20616c7068612c204b2c204e293a20944b118ce72222220a2020202043616c63756c6174652074696d6520756e74696c2062616374657269612067726f77746820657863656564204e207374617274696e672066726f6d206120706f70756c6174696f6e206f66206e302062616374657269612e0a2020202068696e74733a0a20202020202020202a20636f6e7369646572206e300a20202020202020202a20616c706861203e20300a202020203a706172616d206e303a0a202020203a706172616d20616c7068613a0a202020203a706172616d204b3a0a202020203a706172616d204e3a0a202020203a72657475726e3a0a202020202222229486947373756a1b0100006a2f0100008694680586948c29626163746572696147726f7774682831302c20302e342c20313030302c2035303029203d203134203f946a1b0100006a2f0100008694680986947d944b004b0e736a1b0100006a2f01000086946a2501000086946a270100006a1b0100006a370100008694680586948c29626163746572696147726f777468283130302c20312e342c20313030302c2035303029203d2033203f946a1b0100006a370100008694680986947d944b004b03736a1b0100006a3701000086946a2501000086946a270100006a1b0100006a3f0100008694680586948c2f626163746572696147726f777468283130302c20302e303030342c20313030302c2035303029203d2035343934203f946a1b0100006a3f0100008694680986947d944b004d7615736a1b0100006a3f01000086946a2501000086946a270100006a1b0100006a470100008694680586948c28626163746572696147726f777468283130302c20302e342c20313030302c20393929203d2030203f946a1b0100006a470100008694680986947d944b004b00736a1b0100006a4701000086946a2501000086946a270100006869473fd0311600000000758c104665726d656e746174696f6e52617465947d94286a6f0100008c0a746573745f7261746531948694680586948c476665726d656e746174696f6e52617465285b32302e312c2031392e332c20312e312c2031382e322c2031392e372c202e2e2e5d2c2031352c20323529203d2031392e363030203f946a6f0100006a710100008694680986947d944b00680f687643089a999999999933409486945294736a6f0100008c0a746573745f7261746532948694680586948c476665726d656e746174696f6e52617465285b32302e312c2031392e332c20312e312c2031382e322c2031392e372c202e2e2e5d2c20312c2032303029203d2032392e393735203f946a6f0100006a7b0100008694680986947d944b00680f687643089899999999f93d409486945294736a6f0100008c0a746573745f7261746533948694680586948c286665726d656e746174696f6e52617465285b312e37355d2c20312c203229203d20312e373530203f946a6f0100006a850100008694680986947d944b00680f68764308000000000000fc3f9486945294736a6f0100008c0a746573745f7261746534948694680586948c496665726d656e746174696f6e52617465285b32302e312c2031392e332c20312e312c2031382e322c2031392e372c202e2e2e5d2c2031382e322c20323029203d2031392e353030203f946a6f0100006a8f0100008694680986947d944b00680f6876430800000000008033409486945294736869473fcd4fd60000000075752e'
-name="Report1Flat"
-
-report = source_instantiate(name, report1_source, report1_payload)
-output_dir = os.path.dirname(__file__)
-gather_upload_to_campusnet(report, output_dir)
\ No newline at end of file
+'''WARNING: Modifying, decompiling or otherwise tampering with this script, it's data or the resulting .token file will be investigated as a cheating attempt.'''
+import bz2, base64
+exec(bz2.decompress(base64.b64decode('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')))
\ No newline at end of file
diff --git a/examples/02631/instructor/week5/unitgrade/Bacteria.pkl b/examples/02631/instructor/week5/unitgrade_data/Bacteria.pkl
similarity index 71%
rename from examples/02631/instructor/week5/unitgrade/Bacteria.pkl
rename to examples/02631/instructor/week5/unitgrade_data/Bacteria.pkl
index b246df45c63387d95bc69cc26deba7770d8249c5..de4d8915d32620e36c2dce736a4f5d79b7117274 100644
GIT binary patch
delta 183
zcmZn?xWUiTz%uphM3&CUZLAg>&oMDh-oj=qCek(~gQIOq?G$eYZ@%IT#te`E&*pQC
zc8qKpENxSIG$$vpi%eEzmlRV*QpyZc3K9S*wPIv4nKC(o-CEoTp~SaL6r=_u0#P%$
oft3Yfq{id~cCpD9*u}&g5$e4eK*~V^Jd@8c+DzWZ`higo0OUeE?EnA(

delta 203
zcmcb?-z31&z%upwM3zogjSR*Nrp*FOR*XzWQ#K1Q*)eVwVzOXlG68X{7@16`Ocr3W
znf#pX14{;DhS+2uX35F-7-i(d+NNZ1v`wj<;?3aAR}7MBo07rPHYI~EgE2#HvJbPV
zoE(x8W{?t)08EM6<jXA9@@fbrzGb2yH6Rg~8okMhY$h^#2sPdeASECHu#!?e05Etz
A9RL6T

diff --git a/examples/02631/instructor/week5/unitgrade/ClusterAnalysis.pkl b/examples/02631/instructor/week5/unitgrade_data/ClusterAnalysis.pkl
similarity index 100%
rename from examples/02631/instructor/week5/unitgrade/ClusterAnalysis.pkl
rename to examples/02631/instructor/week5/unitgrade_data/ClusterAnalysis.pkl
diff --git a/examples/02631/instructor/week5/unitgrade/FermentationRate.pkl b/examples/02631/instructor/week5/unitgrade_data/FermentationRate.pkl
similarity index 100%
rename from examples/02631/instructor/week5/unitgrade/FermentationRate.pkl
rename to examples/02631/instructor/week5/unitgrade_data/FermentationRate.pkl
diff --git a/examples/02631/instructor/week5/unitgrade/RemoveIncomplete.pkl b/examples/02631/instructor/week5/unitgrade_data/RemoveIncomplete.pkl
similarity index 52%
rename from examples/02631/instructor/week5/unitgrade/RemoveIncomplete.pkl
rename to examples/02631/instructor/week5/unitgrade_data/RemoveIncomplete.pkl
index 49e9468f086330e635588c0d9a3c0ae0ebc882bc..30edf2db7bc0e41f0ada9c1c7443ac1d487a6d9a 100644
GIT binary patch
delta 19
acmey*w}hLufo1AU){U$_ESq)Mf*AoqMFqG3

delta 496
zcmZ3&{hyDufn{n5`$kqDmiitxhvdZMjMOPTEJeksg;RPs(@OJ_OY-w`il_8&#d{<c
zXQZYCrxs3`JVmo{iiS6rw??X8?UWwQjKt!Mvc#Oy)G1vYEjQjXxBJ$+6}L@EYM;_J
zC4;AjC%z~(IX|zsq^LBxWXj|z8T>u$c`1oSMTwPDCQtEZXr1EBm^7umeoD|34R1zo
zjn*j{BAreSj0_BEU?AZzYbFSAI-ETN0y0oq07^?Z7=wWlR2`!OSX-I|R34!oW)4Ii
zCJv?R&oDqWh(HYxfExVS9;N|8i=c@MKrKEARi}hzjsk`}#377Obr286%$&&ywHT%W
o<`bAtVGe}(OaQJP5;Cxm_-qfcfYV`0$&{oF#*FgK{w$%401@fir~m)}

diff --git a/examples/02631/students/week5/.coverage b/examples/02631/students/week5/.coverage
deleted file mode 100644
index ad913a755651443efae803b9092cf83d99e52536..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 53248
zcmWFz^vNtqRY=P(%1ta$FlG>7U}R))P*7lCVBlh4VBlpy0Colj1{MUDff0#~i^;{H
z=X{u#Ka7EgZ5jiA9B%}_F3(b4eePR4Wt@|_m$PSa=CDn}rFm3*Gz3ONU^E0qLtvzZ
zKw}^eySStzV^eKOVp2|ONl{{QY7vCwbq;cM3~^Nmadh%=Re*>oXmBYgC@ARaDmW?>
z<(DfIq!uZpW#*(RWag!0CMT9;=A|o?WTe7Wmlmg{fNDI2l8nR>utGhsevp><%oK&p
zypq)P)FOp~qRiaHqDqDA)Jh$&0;p{zsTCy<fwcUh)XelekO~D2sCG?-qSUn1qSU<P
z)MBvV3L2Rynp~RA^<3=Y!orO0sbD`P79}SZC3B<rCb1|P;T6v`g`(8t{Gt?)>ywHS
z^O7@Ci**zd;XX{x&jYyx;@hJ9T>X-Kg`CVhus8FHGfOh_^Au7mQj<$dQd6*cPzMxf
zFs!Q!3KF<)O7ayFKpskf=!DvZ6gmjaSad>_Lp7%r<>%(*!-5r|5oEQlF2v1wrMXF|
zMG9G^xdoueDay}<SX`2iOD8zK!Tv?nTapjaNqpR3iA$&l;xkiFq7y0%j!}rN(!9*V
z(o_Xl<m)IvmBeSJ=qNxuuA>0*geI4!DmR<Br7$ByW?o8aMR8$HW=U#%VrfY}m>-{5
zlpJrESd`4uBFMomE-%m6UI<PoATP!zWtJ4f8JsAI1}=;v>44;MryEc%K}{r}T$Gce
zke>$5G9cXwkN_?QB@jfO(TDm}A+ZRQ(G>FYQo#x{ONyZpkeQQ;HNil#Dsuc#Gqr&n
zn^{t<kd%|3gqqgCDW*6z73?vXvb55?WKdQqR>;g#NX{=yElNyJ)q~1{b3L*{VeyQT
zDnR)JDM_HHhXxWw2}zSn(~y%*+*KY|(g8&hIElm?!kJu+l5Fha($b7goZw^xbqJJV
zM@d3ZK|}&V6r(Vy+|<P4(jr(vg0GN-=>U~YsCfh`qsgVI%g!e5D2>ZIP<8Q!PzFaM
zI}5wGs3>D2Bu9Y48-!U=JOL8H<^!-e@y;(uEXh#7bUR2`lS@;bl}+4Q6qmz6R>d2F
zNVeu6Ca{y+*}<Won_7|x!pta628ke??44SvTb7tpnyOHcm|0W|DmI`sfC5NiN@7W(
zLSj;WX$d&}g1F%1nVnjR<X(sYnC{O`t<(f7*VR?<POU7qf^ihoGZKqIg-@}%LQ;Ny
zPHJKvs9Xl;70+UYl8nq^1(01(ryy5G_6ReID?w(Ym#KrD0x<xR%|kL$;n_+dIX^cy
zF)syD<b!KpNEMfw0{0W7?9kO!P*5*REh^5;&qFg4RLz47h01~oDtNXnsDzYHxrr%|
zTn>s0BooUsQZbB!IMXGuB()?nH&p?o1nd})R)zA!Vuj?Q)I@L<s;SP5FZMx^6mJM3
zLA_)SP@An$o{?Q#Tbr@56r2iR?u;)^&PdHoMB_4{qzyDlL^AQuO9eFnkdp_fZG#jX
zATGoPP?-ja!6Zm1z*Iq-I9!^b4n8CQZwCI~Aoq^q(GVC7fzc2c4S~@R7!85Z5Eu=C
z(GVC7fzc2c4S~@R7!84876QzSOpNTH{yz(U5(EEi{vQ4U{-j~%$5HQ$hQMeDjE2By
z2#kinXb6mkz-S1JhQMeDjE2By2#kgRokD<zg;|y#w#LFhikVr|7_`Q~$iT=@*T7QO
zz(T>$+{(bf%G83FiCJ10Izw-&XPV5&BHL&UTUimU?rfzWTAW%`tY1=^k*e>KpIn-o
znpaY+Uz(R$l3tXUk{Vx7lv$QolB%Ctk(gVMlUl5AU}R=&sGpfvTvAk;T#{d;U!Izp
zZK|J=T9A`psaH^`9t&FJ&%%F+f&UW!7ycLg_vsWUqt=Xuz-S1JhQMeDjE2By2#kin
zXb6mkz-S1JhQMeDjE2By2v8IPJj}9;u;B(44rWnC&}aiQH?uS&bZCKzn^~3<Hmm@e
z|7YfBX5in$AIr~7k;S8$M?+vV1V%$(Gz3ONU^E0qLtr!nMnhmU1V%$(Gz3ONU@(V3
z1Tzamqp7o140v`u1~j`K1D{=w!I)i-fz7VRfM?fZ5VPws;Mw(<oc#QP%)E5Hg34GX
z7KTQ9>X}@WT998<Vwjm%Qk1V(Q0c_T!qCV`(D<0*qGW_OjF6am1(l%re`bCb2L8SL
zEc|hUIhsb@HW~t>Aut*OqaiRF0;3@?8UmvsFd71*Aut*OqaiRF0+fY7Buk?yBf)Mo
zY;`>e{eR{-mPUIjnvB-}XL4d`<fO3w51RiUJ^zog^fRh^Gz3ONU^E0qLtr!nMnhmU
z1V%$(Gz3ONU^E0qLtr!n25|^5Gcq&qg697j`TsER{~5$C9d+7h2#kinXb6mkz-S1J
zhQMeDjE2By2#kinXb6mkz-S1Jh5*?iz|73c37Y?B=5J!)U&i0Z-$b@iqZ&s;U^E0q
zLtr!nMnhmU1V%$(Gz3ONU^E0qLtr!nMnhmU1n`Cc7c&bZrx^I?Jq0l)7Di4zCI)^a
z9UmAN7$X>2IXN4RkVHvi{(vawU}#|OnrW!#58*N}FbII=|C#yUGVuTA|HA(kE<VZ_
z4S~@R7!85Z5Eu=C(GVC7fzc2c4S~@R7!85Z5Eu=C(GVD_A;8AM$jQje45pZvSXekY
z!SnwN0z=h9qwXFJfzc2c4S~@R7!85Z5Eu=C(GVC7fzc2c4S~@R7!85Z5FjQ5K=c2j
z{eNOYYE;c=2#kinXb6mkz-S1JhQMeDjE2By2#kinXb6mkz-R~z-4Fon{~zuD58e11
pb@^xrjE2By2#kinXb6mkz-S1JhQMeDjE2By2#kinXb2D!0s!6H9xDI<

diff --git a/examples/02631/students/week5/__pycache__/looping.cpython-38.pyc b/examples/02631/students/week5/__pycache__/looping.cpython-38.pyc
deleted file mode 100644
index fa302e5a102c505ba4b62aa5eab3205ca2683298..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 2019
zcmWIL<>g{vU|@KAPd`zBoq^#oh=YuI7#J8F7#J9elNcBnQW#Pga~Pr+!8B78QwmcG
za|=Tha|%leYYRgZOA1>GdkaGpYYImSXA46VTPk}BS2j~oTq;K@YbxUc&J^wxo)q2`
zz7+lxffT_Mp>&Rgj48q?BF)UrjEoE^jKK_=qAx+V`z5o0C@5xSU|?WlU|?_txx<Zt
zfuV+>hB=$1hzF#jgkb^WLIxLxSdChi6s8)+6s8)68YXE52?h}cafTWO5r$frdJ#s3
zLc2nd8kQ6$afV<9P3EeHTnY*b3eJf+$)!1oC8-J}nYpP7rFkWpISNUM$t9^pnTZPN
zMfv3=849Tt$*HL+3VsU3C5c5PnR)37X+`<D3W*8@`2`@&nfZAN`DqGy25_BvV8b&q
z^Gb@Xz)X-`S_;YedBvG2sYMET21ufbIRzPs3U&$*F{^^aqQqQ<JOhYEC>N{-MZ_D0
z=Lh8#rIwTy<v}<_j0_A6FF}MR(=E=-lGLJ-{QR8aTdc|XrFkWqthbo*3~sT4O}@qG
zeT&iW7Guduh9Xd+_!aJK6%$&VT2vfUQksz(<C33Tnwy$eQXEs7msyftl$eqlUr>};
zmROP+lUk9OTac4l9AjW)W^5RfnO9s=RGM6pUldbNl%HOdm|Gl^lb>IZnU}6tP<e|F
z7P#)<um#0+F&`+hc{mtZ7<m{a7&#c(7>ht@FB#-?kQ4}m6mq~4!VCrm22kYJFf3%O
z1+kb)m}?lC85c69Fp4pxFl95<GJ@nw7#6V9Fw`*eGe|Nl1c`uoAa**_LdIIA5{4|+
z5{3nAHK63p&<f(Sr!h$~)PPwj3@Hq)Od!4l!$L+-g70Mlo6TIpQNvurn9bD8SkzTG
zp@zAZu}}e&{J=?z#qT8(0|P@5h|pxb#gbT&S**!<iz%<*7JFiGVo_0I<t?_vqQt!P
z)LYCssd=|pa#IuYKtk!cnR&OE6O)Q>vFD|hgY?~EPRz;CWQpP~N=?g2O)g2yOHPeq
z@-)1~m>b3HX&4WVEC|8Pz`$^eKRKtgxFog6F)uNvvN*F?0+ek8K;g&8#VE$4!f3(B
z!^i{*U`YlBhGb@t3>1Udpxg$ci>06e+|JO>n8uXCn8MV;QN!Q@4q{O5@k5ClkWWEc
zg+aDyFfcHrGt@A|D%3J|Fw`)zFfcP@GZe{mFlI9pvE;EZG8D4ZFivDDWC@0(HL&wF
znQk%Z8QfwlTFG>aD<{7^wa6*IG%w{AS7|{3lnqu_1okGEO-^QUNpgN}ft@PIPEe9%
zV_;%nV&G!nVW?6`ODzJW*2I#`{JfyVl2kpLoc!d(oMJmYghoxKB7RUbfgG*L9L1BH
znpj*~l$rukUnC2XkpmGRql;ufEU?W2=te7p><0w^15=R#C`^$PEhsEO0Ry6o{h(nA
zNwnz<wTvZ9phWA!5UUfzRLj)KP{Q2Kkj97{+Rcn9%-KvuVl|8lSUMOMGBPq0ih&Y#
z4dX&kiOEuBr{IAoWV94Q60=hk5*2dt^RpEaOB6~nQWc=tQz0`C%1tdw&MZ!alu)>%
z5#$$eG)jQ7QVnA>V+lhCLo;JGQxR(PX)@ko&de*(WGVtBnp=z&D;aMwmLVdmNS=X#
z!4MQmpmH1(O9Bj4Dn+Te`DLk|d7wDVNyQ#RFG0bk$qI=kP$Is?nVMIcn_84ul3FAL
zO73il1qG>jDVof;m@-qMm@`w1ZZT#;tOmskB(Vsf+oc6^45)x%VBun9VH9ALV&q{g
z0*T(@h>y=r%*>0APoFh&=FFLrCJyOm&zw1P#>dzJA~N%%eY!Ci7&$-~n~fdP(?Gy2
z4yM?|Asv#bOdMW<(%4H-X4B-l#hO=|TTlt{56ExeQmzOj2~Ik2C*&pOrpCwLVl61j
w%qzLY3NA7rz5=I4Fab`D95%W6DWy57cA!KDE=D;RIhZ&^IJi03Ie0i&0HrYEG5`Po

diff --git a/examples/02631/students/week5/__pycache__/report1intro.cpython-38.pyc b/examples/02631/students/week5/__pycache__/report1intro.cpython-38.pyc
deleted file mode 100644
index 5ff8b50a504bd3e8d030c9362fc1ae6c760e7ac1..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 7195
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

diff --git a/examples/02631/students/week5/looping.py b/examples/02631/students/week5/looping.py
index ad30a92..6ac0b73 100644
--- a/examples/02631/students/week5/looping.py
+++ b/examples/02631/students/week5/looping.py
@@ -14,7 +14,7 @@ def bacteriaGrowth(n0, alpha, K, N):
     :return:
     """
     # TODO: 7 lines missing.
-    raise NotImplementedError("Implement function body")
+    raise NotImplementedError("Implement function bod")
 
 def clusterAnalysis(reflectance):
     reflectance = np.asarray(reflectance)
diff --git a/examples/02631/students/week5/report1intro.py b/examples/02631/students/week5/report1intro.py
index b5c7cab..d4abb8b 100644
--- a/examples/02631/students/week5/report1intro.py
+++ b/examples/02631/students/week5/report1intro.py
@@ -1,4 +1,5 @@
-from unitgrade.framework import Report, UTestCase, cache
+from unitgrade.framework import Report, UTestCase
+from unitgrade import cache
 from unitgrade.evaluate import evaluate_report_student
 import numpy as np
 import looping
@@ -40,7 +41,7 @@ class Bacteria(UTestCase):
         self.stest(100, 0.4, 1000, 99)
 
 class ClusterAnalysis(UTestCase):
-    """ Test the cluster analysis method """
+    """ Cluster analysis """
 
     def stest(self, n, seed):
         np.random.seed(seed)
@@ -102,7 +103,7 @@ class RemoveIncomplete(UTestCase):
 
 
 class FermentationRate(UTestCase):
-    """ Test the fermentation rate question """
+    """ Fermentation rate """
 
     def stest(self, x, lower, upper):
         I =  fermentationRate(x, lower, upper)
@@ -134,6 +135,4 @@ class Report1Flat(Report):
     pack_imports = [looping]
 
 if __name__ == "__main__":
-    # Uncomment to simply run everything as a unittest:
-    # unittest.main(verbosity=2)
     evaluate_report_student(Report1Flat())
diff --git a/examples/02631/students/week5/report1intro_grade.py b/examples/02631/students/week5/report1intro_grade.py
index 354f81e..88d3b50 100644
--- a/examples/02631/students/week5/report1intro_grade.py
+++ b/examples/02631/students/week5/report1intro_grade.py
@@ -1,338 +1,3 @@
-import numpy as np
-from tabulate import tabulate
-from datetime import datetime
-import pyfiglet
-import unittest
-import inspect
-import os
-import argparse
-import time
-
-parser = argparse.ArgumentParser(description='Evaluate your report.', epilog="""Example: 
-To run all tests in a report: 
-
-> python assignment1_dp.py
-
-To run only question 2 or question 2.1
-
-> python assignment1_dp.py -q 2
-> python assignment1_dp.py -q 2.1
-
-Note this scripts does not grade your report. To grade your report, use:
-
-> python report1_grade.py
-
-Finally, note that if your report is part of a module (package), and the report script requires part of that package, the -m option for python may be useful.
-For instance, if the report file is in Documents/course_package/report3_complete.py, and `course_package` is a python package, then change directory to 'Documents/` and run:
-
-> python -m course_package.report1
-
-see https://docs.python.org/3.9/using/cmdline.html
-""", formatter_class=argparse.RawTextHelpFormatter)
-parser.add_argument('-q', nargs='?', type=str, default=None, help='Only evaluate this question (e.g.: -q 2)')
-parser.add_argument('--showexpected',  action="store_true",  help='Show the expected/desired result')
-parser.add_argument('--showcomputed',  action="store_true",  help='Show the answer your code computes')
-parser.add_argument('--unmute',  action="store_true",  help='Show result of print(...) commands in code')
-parser.add_argument('--passall',  action="store_true",  help='Automatically pass all tests. Useful when debugging.')
-parser.add_argument('--noprogress',  action="store_true",  help='Disable progress bars.')
-
-def evaluate_report_student(report, question=None, qitem=None, unmute=None, passall=None, ignore_missing_file=False, show_tol_err=False):
-    args = parser.parse_args()
-    if question is None and args.q is not None:
-        question = args.q
-        if "." in question:
-            question, qitem = [int(v) for v in question.split(".")]
-        else:
-            question = int(question)
-
-    if hasattr(report, "computed_answer_file") and not os.path.isfile(report.computed_answers_file) and not ignore_missing_file:
-        raise Exception("> Error: The pre-computed answer file", os.path.abspath(report.computed_answers_file), "does not exist. Check your package installation")
-
-    if unmute is None:
-        unmute = args.unmute
-    if passall is None:
-        passall = args.passall
-
-
-    results, table_data = evaluate_report(report, question=question, show_progress_bar=not unmute and not args.noprogress, qitem=qitem, verbose=False, passall=passall, show_expected=args.showexpected, show_computed=args.showcomputed,unmute=unmute,
-                                          show_tol_err=show_tol_err)
-
-
-    if question is None:
-        print("Provisional evaluation")
-        tabulate(table_data)
-        table = table_data
-        print(tabulate(table))
-        print(" ")
-
-    fr = inspect.getouterframes(inspect.currentframe())[1].filename
-    gfile = os.path.basename(fr)[:-3] + "_grade.py"
-    if os.path.exists(gfile):
-        print("Note your results have not yet been registered. \nTo register your results, please run the file:")
-        print(">>>", gfile)
-        print("In the same manner as you ran this file.")
-
-
-    return results
-
-
-def upack(q):
-    # h = zip([(i['w'], i['possible'], i['obtained']) for i in q.values()])
-    h =[(i['w'], i['possible'], i['obtained']) for i in q.values()]
-    h = np.asarray(h)
-    return h[:,0], h[:,1], h[:,2],
-
-class UnitgradeTextRunner(unittest.TextTestRunner):
-    def __init__(self, *args, **kwargs):
-        super().__init__(*args, **kwargs)
-
-class SequentialTestLoader(unittest.TestLoader):
-    def getTestCaseNames(self, testCaseClass):
-        test_names = super().getTestCaseNames(testCaseClass)
-        # testcase_methods = list(testCaseClass.__dict__.keys())
-        ls = []
-        for C in testCaseClass.mro():
-            if issubclass(C, unittest.TestCase):
-                ls = list(C.__dict__.keys()) + ls
-        testcase_methods = ls
-        test_names.sort(key=testcase_methods.index)
-        return test_names
-
-def evaluate_report(report, question=None, qitem=None, passall=False, verbose=False,  show_expected=False, show_computed=False,unmute=False, show_help_flag=True, silent=False,
-                    show_progress_bar=True,
-                    show_tol_err=False,
-                    big_header=True):
-
-    from src.unitgrade.version import __version__
-    now = datetime.now()
-    if big_header:
-        ascii_banner = pyfiglet.figlet_format("UnitGrade", font="doom")
-        b = "\n".join( [l for l in ascii_banner.splitlines() if len(l.strip()) > 0] )
-    else:
-        b = "Unitgrade"
-    dt_string = now.strftime("%d/%m/%Y %H:%M:%S")
-    print(b + " v" + __version__ + ", started: " + dt_string+ "\n")
-    # print("Started: " + dt_string)
-    s = report.title
-    if hasattr(report, "version") and report.version is not None:
-        s += " version " + report.version
-    print(s, "(use --help for options)" if show_help_flag else "")
-    # print(f"Loaded answers from: ", report.computed_answers_file, "\n")
-    table_data = []
-    t_start = time.time()
-    score = {}
-    loader = SequentialTestLoader()
-
-    for n, (q, w) in enumerate(report.questions):
-        if question is not None and n+1 != question:
-            continue
-        suite = loader.loadTestsFromTestCase(q)
-        qtitle = q.question_title() if hasattr(q, 'question_title') else q.__qualname__
-        q_title_print = "Question %i: %s"%(n+1, qtitle)
-        print(q_title_print, end="")
-        q.possible = 0
-        q.obtained = 0
-        q_ = {} # Gather score in this class.
-        from src.unitgrade.framework import UTextTestRunner
-        UTextResult.q_title_print = q_title_print # Hacky
-        UTextResult.show_progress_bar = show_progress_bar # Hacky.
-        UTextResult.number = n
-        UTextResult.nL = report.nL
-
-        res = UTextTestRunner(verbosity=2, resultclass=UTextResult).run(suite)
-
-        possible = res.testsRun
-        obtained = len(res.successes)
-
-        assert len(res.successes) +  len(res.errors) + len(res.failures) == res.testsRun
-
-        obtained = int(w * obtained * 1.0 / possible ) if possible > 0 else 0
-        score[n] = {'w': w, 'possible': w, 'obtained': obtained, 'items': q_, 'title': qtitle}
-        q.obtained = obtained
-        q.possible = possible
-
-        s1 = f" * q{n+1})   Total"
-        s2 = f" {q.obtained}/{w}"
-        print(s1 + ("."* (report.nL-len(s1)-len(s2) )) + s2 )
-        print(" ")
-        table_data.append([f"q{n+1}) Total", f"{q.obtained}/{w}"])
-
-    ws, possible, obtained = upack(score)
-    possible = int( msum(possible) )
-    obtained = int( msum(obtained) ) # Cast to python int
-    report.possible = possible
-    report.obtained = obtained
-    now = datetime.now()
-    dt_string = now.strftime("%H:%M:%S")
-
-    dt = int(time.time()-t_start)
-    minutes = dt//60
-    seconds = dt - minutes*60
-    plrl = lambda i, s: str(i) + " " + s + ("s" if i != 1 else "")
-
-    from src.unitgrade.framework import dprint
-    dprint(first = "Total points at "+ dt_string + " (" + plrl(minutes, "minute") + ", "+ plrl(seconds, "second") +")",
-           last=""+str(report.obtained)+"/"+str(report.possible), nL = report.nL)
-
-    # print(f"Completed at "+ dt_string + " (" + plrl(minutes, "minute") + ", "+ plrl(seconds, "second") +"). Total")
-
-    table_data.append(["Total", ""+str(report.obtained)+"/"+str(report.possible) ])
-    results = {'total': (obtained, possible), 'details': score}
-    return results, table_data
-
-
-import bz2
-import pickle
-import os
-
-
-def bzwrite(json_str, token): # to get around obfuscation issues
-    with getattr(bz2, 'open')(token, "wt") as f:
-        f.write(json_str)
-
-def gather_imports(imp):
-    resources = {}
-    m = imp
-    # for m in pack_imports:
-    # print(f"*** {m.__name__}")
-    f = m.__file__
-    # dn = os.path.dirname(f)
-    # top_package = os.path.dirname(__import__(m.__name__.split('.')[0]).__file__)
-    # top_package = str(__import__(m.__name__.split('.')[0]).__path__)
-
-    if hasattr(m, '__file__') and not hasattr(m, '__path__'):  # Importing a simple file: m.__class__.__name__ == 'module' and False:
-        top_package = os.path.dirname(m.__file__)
-        module_import = True
-    else:
-        top_package = __import__(m.__name__.split('.')[0]).__path__._path[0]
-        module_import = False
-
-    # top_package = os.path.dirname(__import__(m.__name__.split('.')[0]).__file__)
-    # top_package = os.path.dirname(top_package)
-    import zipfile
-    # import strea
-    # zipfile.ZipFile
-    import io
-    # file_like_object = io.BytesIO(my_zip_data)
-    zip_buffer = io.BytesIO()
-    with zipfile.ZipFile(zip_buffer, 'w') as zip:
-        # zip.write()
-        for root, dirs, files in os.walk(top_package):
-            for file in files:
-                if file.endswith(".py"):
-                    fpath = os.path.join(root, file)
-                    v = os.path.relpath(os.path.join(root, file), os.path.dirname(top_package) if not module_import else top_package)
-                    zip.write(fpath, v)
-
-    resources['zipfile'] = zip_buffer.getvalue()
-    resources['top_package'] = top_package
-    resources['module_import'] = module_import
-    return resources, top_package
-
-    if f.endswith("__init__.py"):
-        for root, dirs, files in os.walk(os.path.dirname(f)):
-            for file in files:
-                if file.endswith(".py"):
-                    # print(file)
-                    # print()
-                    v = os.path.relpath(os.path.join(root, file), top_package)
-                    with open(os.path.join(root, file), 'r') as ff:
-                        resources[v] = ff.read()
-    else:
-        v = os.path.relpath(f, top_package)
-        with open(f, 'r') as ff:
-            resources[v] = ff.read()
-    return resources
-
-import argparse
-parser = argparse.ArgumentParser(description='Evaluate your report.', epilog="""Use this script to get the score of your report. Example:
-
-> python report1_grade.py
-
-Finally, note that if your report is part of a module (package), and the report script requires part of that package, the -m option for python may be useful.
-For instance, if the report file is in Documents/course_package/report3_complete.py, and `course_package` is a python package, then change directory to 'Documents/` and run:
-
-> python -m course_package.report1
-
-see https://docs.python.org/3.9/using/cmdline.html
-""", formatter_class=argparse.RawTextHelpFormatter)
-parser.add_argument('--noprogress',  action="store_true",  help='Disable progress bars')
-parser.add_argument('--autolab',  action="store_true",  help='Show Autolab results')
-
-def gather_upload_to_campusnet(report, output_dir=None):
-    n = report.nL
-    args = parser.parse_args()
-    results, table_data = evaluate_report(report, show_help_flag=False, show_expected=False, show_computed=False, silent=True,
-                                          show_progress_bar=not args.noprogress,
-                                          big_header=not args.autolab)
-    # print(" ")
-    # print("="*n)
-    # print("Final evaluation")
-    # print(tabulate(table_data))
-    # also load the source code of missing files...
-
-    sources = {}
-    print("")
-    if not args.autolab:
-        if len(report.individual_imports) > 0:
-            print("By uploading the .token file, you verify the files:")
-            for m in report.individual_imports:
-                print(">", m.__file__)
-            print("Are created/modified individually by you in agreement with DTUs exam rules")
-            report.pack_imports += report.individual_imports
-
-        if len(report.pack_imports) > 0:
-            print("Including files in upload...")
-            for k, m in enumerate(report.pack_imports):
-                nimp, top_package = gather_imports(m)
-                _, report_relative_location, module_import = report._import_base_relative()
-
-                # report_relative_location = os.path.relpath(inspect.getfile(report.__class__), top_package)
-                nimp['report_relative_location'] = report_relative_location
-                nimp['report_module_specification'] = module_import
-                nimp['name'] = m.__name__
-                sources[k] = nimp
-                # if len([k for k in nimp if k not in sources]) > 0:
-                print(f" * {m.__name__}")
-                # sources = {**sources, **nimp}
-    results['sources'] = sources
-
-    if output_dir is None:
-        output_dir = os.getcwd()
-
-    payload_out_base = report.__class__.__name__ + "_handin"
-
-    obtain, possible = results['total']
-    vstring = "_v"+report.version if report.version is not None else ""
-
-    token = "%s_%i_of_%i%s.token"%(payload_out_base, obtain, possible,vstring)
-    token = os.path.normpath(os.path.join(output_dir, token))
-
-
-    with open(token, 'wb') as f:
-        pickle.dump(results, f)
-
-    if not args.autolab:
-        print(" ")
-        print("To get credit for your results, please upload the single unmodified file: ")
-        print(">", token)
-        # print("To campusnet without any modifications.")
-
-        # print("Now time for some autolab fun")
-
-def source_instantiate(name, report1_source, payload):
-    eval("exec")(report1_source, globals())
-    pl = pickle.loads(bytes.fromhex(payload))
-    report = eval(name)(payload=pl, strict=True)
-    # report.set_payload(pl)
-    return report
-
-
-
-report1_source = 'import os\nimport lzma\nimport pickle\n\n# DONT\'t import stuff here since install script requires __version__\n\n# def cache_write(object, file_name, verbose=True):\n#     # raise Exception("bad")\n#     # import compress_pickle\n#     dn = os.path.dirname(file_name)\n#     if not os.path.exists(dn):\n#         os.mkdir(dn)\n#     if verbose: print("Writing cache...", file_name)\n#     with lzma.open(file_name, \'wb\', ) as f:\n#         pickle.dump(object, f)\n#     if verbose: print("Done!")\n#\n#\n# def cache_exists(file_name):\n#     # file_name = cn_(file_name) if cache_prefix else file_name\n#     return os.path.exists(file_name)\n#\n#\n# def cache_read(file_name):\n#     # import compress_pickle # Import here because if you import in top the __version__ tag will fail.\n#     # file_name = cn_(file_name) if cache_prefix else file_name\n#     if os.path.exists(file_name):\n#         try:\n#             with lzma.open(file_name, \'rb\') as f:\n#                 return pickle.load(f)\n#         except Exception as e:\n#             print("Tried to load a bad pickle file at", file_name)\n#             print("If the file appears to be automatically generated, you can try to delete it, otherwise download a new version")\n#             print(e)\n#             # return pickle.load(f)\n#     else:\n#         return None\n\n\n"""\ngit add . && git commit -m "Options" && git push &&  pip install git+ssh://git@gitlab.compute.dtu.dk/tuhe/unitgrade_v1.git --upgrade\n"""\nimport numpy as np\nimport sys\nimport re\nimport threading\nimport tqdm\nimport pickle\nimport os\nfrom io import StringIO\nimport io\nfrom unittest.runner import _WritelnDecorator\nfrom typing import Any\nimport inspect\nimport textwrap\nimport colorama\nfrom colorama import Fore\nfrom functools import _make_key, RLock\nfrom collections import namedtuple\nimport unittest\nimport time\n\n_CacheInfo = namedtuple("CacheInfo", ["hits", "misses", "maxsize", "currsize"])\n\ncolorama.init(autoreset=True)  # auto resets your settings after every output\n\ndef gprint(s):\n    print(f"{Fore.GREEN}{s}")\n\nmyround = lambda x: np.round(x)  # required.\nmsum = lambda x: sum(x)\nmfloor = lambda x: np.floor(x)\n\n\ndef setup_dir_by_class(C, base_dir):\n    name = C.__class__.__name__\n    return base_dir, name\n\n\nclass Logger(object):\n    def __init__(self, buffer):\n        assert False\n        self.terminal = sys.stdout\n        self.log = buffer\n\n    def write(self, message):\n        self.terminal.write(message)\n        self.log.write(message)\n\n    def flush(self):\n        # this flush method is needed for python 3 compatibility.\n        pass\n\n\nclass Capturing(list):\n    def __init__(self, *args, stdout=None, unmute=False, **kwargs):\n        self._stdout = stdout\n        self.unmute = unmute\n        super().__init__(*args, **kwargs)\n\n    def __enter__(self, capture_errors=True):  # don\'t put arguments here.\n        self._stdout = sys.stdout if self._stdout == None else self._stdout\n        self._stringio = StringIO()\n        if self.unmute:\n            sys.stdout = Logger(self._stringio)\n        else:\n            sys.stdout = self._stringio\n\n        if capture_errors:\n            self._sterr = sys.stderr\n            sys.sterr = StringIO()  # memory hole it\n        self.capture_errors = capture_errors\n        return self\n\n    def __exit__(self, *args):\n        self.extend(self._stringio.getvalue().splitlines())\n        del self._stringio  # free up some memory\n        sys.stdout = self._stdout\n        if self.capture_errors:\n            sys.sterr = self._sterr\n\n\nclass Capturing2(Capturing):\n    def __exit__(self, *args):\n        lines = self._stringio.getvalue().splitlines()\n        txt = "\\n".join(lines)\n        numbers = extract_numbers(txt)\n        self.extend(lines)\n        del self._stringio  # free up some memory\n        sys.stdout = self._stdout\n        if self.capture_errors:\n            sys.sterr = self._sterr\n\n        self.output = txt\n        self.numbers = numbers\n\n\n# @classmethod\n# class OrderedClassMembers(type):\n#     def __prepare__(self, name, bases):\n#         assert False\n#         return collections.OrderedDict()\n#\n#     def __new__(self, name, bases, classdict):\n#         ks = list(classdict.keys())\n#         for b in bases:\n#             ks += b.__ordered__\n#         classdict[\'__ordered__\'] = [key for key in ks if key not in (\'__module__\', \'__qualname__\')]\n#         return type.__new__(self, name, bases, classdict)\n\n\nclass Report:\n    title = "report title"\n    version = None\n    questions = []\n    pack_imports = []\n    individual_imports = []\n    nL = 120  # Maximum line width\n\n    @classmethod\n    def reset(cls):\n        for (q, _) in cls.questions:\n            if hasattr(q, \'reset\'):\n                q.reset()\n\n    @classmethod\n    def mfile(clc):\n        return inspect.getfile(clc)\n\n    def _file(self):\n        return inspect.getfile(type(self))\n\n    def _import_base_relative(self):\n        if hasattr(self.pack_imports[0], \'__path__\'):\n            root_dir = self.pack_imports[0].__path__._path[0]\n        else:\n            root_dir = self.pack_imports[0].__file__\n\n        root_dir = os.path.dirname(root_dir)\n        relative_path = os.path.relpath(self._file(), root_dir)\n        modules = os.path.normpath(relative_path[:-3]).split(os.sep)\n        return root_dir, relative_path, modules\n\n    def __init__(self, strict=False, payload=None):\n        working_directory = os.path.abspath(os.path.dirname(self._file()))\n        self.wdir, self.name = setup_dir_by_class(self, working_directory)\n        # self.computed_answers_file = os.path.join(self.wdir, self.name + "_resources_do_not_hand_in.dat")\n        for (q, _) in self.questions:\n            q.nL = self.nL  # Set maximum line length.\n\n        if payload is not None:\n            self.set_payload(payload, strict=strict)\n\n    def main(self, verbosity=1):\n        # Run all tests using standard unittest (nothing fancy).\n        loader = unittest.TestLoader()\n        for q, _ in self.questions:\n            start = time.time()  # A good proxy for setup time is to\n            suite = loader.loadTestsFromTestCase(q)\n            unittest.TextTestRunner(verbosity=verbosity).run(suite)\n            total = time.time() - start\n            q.time = total\n\n    def _setup_answers(self, with_coverage=False):\n        if with_coverage:\n            for q, _ in self.questions:\n                q._with_coverage = True\n                q._report = self\n\n        self.main()  # Run all tests in class just to get that out of the way...\n        report_cache = {}\n        for q, _ in self.questions:\n            # print(self.questions)\n            if hasattr(q, \'_save_cache\'):\n                q()._save_cache()\n                print("q is", q())\n                q()._cache_put(\'time\', q.time) # = q.time\n                report_cache[q.__qualname__] = q._cache2\n            else:\n                report_cache[q.__qualname__] = {\'no cache see _setup_answers in framework.py\': True}\n        if with_coverage:\n            for q, _ in self.questions:\n                q._with_coverage = False\n        return report_cache\n\n    def set_payload(self, payloads, strict=False):\n        for q, _ in self.questions:\n            q._cache = payloads[q.__qualname__]\n\n\ndef rm_progress_bar(txt):\n    # More robust version. Apparently length of bar can depend on various factors, so check for order of symbols.\n    nlines = []\n    for l in txt.splitlines():\n        pct = l.find("%")\n        ql = False\n        if pct > 0:\n            i = l.find("|", pct + 1)\n            if i > 0 and l.find("|", i + 1) > 0:\n                ql = True\n        if not ql:\n            nlines.append(l)\n    return "\\n".join(nlines)\n\n\ndef extract_numbers(txt):\n    # txt = rm_progress_bar(txt)\n    numeric_const_pattern = r\'[-+]? (?: (?: \\d* \\. \\d+ ) | (?: \\d+ \\.? ) )(?: [Ee] [+-]? \\d+ ) ?\'\n    rx = re.compile(numeric_const_pattern, re.VERBOSE)\n    all = rx.findall(txt)\n    all = [float(a) if (\'.\' in a or "e" in a) else int(a) for a in all]\n    if len(all) > 500:\n        print(txt)\n        raise Exception("unitgrade_v1.unitgrade_v1.py: Warning, too many numbers!", len(all))\n    return all\n\n\nclass ActiveProgress():\n    def __init__(self, t, start=True, title="my progress bar", show_progress_bar=True, file=None):\n        if file == None:\n            file = sys.stdout\n        self.file = file\n        self.t = t\n        self._running = False\n        self.title = title\n        self.dt = 0.01\n        self.n = int(np.round(self.t / self.dt))\n        self.show_progress_bar = show_progress_bar\n        self.pbar = None\n\n        if start:\n            self.start()\n\n    def start(self):\n        self._running = True\n        if self.show_progress_bar:\n            self.thread = threading.Thread(target=self.run)\n            self.thread.start()\n        self.time_started = time.time()\n\n    def terminate(self):\n        if not self._running:\n            raise Exception("Stopping a stopped progress bar. ")\n        self._running = False\n        if self.show_progress_bar:\n            self.thread.join()\n        if self.pbar is not None:\n            self.pbar.update(1)\n            self.pbar.close()\n            self.pbar = None\n\n        self.file.flush()\n        return time.time() - self.time_started\n\n    def run(self):\n        self.pbar = tqdm.tqdm(total=self.n, file=self.file, position=0, leave=False, desc=self.title, ncols=100,\n                              bar_format=\'{l_bar}{bar}| [{elapsed}<{remaining}]\')\n\n        for _ in range(self.n - 1):  # Don\'t terminate completely; leave bar at 99% done until terminate.\n            if not self._running:\n                self.pbar.close()\n                self.pbar = None\n                break\n\n            time.sleep(self.dt)\n            self.pbar.update(1)\n\ndef dprint(first, last, nL, extra = "", file=None, dotsym=\'.\', color=\'white\'):\n    if file == None:\n        file = sys.stdout\n\n    # ss = self.item_title_print\n    # state = "PASS" if success else "FAILED"\n    dot_parts = (dotsym * max(0, nL - len(last) - len(first)))\n    # if self.show_progress_bar or True:\n    print(first + dot_parts, end="", file=file)\n    # else:\n    # print(dot_parts, end="", file=self.cc.file)\n    last += extra\n    # if tsecs >= 0.5:\n    #     state += " (" + str(tsecs) + " seconds)"\n    print(last, file=file)\n\n\nclass UTextResult(unittest.TextTestResult):\n    nL = 80\n    number = -1  # HAcky way to set question number.\n    show_progress_bar = True\n    cc = None\n\n    def __init__(self, stream, descriptions, verbosity):\n        super().__init__(stream, descriptions, verbosity)\n        self.successes = []\n\n    def printErrors(self) -> None:\n        self.printErrorList(\'ERROR\', self.errors)\n        self.printErrorList(\'FAIL\', self.failures)\n\n    def addError(self, test, err):\n        super(unittest.TextTestResult, self).addFailure(test, err)\n        self.cc_terminate(success=False)\n\n    def addFailure(self, test, err):\n        super(unittest.TextTestResult, self).addFailure(test, err)\n        self.cc_terminate(success=False)\n\n    def addSuccess(self, test: unittest.case.TestCase) -> None:\n        self.successes.append(test)\n        self.cc_terminate()\n\n    def cc_terminate(self, success=True):\n        if self.show_progress_bar or True:\n            tsecs = np.round(self.cc.terminate(), 2)\n            self.cc.file.flush()\n            ss = self.item_title_print\n\n            state = "PASS" if success else "FAILED"\n\n            dot_parts = (\'.\' * max(0, self.nL - len(state) - len(ss)))\n            if self.show_progress_bar or True:\n                print(self.item_title_print + dot_parts, end="", file=self.cc.file)\n            else:\n                print(dot_parts, end="", file=self.cc.file)\n\n            if tsecs >= 0.5:\n                state += " (" + str(tsecs) + " seconds)"\n            print(state, file=self.cc.file)\n\n    def startTest(self, test):\n        # j =self.testsRun\n        self.testsRun += 1\n        # item_title = self.getDescription(test)\n        item_title = test.shortDescription()  # Better for printing (get from cache).\n        if item_title == None:\n            # For unittest framework where getDescription may return None.\n            item_title = self.getDescription(test)\n        self.item_title_print = " * q%i.%i) %s" % (UTextResult.number + 1, self.testsRun, item_title)\n        estimated_time = 10\n        if self.show_progress_bar or True:\n            self.cc = ActiveProgress(t=estimated_time, title=self.item_title_print, show_progress_bar=self.show_progress_bar, file=sys.stdout)\n        else:\n            print(self.item_title_print + (\'.\' * max(0, self.nL - 4 - len(self.item_title_print))), end="")\n\n        self._test = test\n        self._stdout = sys.stdout\n        sys.stdout = io.StringIO()\n\n    def stopTest(self, test):\n        sys.stdout = self._stdout\n        super().stopTest(test)\n\n    def _setupStdout(self):\n        if self._previousTestClass == None:\n            total_estimated_time = 1\n            if hasattr(self.__class__, \'q_title_print\'):\n                q_title_print = self.__class__.q_title_print\n            else:\n                q_title_print = "<unnamed test. See unitgrade_v1.py>"\n\n            cc = ActiveProgress(t=total_estimated_time, title=q_title_print, show_progress_bar=self.show_progress_bar)\n            self.cc = cc\n\n    def _restoreStdout(self):  # Used when setting up the test.\n        if self._previousTestClass is None:\n            q_time = self.cc.terminate()\n            q_time = np.round(q_time, 2)\n            sys.stdout.flush()\n            if self.show_progress_bar:\n                print(self.cc.title, end="")\n            print(" " * max(0, self.nL - len(self.cc.title)) + (" (" + str(q_time) + " seconds)" if q_time >= 0.5 else ""))\n\n\nclass UTextTestRunner(unittest.TextTestRunner):\n    def __init__(self, *args, **kwargs):\n        stream = io.StringIO()\n        super().__init__(*args, stream=stream, **kwargs)\n\n    def _makeResult(self):\n        # stream = self.stream # not you!\n        stream = sys.stdout\n        stream = _WritelnDecorator(stream)\n        return self.resultclass(stream, self.descriptions, self.verbosity)\n\n\ndef cache(foo, typed=False):\n    """ Magic cache wrapper\n    https://github.com/python/cpython/blob/main/Lib/functools.py\n    """\n    maxsize = None\n    def wrapper(self, *args, **kwargs):\n        key = (self.cache_id(), ("@cache", foo.__name__, _make_key(args, kwargs, typed)))\n        if not self._cache_contains(key):\n            value = foo(self, *args, **kwargs)\n            self._cache_put(key, value)\n        else:\n            value = self._cache_get(key)\n        return value\n\n    return wrapper\n\n\ndef get_hints(ss):\n    if ss == None:\n        return None\n    try:\n        ss = textwrap.dedent(ss)\n        ss = ss.replace(\'\'\'"""\'\'\', "").strip()\n        hints = ["hints:", ]\n        j = np.argmax([ss.lower().find(h) for h in hints])\n        h = hints[j]\n        ss = ss[ss.find(h) + len(h) + 1:]\n        ss = "\\n".join([l for l in ss.split("\\n") if not l.strip().startswith(":")])\n        ss = textwrap.dedent(ss)\n        ss = ss.strip()\n        return ss\n    except Exception as e:\n        print("bad hints", ss, e)\n\n\nclass UTestCase(unittest.TestCase):\n    _outcome = None  # A dictionary which stores the user-computed outcomes of all the tests. This differs from the cache.\n    _cache = None  # Read-only cache. Ensures method always produce same result.\n    _cache2 = None  # User-written cache.\n    _with_coverage = False\n    _report = None  # The report used. This is very, very hacky and should always be None. Don\'t rely on it!\n\n    def capture(self):\n        if hasattr(self, \'_stdout\') and self._stdout is not None:\n            file = self._stdout\n        else:\n            # self._stdout = sys.stdout\n            # sys._stdout = io.StringIO()\n            file = sys.stdout\n        return Capturing2(stdout=file)\n\n    @classmethod\n    def question_title(cls):\n        """ Return the question title """\n        return cls.__doc__.strip().splitlines()[0].strip() if cls.__doc__ is not None else cls.__qualname__\n\n    @classmethod\n    def reset(cls):\n        print("Warning, I am not sure UTestCase.reset() is needed anymore and it seems very hacky.")\n        cls._outcome = None\n        cls._cache = None\n        cls._cache2 = None\n\n    def _callSetUp(self):\n        if self._with_coverage:\n            if not hasattr(self._report, \'covcache\'):\n                self._report.covcache = {}\n            import coverage\n            self.cov = coverage.Coverage()\n            self.cov.start()\n        self.setUp()\n\n    def _callTearDown(self):\n        self.tearDown()\n        if self._with_coverage:\n            from pathlib import Path\n            from snipper import snipper_main\n            self.cov.stop()\n            data = self.cov.get_data()\n            base, _, _ = self._report._import_base_relative()\n            for file in data.measured_files():\n                file = os.path.normpath(file)\n                root = Path(base)\n                child = Path(file)\n                if root in child.parents:\n                    with open(child, \'r\') as f:\n                        s = f.read()\n                    lines = s.splitlines()\n                    garb = \'GARBAGE\'\n\n                    lines2 = snipper_main.censor_code(lines, keep=True)\n                    assert len(lines) == len(lines2)\n\n                    for l in data.contexts_by_lineno(file):\n                        if lines2[l].strip() == garb:\n                            if self.cache_id() not in self._report.covcache:\n                                self._report.covcache[self.cache_id()] = {}\n\n                            rel = os.path.relpath(child, root)\n                            cc = self._report.covcache[self.cache_id()]\n                            j = 0\n                            for j in range(l, -1, -1):\n                                if "def" in lines2[j] or "class" in lines2[j]:\n                                    break\n                            from snipper.legacy import gcoms\n                            fun = lines2[j]\n                            comments, _ = gcoms("\\n".join(lines2[j:l]))\n                            if rel not in cc:\n                                cc[rel] = {}\n                            cc[rel][fun] = (l, "\\n".join(comments))\n                            self._cache_put((self.cache_id(), \'coverage\'), self._report.covcache)\n\n    def shortDescriptionStandard(self):\n        sd = super().shortDescription()\n        if sd is None:\n            sd = self._testMethodName\n        return sd\n\n    def shortDescription(self):\n        sd = self.shortDescriptionStandard()\n        title = self._cache_get((self.cache_id(), \'title\'), sd)\n        return title if title is not None else sd\n\n    @property\n    def title(self):\n        return self.shortDescription()\n\n    @title.setter\n    def title(self, value):\n        self._cache_put((self.cache_id(), \'title\'), value)\n\n    def _get_outcome(self):\n        if not (self.__class__, \'_outcome\') or self.__class__._outcome is None:\n            self.__class__._outcome = {}\n        return self.__class__._outcome\n\n    def _callTestMethod(self, testMethod):\n        t = time.time()\n        self._ensure_cache_exists()  # Make sure cache is there.\n        if self._testMethodDoc is not None:\n            self._cache_put((self.cache_id(), \'title\'), self.shortDescriptionStandard())\n\n        self._cache2[(self.cache_id(), \'assert\')] = {}\n        res = testMethod()\n        elapsed = time.time() - t\n        self._get_outcome()[self.cache_id()] = res\n        self._cache_put((self.cache_id(), "time"), elapsed)\n\n    def cache_id(self):\n        c = self.__class__.__qualname__\n        m = self._testMethodName\n        return c, m\n\n    def __init__(self, *args, **kwargs):\n        super().__init__(*args, **kwargs)\n        self._load_cache()\n        self._assert_cache_index = 0\n\n    def _ensure_cache_exists(self):\n        if not hasattr(self.__class__, \'_cache\') or self.__class__._cache == None:\n            self.__class__._cache = dict()\n        if not hasattr(self.__class__, \'_cache2\') or self.__class__._cache2 == None:\n            self.__class__._cache2 = dict()\n\n    def _cache_get(self, key, default=None):\n        self._ensure_cache_exists()\n        return self.__class__._cache.get(key, default)\n\n    def _cache_put(self, key, value):\n        self._ensure_cache_exists()\n        self.__class__._cache2[key] = value\n\n    def _cache_contains(self, key):\n        self._ensure_cache_exists()\n        return key in self.__class__._cache\n\n    def wrap_assert(self, assert_fun, first, *args, **kwargs):\n        # sys.stdout = self._stdout\n        key = (self.cache_id(), \'assert\')\n        if not self._cache_contains(key):\n            print("Warning, framework missing", key)\n            self.__class__._cache[\n                key] = {}  # A new dict. We manually insert it because we have to use that the dict is mutable.\n        cache = self._cache_get(key)\n        id = self._assert_cache_index\n        if not id in cache:\n            print("Warning, framework missing cache index", key, "id =", id)\n        _expected = cache.get(id, f"Key {id} not found in cache; framework files missing. Please run deploy()")\n\n        # The order of these calls is important. If the method assert fails, we should still store the correct result in cache.\n        cache[id] = first\n        self._cache_put(key, cache)\n        self._assert_cache_index += 1\n        assert_fun(first, _expected, *args, **kwargs)\n\n    def assertEqualC(self, first: Any, msg: Any = ...) -> None:\n        self.wrap_assert(self.assertEqual, first, msg)\n\n    def _cache_file(self):\n        # The filename-directory stuff is a bit tricky but this seems robust.\n        return os.path.dirname(inspect.getabsfile(type(self))) + "/unitgrade_v1/" + self.__class__.__name__ + ".pkl"\n\n    def _save_cache(self):\n        # get the class name (i.e. what to save to).\n        cfile = self._cache_file()\n        if not os.path.isdir(os.path.dirname(cfile)):\n            os.makedirs(os.path.dirname(cfile))\n\n        if hasattr(self.__class__, \'_cache2\'):\n            with open(cfile, \'wb\') as f:\n                pickle.dump(self.__class__._cache2, f)\n\n    # But you can also set cache explicitly.\n    def _load_cache(self):\n        if self._cache is not None:  # Cache already loaded. We will not load it twice.\n            return\n            # raise Exception("Loaded cache which was already set. What is going on?!")\n        cfile = self._cache_file()\n        if os.path.exists(cfile):\n            try:\n                # print("\\ncache file", cfile)\n                with open(cfile, \'rb\') as f:\n                    data = pickle.load(f)\n                self.__class__._cache = data\n            except Exception as e:\n                print("Bad cache", cfile)\n                print(e)\n        else:\n            print("Warning! data file not found", cfile)\n\n    def _feedErrorsToResult(self, result, errors):\n        """ Use this to show hints on test failure. """\n        if not isinstance(result, UTextResult):\n            er = [e for e, v in errors if v != None]\n\n            if len(er) > 0:\n                hints = []\n                key = (self.cache_id(), \'coverage\')\n                if self._cache_contains(key):\n                    CC = self._cache_get(key)\n                    for id in CC:\n                        if id == self.cache_id():\n                            cl, m = id\n                            gprint(f"> An error occured while solving: {cl}.{m}. The files/methods you need to edit are:")  # For the test {id} in {file} you should edit:")\n                            for file in CC[id]:\n                                rec = CC[id][file]\n                                gprint(f">   * {file}")\n                                for l in rec:\n                                    _, comments = CC[id][file][l]\n                                    hint = get_hints(comments)\n\n                                    if hint != None:\n                                        hints.append(hint)\n                                    gprint(f">      - {l}")\n\n                er = er[0]\n                doc = er._testMethodDoc\n                if doc is not None:\n                    hint = get_hints(er._testMethodDoc)\n                    if hint is not None:\n                        hints = [hint] + hints\n                if len(hints) > 0:\n                    gprint("> Hints:")\n                    gprint(textwrap.indent("\\n".join(hints), ">   "))\n\n        super()._feedErrorsToResult(result, errors)\n\n    def startTestRun(self):\n        # print("asdfsdaf 11", file=sys.stderr)\n        super().startTestRun()\n        # print("asdfsdaf")\n\n    def _callTestMethod(self, method):\n        # print("asdfsdaf")\n        super()._callTestMethod(method)\n\n\ndef hide(func):\n    return func\n\n\ndef makeRegisteringDecorator(foreignDecorator):\n    """\n        Returns a copy of foreignDecorator, which is identical in every\n        way(*), except also appends a .decorator property to the callable it\n        spits out.\n    """\n\n    def newDecorator(func):\n        # Call to newDecorator(method)\n        # Exactly like old decorator, but output keeps track of what decorated it\n        R = foreignDecorator(func)  # apply foreignDecorator, like call to foreignDecorator(method) would have done\n        R.decorator = newDecorator  # keep track of decorator\n        # R.original = func         # might as well keep track of everything!\n        return R\n\n    newDecorator.__name__ = foreignDecorator.__name__\n    newDecorator.__doc__ = foreignDecorator.__doc__\n    return newDecorator\n\nhide = makeRegisteringDecorator(hide)\n\ndef methodsWithDecorator(cls, decorator):\n    """\n        Returns all methods in CLS with DECORATOR as the\n        outermost decorator.\n\n        DECORATOR must be a "registering decorator"; one\n        can make any decorator "registering" via the\n        makeRegisteringDecorator function.\n\n        import inspect\n        ls = list(methodsWithDecorator(GeneratorQuestion, deco))\n        for f in ls:\n            print(inspect.getsourcelines(f) ) # How to get all hidden questions.\n    """\n    for maybeDecorated in cls.__dict__.values():\n        if hasattr(maybeDecorated, \'decorator\'):\n            if maybeDecorated.decorator == decorator:\n                print(maybeDecorated)\n                yield maybeDecorated\n# 817\n\n\nimport numpy as np\nfrom tabulate import tabulate\nfrom datetime import datetime\nimport pyfiglet\nimport unittest\nimport inspect\nimport os\nimport argparse\nimport time\n\nparser = argparse.ArgumentParser(description=\'Evaluate your report.\', epilog="""Example: \nTo run all tests in a report: \n\n> python assignment1_dp.py\n\nTo run only question 2 or question 2.1\n\n> python assignment1_dp.py -q 2\n> python assignment1_dp.py -q 2.1\n\nNote this scripts does not grade your report. To grade your report, use:\n\n> python report1_grade.py\n\nFinally, note that if your report is part of a module (package), and the report script requires part of that package, the -m option for python may be useful.\nFor instance, if the report file is in Documents/course_package/report3_complete.py, and `course_package` is a python package, then change directory to \'Documents/` and run:\n\n> python -m course_package.report1\n\nsee https://docs.python.org/3.9/using/cmdline.html\n""", formatter_class=argparse.RawTextHelpFormatter)\nparser.add_argument(\'-q\', nargs=\'?\', type=str, default=None, help=\'Only evaluate this question (e.g.: -q 2)\')\nparser.add_argument(\'--showexpected\',  action="store_true",  help=\'Show the expected/desired result\')\nparser.add_argument(\'--showcomputed\',  action="store_true",  help=\'Show the answer your code computes\')\nparser.add_argument(\'--unmute\',  action="store_true",  help=\'Show result of print(...) commands in code\')\nparser.add_argument(\'--passall\',  action="store_true",  help=\'Automatically pass all tests. Useful when debugging.\')\nparser.add_argument(\'--noprogress\',  action="store_true",  help=\'Disable progress bars.\')\n\ndef evaluate_report_student(report, question=None, qitem=None, unmute=None, passall=None, ignore_missing_file=False, show_tol_err=False):\n    args = parser.parse_args()\n    if question is None and args.q is not None:\n        question = args.q\n        if "." in question:\n            question, qitem = [int(v) for v in question.split(".")]\n        else:\n            question = int(question)\n\n    if hasattr(report, "computed_answer_file") and not os.path.isfile(report.computed_answers_file) and not ignore_missing_file:\n        raise Exception("> Error: The pre-computed answer file", os.path.abspath(report.computed_answers_file), "does not exist. Check your package installation")\n\n    if unmute is None:\n        unmute = args.unmute\n    if passall is None:\n        passall = args.passall\n\n\n    results, table_data = evaluate_report(report, question=question, show_progress_bar=not unmute and not args.noprogress, qitem=qitem, verbose=False, passall=passall, show_expected=args.showexpected, show_computed=args.showcomputed,unmute=unmute,\n                                          show_tol_err=show_tol_err)\n\n\n    if question is None:\n        print("Provisional evaluation")\n        tabulate(table_data)\n        table = table_data\n        print(tabulate(table))\n        print(" ")\n\n    fr = inspect.getouterframes(inspect.currentframe())[1].filename\n    gfile = os.path.basename(fr)[:-3] + "_grade.py"\n    if os.path.exists(gfile):\n        print("Note your results have not yet been registered. \\nTo register your results, please run the file:")\n        print(">>>", gfile)\n        print("In the same manner as you ran this file.")\n\n\n    return results\n\n\ndef upack(q):\n    # h = zip([(i[\'w\'], i[\'possible\'], i[\'obtained\']) for i in q.values()])\n    h =[(i[\'w\'], i[\'possible\'], i[\'obtained\']) for i in q.values()]\n    h = np.asarray(h)\n    return h[:,0], h[:,1], h[:,2],\n\nclass UnitgradeTextRunner(unittest.TextTestRunner):\n    def __init__(self, *args, **kwargs):\n        super().__init__(*args, **kwargs)\n\nclass SequentialTestLoader(unittest.TestLoader):\n    def getTestCaseNames(self, testCaseClass):\n        test_names = super().getTestCaseNames(testCaseClass)\n        # testcase_methods = list(testCaseClass.__dict__.keys())\n        ls = []\n        for C in testCaseClass.mro():\n            if issubclass(C, unittest.TestCase):\n                ls = list(C.__dict__.keys()) + ls\n        testcase_methods = ls\n        test_names.sort(key=testcase_methods.index)\n        return test_names\n\ndef evaluate_report(report, question=None, qitem=None, passall=False, verbose=False,  show_expected=False, show_computed=False,unmute=False, show_help_flag=True, silent=False,\n                    show_progress_bar=True,\n                    show_tol_err=False,\n                    big_header=True):\n\n    from src.unitgrade.version import __version__\n    now = datetime.now()\n    if big_header:\n        ascii_banner = pyfiglet.figlet_format("UnitGrade", font="doom")\n        b = "\\n".join( [l for l in ascii_banner.splitlines() if len(l.strip()) > 0] )\n    else:\n        b = "Unitgrade"\n    dt_string = now.strftime("%d/%m/%Y %H:%M:%S")\n    print(b + " v" + __version__ + ", started: " + dt_string+ "\\n")\n    # print("Started: " + dt_string)\n    s = report.title\n    if hasattr(report, "version") and report.version is not None:\n        s += " version " + report.version\n    print(s, "(use --help for options)" if show_help_flag else "")\n    # print(f"Loaded answers from: ", report.computed_answers_file, "\\n")\n    table_data = []\n    t_start = time.time()\n    score = {}\n    loader = SequentialTestLoader()\n\n    for n, (q, w) in enumerate(report.questions):\n        if question is not None and n+1 != question:\n            continue\n        suite = loader.loadTestsFromTestCase(q)\n        qtitle = q.question_title() if hasattr(q, \'question_title\') else q.__qualname__\n        q_title_print = "Question %i: %s"%(n+1, qtitle)\n        print(q_title_print, end="")\n        q.possible = 0\n        q.obtained = 0\n        q_ = {} # Gather score in this class.\n        from src.unitgrade.unitgrade import UTextTestRunner\n        UTextResult.q_title_print = q_title_print # Hacky\n        UTextResult.show_progress_bar = show_progress_bar # Hacky.\n        UTextResult.number = n\n        UTextResult.nL = report.nL\n\n        res = UTextTestRunner(verbosity=2, resultclass=UTextResult).run(suite)\n\n        possible = res.testsRun\n        obtained = len(res.successes)\n\n        assert len(res.successes) +  len(res.errors) + len(res.failures) == res.testsRun\n\n        obtained = int(w * obtained * 1.0 / possible ) if possible > 0 else 0\n        score[n] = {\'w\': w, \'possible\': w, \'obtained\': obtained, \'items\': q_, \'title\': qtitle}\n        q.obtained = obtained\n        q.possible = possible\n\n        s1 = f" * q{n+1})   Total"\n        s2 = f" {q.obtained}/{w}"\n        print(s1 + ("."* (report.nL-len(s1)-len(s2) )) + s2 )\n        print(" ")\n        table_data.append([f"q{n+1}) Total", f"{q.obtained}/{w}"])\n\n    ws, possible, obtained = upack(score)\n    possible = int( msum(possible) )\n    obtained = int( msum(obtained) ) # Cast to python int\n    report.possible = possible\n    report.obtained = obtained\n    now = datetime.now()\n    dt_string = now.strftime("%H:%M:%S")\n\n    dt = int(time.time()-t_start)\n    minutes = dt//60\n    seconds = dt - minutes*60\n    plrl = lambda i, s: str(i) + " " + s + ("s" if i != 1 else "")\n\n    from src.unitgrade.unitgrade import dprint\n    dprint(first = "Total points at "+ dt_string + " (" + plrl(minutes, "minute") + ", "+ plrl(seconds, "second") +")",\n           last=""+str(report.obtained)+"/"+str(report.possible), nL = report.nL)\n\n    # print(f"Completed at "+ dt_string + " (" + plrl(minutes, "minute") + ", "+ plrl(seconds, "second") +"). Total")\n\n    table_data.append(["Total", ""+str(report.obtained)+"/"+str(report.possible) ])\n    results = {\'total\': (obtained, possible), \'details\': score}\n    return results, table_data\n\n\nimport bz2\nimport pickle\nimport os\n\n\ndef bzwrite(json_str, token): # to get around obfuscation issues\n    with getattr(bz2, \'open\')(token, "wt") as f:\n        f.write(json_str)\n\ndef gather_imports(imp):\n    resources = {}\n    m = imp\n    # for m in pack_imports:\n    # print(f"*** {m.__name__}")\n    f = m.__file__\n    # dn = os.path.dirname(f)\n    # top_package = os.path.dirname(__import__(m.__name__.split(\'.\')[0]).__file__)\n    # top_package = str(__import__(m.__name__.split(\'.\')[0]).__path__)\n\n    if hasattr(m, \'__file__\') and not hasattr(m, \'__path__\'):  # Importing a simple file: m.__class__.__name__ == \'module\' and False:\n        top_package = os.path.dirname(m.__file__)\n        module_import = True\n    else:\n        top_package = __import__(m.__name__.split(\'.\')[0]).__path__._path[0]\n        module_import = False\n\n    # top_package = os.path.dirname(__import__(m.__name__.split(\'.\')[0]).__file__)\n    # top_package = os.path.dirname(top_package)\n    import zipfile\n    # import strea\n    # zipfile.ZipFile\n    import io\n    # file_like_object = io.BytesIO(my_zip_data)\n    zip_buffer = io.BytesIO()\n    with zipfile.ZipFile(zip_buffer, \'w\') as zip:\n        # zip.write()\n        for root, dirs, files in os.walk(top_package):\n            for file in files:\n                if file.endswith(".py"):\n                    fpath = os.path.join(root, file)\n                    v = os.path.relpath(os.path.join(root, file), os.path.dirname(top_package) if not module_import else top_package)\n                    zip.write(fpath, v)\n\n    resources[\'zipfile\'] = zip_buffer.getvalue()\n    resources[\'top_package\'] = top_package\n    resources[\'module_import\'] = module_import\n    return resources, top_package\n\n    if f.endswith("__init__.py"):\n        for root, dirs, files in os.walk(os.path.dirname(f)):\n            for file in files:\n                if file.endswith(".py"):\n                    # print(file)\n                    # print()\n                    v = os.path.relpath(os.path.join(root, file), top_package)\n                    with open(os.path.join(root, file), \'r\') as ff:\n                        resources[v] = ff.read()\n    else:\n        v = os.path.relpath(f, top_package)\n        with open(f, \'r\') as ff:\n            resources[v] = ff.read()\n    return resources\n\nimport argparse\nparser = argparse.ArgumentParser(description=\'Evaluate your report.\', epilog="""Use this script to get the score of your report. Example:\n\n> python report1_grade.py\n\nFinally, note that if your report is part of a module (package), and the report script requires part of that package, the -m option for python may be useful.\nFor instance, if the report file is in Documents/course_package/report3_complete.py, and `course_package` is a python package, then change directory to \'Documents/` and run:\n\n> python -m course_package.report1\n\nsee https://docs.python.org/3.9/using/cmdline.html\n""", formatter_class=argparse.RawTextHelpFormatter)\nparser.add_argument(\'--noprogress\',  action="store_true",  help=\'Disable progress bars\')\nparser.add_argument(\'--autolab\',  action="store_true",  help=\'Show Autolab results\')\n\ndef gather_upload_to_campusnet(report, output_dir=None):\n    n = report.nL\n    args = parser.parse_args()\n    results, table_data = evaluate_report(report, show_help_flag=False, show_expected=False, show_computed=False, silent=True,\n                                          show_progress_bar=not args.noprogress,\n                                          big_header=not args.autolab)\n    # print(" ")\n    # print("="*n)\n    # print("Final evaluation")\n    # print(tabulate(table_data))\n    # also load the source code of missing files...\n\n    sources = {}\n    print("")\n    if not args.autolab:\n        if len(report.individual_imports) > 0:\n            print("By uploading the .token file, you verify the files:")\n            for m in report.individual_imports:\n                print(">", m.__file__)\n            print("Are created/modified individually by you in agreement with DTUs exam rules")\n            report.pack_imports += report.individual_imports\n\n        if len(report.pack_imports) > 0:\n            print("Including files in upload...")\n            for k, m in enumerate(report.pack_imports):\n                nimp, top_package = gather_imports(m)\n                _, report_relative_location, module_import = report._import_base_relative()\n\n                # report_relative_location = os.path.relpath(inspect.getfile(report.__class__), top_package)\n                nimp[\'report_relative_location\'] = report_relative_location\n                nimp[\'report_module_specification\'] = module_import\n                nimp[\'name\'] = m.__name__\n                sources[k] = nimp\n                # if len([k for k in nimp if k not in sources]) > 0:\n                print(f" * {m.__name__}")\n                # sources = {**sources, **nimp}\n    results[\'sources\'] = sources\n\n    if output_dir is None:\n        output_dir = os.getcwd()\n\n    payload_out_base = report.__class__.__name__ + "_handin"\n\n    obtain, possible = results[\'total\']\n    vstring = "_v"+report.version if report.version is not None else ""\n\n    token = "%s_%i_of_%i%s.token"%(payload_out_base, obtain, possible,vstring)\n    token = os.path.normpath(os.path.join(output_dir, token))\n\n\n    with open(token, \'wb\') as f:\n        pickle.dump(results, f)\n\n    if not args.autolab:\n        print(" ")\n        print("To get credit for your results, please upload the single unmodified file: ")\n        print(">", token)\n        # print("To campusnet without any modifications.")\n\n        # print("Now time for some autolab fun")\n\ndef source_instantiate(name, report1_source, payload):\n    eval("exec")(report1_source, globals())\n    pl = pickle.loads(bytes.fromhex(payload))\n    report = eval(name)(payload=pl, strict=True)\n    # report.set_payload(pl)\n    return report\n\n\n__version__ = "0.0.3"\n\nimport numpy as np\nimport looping\nfrom looping import bacteriaGrowth, clusterAnalysis, removeIncomplete, fermentationRate\n\ndef trlist(x):\n    s = str(list(x))\n    if len(s) > 30:\n        s = s[:30] + "...]"\n    return s\n\nclass Bacteria(UTestCase):\n    """ Bacteria growth rates """\n\n    def stest(self, n0, alpha, K, N):\n        g = bacteriaGrowth(n0=n0, alpha=alpha, K=K, N=N)\n        self.title = f"bacteriaGrowth({n0}, {alpha}, {K}, {N}) = {g} ?"\n        self.assertEqualC(g)\n\n    def test_growth1(self):\n        """ Hints:\n        * Make sure to frobulate the frobulator.\n        """\n        self.stest(100, 0.4, 1000, 500)\n\n    def test_growth2(self):\n        self.stest(10, 0.4, 1000, 500)\n\n    def test_growth3(self):\n        self.stest(100, 1.4, 1000, 500)\n\n    def test_growth4(self):\n        self.stest(100, 0.0004, 1000, 500)\n\n    def test_growth5(self):\n        """\n        hints:\n        * What happens when n0 > N? (in this case return t=0) """\n        self.stest(100, 0.4, 1000, 99)\n\nclass ClusterAnalysis(UTestCase):\n    """ Test the cluster analysis method """\n\n    def stest(self, n, seed):\n        np.random.seed(seed)\n        x = np.round(np.random.rand(n), 1)\n        I = clusterAnalysis(x)\n        self.title = f"clusterAnalysis({list(x)}) = {list(I)} ?"\n        self.assertEqualC(list(I))\n\n    def test_cluster1(self):\n        """ Hints:\n        * Make sure to frobulate the frobulator.\n        * Just try harder\n        """\n        self.stest(3, 10)\n\n    def test_cluster2(self):\n        self.stest(4, 146)\n\n    def test_cluster3(self):\n        self.stest(5, 12)\n\n    def test_cluster4(self):\n        """\n        Cluster analysis for tied lists\n        Hints:\n        * It may be that an observations has the same distance to the two clusters. Where do you assign it in this case?\n        """\n        x = np.array([10.0, 12.0, 10.0, 12.0, 9.0, 11.0, 11.0, 13.0])\n        self.assertEqualC(list(clusterAnalysis(x) ) )\n\n\nclass RemoveIncomplete(UTestCase):\n    """ Remove incomplete IDs """\n\n    def stest(self, x):\n        I = list( removeIncomplete(x) )\n        self.title = f"removeId({trlist(x)}) = {trlist(I)} ?"\n        self.assertEqualC(I)\n\n    @cache\n    def rseq(self, max, n):\n        np.random.seed(42)\n        return np.random.randint(max, size=(n,) ) + (np.random.randint(2, size=(n,) )+1)/10\n\n    def test_incomplete1(self):\n        self.stest( np.array([1.3, 2.2, 2.3, 4.2, 5.1, 3.2, 5.3, 3.3, 2.1, 1.1, 5.2, 3.1]) )\n\n    def test_incomplete2(self):\n        self.stest( np.array([1.1, 1.2, 1.3, 2.1, 2.2, 2.3]) )\n\n    def test_incomplete3(self):\n        self.stest(np.array([5.1, 5.2, 4.1, 4.3, 4.2, 8.1, 8.2, 8.3]) )\n\n    def test_incomplete4(self):\n        self.stest(np.array([1.1, 1.3, 2.1, 2.2, 3.1, 3.3, 4.1, 4.2, 4.3]) )\n\n    def test_incomplete5(self):\n        self.stest(self.rseq(10, 40))\n\n\nclass FermentationRate(UTestCase):\n    """ Test the fermentation rate question """\n\n    def stest(self, x, lower, upper):\n        I =  fermentationRate(x, lower, upper)\n        s = trlist(x)\n        self.title = f"fermentationRate({s}, {lower}, {upper}) = {I:.3f} ?"\n        self.assertEqualC(I)\n\n    @cache\n    def rseq(self, max, n):\n        np.random.seed(42)\n        return np.random.randint(max, size=(n,) ) + (np.random.randint(3, size=(n,) )+1)/n\n\n    def test_rate1(self):\n        self.stest(np.array([20.1, 19.3, 1.1, 18.2, 19.7, 121.1, 20.3, 20.0]), 15, 25)\n\n    def test_rate2(self):\n        self.stest(np.array([20.1, 19.3, 1.1, 18.2, 19.7, 121.1, 20.3, 20.0]), 1, 200)\n\n    def test_rate3(self):\n        self.stest(np.array([1.75]), 1, 2)\n\n    def test_rate4(self):\n        self.stest(np.array([20.1, 19.3, 1.1, 18.2, 19.7, 121.1, 20.3, 20.0]), 18.2, 20)\n\n\nclass Report1Flat(Report):\n    title = "Week 4: Looping"\n    questions = [(ClusterAnalysis, 10), (RemoveIncomplete, 10), (Bacteria, 10),  (FermentationRate, 10),]\n    pack_imports = [looping]'
-report1_payload = '800495ea140000000000007d94288c0f436c7573746572416e616c79736973947d942868018c0d746573745f636c7573746572319486948c057469746c659486948c2e636c7573746572416e616c79736973285b302e382c20302e302c20302e365d29203d205b312c20322c20315d203f946801680386948c066173736572749486947d944b005d94288c156e756d70792e636f72652e6d756c74696172726179948c067363616c61729493948c056e756d7079948c0564747970659493948c02693494898887945294284b038c013c944e4e4e4affffffff4affffffff4b007494624304010000009486945294680f68154304020000009486945294680f68154304010000009486945294657368018c0d746573745f636c757374657232948694680586948c36636c7573746572416e616c79736973285b302e352c20302e362c20302e332c20302e335d29203d205b322c20322c20312c20315d203f94680168218694680986947d944b005d9428680f68154304020000009486945294680f68154304020000009486945294680f68154304010000009486945294680f68154304010000009486945294657368018c0d746573745f636c757374657233948694680586948c3e636c7573746572416e616c79736973285b302e322c20302e372c20302e332c20302e352c20302e305d29203d205b312c20322c20312c20322c20315d203f94680168358694680986947d944b005d9428680f68154304010000009486945294680f68154304020000009486945294680f68154304010000009486945294680f68154304020000009486945294680f68154304010000009486945294657368018c0d746573745f636c757374657234948694680986947d944b005d9428680f68154304010000009486945294680f68154304020000009486945294680f68154304010000009486945294680f68154304020000009486945294680f68154304010000009486945294680f68154304010000009486945294680f68154304010000009486945294680f6815430402000000948694529465738c0474696d6594473fe8ac0200000000758c1052656d6f7665496e636f6d706c657465947d9428686a8c10746573745f696e636f6d706c65746531948694680586948c5372656d6f76654964285b312e332c20322e322c20322e332c20342e322c20352e312c20332e322c2e2e2e5d29203d205b322e322c20322e332c20352e312c20332e322c20352e332c20332e332c2e2e2e5d203f94686a686c8694680986947d944b005d9428680f68128c02663894898887945294284b0368164e4e4e4affffffff4affffffff4b0074946243089a999999999901409486945294680f6876430866666666666602409486945294680f6876430866666666666614409486945294680f687643089a999999999909409486945294680f6876430833333333333315409486945294680f687643086666666666660a409486945294680f68764308cdcccccccccc00409486945294680f68764308cdcccccccccc14409486945294680f68764308cdcccccccccc084094869452946573686a8c10746573745f696e636f6d706c65746532948694680586948c4b72656d6f76654964285b312e312c20312e322c20312e332c20322e312c20322e322c20322e335d29203d205b312e312c20312e322c20312e332c20322e312c20322e322c20322e335d203f94686a68938694680986947d944b005d9428680f687643089a9999999999f13f9486945294680f68764308333333333333f33f9486945294680f68764308cdccccccccccf43f9486945294680f68764308cdcccccccccc00409486945294680f687643089a999999999901409486945294680f68764308666666666666024094869452946573686a8c10746573745f696e636f6d706c65746533948694680586948c4f72656d6f76654964285b352e312c20352e322c20342e312c20342e332c20342e322c20382e312c2e2e2e5d29203d205b342e312c20342e332c20342e322c20382e312c20382e322c20382e335d203f94686a68ad8694680986947d944b005d9428680f6876430866666666666610409486945294680f6876430833333333333311409486945294680f68764308cdcccccccccc10409486945294680f6876430833333333333320409486945294680f6876430866666666666620409486945294680f687643089a9999999999204094869452946573686a8c10746573745f696e636f6d706c65746534948694680586948c4072656d6f76654964285b312e312c20312e332c20322e312c20322e322c20332e312c20332e332c2e2e2e5d29203d205b342e312c20342e322c20342e335d203f94686a68c78694680986947d944b005d9428680f6876430866666666666610409486945294680f68764308cdcccccccccc10409486945294680f68764308333333333333114094869452946573686a8c10746573745f696e636f6d706c657465359486948c06406361636865948c0472736571948c0966756e63746f6f6c73948c0a5f486173686564536571949394298194284b0a4b28654e7d948c096861736876616c7565948a0884d8ef03874d7f467386946287948694680d8c0c5f7265636f6e73747275637494939468108c076e6461727261799493944b0085944301629487945294284b014b288594687689424001000066666666666618409a99999999990940cdcccccccccc1c40cdcccccccccc1040cdcccccccccc184033333333333322409a999999999901406666666666661840cdcccccccccc1c40cdcccccccccc10409a999999999909406666666666661c40cdcccccccccc1c40cdcccccccccc0040cdcccccccccc14406666666666661040333333333333f33f6666666666661c406666666666661440333333333333f33f66666666666610409a9999999999c93f6666666666662240cdcccccccccc144066666666666620409a9999999999c93f66666666666622409a99999999990140cdcccccccccc18409a9999999999094066666666666620409a999999999901406666666666661040cdcccccccccc0040cdcccccccccc1840cdcccccccccc10406666666666662040cdcccccccccc1840333333333333f33f9a9999999999094094749462686a68d88694680586948c5372656d6f76654964285b362e312c20332e322c20372e322c20342e322c20362e322c20392e312c2e2e2e5d29203d205b392e312c20352e322c20312e322c20352e312c20312e322c20392e322c2e2e2e5d203f94686a68d88694680986947d944b005d9428680f6876430833333333333322409486945294680f68764308cdcccccccccc14409486945294680f68764308333333333333f33f9486945294680f6876430866666666666614409486945294680f68764308333333333333f33f9486945294680f6876430866666666666622409486945294680f68764308cdcccccccccc14409486945294680f6876430866666666666620409486945294680f6876430866666666666622409486945294680f6876430866666666666620409486945294680f6876430866666666666620409486945294680f68764308333333333333f33f948694529465736869473fd9ba5e00000000758c084261637465726961947d94286a1b0100008c0c746573745f67726f77746831948694680586948c29626163746572696147726f777468283130302c20302e342c20313030302c2035303029203d2037203f946a1b0100006a1d0100008694680986947d944b004b07736a1b0100006a1d01000086948c08636f7665726167659486947d94286a1b0100006a1d01000086947d948c0a6c6f6f70696e672e7079947d948c2564656620626163746572696147726f777468286e302c20616c7068612c204b2c204e293a20944b158ce72222220a2020202043616c63756c6174652074696d6520756e74696c2062616374657269612067726f77746820657863656564204e207374617274696e672066726f6d206120706f70756c6174696f6e206f66206e302062616374657269612e0a2020202068696e74733a0a20202020202020202a20636f6e7369646572206e300a20202020202020202a20616c706861203e20300a202020203a706172616d206e303a0a202020203a706172616d20616c7068613a0a202020203a706172616d204b3a0a202020203a706172616d204e3a0a202020203a72657475726e3a0a2020202022222294869473736a1b0100008c0c746573745f67726f777468329486947d948c0a6c6f6f70696e672e7079947d948c2564656620626163746572696147726f777468286e302c20616c7068612c204b2c204e293a20944b158ce72222220a2020202043616c63756c6174652074696d6520756e74696c2062616374657269612067726f77746820657863656564204e207374617274696e672066726f6d206120706f70756c6174696f6e206f66206e302062616374657269612e0a2020202068696e74733a0a20202020202020202a20636f6e7369646572206e300a20202020202020202a20616c706861203e20300a202020203a706172616d206e303a0a202020203a706172616d20616c7068613a0a202020203a706172616d204b3a0a202020203a706172616d204e3a0a202020203a72657475726e3a0a2020202022222294869473736a1b0100008c0c746573745f67726f777468339486947d948c0a6c6f6f70696e672e7079947d948c2564656620626163746572696147726f777468286e302c20616c7068612c204b2c204e293a20944b158ce72222220a2020202043616c63756c6174652074696d6520756e74696c2062616374657269612067726f77746820657863656564204e207374617274696e672066726f6d206120706f70756c6174696f6e206f66206e302062616374657269612e0a2020202068696e74733a0a20202020202020202a20636f6e7369646572206e300a20202020202020202a20616c706861203e20300a202020203a706172616d206e303a0a202020203a706172616d20616c7068613a0a202020203a706172616d204b3a0a202020203a706172616d204e3a0a202020203a72657475726e3a0a2020202022222294869473736a1b0100008c0c746573745f67726f777468349486947d948c0a6c6f6f70696e672e7079947d948c2564656620626163746572696147726f777468286e302c20616c7068612c204b2c204e293a20944b158ce72222220a2020202043616c63756c6174652074696d6520756e74696c2062616374657269612067726f77746820657863656564204e207374617274696e672066726f6d206120706f70756c6174696f6e206f66206e302062616374657269612e0a2020202068696e74733a0a20202020202020202a20636f6e7369646572206e300a20202020202020202a20616c706861203e20300a202020203a706172616d206e303a0a202020203a706172616d20616c7068613a0a202020203a706172616d204b3a0a202020203a706172616d204e3a0a202020203a72657475726e3a0a2020202022222294869473736a1b0100008c0c746573745f67726f777468359486947d948c0a6c6f6f70696e672e7079947d948c2564656620626163746572696147726f777468286e302c20616c7068612c204b2c204e293a20944b118ce72222220a2020202043616c63756c6174652074696d6520756e74696c2062616374657269612067726f77746820657863656564204e207374617274696e672066726f6d206120706f70756c6174696f6e206f66206e302062616374657269612e0a2020202068696e74733a0a20202020202020202a20636f6e7369646572206e300a20202020202020202a20616c706861203e20300a202020203a706172616d206e303a0a202020203a706172616d20616c7068613a0a202020203a706172616d204b3a0a202020203a706172616d204e3a0a202020203a72657475726e3a0a202020202222229486947373756a1b0100006a2f0100008694680586948c29626163746572696147726f7774682831302c20302e342c20313030302c2035303029203d203134203f946a1b0100006a2f0100008694680986947d944b004b0e736a1b0100006a2f01000086946a2501000086946a270100006a1b0100006a370100008694680586948c29626163746572696147726f777468283130302c20312e342c20313030302c2035303029203d2033203f946a1b0100006a370100008694680986947d944b004b03736a1b0100006a3701000086946a2501000086946a270100006a1b0100006a3f0100008694680586948c2f626163746572696147726f777468283130302c20302e303030342c20313030302c2035303029203d2035343934203f946a1b0100006a3f0100008694680986947d944b004d7615736a1b0100006a3f01000086946a2501000086946a270100006a1b0100006a470100008694680586948c28626163746572696147726f777468283130302c20302e342c20313030302c20393929203d2030203f946a1b0100006a470100008694680986947d944b004b00736a1b0100006a4701000086946a2501000086946a270100006869473fd0311600000000758c104665726d656e746174696f6e52617465947d94286a6f0100008c0a746573745f7261746531948694680586948c476665726d656e746174696f6e52617465285b32302e312c2031392e332c20312e312c2031382e322c2031392e372c202e2e2e5d2c2031352c20323529203d2031392e363030203f946a6f0100006a710100008694680986947d944b00680f687643089a999999999933409486945294736a6f0100008c0a746573745f7261746532948694680586948c476665726d656e746174696f6e52617465285b32302e312c2031392e332c20312e312c2031382e322c2031392e372c202e2e2e5d2c20312c2032303029203d2032392e393735203f946a6f0100006a7b0100008694680986947d944b00680f687643089899999999f93d409486945294736a6f0100008c0a746573745f7261746533948694680586948c286665726d656e746174696f6e52617465285b312e37355d2c20312c203229203d20312e373530203f946a6f0100006a850100008694680986947d944b00680f68764308000000000000fc3f9486945294736a6f0100008c0a746573745f7261746534948694680586948c496665726d656e746174696f6e52617465285b32302e312c2031392e332c20312e312c2031382e322c2031392e372c202e2e2e5d2c2031382e322c20323029203d2031392e353030203f946a6f0100006a8f0100008694680986947d944b00680f6876430800000000008033409486945294736869473fcd4fd60000000075752e'
-name="Report1Flat"
-
-report = source_instantiate(name, report1_source, report1_payload)
-output_dir = os.path.dirname(__file__)
-gather_upload_to_campusnet(report, output_dir)
+'''WARNING: Modifying, decompiling or otherwise tampering with this script, it's data or the resulting .token file will be investigated as a cheating attempt.'''
+import bz2, base64
+exec(bz2.decompress(base64.b64decode('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')))
\ No newline at end of file
diff --git a/examples/02631/students/week5/unitgrade/Bacteria.pkl b/examples/02631/students/week5/unitgrade_data/Bacteria.pkl
similarity index 71%
rename from examples/02631/students/week5/unitgrade/Bacteria.pkl
rename to examples/02631/students/week5/unitgrade_data/Bacteria.pkl
index b246df45c63387d95bc69cc26deba7770d8249c5..de4d8915d32620e36c2dce736a4f5d79b7117274 100644
GIT binary patch
delta 183
zcmZn?xWUiTz%uphM3&CUZLAg>&oMDh-oj=qCek(~gQIOq?G$eYZ@%IT#te`E&*pQC
zc8qKpENxSIG$$vpi%eEzmlRV*QpyZc3K9S*wPIv4nKC(o-CEoTp~SaL6r=_u0#P%$
oft3Yfq{id~cCpD9*u}&g5$e4eK*~V^Jd@8c+DzWZ`higo0OUeE?EnA(

delta 203
zcmcb?-z31&z%upwM3zogjSR*Nrp*FOR*XzWQ#K1Q*)eVwVzOXlG68X{7@16`Ocr3W
znf#pX14{;DhS+2uX35F-7-i(d+NNZ1v`wj<;?3aAR}7MBo07rPHYI~EgE2#HvJbPV
zoE(x8W{?t)08EM6<jXA9@@fbrzGb2yH6Rg~8okMhY$h^#2sPdeASECHu#!?e05Etz
A9RL6T

diff --git a/examples/02631/students/week5/unitgrade/ClusterAnalysis.pkl b/examples/02631/students/week5/unitgrade_data/ClusterAnalysis.pkl
similarity index 100%
rename from examples/02631/students/week5/unitgrade/ClusterAnalysis.pkl
rename to examples/02631/students/week5/unitgrade_data/ClusterAnalysis.pkl
diff --git a/examples/02631/students/week5/unitgrade/FermentationRate.pkl b/examples/02631/students/week5/unitgrade_data/FermentationRate.pkl
similarity index 100%
rename from examples/02631/students/week5/unitgrade/FermentationRate.pkl
rename to examples/02631/students/week5/unitgrade_data/FermentationRate.pkl
diff --git a/examples/02631/students/week5/unitgrade/RemoveIncomplete.pkl b/examples/02631/students/week5/unitgrade_data/RemoveIncomplete.pkl
similarity index 52%
rename from examples/02631/students/week5/unitgrade/RemoveIncomplete.pkl
rename to examples/02631/students/week5/unitgrade_data/RemoveIncomplete.pkl
index 49e9468f086330e635588c0d9a3c0ae0ebc882bc..30edf2db7bc0e41f0ada9c1c7443ac1d487a6d9a 100644
GIT binary patch
delta 19
acmey*w}hLufo1AU){U$_ESq)Mf*AoqMFqG3

delta 496
zcmZ3&{hyDufn{n5`$kqDmiitxhvdZMjMOPTEJeksg;RPs(@OJ_OY-w`il_8&#d{<c
zXQZYCrxs3`JVmo{iiS6rw??X8?UWwQjKt!Mvc#Oy)G1vYEjQjXxBJ$+6}L@EYM;_J
zC4;AjC%z~(IX|zsq^LBxWXj|z8T>u$c`1oSMTwPDCQtEZXr1EBm^7umeoD|34R1zo
zjn*j{BAreSj0_BEU?AZzYbFSAI-ETN0y0oq07^?Z7=wWlR2`!OSX-I|R34!oW)4Ii
zCJv?R&oDqWh(HYxfExVS9;N|8i=c@MKrKEARi}hzjsk`}#377Obr286%$&&ywHT%W
o<`bAtVGe}(OaQJP5;Cxm_-qfcfYV`0$&{oF#*FgK{w$%401@fir~m)}

diff --git a/examples/autolab_example/readme.md b/examples/autolab_example/readme.md
new file mode 100644
index 0000000..442f6dc
--- /dev/null
+++ b/examples/autolab_example/readme.md
@@ -0,0 +1,8 @@
+
+## Startup (development)
+
+```terminal
+cd ~/Documents/Tango
+source bin/activate
+python restful_tango/server.py 3000
+```
diff --git a/examples/example_docker/instructor/cs103/.coverage b/examples/example_docker/instructor/cs103/.coverage
deleted file mode 100644
index 4dd6b5e739878250cd64cccece4eeac7806511a1..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 53248
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
XU^E0qLtr!nMnhmU1V%%Egb)A#9j)Dd

diff --git a/examples/example_docker/instructor/cs103/Report3_handin_10_of_10.token b/examples/example_docker/instructor/cs103/Report3_handin_10_of_10.token
deleted file mode 100644
index a41c39a9dbd7bc7fcaf24cd4c806f953ac074deb..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 1840
zcmZo*nX1ap00y;FG<sM|@=FqPrg(FCbG1$BVNXddNzBYCo>Du-n*k)vSU$y@tB0c?
zzqmLvDJK=o$xkXt%*;zo0dZI}OHy+|%6nK#GD~t&r}XeTmX_q_CYEF-2P763Pbn?#
zVK2@vElN%Wse%~FUX@vpmYI_}#i^T>fg!+~nMDNb9`i=c;H@>>e-|?`Fo3WS0|P^H
zv7v#nenx(7YI%N9wxM1@WlCzALQ!g2YEf}&d`@O@iAHWEh|;uD;N?<KP*6}(Qi3qt
zGs{x*6cQCcvI^=DRq6^wsU@XFdBrgC<ovwi%;J*FymW>9G=-9kRE6Ti+*F0soYdUZ
zypm#t%siN73i(ATsYQAUu6pTu5DQRT5pAerq+=YbsZgAeUz(EwwMQY^SjR}mFjhe$
z5oV<(R5#q6$_gR=F8)>uh6*{Ed8x$;xtYbqnR#$a5;Kca75wr`JaY>mj!I2&Eh@?{
z(olknD5RC<C6{F8=P4xRr&KCw@^bNVfr2S9B}F4qCkZ)d6d<8eQl77nSDKrYT2!o%
zkeHy5n3tlEkd&ZMl95@AFb(RJ;>_HFoJyFFN-|P2ixi4WbFCnuV5b1HM!{AgQ9B6{
z0krX0W|~5Ld|qO1YJ9wct*wGme0*+VW?p=}64X7)3a%B2ps-RXElx~Ng^CswW#*M=
zq$x$_mli1$r52awlz<}KNI_e{NWoU28srBf9V5+JQ0Re@5lll6IH`fsN1{S;ZemUj
zI6W!pz>)<d4MrR380(non8#{rD)4flCh6U7v8LY`85lrV0G_0aQVa5nN{saiD$|Pc
za}`SSGE35n5>rx*6f$!`G76y~sl_GEiN&cp3PE7CItm$?DX9v)TsSnOmL=wtCYGee
zLyV3uE-6h(%`4&Mf*J_UN}!~XoRe5wtbmeFHQ=^sLIVtxeo9h{OX3q@`8mEIvA9^H
zI5j5?rUn#FAiiE=adB!<iECkLVvdH9j)IY<f`YPwTYixOIO$|2XO>jzK++b-NQLsu
zoE(M3obtrVVg-<)AV=|XL7WBgtFZ=zhS>xzToh~-l$?VV3=IsSA);Um&FY1vsl}l5
zU#wuO5UqjYGaUs(1I<{Fdpz@!b4pWE6%rLd*()bi0j5hKEx$;?&_E%%C^aRsq!^k%
z3lfvF;~_x@HWnOwu?ir!5=w$NVgl+XV+~DBP#R%m5@Eny@PSK21_p+0jUX1-a+G2)
zz#CORdMX3y0^x0qmziM2C?sKk(p-QyD;r3biGhisj)8&UI}3<6rH8vDzaSpu^ThPj
zDLnzsRxzQ)sYS&xC8ZguF)sPZrQlLA2A*2u3yLz!5=&BJQXzS+7{-WC$xqHsEsB9A
z!r~aP52p0+=H{oA=A=Rcc1mZD1jJGCMX5Q7C7ETZ@j3a)iJ-Wg(xalM7n7M+TvAk;
zT#{b|F(C$`+&CVbS@a4jr}RiegyNwl7Z;=^XQpLB4T+ti(Zi&tH>HOQVbYWyR+wub
UTA`**N$p_)6)bT1(&AD*0K`p2l>h($

diff --git a/examples/example_docker/instructor/cs103/__pycache__/report3.cpython-38.pyc b/examples/example_docker/instructor/cs103/__pycache__/report3.cpython-38.pyc
index eb2ee51b0816d9501726d9ba85439f76b11b91db..324f148f5f375e1a0879b95f4758d88394b9991f 100644
GIT binary patch
delta 245
zcmbQrzLA|Tl$V!_fq{V`^oDDqDAPnfnff#a28I-d6viBeT*fHIT&5@{Mi8GVhdGxe
ziUrJO&SA)9jba6}S#sE-*xVUXSX0<q7*g0$8Jn4-*xeaY*i$%K7*aS=nVOlSI8r%N
zIJ23Gl2TbyIhq-o85tQ;Sb`Zexn6>-)?~WH85)vWT;iNqoO+9sEhx1hzo<l$apMYI
zMn?9@*BFZ!*(Q539cAR6%+D;R&UK5kG%vFxy(lpywTOv<fuV?*fq~%`KU`3+v?Md9
cc(Mz#qYxhh1A_n~4<ipF2a^D+04oP009yby!~g&Q

delta 217
zcmdnUK9!v>l$V!_fq{V`UEV737vn@enff>e28I-d6viBeT*fHIT&5_dT;?cdMvxd&
z4nr<W6bqQmoWmN$>duhDlET`;kiweE*vuTo=FX79mcrh`kiwqI)XW^kp30HJk<C;T
zmCBOJ-ptU<$jFew9L%7}`4VKMCi5-M(2&&P66eI?)LU#psRj8(CAT(i)?s91oBV*W
zh>>-2Fw;>+uE~<ja^jq~xJvUfOVW!HQ&NqJm>3usikKM~7$(OtI|}eHFffQP@-T8R
L39t&Vaxek_AK)*C

diff --git a/examples/example_docker/instructor/cs103/__pycache__/report3_complete.cpython-38.pyc b/examples/example_docker/instructor/cs103/__pycache__/report3_complete.cpython-38.pyc
index fd64b7eaeca854bcf249c32cfe1cdf665f92397c..8876a6701586cf17fee32a3de69e3645ac603639 100644
GIT binary patch
delta 524
zcmX@f@sxu%l$V!_fq{XcsNN;<=0slE`ZNXxh7^Vr#vF!R#wf;IrYI&x5T7ZBIhQ4h
z1<Yp7VaR2TVg<8Va@eBS+!<0>Q`lM<QrJ=%o0+57-5FBYQ#e`}QaDnXnwg_GQaMvN
zvzdyLQdv_uni-lI85vSof*CZqUV?1aWV*!}8j@OE;+$BVdW(}SD77HJs6>--;)<1$
zx409Fi&KkATnkGRb5=6mVku6|Nn6QK#4|aIv4N3&@@vLCHIVa*ctBnN6TA!z47UVI
zQj1ICGcr?BQuE@|5;JqSCf73sY4Cwmv498x5CK+?AV4~c*cccX*e3sEDytU+DG>q@
z!XP7AOEODxQo-`KI15Wti%T-|^NMe=CKnqT7~kS4NKDR-&&&lmy%@<gVAH_{i!d-S
zfb1^@*}%cb!pOx~1QNT&5g(tMn3)$JugP_bvotTWB)upxCABD*31l@h$ZCGLs9tGF
zW=?St*bA&6c?l2!G7)T65!lUOI}rrP_FEh_x%nxjIjMGx3=9m#Aa@8b@-Xr+axe*S
J2(WT60suSebB6!`

delta 496
zcmaFLagu{Kl$V!_fq{X6ozp6D_e5UV`Zxv#h7^Vr#vF!R#wf;IrYNRd<|t-HkQh@A
zLoQ1c3z*HE!y3iv&XB^A!rH=+!kWt1%pAq$&XB^E!rsD=!k)_1%pAp@%8|m6%~TYX
z%96_7%+Sop$dJMu%%I8n5@e$$^DWNMkksN5=fvXFTWmq81^GoKw<d00AsNM;SX`W1
zRN`7#nwYba@fJ&QYEIfph9d6CC5#P>Y?Hq-=BaTqFfbHx!wDV+28LS#C8@<F@fn#Z
zDXDq!X^ELRoRd45f;4zRs#rh-KZrnR0<%Cmi`W<#7+5DWGnds1fRqS=2qBP>tR<Nx
zIjLazD9*yt)Z&uN{Ji2@tjWcO2F6i51&PVo@tL_Gmlq?s24S!;0|Nud{$h{~9E>cC
zT#Q8^v0EJR@wthadGYa@oKak*d6^~YMTse?M$tt~AiJ4C1lY-}AeI=20GR;RTLg9^
n*bW2%^2RL=o80`A(wtN~Mg|6kVvvvsBM&17lK_VRD+eP0Ra|G|

diff --git a/examples/example_docker/instructor/cs103/deploy.py b/examples/example_docker/instructor/cs103/deploy.py
index 8d46e7b..a5f0a9f 100644
--- a/examples/example_docker/instructor/cs103/deploy.py
+++ b/examples/example_docker/instructor/cs103/deploy.py
@@ -1,6 +1,6 @@
 import os
 import glob
-import pickle
+from unitgrade_private import load_token
 from cs103.report3_complete import Report3
 from unitgrade_private.hidden_create_files import setup_grade_file_report
 from unitgrade_private.deployment import remove_hidden_methods
@@ -15,15 +15,15 @@ if __name__ == "__main__": #!s=docker_a
     setup_grade_file_report(Report)                                      # Create report3_grade.py for the students
 
     student_directory = "../../students/cs103"
-    snip_dir("./", student_directory, exclude=['__pycache__', '*.token', 'deploy.py', 'report3_complete*.py', '.*']) #!s
+    snip_dir("./", student_directory, exclude=['*.token', 'deploy.py', 'report3_complete*.py', '.*']) #!s
 
     # Step 2: Simulate that the student run their report script and generate a .token file.
     os.system("cd ../../students && python -m cs103.report3_grade") #!s=docker_b
     student_token_file = glob.glob(student_directory + "/*.token").pop()  #!s
 
     # Step 3: Compile the Docker image (obviously you should only do this once). #!s=docker_c
-    Dockerfile = os.path.dirname(__file__) + "/../../../../docker_images/unitgrade_v1-docker/Dockerfile"
-    os.system(f"cd {os.path.dirname(Dockerfile)} && docker build --tag unitgrade_v1-docker .") #!s
+    Dockerfile = os.path.dirname(__file__) + "/../../../../docker_images/unitgrade-docker/Dockerfile"
+    os.system(f"cd {os.path.dirname(Dockerfile)} && docker build --tag unitgrade-docker .") #!s
 
     # Step 4: Test the students code in the .token file and get the results-token-file:  #!s=docker_d
     token = docker_run_token_file(Dockerfile_location=Dockerfile,
@@ -32,10 +32,9 @@ if __name__ == "__main__": #!s=docker_a
                                   instructor_grade_script="report3_complete_grade.py") #!s
 
     # Load the two token files and compare their scores #!s=docker_e
-    with open(token, 'rb') as f:
-        checked_token = pickle.load(f)
-    with open(student_token_file, 'rb') as f:
-        results = pickle.load(f)
+    checked_token, _ = load_token(token)
+    results, _ = load_token(student_token_file)
+
     print("Student's score was:", results['total'])
     print("My independent evaluation of the students score was", checked_token['total']) #!s
 
diff --git a/examples/example_docker/instructor/cs103/report3.py b/examples/example_docker/instructor/cs103/report3.py
index c9cb164..9245889 100644
--- a/examples/example_docker/instructor/cs103/report3.py
+++ b/examples/example_docker/instructor/cs103/report3.py
@@ -1,4 +1,5 @@
-from unitgrade import UTestCase, Report, hide #!s
+from unitgrade import UTestCase, Report  #!s
+from unitgrade.utils import hide
 from unitgrade import evaluate_report_student
 import cs103
 
diff --git a/examples/example_docker/instructor/cs103/report3_complete.py b/examples/example_docker/instructor/cs103/report3_complete.py
index f0f3bd8..110c530 100644
--- a/examples/example_docker/instructor/cs103/report3_complete.py
+++ b/examples/example_docker/instructor/cs103/report3_complete.py
@@ -1,4 +1,5 @@
-from unitgrade import UTestCase, Report, hide #!s
+from unitgrade import UTestCase, Report  #!s
+from unitgrade.utils import hide
 from unitgrade import evaluate_report_student
 import cs103
 
diff --git a/examples/example_docker/instructor/cs103/report3_complete_grade.py b/examples/example_docker/instructor/cs103/report3_complete_grade.py
index 9c9fe41..3f4755e 100644
--- a/examples/example_docker/instructor/cs103/report3_complete_grade.py
+++ b/examples/example_docker/instructor/cs103/report3_complete_grade.py
@@ -1,3 +1,3 @@
-'''WARNING: Modifying, decompiling or otherwise tampering with this script, it's data or the resulting .token file will be investigated as a cheating attempt.'''
+''' WARNING: Modifying, decompiling or otherwise tampering with this script, it's data or the resulting .token file will be investigated as a cheating attempt. '''
 import bz2, base64
-exec(bz2.decompress(base64.b64decode('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')))
\ No newline at end of file
+exec(bz2.decompress(base64.b64decode('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')))
\ No newline at end of file
diff --git a/examples/example_docker/instructor/cs103/report3_grade.py b/examples/example_docker/instructor/cs103/report3_grade.py
index 5ca4f8c..619c0dc 100644
--- a/examples/example_docker/instructor/cs103/report3_grade.py
+++ b/examples/example_docker/instructor/cs103/report3_grade.py
@@ -1,3 +1,3 @@
-'''WARNING: Modifying, decompiling or otherwise tampering with this script, it's data or the resulting .token file will be investigated as a cheating attempt.'''
+''' WARNING: Modifying, decompiling or otherwise tampering with this script, it's data or the resulting .token file will be investigated as a cheating attempt. '''
 import bz2, base64
-exec(bz2.decompress(base64.b64decode('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')))
\ No newline at end of file
+exec(bz2.decompress(base64.b64decode('QlpoOTFBWSZTWRN6O4QAST3/gH72xFR7/////+//vv////5gV173vHvH3zz74vt97IW+dlu1QPoUYQ9G2aHoGqodi1zfb7773hr1592WeuoikUob3bmAD03332r3XKp7cpZ9DhA969t492dvew7vfet5xkvsc7h9Fe7pr3u+2lnr3dxdadtQ5apLLYnbpd3HXwz3ZedzvfPqu5hXffd97d72Ptx1t97ufF8kIT77lvuK8jLO8Y97Y3TlHb3vtu3u58Xe3brc7rk56W69vdZ2NNbTInbQ2tLuD68bZfH25rrrXHUO+877ex7rd33xrm7nyPRT33O7bbnKu+OBPnHTlt1rlkt93Ve7HoSmiE0aAgCARMCZBqp+amFNqeKehTJ6jQepiAYmE9RoNMgQhBDU0E9BT0T1PVPUaGTRtT1Gmh6mjR6g0ANAANASmIiIgp6o09Tygm2lNhJ7Sb1Q0AhiYmAAIDTBoGkwk1EQjQQBGk9RNolD8qb2VJpvKJ+oTRpvKjJvSnojamRtQBkNBEkQmgmmjQ0jTQYTTRKfhQntJHpNNqNNMQ2iaNGgABoJCQgiMIAJk00U8kw1NPUajyI9TIaAPSaNMgaDTQ0OQE7T1wKEQCiIvtiCqdsFEKQ+UVFRVRU/p+X3N4Wf3s/8/9MWH/ZP6HHHdP4sbSPe7f0FiFYuz+D5zJ/5+6FivsEF83UVJCpHX+3O0fl6KweyCPGUMcRLc5MIN92GtwhBCLBzT97jEIxTsToxe+oCdRcu4NwVr8mA/FZcMdkiOukJ7PiN+5M0FzBFHsRp0ORGxCDsUKyJmXZ/GD+J8SU4+v/C2aBL+3o+u6e7nOIp/5nOk5O6Wq+9Wvn16EMCr8u44twm0iAqv/GjLLeYKgiBwQF8WIsgSCSKyKMiyCBAgL90SmEiyT7INkQUt/nBpVQiRUBsSQr3YPcYpoSc1fc9Bm7vm7BPOYdE8Dts4w+RORH3SUFAqggKsqRqIIqfvMKBiKwFILAVQl1UI/9/H+3bs4GMsPxeIJ35j/Z/N/yrsscnCKKbJALsFCfNARzTmySByFBO8bTtWBqlo2EgbJBUpgnTFbbcpzwQ1pRUE88coOzvVC56T2Gzyq+O7csYSHTGqu6a/2mxdMoHM0/Jb72FtDP6f9l/+n5zpz8n0Eej5uMNytAc20n+kWSLv/c2n+3KJ823a2xeTHVHyp+Xzo7vldfxdu9FhmKlTkeyD5qdYPhCel0ay9V2/2LtnhAjoLorpVsQ1Xj68OuG+H7/qSKn6O7pzDxb0w9zqebmIXNIXDv7SO49tzhqrP3kCIQKhU9HZDt66Dn91Im7fWtSUCHdIwlFpywVop6qHZXQ6yI+ry8rbRqliZ+N/iiun7fHsR1fLr6fc9n/fn6qH6icshjfHoRFckPCkJHDTW7jh6fNvoCSw7FhVfGYrw7xL2J3ZyuwxpnNv9S9pi+v13GO1+euxTle4YWX9/UjGU5XmQlwwx2rHC6U6Qc18uM6Uq9cWpgPy7NJb7oa3BPzLtctuFuBzGvTHBe0Hrp55ccV41mu0jWOjk/JO/qqTHqkvck7VEdn6Uw/qj0+YRTchlejJnuM8WKq6gduM+fQs5t8Nz07O3bCxBGFrDvyIPN7GaFRAs7QUIMeBGiNJoJcpLB5PZHd8dqwWtbTsQJC9ScWW5HchSKwHJn8TzfHyJTMimiFBIdyh7R9EhQSBO9CEOVG0Cq0RZlBGi788Yo1y1pWfRjHy5Co4xEi1XAzvnAIu+lWDTd3bURqU0MoMIpF4CXxvmZClPzanOzQ2wXcs214ESPnBISDEkcHqFu2Q1a5ckqDKTnjSIOCmLvkzpvEl8Gvh3EwkDGgNWC+T48/n2RjOBg4NBv15/UowNebk6LAZtJ5RXa8AmI/Y77MBL5yARfoEv8+uGa8saFApAEOhh4fPkfyzdjIBD7cBfxZ7yqOuf6vAwM/uB77OIcR5lir6cKPDTckchMwi4R9xBbgwhhzEPP9ERsToc877KOLdaDcqOdulaWhoFoaQkfjO2Q1dNwsLeY7hzRAy7okF5BXLJ7Ue61w5UzJRutjl6lX22tdVYGSLoLDSb83CXSRrGC7s4GEEJtHmqtAj7Wh0huWi/Ai/D4zdMjLF2mb3OfF7BGJy4vw3ZVEdioL+naovVgX0xHHKFH6YxhKm3NjCjb8B23F3nc2IJdMCP+lTBC2eu2XKAs+1ojluekOPd97+gu/rwlhnqK4EXd1mOPI0nxa3zZfwUEK/tHPD6hOkWLwzLM2sLmEEyBwgzcKS7je4m9ZvKxoRXAxZPWimyI4CBwyKszYzyKXE8cCPHfnkZlSgSLgnh1ldW4izCOTg4NmUHfZ5iVYjk9+VyhIsDfPF27fBTY3lzjsjVluy+0y0i8FSi4PfuM+s9YNQmXQ4/ZIi2w+4cUrp590YCQkKtlixgjfQoLkWzydeE7qmBztngaFjMwqkgZJJt6aVNE9w9CTIpmZT3tVBS+nJ4Rj44YmPV9dNAvzWDKZ7pBis9Oe/c9JCFPETlQVenDtgPMg13nTZhhj56BzmSi4JIntl9uWt+JgbL1RJE7PNpZu7FxuH2/W5TAy5luQmo9XIJW7Cf2ykUxr2tiRnNvi15M+7x+zHMczDzi95mZTJJsiv3G1jdKZ+L76Ot8Hb4RlfTxwIcudob1AOEfWWlxI8IYJtSB4b61xeoiIiJCH3P0wJ7VIBLrtY2Yyi230u7u9+PF+LxgsNBMeWYFjwRGnD++w+DKRFeFjey3t2mbkXmWHv0KsSPCawwlN2wXcU/ywgI+9+vmykvjPBvAfGUwReZJDs10JkqBl2qr7YdpGpWmKdtV6sZmdZmmOE5aPWOwcxMRSL3tepaNl9sJlIvoxfG+ON5gaPOMrjs5OV9fLbyMfUGRjqcDcQYoGnHwPjfnuOBVrpu9nI9qKS9+Zdl053JahOZUtLWRZga9OwnEemUiUi8hkclerD32hcYxpd+FfUNp0GkOdr4MdLf6LcA7bZ8rW7ntHAwKbWGy17n7DVyRMuTCnDTnnrf4RsWZhNI4BY+/q7es9WaCH1NjiiyHtJSQ7SAgcJPrG8fgS1nhvwL75EwuC9YDgTqPUqSWsOWNgvnaNAh2MCuqFxkSHYe4BekP/SbLRT2Og5UFrtPuCJdkUGxociCxaFmk44OuOOO14SeWtVZfIFEN3uHMICfAxH7tsKsbZmZcagrlg1TCJzDNXxoamJjeNV6WbBYECpGROeJ5Etc5zHVAhDbaxVuOKwBYBYEMJkEXIQHduoImanGQXby6CLtMmJFySZokYLAzmXjV+gxsZu9O/Q+hBBeOLLKc+ExtKOwtMbOjAVew1KJkUzB8tjHAsi1ihKili6SmTerWsRfIe7l13hxCuN5fjIkB8xaeN8zPPDBJJzCgnGVHcUCOt9lzizoJhE1qh0Wz0Sy2oJjgBd2ApemJPhCijUfXOy4UqszKL0Z9b77BwVBFBXIEmvu6o5E9KS+kvM6I4mL0KymUq9EutCZNG93YvTnZN66Tz3d/Z1Ol43So5wxtKU878i7fdgSYJBXWFvvkO6lE8Sb+7DqottxjSZgGu+Mi/VxUdF47qUZCm72C5Frj0OdJg94ZHKWIc26SN8+tbyFMjM3logQbwcoOZW1wrXe+gKMJo3uBNbsaLCV7xQcsAmQpEb4aJ4A2dY45cbNUy+t1GMmApMGNi40yD8+TOU4o2B3usOkGhhKC4JCSmUIc9DXcOQxqNPWG8BtXXpMVfnxgSJQ0LblEttIjcSMBzLjhgXZm2OlLMK9GN8zvHYwyqqEmO4oeOY0I+jiO8eXdwPnPdWvhCHbpd+oG8ZzGPRtHSEPwOEeYOsjDEXpgnxe67vZ2ulmbN7ZE+puLgsIQEBc3VCtdsKGwOOfpnn54OpkXsBu4x+taJd7N9f2SKeOfbXd2d9dN2+Ib+Rek9ew7AhyzkKFyEdoI/UgmJva49Gq1T4P0bz0ytdqSa9dnOg5GDCdfp/rPI4Ew0uLCb32JBptwHE3DzkWgQhEoxtJxukOQyEA9Wr5fE+5/2ZcvpaL96TvfqeBY8B8BCPrKgZ6D9ULGK3/rRufW2StHPLh46dOg6HRqMwX/Bzdzm78pjKnOzv9xeWu/O2PkN9LVe7NbE7ntXJxn2kfYAgQXCxF3MofIHkGqXLY665Ogj+aHQOV3Vn6ppYM9pEB0/Lxr+GGPb19F5P342ru1+XXatJ8bd2Oa2zmmaTvrMdiz05nGUFSu/obGm0irlghpUnLPBssSmEUqqDUqpCxESkdqUGqk/H+Si8fgXKvUuDrVkVio3040fSlP11Qde/s8O+vt5d+mfse2Cqjj/3/TM08+OJk6MVDJslCaIeBQCS4iKgXly1TmKSmF5cWFmWqqulj7dqSL7vzFWqErWmGG3Dhltp+SQzcrCqo/HTViX58ItCtNZtVCfHMGeOTQjCU8P8M3Hy2f6JRj8gxUFxSVEUDMU0zLh9Yf8hgyWRJaJJ2htCfpoUH0gfKQ+s9f5MFFyL6TBA8vb4ez9o9euxL+PrviIbohWHFYTKK1bP8MJV0DVkfiv8Dgd3w9/BEVVVVh2MDjx24FO+mionaMoQVVVSGdakmqGuubQvr21V0GBZ9KooT88ZKeKtNq1VSqqUtVGIUsYFKlIUsZKYKFP99UWXdgLOWx8OJVOIM4jaUmjUKpD931rIsIsxX3xFwZMsgxgHTNOCjDp2DQo7Y0McBgZZXM6VKIZ9meHkj7daesl/xuddK/9HLDdJ68GTh5G6KWeWCWyM3hasKy1Uc/upFcVg0utuVGYMQ87rYuczTiRSuzXcoFiqiB+7Cu0xNuhVtGDMoWs0mijZJNwlx6gJH32FA9vDyI7aaz9ud5+qd2hnoOIvAkya5JFMZmkh5EzxCJXm7nZ2HA9mxad0jLyMSuH0TARZ4F3rhUjIdmc8OQ3mGoNQTSA7xcHYwBYPIrmJIS2jTpJtQisDFZCnHd6KcQMSz4HIjToIBW7FAHRbyyCTZVpqqs79ByGHccSCH3Vwz6xDIokTwpBds/YT9M8dzVvCjGprzNCpjUVTEuI/YIxCzI82sLxwJ1cNKhIhhCGeBWK/soESHAhuKAmUCZ8tnIZo++u0rIbLjNx2dK01Lks6w0kS5O185ThuZom7E83P3279b6FrOVITl8SJh9oaW6niq5RiGrsR8iRaNSxxbv69gUzuceaI0uzuvKNhBAXEXzi6ZK0D3EymbkiDkQV4i65Ge+lLQHIHwCCYjhXI9n79/hgdNW87KZhyOC/Vd0IP0pyflPt96B168+ufH8VOD3HyddoXImIOfE8zRt96gSJKPkqkd5eUf5V82ozv9D8LI7P6oRYH6RNDpi5/Nq/TaPEX0LLlLCpgqd198PMxORDkHCdQVojtuY5busYZdt5rwM8+Kd0r0OmJo+gWaWm3U8ZYE/Jf0q0rP2+/kw9JZMuy7Von2OQ8sCRccYrV8Xg8X8OT5+fD7n1crGjHM4GHdpMLjeFC+0Rbt1d9DPVLzcdet1ro+pf3zNgjMrcTRvSQQOzs4QS9NJTozpCKOd5IjdLvuebGwm2OI4INS6JpozdjC/fhAYEEongj12T78wPeV2R69HzvLjQ2xqGjb0KRwpnU4MlcfYuAdpEcr5NoztgF2GYgOxCZ4d8SwfqQoJIQQd8DETucnIeD2yulO9XDt4xNd1Y5O2OmMGPfDXYWyEEF51IxybD+jnOuFOEjbnjDojWzrMrWYFyfkdE+1XXXz05KQ81PXAMmOeLnDPNPGA/L0qZpBDOEPCUJNFP5bxc9aQrxw5I9XGn82w4r0r0LftaEjW8sSiWlHeOUbuy8gMVfFucKJXyh+2FS2Jlbz165nJ7zHkp8Et87xArfpEOfd3P6zM63XSd97G6+w95MD2A4mE/fL5jzOPSXNd655LpEOCj82yPn2p9iudbVXkoBq3lBQh4yFstwRmCseC1rVWCneXVJdfPOp9OM8LOO20UNZ840RggGM9u0h9GXboqRsbCtenrowefFVnoHFpEK3FAvVfMpDsEMSaKq4CbXIGzJqILNBA2QOIY6xPSWPmuiiXjEiAu1nx09nMDAGjokftxFsGiw4wNelKJdGyqw1fP3ZccWKxp4zu6CZDuIJC+aO8jJDe4jyayBk8+J125LR/L5ue//RXId/i3vIkrpoDqTv6uRu48K+y4iUMM3dt7YDz0tmioXiBWAnnb08bqe+t2U34MdcnNrqF2fE9etZXZSUQysSGmp+vbac+TuhFXHTrPJyRaXZsFVQbqSe/qRuiUgTsdt+F8xDzg634+aRu0cn3v6rrYY2xncl/MPTgWM8558rjcCMMaEMZymZBLPKHne8yW17SpZU62OMrLOfyvgMKvZtoJsSeelqmK3WclrBDUlEORqhUumQSZA6ZAbJrFql8hHPpfouztuMaj8oyMZFSUu+M5GlDSZhe4+3AwnWvj0U85V6VtbOfwPFBTy1vvMG7Hc28bubN0wx5Vv01IqVzJFHJ2K9kmkgkPujxW+rBnjc07rEBY51vJCfuo0m4dF32kXo1ucMENCMG7NK7xVnv27b2xN3OG7NvkYD+rJm9NiQgb6XY3y8BCEmwOBM+r1km4ubX+o5lQOdbguR3TG0IDYjp0PL7i6K1PidhDBiS9bslo8X3Q7N2S1PdhPbI5tbGLJ4EPIZ2XjhltgUPYJpJjEvLHzClwPkPZ6BO4583zBY4WDITAJhZsNJ20DWHkQKCQeTjx8Hfz0PG0hPc7zL0W9OHllGb+WB5ZJIBO6UEhJJCLRmZQncPhmldxed/LEuXuU50c4dWcJVlqW0jV1JTf1lI3CZZuDLtFNUsmplgUMMWGWaSNCGKIrkPdyrIyANo5HwCNGI5Lz3X9QZnuHDXBZEeXUX12F8IhEQxtLH5fV5bjPakNah5m4hYhZogwojIGsruYTedLxHywdWnRDMiF8T5YYETl7BTIQrgpW4kNuzbAbI9bbkM0gQqj9SyydmIbG4vEZU3QfayUWHENAxMZpQRQ8C45hzpQZNm1gsAxDBlhRIEKCxmwpsbR9r3mdF4Bkb9CGjdmoxH5jgFs0YvmHOpniRt42e62LqNIeAwzpOJORjyh0cHWbLWhy32gshUBicS+AVu2w7MOwyVDoVeti++WWKYSV4KxzWKTGufkSTIavA53mDy6Za4OZ8xDhg1KASHLCYQjby92Rv7Q0NxY+diofedcwUBAmCwepu1Hyac4bPwBfcGPure/zn0WPKezB3fzTH2DRbGnwRbHKzSlkxg0zXM0/dtAw/gDYmxUJ92JebSDD6i0EU6CdcuRG7ZLN9INdAg2voCt2/WIChY8vu2PIf7+7z0dM+u2dJvQUrn6TU3lFJpffv9m7gMPGiuI9/iIooqoIixHrVDSUrwaYxFEWPR7GT9t79snedt79wXcdzeUhFRDiSgYNC43BX/TCXkz8E5O53PT9qnCFDxa1StvPjw4cbdQ29e7y8GKIKqKIKKr+DRbKFiMUQVVY+7znXnGCiGGPDi3ITzBuAeHMMhrzkoSd1evUG65ejtjfvnM7CTPumIQnwjwsxnLqFDu8KE+cw5fMiYxl5cpYOLZ0oGbp5y2XQhxOLcqqBDYYgsWIJTNcZlNF8E5WucjJrgVKYwiXN6stCFECTRgTLxbxBqxN4MrN5fOKfM4c3NmozgQMYdwqfDvQzUSsEkJDLvd9omc25aDi9VqWpmgQtIZTtEKowEliXsvec+7QzLDByE95KgEYhaSuMHSqonOMODNQ+Td5T5EKhkRb1N3jhgdAqrNnOxjrx73wldwbZQ+njK6KqiKKiooO1UqiI2c1uFqoILV0XRcORm4S83rpwEPl58jOuzoKsisVSKvZRQqKbpUURUWIxnVhk3a48zHGBF4tu/vJ5XNG1mE+E9bO9mI7qm9sKvZd6c9w+ON91Ot9lq6dxfTEyaRkxA4ErLDDEDHD6wMgqtYigUtXTkugESo1MTjM0cYqxnKZwCxHnYG8TiIOrdazOMHWcSlRwYfXwAhzJoxT7TlQ+YdWuecHahneRFkOucsjKbKl2jVzlygRZkAbVeJqIR453gb3n6lq8yGuQQZ1OLBNyr8VRyc+LVgS9GRGqIJtNkMqNLWNs5mha5PX9iOZU/CjY8WdLX3iwZmIQJGeGnB2gRFuESRc/YGaEdS1JxqqezXOxYveWLBBia28npDy/h+a69p/Y93vnx/F1/Dp9Kejr2ZuP6D5N+6pR1+SidLL01/lhCSAMBz2Ihug4vrhvwP2+jwNTD6ZfnRrYy/EUCbnq1G61y0G5O2p+sP2Bl9wXtGjCGeJnzIR1NQ4oaCe5PY808KrOC7nuZJhloxfdwS/c4tMNg691wOAmGeLApVnB822KcMXPXF+uc8kc9NKMVSJtv33MjDKdjzLqI4aqnmF22MTA5OA4LwCjKCI3GvmeZ9r3EZ71M9K9syv0pXh8tKLWcolVMShxTiN5I39fyQWRunetT9f3epCSC/uspIsClf3iqJ/O4HDCGAMVIKBJTCYZJTBQgsG2pACklpLUhIg5UcsUAFu43bA8PibVhrd8+M8dWW5kV+MEuVRme1r2kJiZjt2Xd96rba60zaDVhjHn+SLHpdqfQQOHhPkKdkxXZjJbus1gr0aWoTXtToJEwZUyFiYIVjBBh473fFS5cp6bbhDsdXe8YNYTGFKOTYtTEJ8fzNc6leNjM7fqoWmr1HPAm21dVpXWkT7r9Kztetu/MOLFnQzmlSKpRn/LgYt0nU1qX3Wgktix2Ukp9vvIrvoPR2M3LHkmefPpcZzwg2IffYjbQnmtR6NlJqK+MFN2kiPFu5hkHxGQ+w6BppjK9LTZrpr6Vmh4MFr6+96cPP6wezT6ZTr3v4nt/0+4fO1RwdwOuvU0YWIw9EPDdNE/LAyfE1yY/13RqnbAiD8FPEFmakcThwr9H9xKmSfDs8SdNqqoEkkmtDVyhofS0FDZ8DUf2w/We/o4fckt3/21wd/35aDaOOaKCLgRIQAngPbeCBF4HrOUtRRT+mXDxdhn+3qx82ziP1BcKCxSJoaUh5h5m/uWTXQYp6j2AHTcaP1//g9Uo/pweJmRLU4B4H5Sle4lDQQziQh4JYfDuA4BcBdwhsBtIYhLUZ3b6M9UH3jien8hzp76d5+JhwD7TRjZpHjCTDnX2cxSc8t/o3G0Tp2AsMWcxhzjJGgMR9GZ2hBIdkzcvP6/EM9+hed6D3rqAjYO9kxu9LkirCfy9DNYzPIgxpfuX2N/+OUV5OQvxNqYjchk5z/GGsA66yozJNxkKoo7D6Vd5gwKo95CVIfp+SpY+jdUqkkmiYOZg3iQQNbwCAgbA+ciO0ofHEke6pxXP9w7OKEEL8yhrVRHhsHw/hkXgoI9kDr7kKpME0MUzbU6vR69QqUNoWPu06gkOwRPvj7IdSp7rIJJLGAt5wJg3Qm0J+ceLKZKol+LXfpyrG/l5L8xCeTZrxRkyCFW53h6lllEXCeW0ohcIMY85nFW/hP5vd/PzBuWPhlleOuNA5lXE7scdSXljjPzWC2/o6h2zEZkOVfw0Zm+wEzIS+x3ENDAwoRDD16qg3sLYcJCHGPh+csKADcD+U7DphHq2+5+MpyCyuevdlRkTt/JnbO5Fj5qM4VRFCYQCnzRjArl6Xu6vtSuLjXx+berH3iLjAB0s++qrExR7oVSgkVQg0OnowJicDOOvVcSrBuk+DRRFH6pjiD1oreKJIG5FEKV1qnPtVlwdr3mBwacFGRG51QVVqAHJ6lTKzakEgZI1Qh1DyYPOeVbh8t3+Gckz3pzQ4UYiouV2oQhbsJBDR3tp6h6uuzVNZk8oc/jp6IjRVw7kDYJSEFA8HruutzHHIu2fYs4O1bWoCyrBQd7ID8pZyxILEg8eZ+XKe/dCQW1qo4P1cC3BJRJkv2TC3ZcbuHaJfPOXZ0Ezq5OJcOmO+I195z4eGBHpOTHb5iUcfbiMqjJHiDAB3Cw7IwftnfKqkMnKdi6o95Dy66Suj2RQ4u6SSQu9+EP0TiXBOsnHHWNIkFsFWwyh6pzTTFSZYUin81Hay1g+xrh/mrhF+Vj+X2uLbGqEvQ6aOideTJEl5mSXPWVFqIaMilRRiIJ7a7TPaaY9unVvG/C1N83YxRYvtqy5WKDl5YtS6qLXbRam3Tncktbu7dWYSs+dXSTLJwQeBj8jCQCQhZTKJrQopUEVNjR/sHO58mDUyeqTgP592swt2+VL+f799vJdZuc8R375xYsJqufbm7CnVERmrDa+32y4nVXMgloI4PP1pxRVn+PuU8c/KN3KDkNPrdod3Jz0ELLW/0owSs+/R3k+i3b8ICiDlXuiWClpyw7uKxzRLxcqpkXCOiBzcLW7pp5SnqindEYfIWnyLR4RyPd+lu9HvfF1Ln6ZcT7VOEPhK+ze9Leu3mwL4Adlb1+vLrv4qd10qyK7qVrd3ESpZr3O3q7Hq/f6H+V1k2Zw7xtv9e5flPU+zAmR0kVyU3zOLuMDaQId3CZBAi33G0tLphfNEtyP1/Whroh8/YdedPxpBdx5f8792F13Drxpz9vPSW5YJ1LaXPPLBg6HcfO/uQ0j3G4oegiBcyoGp/f+qm0RDCjNsgbm8J7ale22aPhApLzUsWAODdqxjarkbQcI9gEOMeqfalJ+3igQGELYjJWj73U47kO49ZBuEAKDQ4ffDFR6bAYDxlz7Mgwgcmmo62NGGIumLBFiUF6RCMHSiUD7a7DAOAAaumC1WEmYSFkNgHkH2jZ5McSYXcPItYqCsnBCcgqSkWTgfsHdkORD0jmHJfN3gQZBo+u+0caM+QsZF5dNQfRmJ7B9zxEdo8ZrhpTWmvhuPWEMaNQmroJDNhTTLG0dw5OAushAiu02Ozl+gkxCqZBGOgb99AyDNoRhyDHFVFPaIb76E3IogsMAzBEF2sYdQdxcNQ7NVkLoc6QmgCRC4elGI7kwHmdp5Bk0GQPEJ8UQoDQs7BIGY7Mue41vCnp5rjN2wSmxNpOIaiRMSaIGgWRMApGXJU7AoJYQ7u351plU90wC4KiCiwcTYRET3AbwHGagGjaEG9jdibIlI/nBwkGpk5fDNMIbC9IHPLNwr1FLgQjCEa88lz2fLBOCaqPshF8YUbpA6rEDHopqeZD+BAWERXjs3UWHV+eQo2r7F+rz27cz0n5O2glUVYFRRSKMEFAMnaKAcQJckwLBEGRMdh2ofnNAYwRDwqmkiqsChAQGMqimH8mgaHOMFBYH6JUg7HmYBKUkKkgUk2A4l7ZCVJn5xTy/0oY0HrIJjM7otXaECJes3+be+DvrEn328vIiCyZcmDzmo2zaiJXIdZzpCKN4IGdkH3FE8Z4Q2A5z8aMDCUIKEEYxACigoKHLJNY0+e5YhtA4YCPwIEIoB2kNcgnsENZ22M4ddg2FA2DS11I6ErqQJZnG5rzhqUtAXUQ6zoCFsh9K897PgIgnodge4/UrASHyJWZNGKsYPmJoAPpyfyhfuhjtDqQP0gkh2QQGAESJpxgOBlridKQUk3JwAfCz45bE4KUE6ZSwGFJByAXi6RYRJCEDjqhpklRCAgHDzRf08q8Q6QoV+wbmMSbQ5tCOVUD2ijEd09B9rBLCQZV1HSQ8ztqA1g9a9IUGAyJMILBow5BxYyMwOc6G2JKKT9HzyFTUnt2XfkthZdBcJ28oQK0A1MjzAMA9QaA0fXwWcLdnLwDTUX8QbBPCL6t0gOI3giLqNfH0DyZb4L8AsRoG/oHd78C636egPzaI2ZC5IVMj335BSbWo2/5CpD2x7TrFxTTsOKNOBAD9lBMPh9ULfIwjGHEnMdKII+pJog8pdSjYQ4/Gf978FNQ+0bIZyDEkkE10UMgwA+ergrrD9kwTSonHaJPQS4EnYkGo6E3u9XpKouy8onBcTKCub1zgefz1D98YfpS80w1r26kNXsgUqDd72G5x8mTqlEftqUjdNSUCkBVygWkLYD7YRqIwGZsiZFFC7CzYx8Ea7MopIbQv4+ufwMDT/ypTZ3oDPeRh1s7YwgMHtiCnj9xIKhYqLJDwJ0ZDtPScom/Gd2A4EAB+FdXhc0BJNRzBmVkxiK0Kw/XHt5F/TA0Bh18RaSQ4MHcGZyPJwoHBlgc0wHs+QJG+3rhDVGAtBlrKISgWb2cglQbDvmBDLwJmUQ618iuJ8S4rr7pkJQaWBe2oMYMxgnqYYQg7kiI3h+sMUw84fq/2mxCbewZEHIrgw4wJvPpC/qqSX8VPfQkURSCArTDyIkuuCVIVepVYdCeAPZocTd2mM8w8XTVde6sglLCGdcCxtK1C0kDoTmS8VahKxiErda06qnLWWDEBdyAx1fr3UpVaxQFVE8yMWwpbUjLyh0oDYJjQhXMumlqfScTbC5EnZrmHO0vxJUx0plLt1SVVAi1E0HX+kyF/h8J/YfimZxk0og0VAqO050MaAq5cLBnFXkgZAMmItiKUFMX2JZOXynXH2+m3AudzJApKqmm253lL7w1QbEI5d580khFVMpVAGIjLJVFAXAWoXVETIcj8hKGMPe47VcHOH5JJlAO34t2iXcVRq6tRu7ltsZJHI5BtyRjkAci9Nl9HvJ1b8mtpA3zMjyEwHnjeGrnqOPSDZ/hGvF/9yoTKRNaMH8vhDfeCCy7wwfQd3QJYZIggbuD6hsTg3DmIdGof5ttD7CAdM1BOhS1vLQ6iRDM+oOr8r6OQzN/SvmbD1CqFAQsSJ5eyzUT5ZAHxdSZo6+wVHsCgWhZRQd+HL6FhYn8An5vEUGghZBoUWR5/H3nd2Vwt2V8OF5X6nlm3fCNCrsBKXJjoUh9gpUXEXT4Hhw3DlZrDB9MUiqeCKIc4LB7UEkAgjTLAvtnEm2NhbRoATfxK4fLkW2hSGwIke3a/as/sZGsDB3whW2hfgWoWKPfYKF8XMEwkmgnfDfuR9eEsc2L79CeQMAXxpfd4GaGBm3AooEkvVVI1tyFjkRnvGVXEyM2c2wo1AuE+2Y7BatGUGqISpnORVGFXfoRoDIujUCAQ6meAhEDorHDiBuBWTmAsb77tLwKFuMLiWx44JrHOdLmrWxuedSYSnAqG/YnG85jpbHlQHZD4HOFZaY8kLEJcig+JtGvSZbkq9Q76vkRddHvjZDSYYSEoq1AtiBAcCJ5DHGoqLZCVGoDQHEDRaXeYGa3FC5VW4cQQmAKAWxY4zUzzacgSnRLgpkoTmUxeDgSSq094GvZFtA1D6u3cgWaOhZCESJdz6t00GSDSYsSuR1BxrhyAYFHNOx4pDahWJ85nIGmYHTc0DMOj1yi5LhQgaDs0g0lObcOUPrB5AmOXapf1BQeUSDcRV2aAQnmTsnUGOGZLICdAH2MCbFwLBdoYjmENYa8MIxXRcMlegHEfja9k0js01TTKHk3aTubZaOU62XLNW1FDmWISlRdF4IEiyIIdOqxvHM941e3glKCQDLVN9SxHHGZsu0shjV1fS23CXWjaQNi3hdjMHEZIvWTPZGMSldBJExSHkhHVrZa3Uw9zGE0OEGVk89Qc1KSFZWLit7wXGpUDD2aJnZOHDJ3Ji3YZ+rGzYsSJBGRYYDjcUgagsBgpriUbHEcBbjBYSCG0Imt5mLJGAwCICpYKSBoKDkQUanEmgYNSSzXoGMWkP40oWSqAyyGuf1Dz4w/DJpLNSv2B8Q7djkGknWEP66YMUSCIoMSpj+fYZQDGAcSybBzYaVSbC49UTy9YM3o7Z8bNmWchtA7bEIQqfOEAteAoLJQgdDgi41YwV0dsGnsMg1S/xLBb4sKL9XKZnHDqNYguRgZDjYDg7ShMI4kE+O37LI78NKAofQZZO/aadRwEPtCDrDJQ/oin0GkTUny35aUSdJXS77pe4YENa0N9yXeGeleQVEsaKElIySUIDAKQWt5NB3nzMQDKE+9yD8ZUrkowyDtfzanYodaDOQ5u74I595YffAChUQWgZRFgxR4g6eARkFIdQ8PKIRz4YXS3zZCLCBERkhmJ5MwTMG8wTG8CvbY+Pnnwp3Ob+vEeImROa9lkLwqCoZ0DzRQZxRo9FxdXYzZ114QAsZ5qgzIiFsqLYzyw4jU2hQ0toJdZ1BwmRZiSZhqbRNDlksCd+4MnKy/j+4Zv1GKIVFOw37ClNmicQhuAHQelkenn5Zcde6PjvcVQxiYIVFxQgRlwLFL9Rhj4QBINUNjjTasD1sZLJiNBrRIzSDlzubeHyHdB6XsQqSJoM1DATBqEyGaodiijpXT2mTiXDUk4Oy6GjbOOvPjni+f1kQYzbUChgHBAwhIsgwhIgGI0DYTyD7mkUiMWCyQGKRXn83ba5OIFc9gNluxbB6UEEWEZJMcJ+J30L89UAgw741kakcMhdokKHsCCFyJ29sD7BUZBhOQFzLnr7eq4nEIu2ARwC9gPH0G+DCHhHkjuxLCfojtG7uI4ufQfyf63xHvMmx5Q7iQJCPbIWKGq6BTqVZgWShOAn/0EDxOXqJ5/Udy+vmjkq2uFMIyikhGSUUVEqUiFJCoQuqhuW1hhDAMEVkJSiQoQKKlSKiDFjAiCIqiRZVU0FfrEKEsZEZSVGFHuz9Zm778BSj9419g7T5MHUJEwrQBaBO4QCBziImkwMQsgPXRPsfmywBcy2lnXPrhxE8vvqR6ZFnKHL1OoHeHQQIBBOZfEMz36a78/h9B6eiLgYmI2TXwHq7vlIE/PGVu5OQPHfGkEkrCyxaLzBmRiEdREJkBUkq2qMS8pYBZkESIxnBo1MTGIUKMH7jBMmBFGMEF9hkmJr0rLHwI8GbPcIIr9qfb/tZH8JpPGfg9GoaRF623kHVDrBtEbp7dekIwQashunK6Lf0PjUZzOkEdD1jhvTSW8/Ym3G+1rRN4PxZhxFlxw+qbE1+P7p5HjyIaGpCe1lVJDmIVLKkloS5GICQ6DM9AoAoHJmUFFQok0lUoFE6eG9CeaodrNoTUEgxkhNy/mOBKh1QxO1YvS7RjLkqDSOjvwWN55mm3bNpSW5BzZ0ri1rlpAQgLxnp34t9ggzuAQrmHUITmcDkgghIsUhAhVIlcyeblzLZy1n0xL3C1iojTFKYDJvSVAkUSN4yqiU7iU2IrAornNAxDAEvLqyy23zcCi3UogJYiyj47B/EwKwFE4EEUIqn7LGiUVGAoUlCCJUhIjIE22M7Ewf0H8xuBcC4sw1DKIVqcb2iB7fWd4sLHB73okWM0V09Uwn58/Z7bG9YU/ryga9TY02wYm1NpbiYQEkDGKAhcD71FIgAVoh83dB1DpviWO2J+V2FFSqOBVgh6Aufg681qfFD9sK1CSKMNkcSJ7zk+bke8V+IGUSJEDy89urMwt3vwNGE0sdmD6TQMvgqZdz7HRzqiZ3w8PE4rS+YWQstDH5/PIrY3vVsd71q7SS8+6TqXcqHjrAvauUaRFHpJKDazOJaElj5URdgsZEA2MaGW+FxbRaxUJTo5arzAwKTAnAHsIHEca/AbD33uPtXgOh7Mw0v0HognlA98dKrCAHpg/rIKLqCCnH1ueIZo1FYgJ/F7ff2FAbpq9x3JdPkYEjZDvkLDsUQnbRBp1HImSKSEZF5QouosUUqqzCWkh/oK6JIHvYAKKEiB8I85C8es+TaIkgaGiRkQfb6DyA8DA44AO0Xv1ChwnHotbzaIeCA5EkDQhfKX7Lnmd7XUmt/oqt97UujCtfokpQnhL5vLPDgKwV04zkoLpfG8DEjH1FwpJrESvw49CFusjJ4RO1pJwBDM26pERsoJAWQmjYxsG2VTb9scliQq+yNlWhCkr4IiihhzPbIaHdF2oFqM8eZWnOIChEZEGRVUCLIQVgwSJAUgeHLwEU/Gn7iDQwd6cxZB51Xv0kShepU1iPIhCRPjQUiEQhIvenk8gHlKLhxj5gVPU9RnvOvtgUE66HNoYiGhMDO9l4spgXIhuOQGBlR+UTv9Og4x+/CZZociAfSRTbq2ce06lV3Ie3iPMbMc3YiZhlY0WCswDVkhYPIaMYQgB8fdy8VHdIkXeC+kL6dtdxRQNi3l7li4j0GgZJIXfX0DBGQTAFMhAyY9OZ+0WH+LlSRVEVErcwh0DmfA62GZqt67OGQH9YM8xo13bj4SbzEh+Gf00zpMoXokF4UuwUdbcPYRKUExG1QfJLK1br2XkDDdiCxV0tE+JhQkJQfpIriUi+wV6cYbIUvdpHDpQj4KEib2qb3ZsQgT6uZykxmh5CBQE2p6Y7temeB+FNR/R4A2Bw6o7Pkb6nnKVBPmCZ8Wcp5ff7IREEYIKCRBABBDp0Kfx6y83h9VP70E5RDamIGxmw0ZEdZ8EURDMcfc541JYLWG7RpkZCNtSEbjCi1qSEtY0HssbE6C6Y/JGCQlQhFKDQ22IowpWEpUpijVBTSzLQOgUDJiUZEWJWLkVKEoKaKg0lJVGWBheiA4AEAuLAHBQo/ZiGw1Ph32OmI9s6Yr+G9PQEDYRgcZNkWEBnGDuHk2jgUgKHtUsUOh7yPtKCBAqD5/v+X94OEDbvA0XSpNgUXuSt4Q5/QRHCbNosSqoIOJHAUGlWn4cimdSoCDCLcQKUm0Xi+UNIuCjeHfxMBpmgTNA8Gwmd9tgA2HA6e7s+x58uGxacpSmKkXlT3YAoc8iCyRECAMQ1+VEIsDTjSjcQzBIIZLNoxhDX8PaZDti50JuSJDh2Kc8ty6CCx69Hy65zmfHm0oyXgDOL9d1MjGAqDSKRwfLZtjTLGj3q8hx9Cv4GBVjSjmEmimUxj9VECQLsp2/jMbckLOHiWDN8oaxoCwHXOftoeUhxJzqcnAL3ER3EqIlMWihoiokEShBYlEFClQikRiEFpFlQUpoGJJmOQpRVvMwDvEwm4jTAaQxYM0MfXUxHlAEHP1BvJcXacVGWNR+DMLc2/tirKzWgce9Ggg1NpgNGdx1kXBnfIbC06+lcOMF0HOQG4bXBINlA+yIqUOBdoBpOQyLRnEHjre7ZxznpKMSFME3y8mwosK886dWfKT8wIBJM46QLb4grfFa3jbG2+RTBgwbAgScc0QYqWG6BgwjUZ7WQvi6LB/vTx0JRtBzBlShhGoa2S8VjUzMliYCqBkyglUFhRRBkQRUjDOKsSVsYrMmi5UxGi6LQS0zsMLHbdJqVALxUCFWXGA1wu3agxIopJTCUqjFYIAiCXeG8DEqYu5TCl3qx3DqeB3hJvO7gcF1WpqMVdKVDEUkGi8IVVIE2bEn6TzaHQarRngSA2uhlskw0UlAoSK4QTTENcC8NUQbwUSp7yeotdDYjlFoJQGK4IiIBCDYMKuRfhj3D9neVC4TNM3iAQkJH4zJyL1uQBCQIeSxQ8tbEeJTlTdWfQJLKW4RWFgvXSaKSOpUgVmpAuWWTWICJTGWlEmMLCKE4FoGECglC5EDtRBQLoiwBEWLAUFkUFIsQYCSEiuNKhGIaRbhQKepuBykCxiumpHNYAloAhmuihCEv5evQEZZELBvYRT45A/9wmG0HEkA1mYH0449NT/wI7ideIpJF7ogMSO55snp6eB9A2PsSy+IXQMJPMYIwkE8qD2od3efHUNcrLAYUwy+DO0h5d57YnfZ3CFwpikMlku2gaILSfbgrYG0gwFCAQgEVJBBGCwRCFUBQYKCliDFolBRQUxJcTxxgvTGLYo1RKEYiAxEEMTcyzWC4J9RXBPOGLmYqyD1m517zaR2ok16VD8BiOr3P0/wjRkUGaoceHkbUP0Z49cSlkMjE2wq5pcsQjqoPUgn4CMWIGZvSzJt8eC7Rc5dByPEqQH8ko+5ShkX0aCA46c0yIHEOFKFgPvLvgpfoAD3hZDRSDkOCLyGY8piCP2gvZ9w4Kg61IxhCEYyMgcORRZ6IdPua9cm5AwYoLJQYEh9WCoE+9gB6gcQQUBIgLIb0FRAqpEQoIQirUTk3lLcTMKEcVT86OUEyyaFQq1KXXO3shkKXdpB1EXZZ8ScDluaznMjWAXFOnWuggVEuYYPqALjd0Jxh4UUFxh/GwLYUCQNULSGBkYOCqKQxhQFykKE40UKHfc2hAzME7mvsy0KNXTJsChKyTLHIj2AXusAwoMNhlJEJAfIqjxERV4LARvriQ6H0v+D8qPncHvKKSm2BQ2xYtJPCfNJxQIiGe05og/ogvWRAsQAIjOlNvghFwLhA1VgfSDOQ4Q5uiQgQdmKjziD0A+cNXA/j8dkil4SHQesq35pYliSRWUgTlPb57NQ82glH3eIQ3JF7okgtbzoOdJA/JQkBJeKYPf7i0aTxbIt83vsfcPSyjtBFfeiwZ25EQUdpMC2cSXCzQMTgAoGs4MligrQ0AyzbLEDAKGBYEHeqDp7RgdiOYj0BAoCCEqdl3xBgbDgBAO8xLEAzQ19Knp9Fs5D5cyeDbHV/PPm6Wc0TJazRcAYxIcEZ4IRrgaVKkOLIGSB7XzHmC6CAR5uIX+UWrnQr5LAmSkhEsvSOfFPH8dCG5JKaaA/gEobhiFgtobt9St3PGE3HiXSMx+/LwsMp39YNBRPF6QhiQ56aH+lFyB26liaCqqSCDAEGEEEAUigwJIirFIyAyQrgPZsnSz/IdcN11T+G7G1GnMT/P6eKQPaKiV1ou8niPUic+lBiQ9amImGfPdVi7FH0/G7Vn/pKVUXGvwp2ETaIdh9bppIFkWXa1eWQon4MtSVFoZOuKtMaNU3l3k8DFRQegkSSpCV/U+3sPjDiqFzJNGYSAMFBopIxhYnumgDBWAWqTDOIDHUJnc7sBWD5u6/eXRHf1CZ7qpnRhBENA3+GHrXVCz0cwrdJY/GEIsXvSM7L1gwDkWrxamTMdD3M8gj3MTjDp0OR84/CCEU8pPoLDBNelQOhW9qLDiMenQuvUuWoNBQ5zt7AbRZuJ/NIHxuzfoJchcjqwhqQftJKgmwaYmMLlRIKGROWIkkkElMKSkWKIMtN5YBXkNBpQSqRJKoGogaaDJQSbWXTVjZFYuC4WacytO3lEduJlq6EUDEFITEwYsDC6lWzSCBY3WCMqbB9FBXjjFRMSBUL6BpGHzIwh6QPmQW4Lv0nH077xvOpCzUZ90AomAUFAiqKJ1h0N5SS4CBUFwabkqfESrpq9RS7YQ+Ik0uO9rBHVJEEHw6QO6K7KPuHSdKR0es+PPh2J2Rm0hfF3mgNxcfITcu72WpJDuhIJwt594T2emBvOtcxIGLaeDgLlcS1SIMBoNGNqOAox0xMRjB9WDjBoRa9FKjgEHl8+KdFe4LKPT1E8TVzKTakxdmR2wYdMDaX6IUVQUCHETEV8+pRrvXYk+5KnyJ09ITQGkgZLhtY2a74ZMLMIONLk3xWkfn87stMQxsYnSXypF76tRpiSZWhSNqvhOusvyiOY7TyCB3JCR7AZYsL6Yr0gjtIHTJEhFaYA5KCF6BexB9YP5mE6T8mQaQPADUVyxTWDAtUQAknoU2JZ95joRzYiHgofwsOLoxOaPVJw6C1pmd6AfTt9AdDPdIGId/cXPjBFWAI1dCIrinwu2AVJViyklLQBcGAtAmnBUwEvMVCkKGEWBEiFIICQBGQRUBoGgUkhFFiyUQqJUoZSAygEQoAYIiSMSMKPQ9CRAikOchyBB98pMnre2xgpQ2uUhaFwbIM9z4hj9XKmhbIejyK+nDPWWl81MQ31jSzw92PC19p3lx56y8xlhDosyEYuF8FUx/t4jMOBpTGSwcdtsFdOzJHKQuLtsXc0q5G7QyRj6SJLGEXzIRMnLrW1hphUY1L8xAws7EZqSFh0hJShxMBRx4heQwHLZuUk4uBc1aehi/e+bHBCEob5P4/aEhpEUlkO/+iuYbbhxzYiuJlSvvHIXmTUZgwoKwfBm8scBl2kzgiyHZo4HJi1beGSoWedxs8luspccC3C1JLvKc3w5jLIgTStC4dot3t4oUhJhQxcj9HtDikhoUGGdSNJ3bV1mAPmrF0M02HkZ1M1CnAxrAA1GWsd4TWWIxtqLFl2br+hv91rsDDNkOzXCYPE0LDiKDOMwW2CAeUoChFjyRoCLIXWYIZG0CbfBraaFW57xtFmBxY8t0pQJcWJxaVCT6wQkKboclNb6xdsFU1YRJ2Hc/5rVRQgQTmUAmItM3oGYOBbtwawEiWReMxXg2hKmK+GKr3IebXNWFoXp6mG3bLmva+WxlZ2mDMdc5gAIIaQmXwLx5BnuUJpyHpSClPWlQBrsYYzPjMAvdzJwn0wDUAT6sFE137ugyG4wxgDZLMKzESj3yiyzulSWiMQVYRYR1AQKJjBRAqoWEsi4JgC5KCIbHvnOgOiVHiu7PYSO3wO8hcuGSoYIBnRxg3XGqbUGXVQH8+KFziUGRKjEEcMihVlFMEWSioRFnqUriLpxCxkQhLE8GpIKOQpkZcxRxELuqyK5UVQVEUE0wZFI6cC0IG46V7WLxtOYW3kgkW7A3NIeEBs0Emdc33A57uEwqqDUw6Tu60Q41NqMk1NZQSVNUSdiqiKxVj31vgJX8uf1tqYdBziZ+/QRHY7YQO6CTbVUrlEQQO2gbwYQ1NheDB+BPGoXteHikm/cF9DsDgNzQUOHk5yNaIgmh2G7nkoEdWqWBo7sWIcb4q8jB5cdXlQaYAMSKIKRiCCojoKi3YVPqEsuFEWmUVVJAGEiCRAFkkTyYHlCBZLkQZZ420eBjIS41QZQqUscBpII2IaKIQoCy6CSLKAEnSE1Zv1LOcaEWkrlUfOp0TCOYfLrqZ7ycYaGrBgrhc3bFS2k5kGVL+OkgBi1K+Uko+h+oBxqx8VZW+4xdcjFYRnejQe2q9qchdpUwuoggUyakhk0E0DoEYStInqPEdZBvftzMagAe/VC9D9xnSygTxh5RAPrPlgiYnxeZqMmciTTD6u48+Ho6eN+U3J48CYqZRm85888a4hMjdScmXVDNQFcT71IDkDthx1NyMfnMIGzAMQS7mKeWwug1ln1VgdB2c2PT2jsVitHecaIIMcQcFhLuVSKWtAz1O90YlQdDO3XffQE1qjFmiYgs40UIhoIcBDRMAwxTCBqy2UrkRrQa4FJkWqzFjbFmYGQiBcCuUcKt0rbZ1CHRWXnjuN52a4o2koCISGRhSEHjOApwlJy1l1m3CaFDAkMVlaIyMiAiMau3kUjJrGCCxeMYmjh0bahbhswylQMVbFaCy+3k3l+D2HV2+omJEh5gRKE7UqqmxTiXpSTMOBDVECHtBtYAQAsKh4VIgDOaMwGOqDiUQhx5YsYRNuLYWJEGMYwyZMUBcmUFGJARDNCm0soQNhDYiE0BApxsXF4kQ6QighgUYjJUid++HnI2NznOHs6acZCaYBYFzcyFhmEMBcpRhGLB5AdkCGQDYDaVTBEOreyMFcBQRkotdiSN2oyyb049GuoaDSMgmWYQFE0xtDWdtrGMGixamguMIOBZbpYouJ283rNNbhMHkFDi5DZlw69VjAqsYXIa44EvCwJ3qJvG3GgcYP43ipziWIoyI4hoLFhvvqHXynYSamJJqMgXlETxEKBM7ksRIlhguCAxYLIqNDgKIWxZYTl3vj0ya6FLilVoqhMSi0YItXYDOhsaIQtD1DzMnJPtwWMLQo2GHI5J89McZNtCWcRJ+yKO+h9/DhaTwiIJUItFH1PiwvBRXsqhDSQcCexWPoUdjIydAMQ4clK1KMHOSG03lzjQ0EE+UVKBKiCUQOqLSGSIFYxSumXKvvurhYULAMZNIpeBQ3SxhpJlxyQYUzGwUEMe083UKAFAoHPhVjITNOrF0Fycx0x7Uc4d5GsDHmYbCQTjgxRCijGxrDgoJUYoIMGrKIoshQdiJpiMs/E5vs7dxh4T3NQvaoQf124OmXwGKKSDlDkTQcoCDdU9aMI1ZJ5sDaJ4Kqq9ghuDgDT1lrSIzL9htsUXM58IcaUkQYqNtjbaNBEUDcygNqRD2kFN4+hZbNbPjORNuzpmPWbUgIgNNGlefIzhoOk6U0C77ljSRSQIBEIgdhZhQC6wICm4W5zazw9nf3dFMYSVT5Tu8CyttTLk4yrWRG2jIHIMYNDqXpUkWmJm4GEFMYIJcS1qqkOpvz8OGsPoOL0XIEg0iUbEsI9Gwbr2m1ShQMAExYyA7MmIMsQZcP3iQhExyfa8hQag3TyZNqG+l5hDfymU6SC5TAQ0BDRxFEFgMBGKoQpo4ESZ/tLkBSQMaH1SFjgPcPhcDWmoB0ExR6ICRgAe4g7FM0I7QILANH6FsegxickYQkBkQapLivxeX26XX2RNHiyJX9k8/CxQfLcpVmNskLSv3bdqwbX4qelYZy5zI3LD1sMUULnZh5ktCiPmligWFiSAMzCaeVYgjPI7z0NBE8PGurIbwZ5h0np/L9vr1gGVVFr+u5LGISCkiQTGhYpuYoWRLMtIM6jTt/ERCEITEW0+qgqdB5t9pcLn3PgFh8RfmCE8z0DgT1In16k6L8yFgsZYVAoNrBK6+ncTvZo96ZGeiC56bnFENWzXbVRB6IWQL46j6YGhUkUvEGF5jPpllaK7w3RAF1n0I5HrmxxMQ7DIwA3x7TCEIpAoJomELfFDve1/H0+72/Jpoq/tfhVvSB6QoWeQdEdtDvuW5CLVMYP2kMreHurVOU/fDUc3WV5UGeqmNZfzoxUiSMhkSBTJKGdUiSMCRUJBDd2tQImR5uu4SsgvSd0PuwhvKoQ3t+i7CVyPajCl3zFGJZ0PcZzuMbDV0UIJvu6NIIIaEtBHS6Ai4OiHNm5JrKL1dtRV6IVhds3AzDJLLuIHqsCdbuwVDSKbsMoZhko5m01YgJYOZcSK6fT2UeTgeFnvhJvQ0lzquwh/tPbAyjPV8gsYnxysdgZgQQVc9R8jRzNeRPvn4PaVxXd/mXTDwtmj9Gos2n+6h+nz/on/4u5IpwoSAm9HcIA==')))
\ No newline at end of file
diff --git a/examples/example_docker/instructor/cs103/unitgrade/AutomaticPass.pkl b/examples/example_docker/instructor/cs103/unitgrade/AutomaticPass.pkl
deleted file mode 100644
index 9b6ff7a..0000000
--- a/examples/example_docker/instructor/cs103/unitgrade/AutomaticPass.pkl
+++ /dev/null
@@ -1 +0,0 @@
-�N.
\ No newline at end of file
diff --git a/examples/example_docker/instructor/cs103/unitgrade/Week1.pkl b/examples/example_docker/instructor/cs103/unitgrade/Week1.pkl
deleted file mode 100644
index c9cb1a6c90f6486629143684d3669f33b39c233c..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 96
zcmZo*nHtIf0ku;!dRW6#Q?m`H^l+4<7MH{)rld@1o6^IUSX`W1R5GP)O6?R4Z$__$
m|NsB@X7FYy&0y@|hbfHD$V^E|&70CTC4&W|5Tu~ER1W}Gd?RiE

diff --git a/examples/example_docker/instructor/cs103/unitgrade_data/AutomaticPass.pkl b/examples/example_docker/instructor/cs103/unitgrade_data/AutomaticPass.pkl
new file mode 100644
index 0000000000000000000000000000000000000000..bbf2cc185121ca31d5dce6495a00fb3305814c64
GIT binary patch
literal 123
zcmZo*nOeXA0ku;!dUzd6OY(CQOEQxK5{rwc^l%lYmV_2K=YTkEQ+ilRGILX>v`uk`
w=wM*TVC)etNi8mkPlV}<FMz6LODrx<Eh?GPHl=n-24e<W+ms9zB%P&t0OfipqW}N^

literal 0
HcmV?d00001

diff --git a/examples/example_docker/instructor/output/report3.py b/examples/example_docker/instructor/output/report3.py
index d6d1693..71d11d9 100644
--- a/examples/example_docker/instructor/output/report3.py
+++ b/examples/example_docker/instructor/output/report3.py
@@ -1,5 +1,6 @@
 # report3.py
-from unitgrade import UTestCase, Report, hide
+from unitgrade import UTestCase, Report  
+from unitgrade.utils import hide
 from unitgrade import evaluate_report_student
 import cs103
 
diff --git a/examples/example_docker/students/cs103/Report3_handin_10_of_10.token b/examples/example_docker/students/cs103/Report3_handin_10_of_10.token
index ec37b0b494abafda3dd62918af5af910d2f99e28..d71c262cba1efe0065e284d35210cc8295abbc44 100644
GIT binary patch
literal 27345
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
a%00?Td`vTnlY{cK%RL=Iz{xEqQ4atJ_)c>G

literal 19550
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
AU;qFB

diff --git a/examples/example_docker/students/cs103/__pycache__/homework1.cpython-38.pyc b/examples/example_docker/students/cs103/__pycache__/homework1.cpython-38.pyc
deleted file mode 100644
index b50a31721d0ad5fec79b6d719fb1ef3fc5424491..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 833
zcmWIL<>g{vU|^`5W|8Q}#K7<v#6iaF3=9ko3=9m#ZVU_zDGVu$Eeuf%DNHHMEeuhN
zsZ1#>*-S-Fsmv*?sf;OXDQwM5vl-?xH8V0Yq%x<lr!u6lrEsKhrf{XRG&43cF*2lZ
z2Qz5$Br_se0b(;VFfcfSY~f*GU?^cIVXR?jW^85*X3%7;TEwNGprGKMS(ciokf@N8
zSzMx^o?8i`)fI|TOG=CKieci(`FX{e#U+_}=?eL23MCn-3dM=JsS2q%sky0nCB+Jv
zc?w0TWvNBQsS5c;DXB$z3a)zTdSLUR;_)DJHKGl5jC71+H5H08@=J44pw=iv8|xV9
z7{)4SB*JXeglN`ey2S$0c#8vSOo}FB6dS~mD;bJFzWWvLY!wq)oLW>IQ&O6d8sn0m
zTnctnOle+bNqSLYN@{#TQD#|UNoq`LMPhD2PHHiX5ucKuoSj+}lbKgsQdF8;l3x^)
zTx@7y9Fvisn_8Y<lx?V2P<e|7YB$&mpg=8V0);Yb5i0`&Lo%2R;xjNXfY=}m4si|!
z28J4j8b)yjaA+q%L%O6qUm>qFHz~EKSRo-XK_M|OMIj+6L7^lgvsfXmG%vX%Gd~X&
zKE;{21v!<lU@FN-%`8$VF3q(9hpe4KVoHieqE3>gf~`WLc9H@(JT#eZF(%$(OagNt
z1PcQL!!72-loXJYAdY7)0<mv##K-3*X6D7mSBXdFmli1$r52awlz`&cNI_e{NWoU&
zCCEQjVnN{81;u}&LUC?lP7XM|yaYwSOHeSp1SMxbO%`yNz|GD}%uS7tzr|Wml$loo
iaSKQXgavjLhfQvNN@-529XMP;ZsK6)VC7&EVFUmIci8m+

diff --git a/examples/example_docker/students/cs103/__pycache__/homework1.cpython-39.pyc b/examples/example_docker/students/cs103/__pycache__/homework1.cpython-39.pyc
deleted file mode 100644
index 0e7a0c627f56abdd78d2ba3ec05f9d13ea233030..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 833
zcmYe~<>g{vU|@Khtet4b#K7<v#6iZa3=9ko3=9m#P7DkTDGVu$Eeuf%DNHHMEeuhN
zsZ1#>*-S-tsmv*?sf;OXDQwM5vl-?xH8V0Yq%x<lr!u57q;M=^Y-Vg`Vq{3+3}(>e
zN@hed9>iv5U|?_t*}%iVz)-?a!dS!5%-GBr%%I6wwTMeWK|#Sivn(}FAyFYGv$#Y-
zJ+~4>t1A?xmXsFd6~n}n^Ye-`i%T-|(iQU46iPBu6^avcQx#HkQgc)DN{SUS^Aw6w
z%TkMqQx)=yQc{cb6kPSv^}yys#p6NdYD63A80i?tYAO_G<d^28K&?@THr6rHF^pBv
zNQBv_3DK;{bc+R~@fHWvm=sOMC^m>AS27fVeD^CxKO;XkRllS(BURreKe-g_BK^|5
z%#!q?#FW(df}+f_#FA9~)QZI1f}GT17$ZI<KRG+KNIx^LxTL5wxg@_xKe^b@z!+>?
zd45s0p<Y4dEgq=FVE2PUw3rDL#H>Z2xJw4JL3{=V1`r#B!NJYJz`#($P{SzB01oOT
zXfT(Q=PTru<|d^U6)PkpCMYE4r6?pMB`B0+WELx=mF6XvWaj6=0;f1Lw;-ny7Dgo*
zshLFz#ihAc;9#{=NK8r5NYqKvRIpV@)J{?W2ZkooEyl!Kj7eY)gkWJ{V7SGcn34i=
z62$S$MIiPqj`;Z8#LT?-_$u+p{L&(YqSWHjoDxt38!2cj7%A8)yaf5DN-PK*wV=pP
zR4C3(%*g>K7EP8SQ0jgOiiDS-(0Iwtz`)?A$pQ`<xD|PcxvBB-w^$2`GV@9xP6FwG
du)vPvu*uC&Da}c>0|zh2X&mevtQ<@ti~wmp){OuF

diff --git a/examples/example_docker/students/cs103/__pycache__/report3.cpython-38.pyc b/examples/example_docker/students/cs103/__pycache__/report3.cpython-38.pyc
deleted file mode 100644
index eb2ee51b0816d9501726d9ba85439f76b11b91db..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 917
zcmWIL<>g{vU|>j>w@UoQ$iVOz#6iX^3=9ko3=9m#aSRL$DGVu$ISjdsQH;4vQB1ka
zQOt}WF{T`bT$U&nFq=7tHHy`pA%!J{wS^&tHI=cMIf~7lA%!i4y@er#J(a1MIf^}%
zBZVWIsVFLyC6&FIp_!49A%!`ZL6h?($YxFETb!XGsl_GEiN&e6*n(0E@{3Atv1DYX
zq-rwW5>G8l%qdMQNsTW8OT-tKl%}NSmG~ut^de&>n9D^N7#LC+q8L*cqL@+`Q<z#9
zqL{(<vE1TyEG@~;O)SYw4oEC6PG&^X4`PEn?+o(100RR<4Z{M46vh<Bg-jri1~X_f
z`Mm_$p~-lQJF&PpwW!3kurx78lkpZyacWN5N`@j($o`6Twu%WYPAw{qDJjiJjd96O
zF3nBND=CgC&C4uFFG@^FjV~z5EK4j&jY+LY%q_@CErv1TQ}UCuQ;T9U^NLG~N|Q_S
zi(-<C4GoNAAYM1tE2z9BT#{N`5}ye3MtnhHaWNan$sngOFjgr#!lXbx)Wf3MPm|>q
zM|^x<Vs2`D{4K8d_}u)I(i{+*Cq5qJBZy294+8_lOJILN2yT!V$U0V-l^l#kAU^Kc
zP(X=|DCSg_6s9z$bjB#wRJL@+D0XPfutVbAxQgF7Si#W1PyxbMFn$RNRX<IRB3_W)
zd?13Kfq~%`Ye{BFPAb^)TbzZZsl_Fk`FX{+SivE7i>DwlIXgZx7nGKYA#Mkm17U%E
z0g7Uf5IFQW7+Dy(7>ht+ps>kJ%*>0A*W|p#1&=hNB2WMqF@x*}C6gjh2o!;m8rTV7
otq>=I429SOW`Qib#bE;pWIIqQD+YzE2qO<82a^D+04oP00DSz@qyPW_

diff --git a/examples/example_docker/students/cs103/__pycache__/report3.cpython-39.pyc b/examples/example_docker/students/cs103/__pycache__/report3.cpython-39.pyc
deleted file mode 100644
index 056c94d504a238f8aba881d205b0fdfb6f498431..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 1053
zcmYe~<>g{vU|=xK)J(KsVqka-;vi!d1_lNP1_p-WI0goW6owSW9EM!RD8^i-D5hNI
zC}u{G7*h^QE^8DkBZE6b3Udle3quM^Dq}Nq6k7^I3TqB~6uUb^3R?<$3quNfDpNCa
z6h|s&3P(0mQB*2xDn~OzGb1BI3TrTfCg)3#&6>=&I735Hi%Xmni&Jm01*I0`7nR&%
z$;eDe)nvRSo?4ceQ<_+k8easKh%YWFO-aowNd{>}#!N7WOE54nq%uS?rZ7Y?r7%V@
zr!b{3w=hJpq_6}tXtLg74NpzYHmp)m2+2rQNXslLE>S2fO)W0T%+FIu%P&$WPfg8M
zFw|2>W<)X_WH>7W1A{XtWDGzd!<fPZ3Yl6)Mur-O1xz)JDa<L%%}fgse3lee2tS1(
zm_d`xuLxwICgUyU#FUhmAOkb!{Qv*|CCFG!=3D&9#fApPdKvk-spa`a*@i{z3=9mn
zcoK_?Q;SMm3riDooHdzlu@tA~q=BVYG8FMLFfjaz(g$hLFDcDP)pyBHF3nBND=F45
z&C4uFFG@^FjV~z5EK4j&)laQR%q_@CErv1TQ}UCuQ;YO7^NLG~N|Q_Si}b-R(1!%G
zv0g#tEsm1Z;*$8ploU3Qw?PC0BM+khV-+7b4E12rewwVeIO5~;5_41I<8N`r$LHp!
zl;(igJn``$r$c4f<3YB@#~1N4FhHCS_5+0A1Brp`0HwfU5W&I7!dL_n@xvY23TTm?
z%96sA#+1$&#hS{N&KSj>!W_(?$#RPwlB$fW_??3l3=IqwAbbVmmm&-d41Ss%MFJq}
z1wn)mDBxL3GD~t&!M5Mxgr$$-Tdd$Py2VqFn4BG-nF~s(#SrI%A_Kw#djw=GNT?X(
zevn7F7>ht+pm54f%*>0A*W|h-3XdiuJp{7|ls1Z(K~4dM!Yx^Z6hc*eMruw$YEiLK
z5h(qD-B|=m_+U#Qo&i}8aS@mWa@H*l8%WgHfzo0z4+8^(2qO=Z00#%704oP00Nkwh
AzyJUM

diff --git a/examples/example_docker/students/cs103/__pycache__/report3_complete.cpython-38.pyc b/examples/example_docker/students/cs103/__pycache__/report3_complete.cpython-38.pyc
deleted file mode 100644
index fd64b7eaeca854bcf249c32cfe1cdf665f92397c..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 1097
zcmWIL<>g{vU|?Y9v`XB~#K7<v#6iX^3=9ko3=9m#aSRL$DGVu$ISjdsQH;4vQB1ka
zQOt}WF{T`bT$U&nFq=7tHHy`pA%!J{wS^&tHI=cMIf~7lA%!i4y@er#J(a1MIf^}%
zBZVWIsVFLyC6&FIp_!49A%!`ZL6h?($YxFETb!XGsl_GEiN&e6*n(0E@{3Atv1DYX
zq-rwW5>G8l%qdMQNsTW8OT-tKl%}NSmG~ut^de(sn9CIy7#LC+q8L*cqL@+`Q<z#9
zqL@=zQkYX%S{RxcqgYc|gBdj0Zt*&nmgMIqmSiReBo-GZGa{J<VuJ$0859r#3=9l4
z3=0@i7*iM*GJ!lD%%I8S_mYW$fng<M6nA2AacWVCYhh_(&Pv8xEXAogX)76uxEUB2
zex*5E#e^2878S>olxC#Hxa237=BDPA6vve2WtOBDC8ngt7ZhcdC6=Vdq*f&67UZNB
z!x-@?`N`R-MKPIq#U(|h$tC$kG0DY-2F5XvU@(qP&IhS4N!2T;yd_+cT3iyJ2=h;T
zL1J++8_4Y-H!?6*DLTTWKwj0uqM9i0Gr_&j>{rCjz`*bl6y`-73=9lKoFD?^X|T_W
zco-NMZV7-b%E(MfNzIE-OU%pxDJllLiK$8si<^*?`f0M=;)svWOUzA;kH5tgAD^3_
zQknx|^Tfx4!Wtq|#0#<)6jw$3AQr*}U>3+3MWB#i1%(EP!NJJE%)|&5!$?6Omx0qh
zY6=3U9;P&=bjB#wRJL@+D0Xn_Wx2%;Nvp<H{LaA&h6aWT5Wa%(OHdy3)8r@urJW){
zki&#P0m536S(1|qwmgcnur#%}Br`v+_!cWTW}|ot5|gvzGjl=dzZepXU{8Pvuup^;
z7#Khv21hOjBMT!JV-ZLU6jHf~nR)T?nw(Kw@Wf?Q1oBZ4IFi6Y1PX;BF_3dWK>^kZ
kaU$3X1Oc+_7KaTa$n8M6p%^42!pOtO!6d*Tz{<f00GGe^&Hw-a

diff --git a/examples/example_docker/students/cs103/__pycache__/report3_complete.cpython-39.pyc b/examples/example_docker/students/cs103/__pycache__/report3_complete.cpython-39.pyc
deleted file mode 100644
index 3e87b71662ab4e431da5c9b952594f5411205f72..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 1764
zcmYe~<>g{vU|?war;{kc!octt#6iX^3=9ko3=9m#c?=8;DGVu$ISjdsQH;4vQB1ka
zQOt}WF{T`rT-GR7Mh16=6y_9`7KRj-RK{lJC^mP76xI~B7KRiyFrPhzA%#7MBZ|YF
zA%!D_vxOmrGnJ{CIf^rtD}^hYsVFOzHI=iOp_!49A%#7dL6iF>$R(Q0w>U#XQj1HR
z6N^)Cu?3|T<QJ9PV#&x%N!4V$C7xQAm{Xcqk{VwGmWVGdDNRYuD@g`vMaIl9kEk#(
zFr+d>F{Us?F{Lm@F{d!4Ft;#7v81x5u%xiIFf=npv8AvDGib8kVhvAC%{Hu3PzcFL
zRY=P$DlSndEKMyg$;{7FNXsu$C{InzRxs34NM=N`iHU)Mft7)Q!5I{42B1)5Oko0r
zS}h|ZLk+_MrW(c+<`m{;riBPTOA0H5pTZE#pvmS}1Tt_X<1OaIl$4hs12gCR|Ns9b
z$k>(4QT)lph6cuZ8Tq-X<@rU~hD96<3=Fq;5{rvdi%MJzOA~XPS2EpVDNfBv152%B
zDB@>eVE9$057MGvQks#f?~<Qfnwy$eQmkK^msyftl$eqlUr>};mRORipIVWaTac4l
zte;p~lAn{96b}{9*VBW^#i!&aXQvkFXXX``6qP2I<QM6K9i<P61>^YSe2@_(sd@#K
zw>U~ti%a4YQ&QMKK>{Ke7<m{47_0ce;j0Ie#vP0b1cDJ9Y%GvqD`ID0U?}1Q5!@hx
z7es*k4-SMP0Z>@+!>o+Y$V^E|%>yYc1|@X{79PebQB-F^)%a<$-{Odm&r8frjgP;@
z6(66QpHi9wV)Mkug905Y!yXR`ocQ=6L6F5DLyLq!EQAxlERZ{jKw$w=Q4ESf4n`J6
z4pt^cuqf{I3knNF`b}YKVTfW*Wr1Y8X2vMi6jo3Yy2a~QT9TieSdy6>kXT%d611Si
z1+o>KLP74RVOYSB!kEIikO`EZgBdiL{J;UYlJOQdQmR_XSj30w6OiUx!r;J!=DYX;
zkcJdtP)vgoE(2qgB8p2Ov5l&lDAzH;UB?V@-AhoGE|LJbND4%NgB47Goh1Nv79@V-
z(-Jdt#NcjXs*=OvCM2bPnruZNFBFM@3>F0u(jWp9YDKaj7T6vH0kW}3oPmJ>6xGF`
zXyst!U}j<ji}~S>Of|H^D3v9JDUB(WHHA5iDV-^bEtNf;F^VIFC73~z^%gs%>@%+7
zcMeuCG%!?v@D+?-f}HshRFL~=a-uo>7HdgnNlq#_QGs1^ixXCc72je7XWCml1&PVo
z@tL`xlC>C;P0+k1$H2e<3IV9sSQrHui$G$a9Fd!tnHL|g$$d){UX&Q=A(%y=WKaZ-
zD^T#=l0`@%RK;hc<`kqB6&n?S$~c5$i<Ciu4YCR1ErhecEKsoD;;@0_L_1KrE(WDg
S5k?*+0X_i^4n_f14n_cZeuFUp

diff --git a/examples/example_docker/students/cs103/__pycache__/report3_complete_grade.cpython-38.pyc b/examples/example_docker/students/cs103/__pycache__/report3_complete_grade.cpython-38.pyc
deleted file mode 100644
index 29600ad002bee7bcffb89098df90876e25fd7158..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 64058
zcmWIL<>g{vU|?W7q?7nwnUUc!h=YuI7#J8F7#J9epD;2oq%fo~<}gGtrZA*1<uK(k
zMKLjg#F%rKbD5)<!EDAHmM9jmI@TywFwGXl2Bz7g*ugYM6bG2*jN$~-Tv1$LnmdXc
zO!GwXq;h2Orm&>2rgCKQrLgrfNAaifX9=XRr*NbSrZA>(rf~JLGBSY0xKnsicvJX#
znW23C6rL0TB)(t@Pl^x{UpR#)MFhf6F-#Fl5pQ9P5=xOsk!)dz5_V@ukxG$nVMviq
zWz7<4W{whdXGoDrk!@i}kxgaI5^H9T5>GKokxx-*VT_W%8wxOAOGZh8eFgKqRFo8$
zFC8Tfra|J0DM~F2Q8FpYDJm@tQL<ohjwlXjD5#=^f?5hsiaNvx;1JMA;Yrbi@KcOa
zv{JNN7^CD;bW(I%7^37;^r93}^rIA045E}$<x`bX6;c(OnWL0b*|Ss@sHUndWQ<Zz
zl}lAlRc{8xC1WsyrpZfC{QGG#-r^`pOe)PuEJ+2iQxZ#3OEPm)t3+MP5_3uuOHvgo
z^Gk~qic$;mi%RqocQG+AxK<?Q7UZN_DR714D-@OHDJ16PD3qiYmlP{x<|!mX)mkZV
zaoH&pRF-7q=P4u>7iXsD<)-G97{;d*=oM6Q!Sv?m<y0yZmZlb$Waj577%AizA@TGK
z@tL8ZTc}`!#}2SO$Oymul2nC~jLc$%;^d;tf|6o|l>F3Ug}nR{h4iAt6jU!Ngydt2
z>L`>Jr&=L71`-~I@nHR6|F~u5CFbN*>VS*|*_K$MkeP-YcnX=t3I&NpB?|dz3W*B2
z`6;D2sR|keiOJcC>8YAJ3W<3s3MCn-(BOkQRiP-gur#wM6`{2xBe6sQs!Io~K{r<+
zzW^M3Y57I45YJ7lR7gq%IXkU1M~}-bzepi7uec;JFF92Q<S-<g(lT>WL5|DJQ*g;o
zE(OI>v3_!XX;E=%Jk%n6h<}aalk-7QUy`a<PziBy0;<9UkU@zsM?iIhotdYQoROH9
zo~n?NS(KVwl3!G*P?E2pj<7KS90En9dC1|co2!6ofgZ#qhFo05si_JXB_##LR{HuW
z`N_q4khG?kUzDzItY@iTTAZ1euAiKnl9QR2s+Uoco5Q8a9L1fI3P}W+`FT-nsRfxi
z`RP&oY57IDi6teeMe)fwiN(cLOuB`?811Vx{6VQR6_yjgNeG@+HB$A`^{l{&OjDC3
ziZw5>D82X=OG#xx>Miz^)U?FXoRV8C8L2r1ReZX-#TohKsTBpO$t9^NQC!6(`9-Pm
zB}JvFRSLlw`Q_kvgh}hCq!wourKTtpr52awlxQ;DVoOX0#cvTi0|NuhFi=dCmZYXs
zDZvd$%quQWErO)E<ouLW1*n?hDh^%U(!AW#lGG|Kuxg0Opp;lpl$lqep{J*(2~wS#
zn3n?1#USlfoVvONiN(c<IXP7(j-@5}xrrs2$)H5801`%Idp(8F;?%U#9EI|X)I5ch
z)TGk%^vt|;J-1|#gF)pC2=g*9Fo5bAXHY%k#>l`>!mxmGAww;D4Py#JHb;?H4SN<-
z3PUz0gjLI!!dSzY%~s@;!j!_?!cfDwfH{S6A)^aJGh+->En_WH9!CjF4P!H7En^95
z4MPe`GgDDb30oHX0*)GnEY5|D#Wgjo#Wf{dDXd^oZir|KTQhSLV+}Ld&aN8vES_5C
z8Wu2bMh$xwZ!Jp+UkyVIV+}J8Lk&|3dksqsdlr8UdzL^Aa}8SxM=w_lQ!Pg=C)CyN
zN(56ln;97yN`z{_bPZ=MSBYSWPz_fzBUoH8g$qmzFAymaULd-VVIgA*w<JTBSS>f$
zUE(#|3qf@)Pb-roLkh1rLoE+jT%v|&A>#zbBBv6;6h5#Cf+_qpJfIT1L@-4FBvQi>
z%%CagcZ*RknGqDkP|U=@z`(-5zz_@yX%PknhIED+hFG3j#u5flcuiy~WC><i$)L%2
zi#an7l)jks3~n)&6@l6aVB%MfvsFxJacWU<Oi5`*Y79J+#+2q|mVnE=_=2L$vc!_q
zm{dq@Pz+<lr{pJRrxwM4N}HlmP)3hQE;ckUj)7!cL=gfnJ8yB><YX3?fD)^n0m#W9
zx3e)YF;r>8vR*tyb9`}0X-aBdiJnbPesW??v7H`5XOsxY08oyIhvb8JP`Os6YNy~@
zRFq$2r4W*ls!&jrstZ%508yp@R;CZH5mGBMi%awroHJ6BvmsdtT8cr+&zzh@P*!x)
z<h;cJD++E2f^v6!K~a8sQEG8<d{Sc3E!M)!lGNN=>}9D%N%_U8x7a~hCNU@H7B5&W
zEU!bkFgM*|gJjcNJYZEN`8n~aMMYI&0Y&*`nZ=p;d5Jj+&@jo&&-=xw@Ddd7FaQ4k
z|G$b89-vk6;2IBFaf8Z`Vug&vvQ$vjq)?e!qL7rDnx{~dnx0u)l3J9Sq6ewTp?rv^
zAtgkyjzU3BYGQFJxSj{q8KBUzs$#aYv#ZkZ%mbHO#fiD83b~1Sd8tJTiNzr83Pp(^
zsmx+<;Oc2g-eN0AEGkYdy2S;i<H1EGW8p2<;)0yak|J&f28LVg8HvS-B_&0-nDUEn
zu@oehWZYuQEC$&ZB?=24Xw(*i<MtM(YejM@xaPaXo|se&(o!VOz`#%hO7pk)p#hZ&
zO*~QHFogv?ga<SC7Av?MECS`6TkM&6#h`*ZiZ4C2B)_yIwJ5D9F*mh1iYK|Ws3<kB
z1kAm~0diViVs7d!j-<rmR4|JToO+5id2g{nQf!d`$UQ<J0`9UX;mq_rQ2C#mSq!S9
zz@90R0EGbyIAGYJfq#puBrz!`H9jS=Br%E=%#LD8D~e)G2U!iysStt>q*olxzp%`r
z4a!m$prV11gHec)jgf;<iiv|shEa@(1I%M%l44}~&t=TP2!bq(Jd7MnB8(D@e2g57
zT#OvdMW9THQNXY=Fff3NaxVr3h7`sWrWS@8h6M}@89)VeEn^Ae0;U?qg^aa~pn@`m
zp_M6xIgLq@0nTGV;jw~vY0SY4nrwa;R<Xg#G9_49CIvATY#bw)WRhe^V}_J$n#{Kt
z%WrWM<QErbCgr5w;>b@bNzBYkO#ug%CQ}ip7P`fl3FblwPyiP3GcYhTg8~a){z#UB
z@;<iGrU;bpili7A7+!+Xj3)CfHc%@ewfGiOUO^OlVsT<oQDUVgQ;{4fY8W#h)_@CG
zkX^S}!6r9?Yy<g@fk}vwi?PU(fq@|z6jR8U8OkY^VPIfL1^3IMnA#cA7{P(g5yjlj
zz`_v463n2<d`mbKRz8QMR+I#lg7PFvaDog2VUS;oLCLa&p_w6zv4*jRsgDuVwF_p@
zWc1Tyy2V;tT98_Fiz7ZhGcU6wK3<dg7E5tzPFj&J$U|(|<)D<hlJOR2Jfz7K9}n>&
z$ah6H3=9k%AisgahJmq428*-w;3l(zYyoAT`1o5~@$tFfmT`RiEuQ%J!qUVXhz!`w
zTf9))l2dbXU^apS)gF|?z;;_PFfg>k?B-xB0`VydQ<31*!qU{dlFY=MkksN5pZvs>
z)S_gt&!8~_ia}7C0R?Pv5Cf=X)6B4d5uE&)(iv)*YZw<Wfigy{QY}jfa}7%gOBQQ0
zQ;|doTMY}Sy|R#@nX!ghoS~MvP@;ypmbHc{i?fC`iz|h(mywa7hAEgqlL^#SW6n;k
z)Z{L*21S8DdTI&CJ<f^6seYj1=@xTtQT{Ei%;MtGBycPC76+)d26fD$IAAJov4E;t
zP=KdoCYQv=-(ty5tt`I9Qk-8@a*H)HFD11?ldZ^>fq@~47o-zpx-+Or9K{9V#)BfG
zIEpE!_!gsclmJL5Ik7l3J~y=_BR{3M2pkRI2m!~1I|Bnl4=64`r62<%4-=?x;b9bE
zWMSlEtWw1muzKj;(qt`i1VyeBhyWEhMIcj)TtHl~O<)3SG1yL51_p+1ke#3y;$SQS
z@k5e9jZbK7F=#O`Fn}7SAj684m_gA6Ziw>M@D!PpFl8}=GFA$6FH<dF3d;hP6xI~B
z7KR$W1+1VbYzCES{CO-X?6v$QY&HBT9O4Wm?BWdI<{0k+jug&?jI{zKY$;qd0#H$g
zEY4cN60RDC6z*oGqP7}_EN*Z!x2;Ang$KkFXE0}|6)a&(;jIxAXQ<&QnwG+s$CSbk
zYU-sk)C#2t)C!mIEZ|wlP%DzjP%B!(+ssfa25P2e@i#NNFic>KZHr;56^~)6m8g{j
zm9W{IMNewPQ$VIMW-}K(DLhakwm_gpVj*L#R0&s&M2b)|(*(vMrW%O_f(se)SZXA)
zgleTzgrRz*)0o5<YGq2;YGhLQQ$%_}g9f5C67j+*AQI#T*&3M=(Ri^Mt`gCB@fz_G
z(Rhgx$rP~?(G>AsrUg<pQVSVt<x(VS<!j`!q-zyQWNPHHWSbdl6=5teE!WH_&H!e~
zgIFN7*-R4{i>H++G%?mFq=;s-Okgb9QleNRS)(YzkRmC<P@^Et(9D>}lp<OS5|yk`
ztdXsePLZ0!S|eH`Zo^QcSR)ZHQlkKNtu(|xvl-?x)heaP)JSBB%w|ZDt&yC~FqfrP
zxrD7oDMhYExJ0H#shLp%<Pv2NEy5tqP@@cqy%M$*8F1VREl^64N0^6V7IQk&LPkc0
z!UHABHKNUoG0e3pwF<S0C5j~~H430^K&=9ptq5i-)+p34#0%Fb)-c42Ks!OaHK4Sk
z08TrKkhrc9kzi<MtW~X1O;MC$s8y>`tx-!+6k(8Hs8vr<N>OfMsMRQ8OHl!(vlLZv
zh8m3;wG_2xCUJ%obudpoMFY&!g!rTe<O8h~{u0$1hAa_Kc&EsUGk|%*ARfdIHHtL~
zX-qYuDcW<GYBg&#YlPB3#gC3(6ep+<cL$A^M6smg=jUoNMzN&j=at-I<U*-pK=}^T
zI0y!1LIqfjEdl9$fHGP$sK3Wj#8Sfut*;ruwW%i4E#{omyj!frB}JJ9@M<~-Qm=q>
zIXHuZs;>DUvq8l!sGA_bP^FC4_Q6(VLp%WPyi_qMlvN3;rs%8Y>Z?X7sCrnb`dX<5
zS8)cHBo>vVrdTO}8}7xK`FT~G3T3H9AeKTEH*`!aGcR4CN<yQwI8{Mc7u3O501dq4
zgIl7-nztBU27n4DP~+ehAFPiMUy@mplUl_e2pj5B&9qWbEe7?$Qu9*40Z?Shz`&r%
zbc++xXUHt6jN*p01i{7m%U9sA1eanT>@``73_-RSfe2$zg}@5xa1`HSg;>O=rKP0+
zx2&*8l7WHY7o&a=Cuj(P3n5X(0rUM!P_2zpuYqC`RHwmXvV@_Ap_ws-QJkR$gc(wp
zvYCsdQke6YQdq<pf*CYf{lFH18%DPni;KcQK4QGZTwGG5$y8(la%%#J0LLbn07dC7
z4x60B+@zF5J8eb=hR+}$Rw?3%QHa_qZfEFVREm{C6_bKS6kBd)9%zh%Nk<`ytvEF~
zKQHAMqh=IqNPbCT4ya920%An5r=*r7X66)Ysuh8JcZ)eMAJkl|Ov_BqNiB)uh0yVk
zF`-*5S^1fHx46I^70^ghagjQxcI1waho+18_*)#sB}HkVVbh{mkncc=z9<wFCoEt=
zP!)8GGc~U?H?=6SBsGc?mMDs&M04^JQ$Uq-v0G7oE{FlDaf>2A#(?UlB6$2pafgE2
zbl@?eTfBvk1O@7b=am!*f}F&bSDKrYS`@_(RtPc+(g3{0TvVDD#R00Ui-St@ia;%t
zD9+;2<mA-i;?&|>Y^k6Qa&Z(#T4H8SX;EtNEk4KM;?yEgKNsA0hV;+a5(^4INfp#c
zjbh0yF3l}U1Vyh_kq*eUpenuy)S?9UzKVoFVxk~I3`BrBKezb6omx<aiBHQ(Ouxle
zoSBmfbv>m2!<Ceo9-om4YGD<nf&9diSe%@h8J`61UEX3$isDQui3b%BdFe&ql%x*|
zW~Mx!D0Yx|Vo^yHYjJXZQR*!=P{^hh-D1oGx52@=C5pAUG_xc%imecwNs4koRxlOD
z-(m*&nz0HI+P9dB4R0|O8$~gd7e_Irlti&Z(pGU4J0xKhN3j&-6y+4@fqVx}$zTGM
zoQu>L7#OC5N~khWQfB1<H+Q6%SQrHuxfppE*%(C_`548RSQuFtL2_(N5-cK&OpIKN
zQj7v%c{WBCW;RAPMm8oPCKh)#MlL2THYG+8um~Tc5Tgns2csGjA0rP`H3uUXlK>+J
zxaX$Bq{hg{2zCQXW(Fm7Q051vs$x(RsDz<}F@>?2sfICyshO!?pq8nIX#rCW1E?ko
zXE0?5WC&u2U`PRFYi7S&Ecpegc~MN|C7R5)*wa%>z&&;5q$;CZtmQ?SC8?UsQ5;#t
z`FWtoxy4$NpPia_i!lwY?7qdGR0URT&&a?~3~DknFbXjifjV6%RR}0K!`-@yk%1wT
zp_Z|R0p!9gP;;6oi!qBSg)y6{$S8%W$f$%li)8_*(af-rv6dx;xt29gp@gl5DT`?V
zdkV`!#uQdbhGxbrjx0_PtCl5&sg^Z`HH9IEtCkH+bJw!hu!GxI95rkUcxyOP*cLMN
zXVr3+FfZV%VF3*~#zw?2*K*Zz*YecxxG=<e)Pibk{uK6wj71Z`_6yW-)$lH4s^tUo
z1i>U!49sQ)nX{0omcNE`flv)!4gW$WMux%(g-wXCuHjf9yb#nw=CEO?VX0wE;k03>
zVXa|I;j#e@NV0%x;@AuncZ4C_F@dp20&EkC-8C#AJ4-~sGEn!V@H8{^3)KqL2!Mto
zYZz<zZ5R-)n7~*lF@dp=E6)I|N3ez&W=0J&ew{U-i6vgYTWpXnoLdOEwt>`bpvtO>
zS+Ah-7JF4@0ciZ<7I#U00c?Wd7B56kd}c0aqN$1-);k30U@X!U19e$Iy5i%DKogaa
zK7k@A^MM8hZn39i7J>REpbjL&i1_#-c~IHF5g!j47>bX-#R_H=wSq*MGV^b-J5`pX
z7JK?fu}5VVxMk*~-eM_F%*npRk(!rMT%K8yQIr8v%3hS312Ung0mS1-Pb~rW^owdi
zT$ZBL#1u`zTg;ic1yP(usm1xFMaikfw-|Ganm~?g0}-I^DA?MfK2U+fRh3x~pH!Nb
zmRfX+xhk{Z7E4ine#tGCl+2>yTdW{Y7T;n4QBkaEV2eSWmnfz*jNHVRo>-ERS_BQV
zVrNjM0(FxZ7+F9C2#WwCA0r!+3?mB*2Qvo~2O}So2zW?`k5Pe9iirn2+{3}d02<_B
z<YAUz6k}8X7b;?mMROP!7!rRmGBAV|gC?`!Q)i$#oAlHY$haS<oCVDxKnEH@5vQjB
zn;jgTEF0pJWmP=7x_SAqLG3D0m&{_&Xruy6L?J1$s2DUylvrAlpOctWB?6vWa)j`p
zlUKzkbr7g|058|?FfuUIFk~^*GJ(bl7c$f`moV3WMiRjTTQ$sCEIbS~%vr2F3@OaL
z>@iHWEVZm9Y$+_D-dG7+3Tq9M2)Nf>!j{4Y5i4P@VFmTD7(w*~8%Xa2#$u%s@N`f!
zV+wmVOVO$lwiFJKYS3hm3q!0xEqe)D3TF*_78j_uUDyEXxkKbx7_z`qM&=Am4DsAx
zQ@A0fOkgZhDq&0E2B|9n_uxUj@YoRW#1MN4Zw)(miV8Fl#FxdtK%hi$flv)YmheKx
z8m@&*wcIt_HJm9tHVifFSt2!@DZDleHJmkUH5@h!C2T2tAko<jbD2P<7oMqMt6@pu
z2bKSzDXIyKMK&dTpi&!DA7%+>iKGaCCX8xWQUoO#Vwh@qYx!yzvcy2+3lkWNvQj|y
ziitDiF{KFC@~4Q@@YL{v>Yg+fF@{=!5|Hb}YZz+;7BbZelt|PFq=<rR2Eh`^1yVIE
zHG-fz3Q;paL-YnxEQo<z2@XL4Q23RwrHF$>z^w)eKerG~wxS|X5r}9B7K6B;3cjcW
z#DeroY^wyo^XEvD8{lfA%Gjw=p|k+hlmm6TKobyp;I;*LVnGKy*HD&Pl$lluE|EZm
zX0g>TM!PC6$D&k)<f7EXlGGIa-29Zxw9M2Lh0MH^%(BdsQt%vRQYBbBXvso)QEDn^
z+FJos>MOW}gcd7+rnMA`N^??+t7JU$l5<K^Kn?&~09xe$ag&~&-Yp5pK!1EuDrjb?
zEHxf9H3e!q-(mq(NL4JLj@T`BXvGl49-onzmy(%RlnSZ}nBvR8eWWU3)#7;7%=rAY
zc-2hRVu&AaF_kA(*@KoNq?UmEl9E{h?r1`bTkyONe0~PvAaE#v<`i;L!69U&P^BJ{
zuaKOWTToh@ms$e$V18+dLSkMeXbD1QT4pkMKC4(yQ@RM$TrC2PG8f5$q6XBAjp9NS
z0a5JGoDS{*f#*sfeF-5%xWek9qE3+actFGFaG@NKp`ePT2wra&O#+E&fYgE-m7w57
zRPVRg(o;*4%TvHzDR5m3sdL#1GLy4GwRK8qZh@u{xchO7E5Ed)ptK}DC9|lg0%Ry?
zoEp+P2XzsO7J|g4fvRlA>?oGJ%-n(^aNP_VNr)0CNUQ{<vH1Mbl6cT$P81tt&H&sY
zh+;2;_BcS}^^kfU+}H;bpcelvDQHa$iG}!*{CIefw}Wcs5Ku<|JlO(j{<Hn#Vg@(X
z8F`plK=m@TR_0(705{`>7<m}Qz+xOsLQEV?T#Ot{JWM={QcR#4od-N|1DdMgVk}w#
znlS)1?LiiRFlgijgu%^xP=~vOA%(G-v4*jPv6%s!MVS^bmw=ng3qeDf%#c2P4Krw#
zy_cz$r3N&Uz~Xm{CAA_oIYg5QG;;|KoLg+5P)IJ(WV^)z>YU$VPtVCuO3W!PS^^4I
zR!{&I-(pPyHL7m0rxoSrW~5eVvKB1>$?`#RiD5h>9~7+uMLAPJ4mk4AdkI1iMe(31
z<V4WGdr9hkP$+VMJjf^jf=or5KrNIN7Z?~a!7WCG{9-OHWd#?1zYz5j1*lkYNoiV|
zLPly)szPyQUUDjI3KwH>4N_;Giz_8HO(8ikIU_Y5+*i@aPs&P7F3|yJDDVKd4roXS
zG^=YHQdF9%X~m_Wpa8QHG@}Tf1coG1uvAK(f~`V+u^y-~rw47QYJk!@*fdSBn#?rt
z>?}-GDrgqESR*A5YC6b<{9?V_?3BzRkSI(KWT+_BN&!57si72Jlvx5QsKD;m)6-Kz
zayG;wa1jUU%pqK$qo7`%q^_f&37Wo5gLnsIA(~(GK=}<38aki_BLyJ8X6EPFD&<t=
zCMrR!$V`I;5ZqlZ`FW{|N}62Ap$qjRA|N0(D<cA0!B!zTFCO7gP0-3Eu-D=Xic-@u
zD-=?5iXkN(I4HrPQj}U!T9gM5Zwy;d+yH96Bbg6z0W|fXd0#<U!4s0yzzHfTH8~M9
z0ti{;1&jX7JcW|{0&p>ml%^C)64MpRGjnnjKtn8gU}sY5&CE31UW9l96on;4l?V<<
z0DJToC8?uFK1eYLLxU47F!VsVT_X*58USfc1y9c_z-Q?}$txArInZPqQUt1=OY#*!
z#wsK#BqgROKr#?GF(@RKU?yac4Im6P!ZQsV>Y&u502--EEGh<dR+3T`K(!WP=~8-X
z9(WWk1=4y*2CY<ptVK&n%}FguRmd#SQOF1NtI9KrQx#J3%k!X)%1bQ=rEAbwFf^fq
ztOsF;6H+0mA0z<6$_mh+gLniQVh}Z;WQzz0s5-y=yi_hOE-ob{C9d?$5{1N+6a_s6
zH8lkgCpkYiH?u@RH&;Q)A2QIa1d}Q#EzSV36$&y7;3ZsoW{GxjafX$?etKq!LwaUO
zPGXWCC=yFcQuR_wO7&8*^-D@KQuRS|gy2DOJ&-lJx}^nR9>f{S3ZQaaK@XO^A$bp!
zX}F-71f(4_vIyhnmF5;yf+9Mv047viS<D4CCNm#qPH;(4W?s6dKTJt-eojtmGN{#5
z3==9!g|SL9Ko(}^rNadZQ*z<#%v`uaNI=76GD}j6O7in_;3k4<h}_De{L;J>1zQEk
zh_gb4l|o*D9#~MLLQ_Ej6l>rWmnnK&pfOGqmBppG8WoycxoJ81`9&x)c?Ei4L69`K
z0x3={DJ=lCM&gqyAv5F}&N`r`1xO59sDs*v3bqQ)deB+z_;|f|a5)wq4=o~K8j$J_
z&~UT{Ok76+WCkQnDT4|}(3)0Q9g<lLsw`kip>`^Rk|wC+$W6>n1&uhs&4QQ$O^YyH
z5DU1tz%vjE9+@dAsd<ou3#uhEGE-7DK&t|vhJ(z88UU&pVcLB1)6-Lnpfv|nDM&kP
zj0bFljsj#z1S$_Q3S_cgNor9pXlbp2twM2Sv0iaWN`7exIC$Vna`Mv^Y@yn@z)~R7
zA(c1C3>}5s)Z${$DqD!t;TmCP>p|4QRDq3vE6T}FN0$dH0NIh2Q(Bw>c0Q7`l_6`5
z!Ey?anQ_pn*u2!#l++Y(3m&pkRlyisgC>?_CS~SimQ+IO1(3a<wPLWqb51NMDFx*g
z4baRz)Ebc8XrZSCT9Bcm09ij~>z0^PoT{Usr3G220o4XF8x$aV5LF7cP~~9%fF(hT
zJ~TApYcn*UrozoZ1aEwNY9468Y&_WeIts~Pccy~YtK}CJLt91)$_gp@dFmw!1)x4h
zQ95LCF}OvB@GaOy@sNnc6U(5H<;=YF%zOn~1z7o^0ZFtVr)Q=qfDM9p4H3~GIYh!y
zuvLJjMzCVInFw=Gi)IYnsM;XG0aBC+YBPdj3KjxrE=bKu(~Ac!w*!?MQ1_%36~RLu
zWClbywFsmH;X?&wh1}F!(0b{Ne9%H|w8W1Z?w}SEN<_ddfaXh(`ysA|q@mOb(CQv&
z9D-vTJ*}ixl%(dRfK`Be07{CP`JiPQ;9*b=O+Ccan1&`I98*$rAQ1u&V~`g?6-sKV
zLTQ0QaXx6(AlPGYH$nmcl)*vi02*W<E?fmHmQj6;7S`Zm0uqcM?}A(n3Tjx63iK>V
z&DDTaTza61GSH+O)ZgHlAq86naBU27GN^V-D+M*-5kmPn3bqOcU{`^5F64rS8R9{6
zeIQ{y6C<z;sErD(aZ}=<JxpYS!Q+ES3s#|WpmruGXMxswg67Ini$Lud&<2en1<=qd
zWJ<Ugl7GrmGt)Cl6l@g?6+p#KssdCXAJQ5sgw8hWAxAl6K^Hheb>N#VY(bvWQ2?g^
ztmOtQ<V*5%6zmiXz>D?4p$iM2%wlkup~VF#5@9NAAqgT8Jh|v&6a*bH0S6W+q*HU?
zmZTP!fWn+aGhIRJ#UNe<nFn?rsDgy2CP+<;UeAKmDnr~BpPXL=+MWPiXo?hV*d^d@
z2ipY;ZUtL-xFWfRVA%?C2MEJM0kmWQRCR#j23xp-<)NVp@+ZVHaK<i9OiPVVPc4B=
z6N4ign!u55KuMyIl%EON7=vjgQURiesSh3y$jZPbA{+&Yc)$FjT(El}od-|`&{2Rb
z%hgdR$<G0&MO4><Qk^X%Q=$e0SOOAvCHXmUSEOX7r775gns$jv#Tp74c?EjVHJKW)
zEUBrNmXlbb3swVJuBicYg(gH!0a2Re73D&VD=sW50htDB3MznY(b7^d($s|b5)`)J
zlmMPmhi7n*)}ma55>RKqC|AJ_<XKejKzb5sN`Cnz3aOyf3?8uq_bPKzixNR&7}X{D
zIknabdHF@Tpvf1I8&Zo>K{Dlu#R}DVMY*+DyC-Q%t~uaQPF+aHCKEIP1=3fnPz^Ff
zuOuJT!qCt}*ADg&B<{c&3?72W(Ux1BZcEtNpb-F27=e-~#6%yXL6H^|aHIpIBmfQu
z%y=!(%T27%00kgY8URHwk^}`YZCh)tkdj)K2_B_YfW$D8$+qZ`1xr8!9@n<DIttZ!
z=uQP^P~_N$RRTjL6@VgI!4{J9^%XP>Q*|vAw83Qv&T<ASk5R@bXcC*cK&4kwF(i>8
z$|Oi40~JJIM}bQdO;FuTUXd~+3XOuIR9N{9tDC_o2dTC|u7FVLDQFW6QVfIAAi^+Q
zW+^KKAa)FarZgeb`=AC{CU{Z^G^7mO`wChQ2-*Y(S__z-S^^%1O#}}tC=}(TYeL#<
zpu!K*y92R6j(~ax+TZ|t2DKN5?6pMDkd$A3i6>|mCTPYgH3hsvOG63N#!>+7+5>m4
zkjq(+4AfYtT`7oy8_95R`36#)R+@*Uh=-PLASZ*G6$Sa3c_qbAbD^WquwEy4nHQ`s
zMG=HK04fOSt3f&7O@)a$IWR6{aTtsT?|~u`cL8*R2dMQ6E>}Q73bO&)n1+jk+zoaY
zOhG){k4RwvG67P8D%siDDMW&{K0_v!tgvPem|@Vs0cnR@1Pg$8M6&|nc92RWi(H{Q
zLlq#FDQM*7m!w)LfHv`hH*SG9Y!wvcgIDaOSSx@A#1u+WD@vd<8JgIg2Xg|F^PtUG
zc#9ayhbBK*K7a=s#`tk&8g$ISN<mp62(mdj1(Y8^BTu=R6$&N!>8YU6Q^<^j0(c4r
zk@i9U24Se*(E=3~oG{lx`B2AcK$8oELX?9<3^Rj@%6!naY4C1V)Mx-X2PzLqa+uN}
zB~TZ~<k?aipalZRG7yGXn5GmC+EiOoR0*2aDS>Rb2jx-)$dH_RH8|gbTK~1`pb70F
zNGSjsG%Z(1%u@ijSge$E6wrpJK~{h;I8(q93Mf;6`#*@#1*w5y=$LOwQDSmxQetv8
zJej~0fM|%j;cE0C>uBRsE0U3i2S6%e7@|Xo+Tm)8C19bIgNA{Q0<8Ez${etc7rfyP
zO?i0wU>Hhm!Gn6BUJaz80eKQ+Zbp82JS><&ryPL89h$&XP?H=qJYw>YJb-Qlst&MW
zFw?O_B1|`S`@p(kQXt*A1t9k$(g3zn0F>WBHCbX#4ys!~9tNjLP%4ENvbHeu5p|C(
zwCq9HLwrugl~dtCM~}n=u`EpqG=c;xxxo`1AfIE+pDD0&Cvp=@k~84FUQo-TG^a#Q
z0c;X9$0C9S6rvyuu@6f=CK!Pr-5?BBh$o$Z)L_jbAPEqLNg870A8@?~S`i3t6Cl;8
z7>NgwI1pYWBIco1Lq^?@++qkH*9!ohWdI)B0}t^*-2ieJH1R>RGi1>`x;sJBZXjbp
z*d01a2#eM7jLhT=P$^K74?0x?6u+Qt(@vEN(1RXy6q52wG9XoQc~NFbNh)X}7(62h
zn`BS`A4mbI79j^NBo-@_r{?5<X3L<S0}rVd!;95K(87gO(77P_pk;TU+8?w;1vHqh
z0XqHy)msWlsX6)OntBSJd5{TAh4TEOlw$Dd8xWVl=ROrOi>(mF6X<vmc(E1l2tGvu
z8b*j1DyaYsGirbq4#9l{ZLJ`TO-#x!LrR~J4GF~xwhCZ<Fm4)n3Jx@=0iD~?g&I^+
zQG!$&Bhm@9<pcG*Mo}urQxzpT3Q!X@brfu1sT!J>?2rtyf`qP>0%YbiF-HLs&fvKi
zP#7i_Wfte>!Gj$+B@}_1-0&%E4JGuX0a^^8rvN%!0O|?wF)zi%so+)-*bk`AM{b*=
z%79a(4#)#K3MI(iLlm$OpMaD=q7O51Lk)p6k|3>TXhr}fZ1D6yVoC|B3POQb06;u}
zun?pPl0Lv*0fkm+Nh)eaLL?GUR4c{gDd~Y{DIsQ|$`<9KoRgqYtO;&M=H{1yPG^7|
zpa5D~ifA%I<5<B~A+-Y3swjzvif9xg84Vg|#!?qU(n>KRrNAQ@8j@gNp+y5YeIe_C
zPJj9rrGSo00PlzOO$F_>Db@fT_W})H2XKoFGT{fd1{68*pe|@ZVo_>5Y@!U*RMSxa
zO|TY2HA2D|ylMq$B3ut@ol9nN33Q$dVqjisIX1&|AT<tXUoVom*`O!^kL!V52a?qT
zZTUrRi-CHqNuX7YU`L_GeRi>ewyi>vUVMB$#P`s-X^@-YCPu3xNvp>y*eXP4r&fZq
z7l_WxQ^+m`%}#?jpmsxMo`QxtVyCydj)FS!UT<~HSaA4(?0`lSD40Q$<Al8quMMD6
zAMQo@r3D(fsU?YE=h{L;6*&^2!37?zR<Ko23e5vEQ{aR6N?_-J4sXf?Egg*q?=S)_
zA^=abf+b79`{Y5>KcF=PA(^?U3dNx9QVRKb3ZMy>%*33`D##$7MnO(ua%x6?PD*N#
zwL&p?HGL*%#c4@u5%>%#=vV>nnWc=x;&{+OJgF&QTjLdM6%Z}~uOL9~{>Fnh2Es(Z
zu5~CV$}dPQDyanXK*<WM23&SPLjx4}pk^aDV}WHAunxe3GZ5U0Xhh6`49JD#5>SFj
zhb&%AF99XAXy^_iu!TAb=_Q)r!~&6on21Pkpp=td0$v`MnWqq~1YIowIRijRM?ncT
z6Rs2+3sRd2Ile<LvltxX8X(g_hif5r#%rXP=qNzi2&nD_<pfWV1ECH_%?ltOK^zAT
z4?WN_qr4Oi1y2pw#E&gV8fg*~ntDN^dXO-J6x$9E1Bz2YXHH>>106^Wg%lM?Mkv@q
zWT8f3L?x(z0S7FSc6dyJB=JQgL>@As0u5+v(`6_g1M5+SItRqjL-QC&4D2GXzmS{-
z@fAoK;wgw3;PjZ6SpwFAq*__QIWZ5^{wjsnt|g$V5IQJVl$w)TmY4@gXQ*d&K~|C`
zry^<<P}c?3w)n)H9B>@P!(tOMyoKZdQ1Sr994Li=oets@qb3sQPy$Fs4`z@adWJ>S
z0!mk?>Omz2w9E%d!Z4~LbVC(v6(Fl_pw(3n_{=^HsQbZ18mM%Gti)9S^C1NrbR#RQ
zgaFwFb2+H?faYoBwcMZ#4aqr}OTQ6vc|HoZ3Kj+m$_l=T6`8rExeA~Sv<l^!DJ2<@
zu*X_u7Nr)amS`mBAXkr|kk=^GiPr=LeR57QJZLdPA9{?CMxl;^I@l<6Xb6D(1;d4U
zU?~k~D-o+ZazSeeHIj3Zk@Q2;J*<dHPc4Bfg7^rOcEJbwpeJ4&Izbg1L@CrMU;`in
zE#Rf-@Qno!Rfv=W+B61QOa>b)Lyn(lgIGP-zBfJawzp^lNPK|;07)lotr%=oGE555
zvV!kx0Igm|T89SR6$f^e9>m9*ItrNjbHT^CfYK4nF3`*+$S@5Qqob{KjbovUNi_0{
z^@>vqkR1VT9l=ZowUME_EkFk8fVMJ#wrU_n0i<GtwYeZG*CDN89R=t_0Qxj@d45rL
zW?nidOrZx9B35lfkCy^D3}hpG6*ssPfchR|61Y4ivq%S0ltPO*EUN-RCg^~AYN&Q2
z{0?220Bw1vK%3r>Be0O-1Ki>U8K#GBt+s+vJbY(jd`f<NUVaI97fO6)o?c2~3DPJN
zN;U%<1}_K@2@jNn3iZI58>}SHM?qO3IJHC}7de;bq~@iUWIz|5fV5<$!2%xCkp?vb
zG1nM?%_~kVfsI3JK%+`W0UCo43OR64*K0wRHzKW#hMXV<Nu^kW5Giv*G=toV;SR*Y
zSA0g{aVE%AY)%D<gEB{&lAS_$Vo_dZUON7x>U0#UVHpXQD8a79?zvh}SVPYlgY;6t
zhnInpI%Gk*pMMBA@qq>*GV?$yy+8vSL8*zw`FX|Q2?)>%YK5dC(2i~e(B7sT*cxMS
zYgP|Zg@C+)2tH72qogP^xdf4D5RxFJ=)G#Bo*Y6UuHXV002vA^Mk+IN6EpL`aRb|(
zky%n{YlsrNK`3X{LWW~NN1~=A7Nsb_)`NlPUNS&~?P-a5$(7KyILJ;&p$u0DZnlBM
zLCeEaL2LG4Mu3-;LC%Rns>DHgt57E%RDppb3`fp_+5%ck2DbrZOEKtZ5(QfYkc1wH
z&;a$E9Tn2^^HV^BLluzz7Py1~D+0xQNj|C>pwkaP>z2W1Sb<lhgGL-t&YsXHMC2}z
zy-1#_C;_R494es!nezh$GMuHUS5%s(0X|{@)eP{t8)$9^nGMIf3SjS{IJOY%OOP(m
zsU1i~JJ^e`Vh|kVNU;nKT5wtbFXl##^2|I)A6X%*w73K`X$4wO2R=|2v?mU_X0AN3
zQcn-jP=qv>;=u)gf~`VzE!>fi2vr~)qiG7rZIbxn#IjU~d01N}pyjs+B}fSf7FvaR
z5Z%%0pkx5<ZbQNf?lPE4WVc5b>LK^BL7jA%K`8oAa~+W;RjcQLb{QsTq$+^MCF4<|
z2$bSMsVE(Ec94-?L8ZDCsGW)kNNCdt*|mu1My?G&kqfWBi{Yg$xbKUU28fLqnEw@Q
zVKq}RdMH8M0Sg6Xa4!|q3J3YAP!GgHYk)$Eugo-sLOpPu531)f^Wf%#W`01ruu4Wl
z^u!`cO_0S96G1FkJ>di?jA3=U0%%YNbT(*Fr9yFOQZ8up89ew14|K4zVdafNHN=`)
z$P&)dB!mRqWwm+=ZlE(S5%mPfA0Qr5c@J_D!f{y2d{hM>9-eX^B#kf)GZiA_Kq}$o
zKZpav5GDAuf<1_PjVH9V0ZIj+$cv2ztA{Yvp_1x|b~MOdh@Bu7SS`kw4OAC4BSCAZ
zHIzVkSV>305Vgca7+a`E&`jbC%1l#GLaca6Q354lJgx)H?>pz`6=$ZTf{uUB%`XGh
ziQr|(h{6%%Z-i4pJa8z0#ysKe5vU!gnG6!9V8sxoI+D|H1~JA|5}Ms<3QCY}EfIbL
zZTu=oEy_qNC<YBF6s3ZOpi>kGdJyhOuuX(~1y+R9KiFrz6u{#gpbQ5Z8w4G+lbKXn
zk_ws0hcx2A#)2yNM1{1{Jn+UT&=gAws3DM)n3PkgP@Iupnv((^G)qcFYQ%t?j~Z&=
zkr0qD45LabLuag%k`hx;R}nxvCeZi=6;3cFbc-eWSU+fb2U4~vEBNLYr79HVCxI$r
z==g)4f@1+_q&%-Ar&0mZeE=<RO-d|M07X_xDr`KpEU_pvzqD8(EfI9QG^ifPS4ak*
z*9<E8!Q<2*jm4F@N%=X@h4Oizp$Cu~p`#ffm7ta^XrcvW2Lr@`ps*-N2F-Zo=%r=m
zrD!OrB6X7rLCgQawGO=M1odu`OE6d8WrCVpP$O!TbQB7bOSIAQdS;qJCP*W=Jcd~Z
zQk$u5h-Ez=$Z22)fGSaB`#~wD5N$FZ;%(SSWe%i}f!4Q(i5iG1O~~e4^jQ|<Sc6Og
zVvAR>L%=7TWhTcb=jRoJ`f#ApP0+>(^=Mt~SbGHxdn+)GNzqb>(Nl;?(N@q@sDTP;
zE5zv8gO)^sR7Ja{#wtW>>&DtcRoSb9Ehwr`uvI8Z1#e``%t_V2Y9VNJKrhTS$jLw0
z72@H<98iQ6Re<9mF(*d@<R`F!5Si$-oczQRjYRPNVhwdYbx`?{2&$`<Qo-e9q9$ag
zG3c!PM95fmB3MmM4x~EBOarA@jl`TBP>h)x7$7Ah(5y7VMo{#jSA$CMnpzLRDyX!A
z^$0<$;`2dAY*)f&JQbC6;1)vs2#wUloE$FL6o_MTNoHAU0Q6XL*gzn7fC+VYqy*HI
zN-Qb?@7mIV3=P^U<yL}<6Y!Ddpcy$O9q{S_*zqr*Q_jKaks4m0_L&|i)1d89iZ3e7
z1NCfC<|#k{0nq^6#sDtVz_9|CN&y*Wpl66G3QAI-n1FBGgczfs4;gDoDM1>62TNf%
z95iMIT9AY68AMYLR<MCe9$STy!jxP+5TOC?#(;<T_3|Kr4ss~C;geW|)Yk=xLhJ?g
z*<fRgpl}EGa<Fz;kb($3Uqg&ScP=7<!L0+W`AP&$OF<Z*D;Pq+duKID5{uGPOCU}!
zDn)WUnqEDK0}-AB+YM@>#Dis0!KP>Crh@xs$UcLv2`ItX4+<R*2O9+QB&ypnazk)Q
zenA1KwUMY$3}U8&>os^n)Kfqzic!qPNME410Zm|GBmh(wfDM5J8f4}g5dfKp&KpRT
zj)HnYQeqKkw|rg-B)Nh3psE;D{NfnV0x8ieEdX7vqk&fVgACOJ%O~gL7pJ0i_u#VN
zu}VY=MQoJQ18*}$(grODKye0*Bn4fFLqS5YXoMIAN|N9%dumP^dNu~R3Do(<n))H9
zO4uTt0bUN23EIGIYXB;l63bFyqphF|S0E`5oWXSz@{;p&ifs)I40Pbx8k7t%aZ+Lt
z^b}58_39i@fm2(Zlvq?-qYz!4nv+;ioSIT=Q(cq_>h5RerPs!)gZuoT<<prZ@x{rB
zIjOcOB@nKyI`rH|P@fxaFQ^p&?!Om-uBHKJOual^LrqZQ*9E+B6`roa%lbeE1msj&
zE99htu2TS&4~ZoTmX@lZU9PDLrFkWppqr4u8<tCuCYwNBBb*OFs^Af>hb=jvs6d{s
z0ZG7cQc-GRHY9#wLZFz}E6zzxEr572r38_{L23}TA`&SV7i7~us6qm*chUoo>%cbf
z$7dGj<(GhkV6}~JWiV)X39+#fEDIhB151Dd6|}FZxU?u$p*&Rqv>_U@RXRT}6?7s|
zZhjFo(7<g{@IHFj%pG{X8<cvJvo&C1&?F0L)hX#h*PP@g7HA;0_E&(`3?$~J#>eYG
zMlJJ_Q;~Mt=N9E_XhJIsXuc_iG=e}&+`+TQ@u1<M_>|N%&;<g}bIw7l2{NFTgHlj(
z4*1R-q)8!=!Jvg8dYQS9Er(Fmpuo;d18)k4yA0Hh0L^H{$AkLu@$sld6VzGBIgnLh
zP%fyPfjAVr44?=+=dV$mompUO1hq;@Ny$C6L?ID;LI9{aoTva%3$hP%kQQWJE_CWd
z5A0bzkel;U;E5*zWMTqnAwx3g0IgyL&{ajbpe0~Asb#4-#UNvgOA?c_L1SqkwF>1K
znK`MTZK~ky4-gAsxee6O(^CK`vo%!6O-;-zR!}O>0F4{v<P<C9rYh+`B#lsnE1}L-
zQb;XHMocF-<|(A+7L-(iCkFD;K?N`*Y(U3+rGX79NKH|Ix)apVN=*R`GA3s$WPta~
zf?Wk$=>_qGEhvqEZvFsOgUQ*@LKR%`ffsgYgN+4igtqs<`ZN`6KqeQJC}=Af!eS5N
z7zK4myA{%{0S~={njWAaiw2t;3!0Y$n+OUW#MCKd)=UB6qV&`fh?oYFS&&?;tdNkK
zp90dK0PZLyrGhu&LT+P%*a==<l9~)!)eF6UE2k2a4nPg{{G3#<1C$j){9XJtN>Y<E
zO7inEvo)<0K+@p;KV+;tJ|0xkLKgsmk}-H{59VV9a7u%9H6V_KCvuoeQ&LM(lS?3@
zupk$MZO%+nPzM!3;AS_H_w>@hhpFWt4Y4UJc!J7W^%8~bynN95_DY5FMDR^wFq1(o
zddMQ&j8p~4(M{m|mY)K)3zP$u6(S-ctU!x1!Rsqib73dN<mIE8R$KzQ@(QXSoDdas
z6*57`sO2E`nnL@_NvV)wWuz`SDE-521$h@1I@mlJ4G9C##4R{8A}zasgdS*j56BSk
zm;?MC8oji5kc3`xKDZD7TL(IfAU_3sC5?ijt%AA@BsT2Stw4*DKnE0o^MyibG59Dv
zupUsrfJ}!u5xk86B%lDAXMm3~<QIW1uLEEA04XMvl@%Pz@-tHuk~52vOLG!IgGFh@
z;Jz#*?d7B<W<v@uWd#LX7q%Jcnd|3dCKV+XRqDga(TtMZ9OaUXR9(=#R8c`uYDsF5
zE;z@59Sk~P04W^7U6^EO#RtuON_x;*0pt&8_ZCsIgHlO6*o_)#MbJ_cevTK^5n!7X
z6d-47#Oo-;gIBPWrh?0A)a;p9lnz-|3Nj6<PZ?CtL53#4MQ&zMF=!VGXlS)0wFo>c
z3l;|nAVzXBA;ATTE0Duept%ETCbZ}QIY|>7%pg{@K`dxh4<rd8awI5Hl|dODREsHq
zuIkW%8U~sDOG;HJN=<`o9|j$d2w7MJ_8inUkO>N)auIxWAY_#e)cfFJM~IC&;1UOt
zOd&cHpewP!+E5(?Q2;t<2Rx~tSyBus4^V7`DatH{)%NgeUkAKQJ~J;JlrS@kLHSrA
zF}b8PF$ZD}+_i|>0%97NEP@;l23vpzGabAH5t{GRQN06qDX7+ktgHs@poTgZY92@q
z+F~lH1b1Gb6M2q#mGBdZAPduU6w;F+m3Mk(S!!uPNk%Ftd%^nW;1r3Jw2&{If>ueO
z46mSIs{mFCEdapI0iDPPY7W69K>S2#(*a}$XtfEbQD0e*3T-7>DHuSa4I~ZHiZnh3
z5&|Wj^kh&}$AeQ!QEE}K2FQMRh5^Sk$Y2eSdQDJG3}S#pP~$x_4b(6Ijc0;Yf*0<A
zOp1?Jf(AH9FGvJcA1K<e>4ka@RXa!!slEW|g<+7ZiebeYhy(FBOd3W*^A|`#F=#Lc
zUZuknAZX;c2Z=)YV6C7WnVAO8)Wwj&BS;c~w5pNT`NEpi(47RJMj)(74L-;}2z=r{
zqFD{P1pqt`3l@h)19&xt1!QjoWO=lLt%5G-P!JEt<ZO5)2^vs_PxnC7K?d_NI>@la
zWFT*Wx{0tgmf#KqsH`nYP0ZC%0Cny_SE^>_=M^JOyhB|D(p-#w>_u@2ey!ky4Au$m
zxx=n0fV7Rkk|6hhCxF0vU!kk?6m;#tg%Bd`fDgn1wJY>e@=J<Aqj_Ks$g7UXo0cH;
zH$)EXHpp>LIeF0B267A7EZ8hANU4s3dU7(TFA0(bVI)(MlVPV;l^}QMp~Fha$?@<`
zr3UmC21s8Sksd)d=pnr5lUZD%q3#+K<R7FCT~GwxB!skV0;>);M^7J^2GGfapvxVQ
zmP{n3Kz9#=H0yx3G3$V488BiG-UmcYdl08+>LsS6xIwOt&;a!mA!dMM3KTFP!}aia
z8mtl&r%2|2G!2}KK+XnXaIAxzqDMlaQ38cJ(g>BZ0^(d7P(nmbpdd>i<|8FM4Rtql
zL{dOXSCE_oAMrsBw_r#%f#yz7ELg!8s_230eQ-Y<e9RHHi~`G~i76>ClR#!5Tmf+;
z#FA8aA&RO-S%IK25YJ?QkC6jaaqzp!G{94V@CC;@(4*!M4uI$cM+j)34Ppd(P(l=e
z^NmJvv5rD&UW%;}N>qRXTp8&gIe1`#BtRHq1h{Voswk0$Izh4^tPBo!FbhN|Xh17y
z@DLdI#z9Sx*Gf`z!L=rAqdaK*7Pd#p7L=UeyFqn8lXd0r%_|T|*z~CmWN(fwgaR#o
z0B>Qo1&xp-=H%!oKz2gfLMZg`DvXcLiUqA&Q7>1wQUHfB<bWv9I3{%ayt);9E3A%!
zI^^8r)D(3q1-QS|A)&2qr2t`o%D#Na9#M5GPzM|udoVXc*XC&ID5!&n{9smtIf!K+
zkf1IpPE7{2JK%%);K3>op`i(C?H85kC>SC91x|=4r3vUzS#XqqiVzeTkXjuDSP=^v
zR!1t?a1ITFDhiNVMB)NPGlnxkhU=l0^e7GmX+n&TVx%*$G|1mzb3iczIjIS<?+)xA
zkP;Avre{!Xh^|gSTLC;>r3G4h3EI>QHZ9LbL07><K^HtjR9vj7sfn2tKn5$rq8Q}_
z1&9o6cQh6$Xu1IPH(;tz+*=ItmQsLYaIg}n695f=NE--TIJ&wZ77c=I%S=;%1h1W~
zf`J~E_Es@?6OxjGhLVCdIK6?DYbt0fC@DaPbv03qgoYVtfgspzptJ$b)S#9VQYnd)
zAP~hDLLq7am!$w5#|GVXA5@CiFbEEHkXq3FN}&BxhzTqB^f~xyG0>z2sKW<R3p$+{
zk*<{?g#hw|6mk;`6ilFLFQgWs9;E#S>4k&j5s3pd#so?(>8T|yi0jV5l{3Od6y*pG
zWHMX>G&!sZADqH49_)eQjQk=L3qTz*C-9yYaMu<b2_P?PfY#Z8y4#R*wUL%1D1%!a
zddc~vdEmu`pc<+esoez*S%l*txdXI|0d%T<p=zd{YNn=wYO#`ns)9xyX#7n_Aqzqw
zG$Fi<v699R(qaaA54i;m;v<TA5=#oOlarGbY!%SvUrTIJ?T1aYf;AwV3-KegQb0}*
zki-YBI*^5tyq8mq^>}5h7GM+|sHFxd`JlTAr62)kD^NgzO^*j92vCKYT3iB2k)Rw0
zSqB&lKC%^@>5#G;EL1^jg~~w7IY2qn8FbYss9*v0mCy=c&??Y))DTp#Re&6|2yzDq
zqs`VKhWd3B)KP9sLvFc)G=eaS0$3J;H%atRq~X2?X~bM{1`<V44@$B&rFoFy98g&4
zDFlPg!GvAct5;BIrvwQ&kX{g0R=_X;d}by%SAljHgQm?vg$RmUuqQn5%r#oz!IB?}
zE#xFSkYmA#0Bm=1GQ=C;_%BK=F3B%SMM(h)$_k;N{afXrb4@@S#Xu!QDdfy_aLB;@
zLuwKM`6M?L7IUa|Gu%*+YvBsvjSh$isTDXlD!>UF+!6pq2(FqIT&I94Q$&daatS1o
z!H$Nz1=RLInz{w8A;54LdT9kR3*s6j1tkS|a{!#Db5bD-<Kb@91l61xC?NvUk5s=x
zf&-)sse%Pn<`4-5NJR~;(v>v9)2@g$ubFuYkhQ#eumxdol_-|N>qc9Ulk<Eup#x~}
z?j~s2NNN#mfFvGtxj|}9o=a+Seo<mcei39S1<R@8&<$|l$`VwpK$on;&4qVkOF<W8
zLklHvf<;{ygZng8aAk(YW>7eSFr=%7{iI@8F9|-R0<{LB#}+~%oxzHfpFoFpL&t+a
zIS%S_kcG;ic2Q~~=#)y3j2^@k1!eFGz{>nmMR>?VWw0No4eo|2*eYOzwFX2RqOyUG
zb%8B|97zivJ%y@+3=Qa^4iACVB6bTv#z4!9K-*}GG}7|(q22*SL~dewW->TuK?Om6
z1h*>*PxOMVL6qB|xmegFFUS;FszVw)Nz2cN*aZ$Gu-$s`@hSPq@u02MY5Dmu9#|gg
zbFeaKiUp1MfzO(UrB%p0dOXx~ItuZin2XO&t<+Hn^2txmh9q4qqk!NVqNKDSCzUJS
z8FUGWXI>iU#A}4Oh7w#{Nk<`CDI>F_7_<u-w96+I!b+?t&a48>rz(Nk>R@&(bov9l
zj{y|eItri>+7#%>6Qr(HQc_az1%*7Mou&YFKG@f=nVa;?l8jRDRRa2uW6brFp>$GC
zev&?DhEU%pGf5vFBzgsqUFNX4)?A3|ke4rjVjOB0I3DnwLkv1Yz*YgQOb_gt_{<ay
zO&tXdB?mAUbWsF2!ayMgn)inXy#{EaL`MN~B0ALjn#gA`Dl6bJTpeOI%CHQ)b^==q
zTJu<vn3-1$I{6?Ll4U`u4Q1H}s!9#eZSIhO2dM;M@B|WQU>}+wF#`e|7a*k|3`yw_
zQwvH<Kn6nRrx5uRvvC5m1X*`_Dp)r{8#IxF)q?GW3P7U?zQ!;VRK9{*?Z^Yv#U&sS
zXwC(l+L8=9>>F}?uY$6IBl3;~$k96BW&&g?r?fb=NEbGg06KsNq#3-_05r7=>pc~N
z7D8thgAd|NEh<(37swz<aA-gVwISPNpa~5$n--Lsn4+7XmjhZ;kerdKr{J0gT8si(
zd;q$?ULi53Jh8GEwCXXXG&xnFI59UBw7(p5G!r-sAO;#CnHUOkY&rD6AE?z}rC4_q
z!-n1=U467I&P9-kDd<uVP}u|Nih&m{Yk>M<ph7*fKm)u=6-gOriWk&ghE%c;3DD8O
zkPHAxiddZk*#eEa(Hh!_fNn+9QSekq%mvpWpny_<$2M&HG-$>Kw2mh=1-5_(JSCY~
z0@??ZTMW7{rBWdyF*&<Z4{00@?8f}k5>U)S0}~u*pfnAZ1BWDT8CVQJ{01sL(7U3+
zC5d^UZGGT!0-6v(rWb=2Fv2QebWKS8PEh7f!QK&p7y;@Zfjd3E;JI+W#9YWK3Xmnx
zm@I}aq`~Gsbaz4L29Qj2$xnvGH?DL54>N?5(7gl?2Sm;WkHWzk$&eHcIw)L20ZX9@
z9lz7mQ7BG9I;<AzL5NA9(Hl_97d08eJdb(O2v`@o|Dh&=izIYEz?PXhfOVpuEddq;
z8wV@;5Jf83IH(sv<s(=bO09wLAh@K1PL3#pj`dOiFF6ZNEeVCJnuDey$f%{Vf+M7?
zC@KY=NRbBG%>Y?E1<DbibswoIkU|Ke9-6HZi&N5|`2Z@OSPYr$S60Btq7YXUgB$?v
z7bBGy5Y4be1I{h+M0yaEKq1;eISo<-K)nr0sGy_(E3v`B1@$&a8?-J13!`+cVH(sm
zL4&7|P=~C011(~KXLLvffQTNDnK%_A@3cft9f*b<%vMAx0FE(Gg#^izV246xksty{
zegQ2kN9t%HvJyCBr-JJRXv#^2+{FeO-11G#PE`Pxgy1j-#Wm=xQ|PKikbgi02iOQu
zR~BNcOMWseZ=m{J8Cw5<S1`a0Of5^z11)CA0o{BFS~8phJ_8=Cs0e)9LrQ)!XdirD
zIwXaGtOa36P=d`Nm>9rn(K8yNut3V|$_j3vQ(aSY3!sfc(1B+P8lZKLkX2!zN*B^R
zQb>XI%n+pw*dj<k8bxC(VIarAt7|HN=P7C-kqPn+<kT@lFd~)C(8a%?@g~Fsje@QM
zV%q^`*1%>rxa?2|m2RLYLk|uOP}>kKVSrW-LDRE_W;EDykN^iYLP0(#N`>TSkPpDp
z5Wj;X1d9_O+y6l0^N{t-(445O5R#Eu3`$<PmEfboz{8}F<t=&&!TAd18HptzY0#Zy
ziAkW{%b6wiV7G!YG2BTY7a%2i(4Ztp2$6YF_5_3VgB%X;MIzNl*lIY9WSv~Ni$NBb
z=4BR^rb4}(3Ar=|YCojR$u@x1Ja9Kc(h5Wx-U3G!1Z|;$jG90cfs$S(Xk7~YhA+tY
zF>C=1L>0&%FypcfK%<?RI>@Gi<iR_yK+}ntd5|UYP?v*R!wMSN209Ar@Z^c&4UlFK
zhOD&)u^^U03#v?TNTLX3r&dCeHYk|jJ%3PSV7BoQr39>{0@t7g>BGQJ!v<RfvL9rU
zUOeb10*D`watlNX;t_~sd}dxsDrhSeBv?WEp&14mD<J7qP<I<?Q3~>cA+WVzpI|E~
zK^8)T3uH93+CW}Cfk=R$byr|ZvDY17DID!EP@YAq4WLTFeG4St6KA^-9_x)rupiVi
z1+CzLwOPPn1a=vyVue;n;9&r0$bvU^AO#jE?DXQXg(@WRf&vtp${<P+^(@#L(3~@*
z9|*Monm>^o0%|CL^y+}RySN%n_+0?fj)+6(c?3q_t}kqfAW~`vI}F}IMg#(R-Ujv2
z;rSKK_uzC1nYn?qo*?Pn2)E^sObTtDd4hVNpbK!oSGC!rwA3J8#vLpWgP>7^&y7Zi
zkO6h3;~^On8Y&P@d|GK9Xp2ozaS6WC0b~odp%8eX1r82Sih*VVh#%0R19KDt8XE9E
zAb2$)X!E}UXpAW{FI@?obPx#=Y$B{+hXgq|xq}mWbuB_+Cb;_r&bUyYg0(`*BXrkh
zf>)%16(CAPkZ%aO586@zmvRud>L@6I>{ilI$V@>v2fhRYd~F(NL;zIsXQn{I9-$EG
zSkTP~X`nT{Itp;Dm=Of`2iWP+nJJ)l0azPc200=?*%2I2VC4uqA!?vDgXJK>1esq3
z8wJYL5C!0id7Pn%2yB;?f@5B#jzVs6I+&$ktDvW+r-`}v2W$;`LexVt6&e^|qc95-
z@bPCLGmtVfG!wv%DT19X23=AODxu)I5QT`Q0(iOsaUZEZc(NayRuH)yyv98~9yIf>
zSCE|poiYQ31Jbc7;9x*<k1}Z8DY*R%9-;>CQ&7;z)JxTaw4+M$6+j2BD3s(Q%}ghQ
z+=!N@K|+{S3(TL8`!-=bn6JU+Xd<}=l!8H5Im7PX#GwIFN`MsOo79A4HY4=uOz<(k
z`30$Y8er=o7d(T{_eHwi8DusHL#|DQ-0lpDNkp8$3U(cZG-%8#D>#*wfUX$;?=(rw
zDb5EUU<yv2pySMQGLth)a-dgPf};hgNdht)DInloC5UcCX!j6&`~m1BnZz8>H5ZlO
zJApxmQiZ2N7OjICY#>uX8!<}CGm%eq1bGLN`oQ@E#06nx1&lqW;NzK6palhF46;12
zSOI2dacYU4LO8UMot_VxqRh{;2i;%|G7p5o0gFF<z-AhhK$d}wfOr%%RH>w+05$-T
z-I2~LgLXI}3Q&ta%!tKvb#qE$Ng`;oNM>?&PAd4cCyg|Og&<FWFep|qq8xO^QDR9V
zJQOiUkx>g_MFp^BpbP>YEd(F&jqoIRD<Al_SkSZpGz~x^3cNxZG8F`xBMC}P&jekQ
znVFXkpXUR0Hd8ax5fgt<17I@>AYTN5M^B3t5*3p33o1by(?DY~$eMIOo6{htxM!xM
z=9Oe7CxQ=vNG(e(g3M5W%qdT-)X)O;#~^oCgHt$Yf+{ZsWVRl>hYK1c2A`k{+WH3S
z0)xhU5|hv_=qvzjZpbe!fppYi?gizGywq|e|CQz;A2JC#|05>{WH5><$oLW>0+kh9
zD-x5zhh=1Drz+&<q#!!rpxbmyK!fL?v*NQ;Qwxd}Kxb!Xg8~NJcZ7Nbv|A3*YYqZW
zJrtpYHF&K)c!D>vpdbf)$QX*ejzSK|c98c$E=CV^@LtLM6itP4@OdQQ+iX%m7hQt_
z8-#<9!qip)*~6d_dyvx+E{8fgA8~D}vO<tveo<yR^oC$i>H--G#>xu0;NcS3G5e@y
zfup?ybkG}OY809xgCJ!uvRmLA*|3BVTn?OD&~zat5mAE`Wkyk1K|@P3JQZA~CZ&R}
zMg>QbQbuKZW@=t$vJxadk<C^pE&*LApIMxzUZPN(nVy$eQd*R%TL2o-D*~O>qoV+>
z;VSb>5yd9xEI&{hEy)L0iHQnDpgqgEsS2PI!a-@HAQ7|`sU)?iSWm$%zeoYJZwPWx
zI%t$1Jd&SToS^{Os+E~qtf!}!R0=-Qxdb#|k(>y+br_T#z_Tog&>Me2BNd>i(NQSQ
zSI8_;hg>n4sF0Ki+PGO<3K=?whCZ?<xwt@uhJvjE&Y}S%51rbC<d5R;%#sX5)=JJP
z2JKRSt{A{qaOC7b_xXW0^E&$kLx$a4T%G-c97FtrKqn-YWI&t>N?-Y<pk@5|#U+Sb
zhqU1cp)D75#0@Cm6_kn)g&RVXlC=VIegGYH1M)3sJ_Vr&MX!=VS!N=rJp)c~Ah&=t
zU@JMng=<M>ejbv`p!<@btueR}IiT)7C>cO=ELu21uRX{w3WT1k4hdE0=4p@{K*KU=
zpkW#0{hA;NNKFB?57hcA1|QfAnb%4KwfmG6Jo3vyr3Yx8AZV5kvd$QO{yOvwA6WSb
zvMD#QGAR`r&7eXIbh2MDC{tx7m&C{Gfk*R;VIx8yS0J^bQ1$94sKd(@^mY_zlPiiv
z$c2?HB6?6OX^?dgPovs|D7rx^K)5n9H75mh$|jOuxVX4r8^-cVa|<d#=`ODTvS6Sj
zF{u=ELKSS80gMlk1q~L1#<XFwFh0z<g37ea^qkZZ7$3GC25uiTj$rcn#V}T4QF=jQ
zQE@7aUt9^70$B(Xh8&>*YU#l4{e~ts$T1`eNy&PkLMAseFEg!D0dyXFsvcZ#VM;Fi
zy6}{I=!7mv5NZbK2o{B;)a1m{;#7nwx?oedxWLW>9l{B7s-7dX@Cg7pyhsCSDT=MS
zD=2*=mZXAOvY-vC1^GoKdg?j~sRfxi`RTSwN=mL3iJ&|7tQ5FHAa`zok|k&`8eBRg
zLKiq$DR6PwDL~dgC?pnxieb>Le1`EU1)yaQFumZy5H|U%U<8^ZLGbhp@tL8ZTc}`!
z#}2SO$Oymul2piP3dPBw9a+T+@XLn42QQ*{RUsr_0Yg+rp%k=!6k!=;5tm^+SS8p$
zZlHQLr&0&h#sk>~8iY<mHW^gXgYHQHMNlI2Yykxg(9zV1>8YAJ;K^Z7^#Cy%dV8Hh
z5#%1ZVg;C1P_?4~)djh~MmJX>zW`K{K~@%5mSp7Tfie#0?6%V4)U?tZJuXm%h1kyt
znwQK-g+`PDxMd0&QqNOx$xnvdL$9BlUs_b08V|KdAL1xu@J<ZSNgsLzl@J#vpejrN
z`7#j}?NHrdXXYs+XMj!;fo`$~UD{rfub_^wF##L`MWuOGNRh6atAJ{O9>gVvTwI{j
zG+`@mK+`^YkhG?kUzDzItY@hYo`TU&&P@T8rh1?q(_BhQ;3Y6cxrw0Tw;)|-TX?Pr
zN-PJhe)CApDR9e&s?mhz9?(XvcvzjSp{`q~uA`6#8gRB%w^xTOm;tR$1C{(~iKRIu
z;IT^`1<)nsw(9<%WfiHgd<AX|z|*)!s$ROD6*#GCs^hXv7qqe&wnIi;M**~_H#0xa
zRtdZ|B)+7m6ttoVYFjYqBnnVMf@#oCNiEJSN=<>T*T8QJY;_6Iwj_e@M1mxA&<0fn
zs0qcm?SX9AA<72G@;OkJfz%q{ftuv}+}uP^uLE>wZGK8BZkwQ6fe2aUSXz>w3p&mK
zbcG4{vP}henWhI?k_)=L6uc-mB{iuuJsos>lsdF&1&i1CBJiC8@x>*jpe~dKgo|;D
zd?9G%I5c%Y!U4*GIu**xOwY?NN{xpODuPc@hb%{fu0k%!&xubhDuReXn{J@w2<p><
z3w1qksSirBuss8yMX1mQ3Mi9;m&JhY{s3vyD+CFFMh`&3h$<VNOl`sY{PhaqZKBLH
z1tmT30dO!i2wkA+8z!ow0QNCxiz?_`vNFgCab=*!5KIYV4Tpx3o)XgKHkiF?m~zk#
zvb+-by&}-j7o;`}Eaa7-DG_!qJUA4UAO{10yb2p#f}Vp8(FQ(04|Es^bf*^NFnNR~
zED?k7IL1(lodS3tF8*W7m2?zfPJta;j@K<Z3QF+$3p^g8r{D}e;;|BRCo8nfh3xdt
z0bK=<54tQ79C7d)N<p!W8q<)pr~r*;2oI(Qnlv#r!6cx%pj=275t4I3w~>Lm{_)^3
z5L*Sb+=7`)V6hBM=g7M`Y(bF*aTzpK*@Dv+Y;!gISS_eKkTwFM>@Wl;c;pflY8NcI
zfNF$dJ&*#J2-;3VaJYaHIbjSkB_5VpkvX8Pc_8h|3ZRo)LH&796^+~r0v)gdZQVmA
zP@s)HP}3CL>;UbCDN8JYbh}WLWESNl>*b^-gSx$tId>H4ik$MyymVv<(72ldXi&7E
zvLXl8Mh?#}%1+A9hg@ZfVn6|C1z9nu^<4ltItC&OHU-PVUFdWhXz~vnbP&}kpa~Bo
zDflF6bS$Jd08s|s%?)mMfN~|M9Dy7w36TZ$cd`w26hK#+KyE-u1s{BwSdt1&TY9h*
z1-ml^q7fAKV9iE4;LV?)0tulNdVV#uU`6Nv=}Jk7R)?7hnRZZ*g&m!c4L!mRQwONn
z$50L3yosqAW<J7X$idXe0RwUi2!q@MG9957#M1*Uam1y(BtHkC+5oh90hG01v(O;z
zp#7=&IqI;pJwZEmOY)&-q@p?(HGW_Lfy+=-)hOnpN<p2DlwJzK83KIBDY#Dpy2}GJ
z*#Vvmffkq`PlLqtDsqY|Aln{cQ=XupLK;Yh7WxoFG2%HT9yGoVs!UV#KrGM|y{S1G
zP}O=R`QUS4pz|G&@IX{p5I)F0xG|ul4^xfgC2#@+r98+Pdxi!E1{h9(%w(z;mFC5(
zYZsRkX=Fo#24n#kXQqK>t3k#<?1R)t2v>j<rKG@Spuyu95QWiTQw`K(;bQ{mMq~37
zs&S~XhU7PpG7v^u2ZAIEnlc5IEef^@uwn)lJ|IotdpC+RQd2=|(O_!z62XVIBAEgT
zzvTQJ@RTda|A-8nk^;NR4?Q$Mrh!e?1KpCQQIub9YpA1;oS##gn`fJxpQCN42?-7b
zTTrkf*#>eL$i|}la%^P=G>9=G5Tp%@rA7JW+D5o624z8r%@7h~1~^PWVWtO~k%Og0
zZ1TwGBf^qD=$N;H5(QuIxnzF%C2pXLM!}5}P%#eO8wp7>pwTWPV-qBkK@}>bR>#ta
zgak0ig^(t?Qb19DS!OZl)cqV-eV++#gMie4Fl=Z>qXgbGfFwMqWDaPf8bS{25Reqa
zd{o^?qihgqCD0M5U@d8&F%Rgt4QOl)JSqvEurCH3m;^q}4zvj*HLnCLs-dYFZ5XQu
z>JEd-5wIEQARf|HLZE9PL6V?@tiabYfl3?rC;+6yK`Ldy&9h<+uqn`lf$)eDcw7S9
zXoEJE6u@%;pt86!wL}4YvpuXu0Gj2C$pa0zKnF@8Juaw59fg9N)WqUc(4aMF^b_2t
zN51$T8a8%zc1k)55a)pXhvXX1Jg`pi%KqF$(C#l#$^ea#7bSwEGK;~cf)=Yo(n1k<
zUJ2T(EQTIzUJ7b|Y7{~}tE`ZrV5?A-S)dWEkr}OCt{$tSkQuEG+Zzw%!Vgx6h4c=<
zE7%Glxv*G66WSceP_U)M5U_VauE{IVODs+-DoU)>$bcj}s7ErQt#k}xbre9fA(S?X
z)q$Tl1ly1b8YH0pwmHJ<*`QnZf>R4iL34D8IiTgdp!w6(BGerw5HV;JfM(RvQ{g+v
zL2DHu#{xlC|AKa-fR|81m4gxlXe<xBngCQ1z}$sl21pe`H#m4fnjzcPL9-puBSAri
zfGZso4T$k*^eb1vqwUd<MjpsOP?75lD&0}_gZHi>${vtP(3(ZWu_?}w(``Yz5GTB#
zY5-{hTL*TZGlrWKv=yKygn?9oOhWe;q!A61g#?;jaefha%aAR)4n6R)8%Ux9>47FZ
zkTQr?$Yd|UP7<i=2I~Sr*q{<RF((Hy9)Qsyf*ha#8xMjh0(VDXT^y(&q<aPBK(v9z
zu;SBl64Sv)n!`_30iW@Y{g`5~!6-d9(4irC)WSMQc+5=7Opnh<O-xBG0y{$!dPg_t
zq)S`S1bZrIuw5@NzZ}|($V>xGp+U7EVm+}qIWsdp2~xb-D!_*Q^&q4F&?A*KltS||
zOWZ+s@_@$+^Ga-$Qu6b2p^M%?F_#3|wGO|{Ss^+HJoXBnG)J}qGPD62fGmdWO#*E=
z&Vg-S0Ue=c5DQ&Uj%aGZ%?G&x+|z^9E08ig2~^`Klz~<N#m7Uhhlr1dq^XpWc*yE^
z1zUx@{Bn>zX`pb?P*P3NSIyN|jZ{$euu}E4QVoXs1!ATW_ymsB6e|Ugv2ar$hJx}h
zw0T_u+ROsZ>DY!_ppJo#ut2py1wms6pn46IS`o1UJ-Y;^24p#^Hn3e#H$o>SKvO6n
zg~d7wN*bW~4qaVP3I&HhWEi|y6LPo;sM8OU0w-R`4lvk>N3i85Y2fuI;2m1U<*>bS
zRtid>dlJB%3|RI+84c1=03QJYb{wLag6Nte??4B|NMaGF84HRC=-zd(PVi01paX~?
z$Nqqp?SQXJ!&<&WN4Y>{VIHKnTMoYO6Vc*@1{|#C2<z>F5|gq*p@OYKAv9+|MdG0o
ziOBaOV@QE!kdnYF!!$s5WPw?rjiVmmW2zwO1EdM9SqO`1@Q8k%wjpSb2h3rJ*avA$
z&d)2!%!AHyg9M5}2W5jU1|jkuwnA{41bGkM(T8p!1n&ie^=Uyjp2A!Jk%#p?LH<J8
z5(shw2!nR>m*k{^##r(|v8M!^+*MG`v;rNgqN<UnZK$IFu^$l<ki?3j8}r<QLOoau
z2y}QdI5mLn)PuEzP=!G|t*dJlloi|)L0f7RASovk+9(4@3S<=x$Pi`3;btL_p&^K9
zVLWJo6lh}*_+CHIZJwa3bU~>W)Z2iE9ylX`L_k$8bQ}aWLI4tmE5x|D7g1${PZxk}
z#z#FH1Qbt@;D-jRvVsR_2P8ZQkac2IBcLT^piGTiwJ1PMKm-7?5s-6$K&2t1$qEVz
z$mSWaDo_Io+LD9sy|*<2W&YyQoDy)r+JY5A{DSooKhP1Vpdu2iju-<$<9DDMUk}ud
z1Z#ktR*CI~z$(x&F3_$R$nDDD*vZ1y{e(spQZo+Hn*(J{P`n|Rz~Fod%MKV4S<nm%
z(uK&a5Ys@8z{s<ZJ|;*Cq6lOqj?@NPL7ra%IgL_58R=>wP{jbA1P4!#!4`&qmQI1r
zbAc?S1ZQ>VkSM}72n)K58{}r(DHNM;V5g6u7tdg0;pr0MF_0MeBo~ltvB-gzZK5Yo
zY<7ao!FKKpD0`saX$C$L20VMMrx22n3ctS+e%uc@Nr2}23KcR-z$+F(qshgkxf%-5
zg+}PcfohOKBXHiv9!0SB2*`~HUxRpHpJN={gv}pV&(A@WkqBeKBgUW%0dD5N2A-W0
z3rb3hKoz~Rf{VYOdWb@htFM2Ut3rr}XRv~gr=Kg9um_cH;Nb=hb+~?YO$}&+7D8!)
z5BYY^Db35SgjrTxnOBln0m=l>srD3bGR#j?KwXOg3IPyCI3C0U4c=pM3`h!u35GVV
z)B(~A!i7e9pi&y8>IR9U<3b}nTz8(sl%nTSm^g@5RzS@-5IaHX$TKgqBr`E5vkJ7P
zAr-#t2tF$c@?mjCA~?2Sw=QDMq9ALagHW#E1*Dnzd7uFX=+F~L8Z~G^BG6n7?cERx
zEU0S8d5?q?gN%n%*5DB%5Eq0o-2f5=VW?tTB`ss<xzHd{Lh93$!a;{QfdUj9jG$Bv
zFL|p$my?#{q}GB*Uf^oLw+Dj{nO6WU8v>o>4?24`zX;lBC&u1XY}pN@5g9|h6arog
z0y>@q<T}to6Y!Z5;F1{b)^gC2%ACyXRM0}##LOJfI1tP%LV=)!9%xvy3@K$Nj`OQf
zoq^|sNmPZ9P$1A`!<KtMT0rMh!H=g>0GH0tMn0AkI<Xl7v0X_)33f6S{9r1O@$e=n
zXf2>N=#)qJL60Em+*I(+5X4E3pq3g$0{tK=@LdI<ni)JZ1gZd_JqFwdQ6Yi}>PYxu
zRG1NuyLpLPSE9u{TEPRV0HHUggK9L$9R~112QsIfmz)Z&@<5CIKnv8MXY?Z)fDmVc
z3N)0armX_x^i8zm5uxq)EKp+}q(=|j%0S9JXf7r;ono&o!8X9F?s!n616Emrq>vqq
z<OFbVqYe;2JPDG3#0|P`(5_wubv<>h+{6md>8E)<x+c1y(Ff3>rwX7|{8$eFhIa~)
zdVV0I5xXEp&mV@3381YC0IwSYjln@{EBHtmq&`BA&f$0dFeFJ5pFeP%1P@BnAWT&G
zjXUv!uBwC;sS4mSmB6vT=!G-1H37*H*jf{i;skz}FLWviv?Chcy9ec21tn0413LK}
z`EXxIV1fJzT8s%k=oxZyAU2yo$`A+r5^>Hi!gNRg6@yOu1(^cE$_nMhh!eSW6p#iT
zptCpe(BUSKYPerOw~H3*fqJgR$Orr)=>`=qMXAMl&|{5Lku8Pnngk!ajH*OITLCT#
zo=h$VRcSDz;79X=f)%6@Za-47jO0Yn8ng0Z1qb-K-N@Mv$*FL4Fflypax05KlcgFU
zJsRZ-TJQkVRM3apqoAn?9&m!Y#ZJKhGUjN27<zzN23^92Y?gwSf}x%Pih-cI9Gh{V
zSOH=1Fi><}ENBc7e295D>e1yOF3d)CE4Zt56x2Z_da=5dLSZ~;od;-87sLTqe2~FN
zknx4cqfsz(;GvE(gavaY!l%WCpxr>=ln);`E3D4bHmrq=WrHjz2Av3yrUbfl9cFy3
zeswvL3TWar1XX5AdP-Uf8hJjDO3Y9bLK|r+fRF4fHi8bLgA9gfLuu9{hG}6dRHD-m
zLwZn`=_sTrRU^C&aSZ5mK#-vX@(egKAc+VT8qio)$OZMqVS=E8Q$WVSe2k(9CJ1Wm
zfp)qTmw<MDK-M)YWadG3qrsYO&@<{mi&UUYaO6OxVMc-Gu9HBg@1;UkYT=wPfsguw
zM$1s=4iHlYU>m?U&w?@osPzJC>_W%6At8{PnO9l@IV7V*U*8OJlm_%Pa?tk45(QmQ
z?;4~=3o2WXQ<MW5_D#%9N=a16)KMsg9-j{?4L}FCYAY0jlR+_fa6c0?q-+SuV4y*L
zu)`qno~GoS589tl0-n#%RzP?RbS65u`3$m51L{Z}1tkbe32c*&f|9lZSRU$L9R(!_
z3nZ_ksRS(=u_P#^5YRcypz|h`zzcQIVnS0}NgqW5ktCoq+|bE<aDE04tEgKkXuu*8
zQDTEG4@gNZNzBXv<zaBbgXCK1bRyIk9R-9NK^tcv8)0CpCt$-LFg`>Uwk-xG3**Cf
zqCi(uz_?k(`FSulVn<9;l@Ux3vVR)J%ZJ_|nN(F?lv$Fh0n!edumauToSm8nz6BGu
z{SI8@D&!}nl@=#M`oo|WDf9#(@K_J*nyREKBhcjx1*v)Jni?hf*{OLt3QFZAplPUL
z1*ARQX^^{X;I=~7Z>NLD)Z-zGD~mNUa|@tDsPNGYP<%iF7<BkgW^MsEu|bAnb3q*`
z(2@t30g&n&F~0<=`>S)|`ygwfUHCN6#y!1w@RDTct%1r4DWGHQVM~Ewo8+O}l9d%o
z@(W<wF+iERSg#<lBts9TEFS8B_;?M3ZIJ0l&@~94GZHo7_Cazfx{;v8WkebSvKlt&
z2-*mS=pMj*3aYTxbHU4v)WPG;;K^M`@PG<H{N4fi0krf6W(i0K#4xBok#7J1wX$#-
zOp=H6;z1q*9qkXY4}{U}1bYHf&7lV$dc+ZFGqNuU8Hp5TkSK(tTF?R;kTKA72^9pN
zN(>dM$}9jW(2L3}aLa^VY6(@AnGaP1QV<Us;E9J`4QZ>8nXl(mS&~}p>93Jn8DEuI
z0A9uou^PlnDoslR&sicVgvf$(D4MMr2rZyf7eE(97lWLRh&p8u7n)5W=78b=G{jhx
zpI@Q_+B#GWI&&i@6};6fzgVw4F(+FCIam;e!L)+>1<Iu$8q4)(nQ4$^O{sY)#UNK}
zDCrecDnZKtkQvB04U|5Ra$i<{W}XJbZ6M<jZbsHrhNPh=H3wvb1}w3l8-Umf0L$3O
zp2Kc_Rb~M+%)rjmQ7D7fQScHhS{)h{>Y&CVA{s!e;y~MyU{`S=X+W|TtO<z^PA^DG
zQSt~_F^ULOIru_DxGqqU4=>Ij`3V#edWcwno$G}b8w3*rEM#Hfmxg}82*?CbWKk<k
zz{~o~9Hc>4<OBdyfj#<2OCCt^fZaGy8U`=r$CJj?!MC&*E2JS+kH`)NvEfk_T?R@t
zX=&hv(9nqp)Djn)57JO#7~xce^U`z_aJd7o-H28Wc&~IZe2Xq@BOi3j9%L^IcpDUj
z8(u?;L6aYu#jrh@&^8Kagc98P0&P!&F5?6*8UY<X0cwFFZ)Ait21hrHDvZz#qq=$d
zuw@H`b|boE7K7GBgN{*2FG?*gR!B-L!n2z)v9u&VCozeTso-s)ppA|>iAk_EyRbcs
z&^B;s0ca6Yd`W(Ma$;^lX>nd^33L;U4)nZ~_>{~d@D4?2{RnEXLQ=L~o)5U72W_qb
zbxCn-Ld4QHQNX<`47>sazJv>9RU$Eq8DST|g%p*hVqbj-D(EmV*jiX@#U~{efp?yP
ze5QwpMN$k*LM&bcEsX-31dTRG$q4DW!bdEiTw5irJQR8G9&_*{cPY3}1no>fl*4**
z$gAohx|J2cXZ3(07d+7jIb;Gd!3dt`E-nU5{DCS((5WSm>KLL3w6diddh#rEKor^a
zh}IVLYFKDu$jnR0EXzzOP0WEd*TL7t8X%N|0v+OPB`45fz96@O+yE+5^}wAtaH|Y*
zzDikY5$I3^kQ~^J$P3#+27zjHa7PTM?Wh)m^gt~KEr-X}*FaL@Sd^-eT$GwvlA5BQ
zo1c=ImI*#o1Lnb;N`<6K&|-X0dm=HtC^Z#y%mMU(l#tM3h180~T!o_2oYZ1ybb-tU
zVW?}7dyk+4?4ZJ!K?sQ#kWSRVMm7Mvq!iV+P@j6{CFhi;fWjCYh9K8M^1GfM@>DL!
zcu;s|>nMPO6k~xQifyPif%N8O<`$q-{R*}U(BcKs;V9O~g``T5Y8Zz2Ild?rv|qI>
z6@0fn_(TI+_|{lh%NaTZ0cyH}JOVAC5FJoW6x%Va0y!{R9hZgR<|{5qZ~+H%GKhwl
z1=<e+)(1*RAP%%c4^jcc(A*TA4Qfk)v|*S9zP}SR>>ZsAp5Dv`#Slm(Xc#yfbgBeM
z0BTMwmUsqP1&Ql4@VG0MQ3sF`7*<w*ngtr((9(i(KzHkaEQO4BKuharb*L=Zmryn&
zHG=lKl$I2fmVjyo&>|YpY%d~J<Rj$3F`1rPl3bnwI{_9t^9)*(7!TT5gV@`LbapLx
zVLaqm!}yHEyp+s5=*fnVfic9e7+5!G-Cl9DI%M<=vLLYxz9d>HzD!9Q61jS?HOHB0
z&|@$VB9J4PKpugOFGBnZDVA&%lvIo3RWsxB)8bV#Rf{2|m6ECkx^G|;D+m|rK%D|f
zlrZC99Tsp`5D{RYWDFV<11A(js~M~d)O}8Z^q-Mh@Q}ea$YF)hm_wXSh_~>DBpZ13
z14<%LA<$tcsU@KDFD0`CoGzgaU2s6dw;e%B5=iBenU|iE3NF2^KwGguhJi5DKv01T
z_5&mkkYqyg72wSdaPbK`x;rti5_D8bW?Cj>6tEanR)K>Aq!ZS$Qt|_xk(8MWSr`Dm
z3JzMmf=+n?4cUTr!9WsjJmeUZl1$JRVNh-bE%yX9+YRF(3P2ahR)XpyXd4H#8$&}W
zwIVfHNfTPyAe4gcR8Pz))_`t9D*%mQL*oHtM6pH^X#7MEw9YLfwE~t#psFEB5!(LI
z0J%jIroy%WbboD0QD$-pWWNL0&!DxYAg6*ZdWeUnH;n@5wp@6>2&96GiwkLY0BEy<
zfu5zFff5&NH&b|OYPO*U{L&JrUqQDVfmQ>7k4Z(Wy8u-P<*BLJ3Wj<Lu#=`hAqtv|
zi%(2JIm{dsFCgzKBo`YR80%%^=ca;oKN`Y@loL}R6A>VF;MIzdnL+3&tsujUbc~<@
zgj<cSp@D&pf~h8Sq{9Jp))_d6kevlx;*NRdDeMIKMCh%(;3MQA%PYYq>B3LFf}9VR
zn3I!V4qjIcS*KW%uTYeln_mX%7N$ZpgDnTSR~dYJA*iha$;+Tp8^nX23j!L$N=+^S
z9e)D~)m+f+7@2u#;PYm{hmnEI0AXr`A#C6s92L;*V?p3!N{lriG&J79Q-7dT;vB4C
zXke%SkyJ2-OxD5HfPor=(Hh{CqoZJCpcxBUAP8z#q$(sTfEtlGh$VvH(!$UHT6RF!
z1R}Q{KugcTE{lzNVqsulVrgn-Zh!*JQ!Gs^k_}8v&CN{BOwE#v4J}PTVn!C|q87;p
z7Um{qrsl@xCZ=g-hGr&aCYB}^W?=nhW`^d*=Ei2G=0@gFQHUufNd|@{iHU}3U|^DD
zU|^DDU}A1+W?^7#W?=x+Z(?p@W@(mUW(qOU1kIHO1{TQ%NNP;Xjngbl%u`e0ela&S
zH#SO*Vuu8)u_l|JpP!$bn<fv4baQhH0YObhKTVA&R`9`QMdl0)3`I;Jf*C}lg9tAW
zp#dTk85kI%IAG%)x0s77i;J>BVw|A$f{CD3UK9)HP_QUI)T6$lM1rs!a#SP((#w;W
zk^(v}27CZiQ6k750}x>elH`LgRtMh;SY!nf<N~c;hio=1as??>1BtSLrge(yLHs2k
zq8UWY0TC-e#3m525u}hGQvMmjO0uE_ASoRXp#&njKtv~qSOy}vPzgQ;28LT4Hjtr4
zJ5W#+XE87^a4_;P@-T8Raxig#NEl|~5Mg=4CMv=x0D(+gVH|8iEJ8dCj9~betDZpt
jsuQ7yg~ODCk%Non8ymL(qW}|^1qUY!BMT!76G$ZhlGeD=

diff --git a/examples/example_docker/students/cs103/__pycache__/report3_complete_grade.cpython-39.pyc b/examples/example_docker/students/cs103/__pycache__/report3_complete_grade.cpython-39.pyc
deleted file mode 100644
index 5efad03805d904ffdc7a11abb12cf5d179ea47c5..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 57973
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

diff --git a/examples/example_docker/students/cs103/__pycache__/report3_grade.cpython-38.pyc b/examples/example_docker/students/cs103/__pycache__/report3_grade.cpython-38.pyc
index 62e8822d72d540a4ceee4dc8dec9649d4f7f8025..77015c4da9e35a95404dc204fda36e1c28f1c29c 100644
GIT binary patch
literal 23229
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
X{FKt1R69ln28Lo51_lNeMgc|ut$sGE

literal 50128
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
F2ml`9OM3tS

diff --git a/examples/example_docker/students/cs103/report3.py b/examples/example_docker/students/cs103/report3.py
index 69e9d06..e08f7a0 100644
--- a/examples/example_docker/students/cs103/report3.py
+++ b/examples/example_docker/students/cs103/report3.py
@@ -1,4 +1,5 @@
-from unitgrade import UTestCase, Report, hide
+from unitgrade import UTestCase, Report  
+from unitgrade.utils import hide
 from unitgrade import evaluate_report_student
 import cs103
 
diff --git a/examples/example_docker/students/cs103/report3_grade.py b/examples/example_docker/students/cs103/report3_grade.py
index 5ca4f8c..619c0dc 100644
--- a/examples/example_docker/students/cs103/report3_grade.py
+++ b/examples/example_docker/students/cs103/report3_grade.py
@@ -1,3 +1,3 @@
-'''WARNING: Modifying, decompiling or otherwise tampering with this script, it's data or the resulting .token file will be investigated as a cheating attempt.'''
+''' WARNING: Modifying, decompiling or otherwise tampering with this script, it's data or the resulting .token file will be investigated as a cheating attempt. '''
 import bz2, base64
-exec(bz2.decompress(base64.b64decode('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')))
\ No newline at end of file
+exec(bz2.decompress(base64.b64decode('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')))
\ No newline at end of file
diff --git a/examples/example_docker/students/cs103/unitgrade/AutomaticPass.pkl b/examples/example_docker/students/cs103/unitgrade/AutomaticPass.pkl
deleted file mode 100644
index 9b6ff7a..0000000
--- a/examples/example_docker/students/cs103/unitgrade/AutomaticPass.pkl
+++ /dev/null
@@ -1 +0,0 @@
-�N.
\ No newline at end of file
diff --git a/examples/example_docker/students/cs103/unitgrade/Week1.pkl b/examples/example_docker/students/cs103/unitgrade/Week1.pkl
deleted file mode 100644
index c9cb1a6c90f6486629143684d3669f33b39c233c..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 96
zcmZo*nHtIf0ku;!dRW6#Q?m`H^l+4<7MH{)rld@1o6^IUSX`W1R5GP)O6?R4Z$__$
m|NsB@X7FYy&0y@|hbfHD$V^E|&70CTC4&W|5Tu~ER1W}Gd?RiE

diff --git a/examples/example_docker/students/cs103/unitgrade_data/AutomaticPass.pkl b/examples/example_docker/students/cs103/unitgrade_data/AutomaticPass.pkl
new file mode 100644
index 0000000000000000000000000000000000000000..bbf2cc185121ca31d5dce6495a00fb3305814c64
GIT binary patch
literal 123
zcmZo*nOeXA0ku;!dUzd6OY(CQOEQxK5{rwc^l%lYmV_2K=YTkEQ+ilRGILX>v`uk`
w=wM*TVC)etNi8mkPlV}<FMz6LODrx<Eh?GPHl=n-24e<W+ms9zB%P&t0OfipqW}N^

literal 0
HcmV?d00001

diff --git a/examples/example_flat/instructor/cs101flat/__pycache__/homework1.cpython-38.pyc b/examples/example_flat/instructor/cs101flat/__pycache__/homework1.cpython-38.pyc
index 87d201e2c398c0561b07ffa5d089de848bfc7d5c..9868c39b56e601683837521c4d05920eea494c2b 100644
GIT binary patch
delta 150
zcmX@ic9@Mjl$V!_fq{WRP0VQ{w?8A#Ew<dsoXp~ql?+8JlhYU*7}+L2XPltR!oa|w
z$#jb`@fKrJ5r_jJSQ!`?ZZRjOq;N1WFcdR^3}P<goV<i7jE#+ffuV?V60@itLOGZP
c*27_wo1apelWNBZ(g@Pc!Op?T!6d>60Dd(b0RR91

delta 150
zcmX@ic9@Mjl$V!_fq{YH(nH6M-2RL_QEa)DIhn;JD;bKIC#NwsFtSd5&NxArnSp^p
zlj#;?;w{FcA`k~curM$%++t2lN#S5%U?^q+8N^(~F?k777#k}C149wVBxX@PgmN$o
ctcSxUH$SB`C)JJ-q!FZ>gPntwgGq!D00D*^>Hq)$

diff --git a/examples/example_flat/instructor/cs101flat/__pycache__/report1flat.cpython-38.pyc b/examples/example_flat/instructor/cs101flat/__pycache__/report1flat.cpython-38.pyc
index 1bca6476ec8808f1d188c5119a8c9442f5d2bcdb..cf4da6dda64dcbf27bc49f771e2824d67104651d 100644
GIT binary patch
delta 160
zcmZ3<xtx<Xl$V!_fq{X6CCfSS%tT&4S(Yf46owR*9QG)7cZL+!6t)(I6t-0MERJU8
zD9())^BEaACQC5QV&s{;nJI&jeX<Pmc}D)pZ<rOFgiG@>OVW!HQ&RQPiV|~E%kzt}
zi<lS~7@~v_GO1;WIi-musYT2T3=Bn*Ac6%%ure?(+?pJ~62QsG!6d{Xz{<f00HdlW
AH~;_u

delta 144
zcmZ3^xssDNl$V!_fq{X+Zm~h)^NGBE6O%<bQW#QLa#*5RHdf4MWMrQ#!8D7Jd-7(c
z3`VxeGR)^01tz~?R&bFlE=txb&C4uFFG@^FH9}$*F)=VOMDd}@7cnz1Fce9G2o?~*
V3Q{xKk0pSUNr;n!QGk_$82}bRBjo@9

diff --git a/examples/example_flat/instructor/cs101flat/deploy.py b/examples/example_flat/instructor/cs101flat/deploy.py
index b110ad5..0ce549e 100644
--- a/examples/example_flat/instructor/cs101flat/deploy.py
+++ b/examples/example_flat/instructor/cs101flat/deploy.py
@@ -4,5 +4,4 @@ from snipper import snip_dir
 
 if __name__ == "__main__":
     setup_grade_file_report(Report1Flat)
-    # Deploy the files using snipper: https://gitlab.compute.dtu.dk/tuhe/snipper
-    snip_dir.snip_dir("./", "../../students/cs101flat", clean_destination_dir=True, exclude=['__pycache__', '*.token', 'deploy.py'])
+    snip_dir("./", "../../students/cs101flat", clean_destination_dir=True, exclude=['*.token', 'deploy.py'])
diff --git a/examples/example_flat/instructor/cs101flat/report1flat_grade.py b/examples/example_flat/instructor/cs101flat/report1flat_grade.py
index 96e8e37..b71dc43 100644
--- a/examples/example_flat/instructor/cs101flat/report1flat_grade.py
+++ b/examples/example_flat/instructor/cs101flat/report1flat_grade.py
@@ -1,349 +1,3 @@
-
-import numpy as np
-from tabulate import tabulate
-from datetime import datetime
-import pyfiglet
-import unittest
-# from unitgrade.unitgrade import MySuite
-
-import inspect
-import os
-import argparse
-import sys
-import time
-import threading # don't import Thread bc. of minify issue.
-import tqdm # don't do from tqdm import tqdm because of minify-issue
-
-parser = argparse.ArgumentParser(description='Evaluate your report.', epilog="""Example: 
-To run all tests in a report: 
-
-> python assignment1_dp.py
-
-To run only question 2 or question 2.1
-
-> python assignment1_dp.py -q 2
-> python assignment1_dp.py -q 2.1
-
-Note this scripts does not grade your report. To grade your report, use:
-
-> python report1_grade.py
-
-Finally, note that if your report is part of a module (package), and the report script requires part of that package, the -m option for python may be useful.
-For instance, if the report file is in Documents/course_package/report3_complete.py, and `course_package` is a python package, then change directory to 'Documents/` and run:
-
-> python -m course_package.report1
-
-see https://docs.python.org/3.9/using/cmdline.html
-""", formatter_class=argparse.RawTextHelpFormatter)
-parser.add_argument('-q', nargs='?', type=str, default=None, help='Only evaluate this question (e.g.: -q 2)')
-parser.add_argument('--showexpected',  action="store_true",  help='Show the expected/desired result')
-parser.add_argument('--showcomputed',  action="store_true",  help='Show the answer your code computes')
-parser.add_argument('--unmute',  action="store_true",  help='Show result of print(...) commands in code')
-parser.add_argument('--passall',  action="store_true",  help='Automatically pass all tests. Useful when debugging.')
-
-def evaluate_report_student(report, question=None, qitem=None, unmute=None, passall=None, ignore_missing_file=False, show_tol_err=False):
-    args = parser.parse_args()
-    if question is None and args.q is not None:
-        question = args.q
-        if "." in question:
-            question, qitem = [int(v) for v in question.split(".")]
-        else:
-            question = int(question)
-
-    if hasattr(report, "computed_answer_file") and not os.path.isfile(report.computed_answers_file) and not ignore_missing_file:
-        raise Exception("> Error: The pre-computed answer file", os.path.abspath(report.computed_answers_file), "does not exist. Check your package installation")
-
-    if unmute is None:
-        unmute = args.unmute
-    if passall is None:
-        passall = args.passall
-
-    results, table_data = evaluate_report(report, question=question, show_progress_bar=not unmute, qitem=qitem, verbose=False, passall=passall, show_expected=args.showexpected, show_computed=args.showcomputed,unmute=unmute,
-                                          show_tol_err=show_tol_err)
-
-
-    if question is None:
-        print("Provisional evaluation")
-        tabulate(table_data)
-        table = table_data
-        print(tabulate(table))
-        print(" ")
-
-    fr = inspect.getouterframes(inspect.currentframe())[1].filename
-    gfile = os.path.basename(fr)[:-3] + "_grade.py"
-    if os.path.exists(gfile):
-        print("Note your results have not yet been registered. \nTo register your results, please run the file:")
-        print(">>>", gfile)
-        print("In the same manner as you ran this file.")
-
-
-    return results
-
-
-def upack(q):
-    # h = zip([(i['w'], i['possible'], i['obtained']) for i in q.values()])
-    h =[(i['w'], i['possible'], i['obtained']) for i in q.values()]
-    h = np.asarray(h)
-    return h[:,0], h[:,1], h[:,2],
-
-class UnitgradeTextRunner(unittest.TextTestRunner):
-    def __init__(self, *args, **kwargs):
-        super().__init__(*args, **kwargs)
-
-class SequentialTestLoader(unittest.TestLoader):
-    def getTestCaseNames(self, testCaseClass):
-        test_names = super().getTestCaseNames(testCaseClass)
-        # testcase_methods = list(testCaseClass.__dict__.keys())
-        ls = []
-        for C in testCaseClass.mro():
-            if issubclass(C, unittest.TestCase):
-                ls = list(C.__dict__.keys()) + ls
-        testcase_methods = ls
-        test_names.sort(key=testcase_methods.index)
-        return test_names
-
-def evaluate_report(report, question=None, qitem=None, passall=False, verbose=False,  show_expected=False, show_computed=False,unmute=False, show_help_flag=True, silent=False,
-                    show_progress_bar=True,
-                    show_tol_err=False,
-                    big_header=True):
-
-    now = datetime.now()
-    if big_header:
-        ascii_banner = pyfiglet.figlet_format("UnitGrade", font="doom")
-        b = "\n".join( [l for l in ascii_banner.splitlines() if len(l.strip()) > 0] )
-    else:
-        b = "Unitgrade"
-    print(b + " v" + __version__)
-    dt_string = now.strftime("%d/%m/%Y %H:%M:%S")
-    print("Started: " + dt_string)
-    s = report.title
-    if hasattr(report, "version") and report.version is not None:
-        s += " version " + report.version
-    print("Evaluating " + s, "(use --help for options)" if show_help_flag else "")
-    # print(f"Loaded answers from: ", report.computed_answers_file, "\n")
-    table_data = []
-    nL = 80
-    t_start = time.time()
-    score = {}
-    loader = SequentialTestLoader()
-
-    for n, (q, w) in enumerate(report.questions):
-        # q = q()
-        # q_hidden = False
-        # q_hidden = issubclass(q.__class__, Hidden)
-        if question is not None and n+1 != question:
-            continue
-        suite = loader.loadTestsFromTestCase(q)
-        qtitle = q.question_title() if hasattr(q, 'question_title') else q.__qualname__
-        q_title_print = "Question %i: %s"%(n+1, qtitle)
-        print(q_title_print, end="")
-        q.possible = 0
-        q.obtained = 0
-        q_ = {} # Gather score in this class.
-        # unittest.Te
-        # q_with_outstanding_init = [item.question for item in q.items if not item.question.has_called_init_]
-        UTextResult.q_title_print = q_title_print # Hacky
-        UTextResult.show_progress_bar = show_progress_bar # Hacky.
-        UTextResult.number = n
-
-        res = UTextTestRunner(verbosity=2, resultclass=UTextResult).run(suite)
-
-        possible = res.testsRun
-        obtained = len(res.successes)
-
-        assert len(res.successes) +  len(res.errors) + len(res.failures) == res.testsRun
-
-        # possible = int(ws @ possible)
-        # obtained = int(ws @ obtained)
-        # obtained = int(myround(int((w * obtained) / possible ))) if possible > 0 else 0
-
-        obtained = int(w * obtained * 1.0 / possible ) if possible > 0 else 0
-        score[n] = {'w': w, 'possible': w, 'obtained': obtained, 'items': q_, 'title': qtitle}
-        q.obtained = obtained
-        q.possible = possible
-
-        s1 = f"*** Question q{n+1}"
-        s2 = f" {q.obtained}/{w}"
-        print(s1 + ("."* (nL-len(s1)-len(s2) )) + s2 )
-        print(" ")
-        table_data.append([f"Question q{n+1}", f"{q.obtained}/{w}"])
-
-    ws, possible, obtained = upack(score)
-    possible = int( msum(possible) )
-    obtained = int( msum(obtained) ) # Cast to python int
-    report.possible = possible
-    report.obtained = obtained
-    now = datetime.now()
-    dt_string = now.strftime("%H:%M:%S")
-
-    dt = int(time.time()-t_start)
-    minutes = dt//60
-    seconds = dt - minutes*60
-    plrl = lambda i, s: str(i) + " " + s + ("s" if i != 1 else "")
-
-    print(f"Completed: "+ dt_string + " (" + plrl(minutes, "minute") + ", "+ plrl(seconds, "second") +")")
-
-    table_data.append(["Total", ""+str(report.obtained)+"/"+str(report.possible) ])
-    results = {'total': (obtained, possible), 'details': score}
-    return results, table_data
-
-
-
-
-from tabulate import tabulate
-from datetime import datetime
-import inspect
-import json
-import os
-import bz2
-import pickle
-import os
-
-def bzwrite(json_str, token): # to get around obfuscation issues
-    with getattr(bz2, 'open')(token, "wt") as f:
-        f.write(json_str)
-
-def gather_imports(imp):
-    resources = {}
-    m = imp
-    # for m in pack_imports:
-    # print(f"*** {m.__name__}")
-    f = m.__file__
-    # dn = os.path.dirname(f)
-    # top_package = os.path.dirname(__import__(m.__name__.split('.')[0]).__file__)
-    # top_package = str(__import__(m.__name__.split('.')[0]).__path__)
-
-    if hasattr(m, '__file__') and not hasattr(m, '__path__'):  # Importing a simple file: m.__class__.__name__ == 'module' and False:
-        top_package = os.path.dirname(m.__file__)
-        module_import = True
-    else:
-        top_package = __import__(m.__name__.split('.')[0]).__path__._path[0]
-        module_import = False
-
-    # top_package = os.path.dirname(__import__(m.__name__.split('.')[0]).__file__)
-    # top_package = os.path.dirname(top_package)
-    import zipfile
-    # import strea
-    # zipfile.ZipFile
-    import io
-    # file_like_object = io.BytesIO(my_zip_data)
-    zip_buffer = io.BytesIO()
-    with zipfile.ZipFile(zip_buffer, 'w') as zip:
-        # zip.write()
-        for root, dirs, files in os.walk(top_package):
-            for file in files:
-                if file.endswith(".py"):
-                    fpath = os.path.join(root, file)
-                    v = os.path.relpath(os.path.join(root, file), os.path.dirname(top_package) if not module_import else top_package)
-                    zip.write(fpath, v)
-
-    resources['zipfile'] = zip_buffer.getvalue()
-    resources['top_package'] = top_package
-    resources['module_import'] = module_import
-    return resources, top_package
-
-    if f.endswith("__init__.py"):
-        for root, dirs, files in os.walk(os.path.dirname(f)):
-            for file in files:
-                if file.endswith(".py"):
-                    # print(file)
-                    # print()
-                    v = os.path.relpath(os.path.join(root, file), top_package)
-                    with open(os.path.join(root, file), 'r') as ff:
-                        resources[v] = ff.read()
-    else:
-        v = os.path.relpath(f, top_package)
-        with open(f, 'r') as ff:
-            resources[v] = ff.read()
-    return resources
-
-import argparse
-parser = argparse.ArgumentParser(description='Evaluate your report.', epilog="""Use this script to get the score of your report. Example:
-
-> python report1_grade.py
-
-Finally, note that if your report is part of a module (package), and the report script requires part of that package, the -m option for python may be useful.
-For instance, if the report file is in Documents/course_package/report3_complete.py, and `course_package` is a python package, then change directory to 'Documents/` and run:
-
-> python -m course_package.report1
-
-see https://docs.python.org/3.9/using/cmdline.html
-""", formatter_class=argparse.RawTextHelpFormatter)
-parser.add_argument('--noprogress',  action="store_true",  help='Disable progress bars')
-parser.add_argument('--autolab',  action="store_true",  help='Show Autolab results')
-
-def gather_upload_to_campusnet(report, output_dir=None):
-    n = report.nL
-    args = parser.parse_args()
-    results, table_data = evaluate_report(report, show_help_flag=False, show_expected=False, show_computed=False, silent=True,
-                                          show_progress_bar=not args.noprogress,
-                                          big_header=not args.autolab)
-    print(" ")
-    print("="*n)
-    print("Final evaluation")
-    print(tabulate(table_data))
-    # also load the source code of missing files...
-
-    sources = {}
-
-    if not args.autolab:
-        if len(report.individual_imports) > 0:
-            print("By uploading the .token file, you verify the files:")
-            for m in report.individual_imports:
-                print(">", m.__file__)
-            print("Are created/modified individually by you in agreement with DTUs exam rules")
-            report.pack_imports += report.individual_imports
-
-        if len(report.pack_imports) > 0:
-            print("Including files in upload...")
-            for k, m in enumerate(report.pack_imports):
-                nimp, top_package = gather_imports(m)
-                _, report_relative_location, module_import = report._import_base_relative()
-
-                # report_relative_location = os.path.relpath(inspect.getfile(report.__class__), top_package)
-                nimp['report_relative_location'] = report_relative_location
-                nimp['report_module_specification'] = module_import
-                nimp['name'] = m.__name__
-                sources[k] = nimp
-                # if len([k for k in nimp if k not in sources]) > 0:
-                print(f"*** {m.__name__}")
-                # sources = {**sources, **nimp}
-    results['sources'] = sources
-
-    if output_dir is None:
-        output_dir = os.getcwd()
-
-    payload_out_base = report.__class__.__name__ + "_handin"
-
-    obtain, possible = results['total']
-    vstring = "_v"+report.version if report.version is not None else ""
-
-    token = "%s_%i_of_%i%s.token"%(payload_out_base, obtain, possible,vstring)
-    token = os.path.join(output_dir, token)
-    with open(token, 'wb') as f:
-        pickle.dump(results, f)
-
-    if not args.autolab:
-        print(" ")
-        print("To get credit for your results, please upload the single file: ")
-        print(">", token)
-        print("To campusnet without any modifications.")
-
-        # print("Now time for some autolab fun")
-
-def source_instantiate(name, report1_source, payload):
-    eval("exec")(report1_source, globals())
-    pl = pickle.loads(bytes.fromhex(payload))
-    report = eval(name)(payload=pl, strict=True)
-    # report.set_payload(pl)
-    return report
-
-
-
-report1_source = 'import os\n\n# DONT\'t import stuff here since install script requires __version__\n\ndef cache_write(object, file_name, verbose=True):\n    import compress_pickle\n    dn = os.path.dirname(file_name)\n    if not os.path.exists(dn):\n        os.mkdir(dn)\n    if verbose: print("Writing cache...", file_name)\n    with open(file_name, \'wb\', ) as f:\n        compress_pickle.dump(object, f, compression="lzma")\n    if verbose: print("Done!")\n\n\ndef cache_exists(file_name):\n    # file_name = cn_(file_name) if cache_prefix else file_name\n    return os.path.exists(file_name)\n\n\ndef cache_read(file_name):\n    import compress_pickle # Import here because if you import in top the __version__ tag will fail.\n    # file_name = cn_(file_name) if cache_prefix else file_name\n    if os.path.exists(file_name):\n        try:\n            with open(file_name, \'rb\') as f:\n                return compress_pickle.load(f, compression="lzma")\n        except Exception as e:\n            print("Tried to load a bad pickle file at", file_name)\n            print("If the file appears to be automatically generated, you can try to delete it, otherwise download a new version")\n            print(e)\n            # return pickle.load(f)\n    else:\n        return None\n\n\n\n"""\ngit add . && git commit -m "Options" && git push &&  pip install git+ssh://git@gitlab.compute.dtu.dk/tuhe/unitgrade_v1.git --upgrade\n\n"""\n# from . import cache_read\nimport unittest\nimport numpy as np\nimport sys\nimport collections\nimport re\nimport threading\nimport tqdm\nimport time\nimport pickle\nimport os\nfrom io import StringIO\nfrom unittest.runner import _WritelnDecorator\nimport inspect\n\nmyround = lambda x: np.round(x)  # required.\nmsum = lambda x: sum(x)\nmfloor = lambda x: np.floor(x)\n\ndef setup_dir_by_class(C,base_dir):\n    name = C.__class__.__name__\n    # base_dir = os.path.join(base_dir, name)\n    # if not os.path.isdir(base_dir):\n    #     os.makedirs(base_dir)\n    return base_dir, name\n\nclass Hidden:\n    def hide(self):\n        return True\n\nclass Logger(object):\n    def __init__(self, buffer):\n        self.terminal = sys.stdout\n        self.log = buffer\n\n    def write(self, message):\n        self.terminal.write(message)\n        self.log.write(message)\n\n    def flush(self):\n        # this flush method is needed for python 3 compatibility.\n        pass\n\nclass Capturing(list):\n    def __init__(self, *args, stdout=None, unmute=False, **kwargs):\n        self._stdout = stdout\n        self.unmute = unmute\n        super().__init__(*args, **kwargs)\n\n    def __enter__(self, capture_errors=True): # don\'t put arguments here.\n        self._stdout = sys.stdout if self._stdout == None else self._stdout\n        self._stringio = StringIO()\n        if self.unmute:\n            sys.stdout = Logger(self._stringio)\n        else:\n            sys.stdout = self._stringio\n\n        if capture_errors:\n            self._sterr = sys.stderr\n            sys.sterr = StringIO() # memory hole it\n        self.capture_errors = capture_errors\n        return self\n\n    def __exit__(self, *args):\n        self.extend(self._stringio.getvalue().splitlines())\n        del self._stringio    # free up some memory\n        sys.stdout = self._stdout\n        if self.capture_errors:\n            sys.sterr = self._sterr\n\nclass Capturing2(Capturing):\n    def __exit__(self, *args):\n        lines = self._stringio.getvalue().splitlines()\n        txt = "\\n".join(lines)\n        numbers = extract_numbers(txt)\n        self.extend(lines)\n        del self._stringio    # free up some memory\n        sys.stdout = self._stdout\n        if self.capture_errors:\n            sys.sterr = self._sterr\n\n        self.output = txt\n        self.numbers = numbers\n\n\nclass QItem(unittest.TestCase):\n    title = None\n    testfun = None\n    tol = 0\n    estimated_time = 0.42\n    _precomputed_payload = None\n    _computed_answer = None # Internal helper to later get results.\n    weight = 1 # the weight of the question.\n\n    def __init__(self, question=None, *args, **kwargs):\n        if self.tol > 0 and self.testfun is None:\n            self.testfun = self.assertL2Relative\n        elif self.testfun is None:\n            self.testfun = self.assertEqual\n\n        self.name = self.__class__.__name__\n        # self._correct_answer_payload = correct_answer_payload\n        self.question = question\n\n        super().__init__(*args, **kwargs)\n        if self.title is None:\n            self.title = self.name\n\n    def _safe_get_title(self):\n        if self._precomputed_title is not None:\n            return self._precomputed_title\n        return self.title\n\n    def assertNorm(self, computed, expected, tol=None):\n        if tol == None:\n            tol = self.tol\n        diff = np.abs( (np.asarray(computed).flat- np.asarray(expected)).flat )\n        nrm = np.sqrt(np.sum( diff ** 2))\n\n        self.error_computed = nrm\n\n        if nrm > tol:\n            print(f"Not equal within tolerance {tol}; norm of difference was {nrm}")\n            print(f"Element-wise differences {diff.tolist()}")\n            self.assertEqual(computed, expected, msg=f"Not equal within tolerance {tol}")\n\n    def assertL2(self, computed, expected, tol=None):\n        if tol == None:\n            tol = self.tol\n        diff = np.abs( (np.asarray(computed) - np.asarray(expected)) )\n        self.error_computed = np.max(diff)\n\n        if np.max(diff) > tol:\n            print(f"Not equal within tolerance {tol=}; deviation was {np.max(diff)=}")\n            print(f"Element-wise differences {diff.tolist()}")\n            self.assertEqual(computed, expected, msg=f"Not equal within tolerance {tol=}, {np.max(diff)=}")\n\n    def assertL2Relative(self, computed, expected, tol=None):\n        if tol == None:\n            tol = self.tol\n        diff = np.abs( (np.asarray(computed) - np.asarray(expected)) )\n        diff = diff / (1e-8 + np.abs( (np.asarray(computed) + np.asarray(expected)) ) )\n        self.error_computed = np.max(np.abs(diff))\n        if np.sum(diff > tol) > 0:\n            print(f"Not equal within tolerance {tol}")\n            print(f"Element-wise differences {diff.tolist()}")\n            self.assertEqual(computed, expected, msg=f"Not equal within tolerance {tol}")\n\n    def precomputed_payload(self):\n        return self._precomputed_payload\n\n    def precompute_payload(self):\n        # Pre-compute resources to include in tests (useful for getting around rng).\n        pass\n\n    def compute_answer(self, unmute=False):\n        raise NotImplementedError("test code here")\n\n    def test(self, computed, expected):\n        self.testfun(computed, expected)\n\n    def get_points(self, verbose=False, show_expected=False, show_computed=False,unmute=False, passall=False, silent=False, **kwargs):\n        possible = 1\n        computed = None\n        def show_computed_(computed):\n            print(">>> Your output:")\n            print(computed)\n\n        def show_expected_(expected):\n            print(">>> Expected output (note: may have been processed; read text script):")\n            print(expected)\n\n        correct = self._correct_answer_payload\n        try:\n            if unmute: # Required to not mix together print stuff.\n                print("")\n            computed = self.compute_answer(unmute=unmute)\n        except Exception as e:\n            if not passall:\n                if not silent:\n                    print("\\n=================================================================================")\n                    print(f"When trying to run test class \'{self.name}\' your code threw an error:", e)\n                    show_expected_(correct)\n                    import traceback\n                    print(traceback.format_exc())\n                    print("=================================================================================")\n                return (0, possible)\n\n        if self._computed_answer is None:\n            self._computed_answer = computed\n\n        if show_expected or show_computed:\n            print("\\n")\n        if show_expected:\n            show_expected_(correct)\n        if show_computed:\n            show_computed_(computed)\n        try:\n            if not passall:\n                self.test(computed=computed, expected=correct)\n        except Exception as e:\n            if not silent:\n                print("\\n=================================================================================")\n                print(f"Test output from test class \'{self.name}\' does not match expected result. Test error:")\n                print(e)\n                show_computed_(computed)\n                show_expected_(correct)\n            return (0, possible)\n        return (1, possible)\n\n    def score(self):\n        try:\n            self.test()\n        except Exception as e:\n            return 0\n        return 1\n\nclass QPrintItem(QItem):\n    def compute_answer_print(self):\n        """\n        Generate output which is to be tested. By default, both text written to the terminal using print(...) as well as return values\n        are send to process_output (see compute_answer below). In other words, the text generated is:\n\n        res = compute_Answer_print()\n        txt = (any terminal output generated above)\n        numbers = (any numbers found in terminal-output txt)\n\n        self.test(process_output(res, txt, numbers), <expected result>)\n\n        :return: Optional values for comparison\n        """\n        raise Exception("Generate output here. The output is passed to self.process_output")\n\n    def process_output(self, res, txt, numbers):\n        return res\n\n    def compute_answer(self, unmute=False):\n        with Capturing(unmute=unmute) as output:\n            res = self.compute_answer_print()\n        s = "\\n".join(output)\n        s = rm_progress_bar(s) # Remove progress bar.\n        numbers = extract_numbers(s)\n        self._computed_answer = (res, s, numbers)\n        return self.process_output(res, s, numbers)\n\nclass OrderedClassMembers(type):\n    @classmethod\n    def __prepare__(self, name, bases):\n        return collections.OrderedDict()\n    def __new__(self, name, bases, classdict):\n        ks = list(classdict.keys())\n        for b in bases:\n            ks += b.__ordered__\n        classdict[\'__ordered__\'] = [key for key in ks if key not in (\'__module__\', \'__qualname__\')]\n        return type.__new__(self, name, bases, classdict)\n\nclass QuestionGroup(metaclass=OrderedClassMembers):\n    title = "Untitled question"\n    partially_scored = False\n    t_init = 0  # Time spend on initialization (placeholder; set this externally).\n    estimated_time = 0.42\n    has_called_init_ = False\n    _name = None\n    _items = None\n\n    @property\n    def items(self):\n        if self._items == None:\n            self._items = []\n            members = [gt for gt in [getattr(self, gt) for gt in self.__ordered__ if gt not in ["__classcell__", "__init__"]] if inspect.isclass(gt) and issubclass(gt, QItem)]\n            for I in members:\n                self._items.append( I(question=self))\n        return self._items\n\n    @items.setter\n    def items(self, value):\n        self._items = value\n\n    @property\n    def name(self):\n        if self._name == None:\n            self._name = self.__class__.__name__\n        return self._name #\n\n    @name.setter\n    def name(self, val):\n        self._name = val\n\n    def init(self):\n        # Can be used to set resources relevant for this question instance.\n        pass\n\n    def init_all_item_questions(self):\n        for item in self.items:\n            if not item.question.has_called_init_:\n                item.question.init()\n                item.question.has_called_init_ = True\n\n\nclass Report:\n    title = "report title"\n    version = None\n    questions = []\n    pack_imports = []\n    individual_imports = []\n    nL = 80 # Maximum line width\n\n    @classmethod\n    def reset(cls):\n        for (q,_) in cls.questions:\n            if hasattr(q, \'reset\'):\n                q.reset()\n\n    @classmethod\n    def mfile(clc):\n        return inspect.getfile(clc)\n\n    def _file(self):\n        return inspect.getfile(type(self))\n\n    def _import_base_relative(self):\n        if hasattr(self.pack_imports[0], \'__path__\'):\n            root_dir = self.pack_imports[0].__path__._path[0]\n        else:\n            root_dir = self.pack_imports[0].__file__\n\n        root_dir = os.path.dirname(root_dir)\n        relative_path = os.path.relpath(self._file(), root_dir)\n        modules = os.path.normpath(relative_path[:-3]).split(os.sep)\n        return root_dir, relative_path, modules\n\n    def __init__(self, strict=False, payload=None):\n        working_directory = os.path.abspath(os.path.dirname(self._file()))\n\n        self.wdir, self.name = setup_dir_by_class(self, working_directory)\n        # self.computed_answers_file = os.path.join(self.wdir, self.name + "_resources_do_not_hand_in.dat")\n        for (q,_) in self.questions:\n            q.nL = self.nL # Set maximum line length.\n\n        if payload is not None:\n            self.set_payload(payload, strict=strict)\n        # else:\n        #     if os.path.isfile(self.computed_answers_file):\n        #         self.set_payload(cache_read(self.computed_answers_file), strict=strict)\n        #     else:\n        #         s = f"> Warning: The pre-computed answer file, {os.path.abspath(self.computed_answers_file)} is missing. The framework will NOT work as intended. Reasons may be a broken local installation."\n        #         if strict:\n        #             raise Exception(s)\n        #         else:\n        #             print(s)\n\n    def main(self, verbosity=1):\n        # Run all tests using standard unittest (nothing fancy).\n        import unittest\n        loader = unittest.TestLoader()\n        for q,_ in self.questions:\n            import time\n            start = time.time() # A good proxy for setup time is to\n            suite = loader.loadTestsFromTestCase(q)\n            unittest.TextTestRunner(verbosity=verbosity).run(suite)\n            total = time.time()              - start\n            q.time = total\n\n    def _setup_answers(self):\n        self.main()  # Run all tests in class just to get that out of the way...\n        report_cache = {}\n        for q, _ in self.questions:\n            if hasattr(q, \'_save_cache\'):\n                q()._save_cache()\n                q._cache[\'time\'] = q.time\n                report_cache[q.__qualname__] = q._cache\n            else:\n                report_cache[q.__qualname__] = {\'no cache see _setup_answers in framework.py\':True}\n        return report_cache\n\n    def set_payload(self, payloads, strict=False):\n        for q, _ in self.questions:\n            q._cache = payloads[q.__qualname__]\n\ndef rm_progress_bar(txt):\n    # More robust version. Apparently length of bar can depend on various factors, so check for order of symbols.\n    nlines = []\n    for l in txt.splitlines():\n        pct = l.find("%")\n        ql = False\n        if pct > 0:\n            i = l.find("|", pct+1)\n            if i > 0 and l.find("|", i+1) > 0:\n                ql = True\n        if not ql:\n            nlines.append(l)\n    return "\\n".join(nlines)\n\ndef extract_numbers(txt):\n    # txt = rm_progress_bar(txt)\n    numeric_const_pattern = \'[-+]? (?: (?: \\d* \\. \\d+ ) | (?: \\d+ \\.? ) )(?: [Ee] [+-]? \\d+ ) ?\'\n    rx = re.compile(numeric_const_pattern, re.VERBOSE)\n    all = rx.findall(txt)\n    all = [float(a) if (\'.\' in a or "e" in a) else int(a) for a in all]\n    if len(all) > 500:\n        print(txt)\n        raise Exception("unitgrade_v1.unitgrade_v1.py: Warning, too many numbers!", len(all))\n    return all\n\nclass ActiveProgress():\n    def __init__(self, t, start=True, title="my progress bar",show_progress_bar=True):\n        self.t = t\n        self._running = False\n        self.title = title\n        self.dt = 0.1\n        self.n = int(np.round(self.t / self.dt))\n        self.show_progress_bar = show_progress_bar\n\n        # self.pbar = tqdm.tqdm(total=self.n)\n        if start:\n            self.start()\n\n    def start(self):\n        self._running = True\n        if self.show_progress_bar:\n            self.thread = threading.Thread(target=self.run)\n            self.thread.start()\n        self.time_started = time.time()\n\n    def terminate(self):\n        if not self._running:\n            raise Exception("Stopping a stopped progress bar. ")\n        self._running = False\n        if self.show_progress_bar:\n            self.thread.join()\n        if hasattr(self, \'pbar\') and self.pbar is not None:\n            self.pbar.update(1)\n            self.pbar.close()\n            self.pbar=None\n\n        sys.stdout.flush()\n        return time.time() - self.time_started\n\n    def run(self):\n        self.pbar = tqdm.tqdm(total=self.n, file=sys.stdout, position=0, leave=False, desc=self.title, ncols=100,\n                              bar_format=\'{l_bar}{bar}| [{elapsed}<{remaining}]\')  # , unit_scale=dt, unit=\'seconds\'):\n\n        for _ in range(self.n-1): # Don\'t terminate completely; leave bar at 99% done until terminate.\n            if not self._running:\n                self.pbar.close()\n                self.pbar = None\n                break\n\n            time.sleep(self.dt)\n            self.pbar.update(1)\n\n\n# class MySuite(unittest.suite.TestSuite): # Not sure we need this one anymore.\n#     raise Exception("no suite")\n#     pass\n\ndef instance_call_stack(instance):\n    s = "-".join(map(lambda x: x.__name__, instance.__class__.mro()))\n    return s\n\ndef get_class_that_defined_method(meth):\n    for cls in inspect.getmro(meth.im_class):\n        if meth.__name__ in cls.__dict__:\n            return cls\n    return None\n\ndef caller_name(skip=2):\n    """Get a name of a caller in the format module.class.method\n\n       `skip` specifies how many levels of stack to skip while getting caller\n       name. skip=1 means "who calls me", skip=2 "who calls my caller" etc.\n\n       An empty string is returned if skipped levels exceed stack height\n    """\n    stack = inspect.stack()\n    start = 0 + skip\n    if len(stack) < start + 1:\n      return \'\'\n    parentframe = stack[start][0]\n\n    name = []\n    module = inspect.getmodule(parentframe)\n    # `modname` can be None when frame is executed directly in console\n    # TODO(techtonik): consider using __main__\n    if module:\n        name.append(module.__name__)\n    # detect classname\n    if \'self\' in parentframe.f_locals:\n        # I don\'t know any way to detect call from the object method\n        # XXX: there seems to be no way to detect static method call - it will\n        #      be just a function call\n        name.append(parentframe.f_locals[\'self\'].__class__.__name__)\n    codename = parentframe.f_code.co_name\n    if codename != \'<module>\':  # top level usually\n        name.append( codename ) # function or a method\n\n    ## Avoid circular refs and frame leaks\n    #  https://docs.python.org/2.7/library/inspect.html#the-interpreter-stack\n    del parentframe, stack\n\n    return ".".join(name)\n\ndef get_class_from_frame(fr):\n\n      args, _, _, value_dict = inspect.getargvalues(fr)\n      # we check the first parameter for the frame function is\n      # named \'self\'\n      if len(args) and args[0] == \'self\':\n            # in that case, \'self\' will be referenced in value_dict\n            instance = value_dict.get(\'self\', None)\n            if instance:\n                  # return its class\n                  # isinstance(instance, Testing) # is the actual class instance.\n\n                  return getattr(instance, \'__class__\', None)\n      # return None otherwise\n      return None\n\nfrom typing import Any\nimport inspect, gc\n\ndef giveupthefunc():\n    frame = inspect.currentframe()\n    code  = frame.f_code\n    globs = frame.f_globals\n    functype = type(lambda: 0)\n    funcs = []\n    for func in gc.get_referrers(code):\n        if type(func) is functype:\n            if getattr(func, "__code__", None) is code:\n                if getattr(func, "__globals__", None) is globs:\n                    funcs.append(func)\n                    if len(funcs) > 1:\n                        return None\n    return funcs[0] if funcs else None\n\n\nfrom collections import defaultdict\n\nclass UTextResult(unittest.TextTestResult):\n    nL = 80\n    number = -1 # HAcky way to set question number.\n    show_progress_bar = True\n    def __init__(self, stream, descriptions, verbosity):\n        super().__init__(stream, descriptions, verbosity)\n        self.successes = []\n\n    def printErrors(self) -> None:\n        # if self.dots or self.showAll:\n        #     self.stream.writeln()\n        # if hasattr(self, \'cc\'):\n        #     self.cc.terminate()\n        # self.cc_terminate(success=False)\n        self.printErrorList(\'ERROR\', self.errors)\n        self.printErrorList(\'FAIL\', self.failures)\n\n    def addError(self, test, err):\n        super(unittest.TextTestResult, self).addFailure(test, err)\n        self.cc_terminate(success=False)\n\n    def addFailure(self, test, err):\n        super(unittest.TextTestResult, self).addFailure(test, err)\n        self.cc_terminate(success=False)\n        # if self.showAll:\n        #     self.stream.writeln("FAIL")\n        # elif self.dots:\n        #     self.stream.write(\'F\')\n        #     self.stream.flush()\n\n    def addSuccess(self, test: unittest.case.TestCase) -> None:\n        # super().addSuccess(test)\n        self.successes.append(test)\n        # super().addSuccess(test)\n        #     hidden = issubclass(item.__class__, Hidden)\n        #     # if not hidden:\n        #     #     print(ss, end="")\n        #     # sys.stdout.flush()\n        #     start = time.time()\n        #\n        #     (current, possible) = item.get_points(show_expected=show_expected, show_computed=show_computed,unmute=unmute, passall=passall, silent=silent)\n        #     q_[j] = {\'w\': item.weight, \'possible\': possible, \'obtained\': current, \'hidden\': hidden, \'computed\': str(item._computed_answer), \'title\': item.title}\n        #     tsecs = np.round(time.time()-start, 2)\n        self.cc_terminate()\n\n\n\n    def cc_terminate(self, success=True):\n        if self.show_progress_bar or True:\n            tsecs = np.round(self.cc.terminate(), 2)\n            sys.stdout.flush()\n            ss = self.item_title_print\n\n            state = "PASS" if success else "FAILED"\n\n            dot_parts = (\'.\' * max(0, self.nL - len(state) - len(ss)))\n            if self.show_progress_bar or True:\n                print(self.item_title_print + dot_parts, end="")\n            else:\n                print( dot_parts, end="")\n\n            if tsecs >= 0.1:\n                state += " (" + str(tsecs) + " seconds)"\n            print(state)\n\n\n    def startTest(self, test):\n        # super().startTest(test)\n        j =self.testsRun\n        self.testsRun += 1\n        # print("Starting the test...")\n        # show_progress_bar = True\n        n = UTextResult.number\n\n        item_title = self.getDescription(test)\n        # item_title = item_title.split("\\n")[0]\n        item_title = test.shortDescription() # Better for printing (get from cache).\n        if item_title == None:\n            # For unittest framework where getDescription may return None.\n            item_title = self.getDescription(test)\n        # test.countTestCases()\n        self.item_title_print = "*** q%i.%i) %s" % (n + 1, j + 1, item_title)\n        estimated_time = 10\n        nL = 80\n        #\n        if self.show_progress_bar or True:\n            self.cc = ActiveProgress(t=estimated_time, title=self.item_title_print, show_progress_bar=self.show_progress_bar)\n        else:\n            print(self.item_title_print + (\'.\' * max(0, nL - 4 - len(self.item_title_print))), end="")\n\n        self._test = test\n\n    def _setupStdout(self):\n        if self._previousTestClass == None:\n            total_estimated_time = 1\n            if hasattr(self.__class__, \'q_title_print\'):\n                q_title_print = self.__class__.q_title_print\n            else:\n                q_title_print = "<unnamed test. See unitgrade_v1.py>"\n\n            # q_title_print = "some printed title..."\n            cc = ActiveProgress(t=total_estimated_time, title=q_title_print, show_progress_bar=self.show_progress_bar)\n            self.cc = cc\n\n    def _restoreStdout(self): # Used when setting up the test.\n        if self._previousTestClass == None:\n            q_time = self.cc.terminate()\n            q_time = np.round(q_time, 2)\n            sys.stdout.flush()\n            if self.show_progress_bar:\n                print(self.cc.title, end="")\n            # start = 10\n            # q_time = np.round(time.time() - start, 2)\n            nL = 80\n            print(" " * max(0, nL - len(self.cc.title)) + (\n                " (" + str(q_time) + " seconds)" if q_time >= 0.1 else ""))  # if q.name in report.payloads else "")\n            # print("=" * nL)\n\n\n\nclass UTextTestRunner(unittest.TextTestRunner):\n    def __init__(self, *args, **kwargs):\n        from io import StringIO\n        stream = StringIO()\n        super().__init__(*args, stream=stream, **kwargs)\n\n    def _makeResult(self):\n        # stream = self.stream # not you!\n        stream = sys.stdout\n        stream = _WritelnDecorator(stream)\n        return self.resultclass(stream, self.descriptions, self.verbosity)\n\n# def wrapper(foo):\n#     def magic(self):\n#         # s = "-".join(map(lambda x: x.__name__, self.__class__.mro()))\n#         foo(self)\n#     magic.__doc__ = foo.__doc__\n#     return magic\n\nfrom functools import update_wrapper, _make_key, RLock\nfrom collections import namedtuple\n_CacheInfo = namedtuple("CacheInfo", ["hits", "misses", "maxsize", "currsize"])\n\ndef cache(foo, typed=False):\n    """ Magic cache wrapper\n    https://github.com/python/cpython/blob/main/Lib/functools.py\n    """\n    maxsize = None\n    def wrapper(self, *args, **kwargs):\n        key = (self.cache_id(), ("@cache", foo.__name__, _make_key(args, kwargs, typed)) )\n        if not self._cache_contains(key):\n            value = foo(self, *args, **kwargs)\n            self._cache_put(key, value)\n        else:\n            value = self._cache_get(key)\n        return value\n    return wrapper\n\n\nclass UTestCase(unittest.TestCase):\n    _outcome = None # A dictionary which stores the user-computed outcomes of all the tests. This differs from the cache.\n    _cache = None  # Read-only cache. Ensures method always produce same result.\n    _cache2 = None  # User-written cache.\n\n    def capture(self):\n        return Capturing2(stdout=self._stdout)\n\n    @classmethod\n    def question_title(cls):\n        """ Return the question title """\n        return cls.__doc__.strip().splitlines()[0].strip() if cls.__doc__ != None else cls.__qualname__\n\n    @classmethod\n    def reset(cls):\n        print("Warning, I am not sure UTestCase.reset() is needed anymore and it seems very hacky.")\n        cls._outcome = None\n        cls._cache = None\n        cls._cache2 = None\n\n    def _callSetUp(self):\n        self._stdout = sys.stdout\n        import io\n        sys.stdout = io.StringIO()\n        super().setUp()\n        # print("Setting up...")\n\n    def _callTearDown(self):\n        sys.stdout = self._stdout\n        super().tearDown()\n        # print("asdfsfd")\n\n    def shortDescriptionStandard(self):\n        sd = super().shortDescription()\n        if sd == None:\n            sd = self._testMethodName\n        return sd\n\n    def shortDescription(self):\n        # self._testMethodDoc.strip().splitlines()[0].strip()\n        sd = self.shortDescriptionStandard()\n        title = self._cache_get(  (self.cache_id(), \'title\'), sd )\n        return title if title != None else sd\n\n    @property\n    def title(self):\n        return self.shortDescription()\n\n    @title.setter\n    def title(self, value):\n        self._cache_put((self.cache_id(), \'title\'), value)\n\n    def _get_outcome(self):\n        if not (self.__class__, \'_outcome\') or self.__class__._outcome == None:\n            self.__class__._outcome = {}\n        return self.__class__._outcome\n\n    def _callTestMethod(self, testMethod):\n        t = time.time()\n        self._ensure_cache_exists() # Make sure cache is there.\n        if self._testMethodDoc != None:\n            # Ensure the cache is eventually updated with the right docstring.\n            self._cache_put((self.cache_id(), \'title\'), self.shortDescriptionStandard() )\n        # Fix temp cache here (for using the @cache decorator)\n        self._cache2[ (self.cache_id(), \'assert\') ] = {}\n\n        res = testMethod()\n        elapsed = time.time() - t\n        # self._cache_put( (self.cache_id(), \'title\'), self.shortDescription() )\n\n        self._get_outcome()[self.cache_id()] = res\n        self._cache_put( (self.cache_id(), "time"), elapsed)\n\n    # This is my base test class. So what is new about it?\n    def cache_id(self):\n        c = self.__class__.__qualname__\n        m = self._testMethodName\n        return (c,m)\n\n    def __init__(self, *args, **kwargs):\n        super().__init__(*args, **kwargs)\n        self._load_cache()\n        self._assert_cache_index = 0\n        # self.cache_indexes = defaultdict(lambda: 0)\n\n    def _ensure_cache_exists(self):\n        if not hasattr(self.__class__, \'_cache\') or self.__class__._cache == None:\n            self.__class__._cache = dict()\n        if not hasattr(self.__class__, \'_cache2\') or self.__class__._cache2 == None:\n            self.__class__._cache2 = dict()\n\n    def _cache_get(self, key, default=None):\n        self._ensure_cache_exists()\n        return self.__class__._cache.get(key, default)\n\n    def _cache_put(self, key, value):\n        self._ensure_cache_exists()\n        self.__class__._cache2[key] = value\n\n    def _cache_contains(self, key):\n        self._ensure_cache_exists()\n        return key in self.__class__._cache\n\n    def wrap_assert(self, assert_fun, first, *args, **kwargs):\n        key = (self.cache_id(), \'assert\')\n        if not self._cache_contains(key):\n            print("Warning, framework missing", key)\n        cache = self._cache_get(key, {})\n        id = self._assert_cache_index\n        if not id in cache:\n            print("Warning, framework missing cache index", key, "id =", id)\n        _expected = cache.get(id, first)\n        assert_fun(first, _expected, *args, **kwargs)\n        cache[id] = first\n        self._cache_put(key, cache)\n        self._assert_cache_index += 1\n\n    def assertEqualC(self, first: Any, msg: Any = ...) -> None:\n        self.wrap_assert(self.assertEqual, first, msg)\n\n    def _cache_file(self):\n        return os.path.dirname(inspect.getfile(self.__class__) ) + "/unitgrade_v1/" + self.__class__.__name__ + ".pkl"\n\n    def _save_cache(self):\n        # get the class name (i.e. what to save to).\n        cfile = self._cache_file()\n        if not os.path.isdir(os.path.dirname(cfile)):\n            os.makedirs(os.path.dirname(cfile))\n\n        if hasattr(self.__class__, \'_cache2\'):\n            with open(cfile, \'wb\') as f:\n                pickle.dump(self.__class__._cache2, f)\n\n    # But you can also set cache explicitly.\n    def _load_cache(self):\n        if self._cache != None: # Cache already loaded. We will not load it twice.\n            return\n            # raise Exception("Loaded cache which was already set. What is going on?!")\n        cfile = self._cache_file()\n        # print("Loading cache from", cfile)\n        if os.path.exists(cfile):\n            with open(cfile, \'rb\') as f:\n                data = pickle.load(f)\n                self.__class__._cache = data\n        else:\n            print("Warning! data file not found", cfile)\n\ndef hide(func):\n    return func\n\ndef makeRegisteringDecorator(foreignDecorator):\n    """\n        Returns a copy of foreignDecorator, which is identical in every\n        way(*), except also appends a .decorator property to the callable it\n        spits out.\n    """\n    def newDecorator(func):\n        # Call to newDecorator(method)\n        # Exactly like old decorator, but output keeps track of what decorated it\n        R = foreignDecorator(func)  # apply foreignDecorator, like call to foreignDecorator(method) would have done\n        R.decorator = newDecorator  # keep track of decorator\n        # R.original = func         # might as well keep track of everything!\n        return R\n\n    newDecorator.__name__ = foreignDecorator.__name__\n    newDecorator.__doc__ = foreignDecorator.__doc__\n    # (*)We can be somewhat "hygienic", but newDecorator still isn\'t signature-preserving, i.e. you will not be able to get a runtime list of parameters. For that, you need hackish libraries...but in this case, the only argument is func, so it\'s not a big issue\n    return newDecorator\n\nhide = makeRegisteringDecorator(hide)\n\ndef methodsWithDecorator(cls, decorator):\n    """\n        Returns all methods in CLS with DECORATOR as the\n        outermost decorator.\n\n        DECORATOR must be a "registering decorator"; one\n        can make any decorator "registering" via the\n        makeRegisteringDecorator function.\n\n        import inspect\n        ls = list(methodsWithDecorator(GeneratorQuestion, deco))\n        for f in ls:\n            print(inspect.getsourcelines(f) ) # How to get all hidden questions.\n    """\n    for maybeDecorated in cls.__dict__.values():\n        if hasattr(maybeDecorated, \'decorator\'):\n            if maybeDecorated.decorator == decorator:\n                print(maybeDecorated)\n                yield maybeDecorated\n\n\n\nimport numpy as np\nfrom tabulate import tabulate\nfrom datetime import datetime\nimport pyfiglet\nimport unittest\n# from unitgrade.unitgrade import MySuite\n\nimport inspect\nimport os\nimport argparse\nimport sys\nimport time\nimport threading # don\'t import Thread bc. of minify issue.\nimport tqdm # don\'t do from tqdm import tqdm because of minify-issue\n\nparser = argparse.ArgumentParser(description=\'Evaluate your report.\', epilog="""Example: \nTo run all tests in a report: \n\n> python assignment1_dp.py\n\nTo run only question 2 or question 2.1\n\n> python assignment1_dp.py -q 2\n> python assignment1_dp.py -q 2.1\n\nNote this scripts does not grade your report. To grade your report, use:\n\n> python report1_grade.py\n\nFinally, note that if your report is part of a module (package), and the report script requires part of that package, the -m option for python may be useful.\nFor instance, if the report file is in Documents/course_package/report3_complete.py, and `course_package` is a python package, then change directory to \'Documents/` and run:\n\n> python -m course_package.report1\n\nsee https://docs.python.org/3.9/using/cmdline.html\n""", formatter_class=argparse.RawTextHelpFormatter)\nparser.add_argument(\'-q\', nargs=\'?\', type=str, default=None, help=\'Only evaluate this question (e.g.: -q 2)\')\nparser.add_argument(\'--showexpected\',  action="store_true",  help=\'Show the expected/desired result\')\nparser.add_argument(\'--showcomputed\',  action="store_true",  help=\'Show the answer your code computes\')\nparser.add_argument(\'--unmute\',  action="store_true",  help=\'Show result of print(...) commands in code\')\nparser.add_argument(\'--passall\',  action="store_true",  help=\'Automatically pass all tests. Useful when debugging.\')\n\ndef evaluate_report_student(report, question=None, qitem=None, unmute=None, passall=None, ignore_missing_file=False, show_tol_err=False):\n    args = parser.parse_args()\n    if question is None and args.q is not None:\n        question = args.q\n        if "." in question:\n            question, qitem = [int(v) for v in question.split(".")]\n        else:\n            question = int(question)\n\n    if hasattr(report, "computed_answer_file") and not os.path.isfile(report.computed_answers_file) and not ignore_missing_file:\n        raise Exception("> Error: The pre-computed answer file", os.path.abspath(report.computed_answers_file), "does not exist. Check your package installation")\n\n    if unmute is None:\n        unmute = args.unmute\n    if passall is None:\n        passall = args.passall\n\n    results, table_data = evaluate_report(report, question=question, show_progress_bar=not unmute, qitem=qitem, verbose=False, passall=passall, show_expected=args.showexpected, show_computed=args.showcomputed,unmute=unmute,\n                                          show_tol_err=show_tol_err)\n\n\n    if question is None:\n        print("Provisional evaluation")\n        tabulate(table_data)\n        table = table_data\n        print(tabulate(table))\n        print(" ")\n\n    fr = inspect.getouterframes(inspect.currentframe())[1].filename\n    gfile = os.path.basename(fr)[:-3] + "_grade.py"\n    if os.path.exists(gfile):\n        print("Note your results have not yet been registered. \\nTo register your results, please run the file:")\n        print(">>>", gfile)\n        print("In the same manner as you ran this file.")\n\n\n    return results\n\n\ndef upack(q):\n    # h = zip([(i[\'w\'], i[\'possible\'], i[\'obtained\']) for i in q.values()])\n    h =[(i[\'w\'], i[\'possible\'], i[\'obtained\']) for i in q.values()]\n    h = np.asarray(h)\n    return h[:,0], h[:,1], h[:,2],\n\nclass UnitgradeTextRunner(unittest.TextTestRunner):\n    def __init__(self, *args, **kwargs):\n        super().__init__(*args, **kwargs)\n\nclass SequentialTestLoader(unittest.TestLoader):\n    def getTestCaseNames(self, testCaseClass):\n        test_names = super().getTestCaseNames(testCaseClass)\n        # testcase_methods = list(testCaseClass.__dict__.keys())\n        ls = []\n        for C in testCaseClass.mro():\n            if issubclass(C, unittest.TestCase):\n                ls = list(C.__dict__.keys()) + ls\n        testcase_methods = ls\n        test_names.sort(key=testcase_methods.index)\n        return test_names\n\ndef evaluate_report(report, question=None, qitem=None, passall=False, verbose=False,  show_expected=False, show_computed=False,unmute=False, show_help_flag=True, silent=False,\n                    show_progress_bar=True,\n                    show_tol_err=False,\n                    big_header=True):\n\n    now = datetime.now()\n    if big_header:\n        ascii_banner = pyfiglet.figlet_format("UnitGrade", font="doom")\n        b = "\\n".join( [l for l in ascii_banner.splitlines() if len(l.strip()) > 0] )\n    else:\n        b = "Unitgrade"\n    print(b + " v" + __version__)\n    dt_string = now.strftime("%d/%m/%Y %H:%M:%S")\n    print("Started: " + dt_string)\n    s = report.title\n    if hasattr(report, "version") and report.version is not None:\n        s += " version " + report.version\n    print("Evaluating " + s, "(use --help for options)" if show_help_flag else "")\n    # print(f"Loaded answers from: ", report.computed_answers_file, "\\n")\n    table_data = []\n    nL = 80\n    t_start = time.time()\n    score = {}\n    loader = SequentialTestLoader()\n\n    for n, (q, w) in enumerate(report.questions):\n        # q = q()\n        # q_hidden = False\n        # q_hidden = issubclass(q.__class__, Hidden)\n        if question is not None and n+1 != question:\n            continue\n        suite = loader.loadTestsFromTestCase(q)\n        qtitle = q.question_title() if hasattr(q, \'question_title\') else q.__qualname__\n        q_title_print = "Question %i: %s"%(n+1, qtitle)\n        print(q_title_print, end="")\n        q.possible = 0\n        q.obtained = 0\n        q_ = {} # Gather score in this class.\n        # unittest.Te\n        # q_with_outstanding_init = [item.question for item in q.items if not item.question.has_called_init_]\n        UTextResult.q_title_print = q_title_print # Hacky\n        UTextResult.show_progress_bar = show_progress_bar # Hacky.\n        UTextResult.number = n\n\n        res = UTextTestRunner(verbosity=2, resultclass=UTextResult).run(suite)\n\n        possible = res.testsRun\n        obtained = len(res.successes)\n\n        assert len(res.successes) +  len(res.errors) + len(res.failures) == res.testsRun\n\n        # possible = int(ws @ possible)\n        # obtained = int(ws @ obtained)\n        # obtained = int(myround(int((w * obtained) / possible ))) if possible > 0 else 0\n\n        obtained = int(w * obtained * 1.0 / possible ) if possible > 0 else 0\n        score[n] = {\'w\': w, \'possible\': w, \'obtained\': obtained, \'items\': q_, \'title\': qtitle}\n        q.obtained = obtained\n        q.possible = possible\n\n        s1 = f"*** Question q{n+1}"\n        s2 = f" {q.obtained}/{w}"\n        print(s1 + ("."* (nL-len(s1)-len(s2) )) + s2 )\n        print(" ")\n        table_data.append([f"Question q{n+1}", f"{q.obtained}/{w}"])\n\n    ws, possible, obtained = upack(score)\n    possible = int( msum(possible) )\n    obtained = int( msum(obtained) ) # Cast to python int\n    report.possible = possible\n    report.obtained = obtained\n    now = datetime.now()\n    dt_string = now.strftime("%H:%M:%S")\n\n    dt = int(time.time()-t_start)\n    minutes = dt//60\n    seconds = dt - minutes*60\n    plrl = lambda i, s: str(i) + " " + s + ("s" if i != 1 else "")\n\n    print(f"Completed: "+ dt_string + " (" + plrl(minutes, "minute") + ", "+ plrl(seconds, "second") +")")\n\n    table_data.append(["Total", ""+str(report.obtained)+"/"+str(report.possible) ])\n    results = {\'total\': (obtained, possible), \'details\': score}\n    return results, table_data\n\n\n\n\nfrom tabulate import tabulate\nfrom datetime import datetime\nimport inspect\nimport json\nimport os\nimport bz2\nimport pickle\nimport os\n\ndef bzwrite(json_str, token): # to get around obfuscation issues\n    with getattr(bz2, \'open\')(token, "wt") as f:\n        f.write(json_str)\n\ndef gather_imports(imp):\n    resources = {}\n    m = imp\n    # for m in pack_imports:\n    # print(f"*** {m.__name__}")\n    f = m.__file__\n    # dn = os.path.dirname(f)\n    # top_package = os.path.dirname(__import__(m.__name__.split(\'.\')[0]).__file__)\n    # top_package = str(__import__(m.__name__.split(\'.\')[0]).__path__)\n\n    if hasattr(m, \'__file__\') and not hasattr(m, \'__path__\'):  # Importing a simple file: m.__class__.__name__ == \'module\' and False:\n        top_package = os.path.dirname(m.__file__)\n        module_import = True\n    else:\n        top_package = __import__(m.__name__.split(\'.\')[0]).__path__._path[0]\n        module_import = False\n\n    # top_package = os.path.dirname(__import__(m.__name__.split(\'.\')[0]).__file__)\n    # top_package = os.path.dirname(top_package)\n    import zipfile\n    # import strea\n    # zipfile.ZipFile\n    import io\n    # file_like_object = io.BytesIO(my_zip_data)\n    zip_buffer = io.BytesIO()\n    with zipfile.ZipFile(zip_buffer, \'w\') as zip:\n        # zip.write()\n        for root, dirs, files in os.walk(top_package):\n            for file in files:\n                if file.endswith(".py"):\n                    fpath = os.path.join(root, file)\n                    v = os.path.relpath(os.path.join(root, file), os.path.dirname(top_package) if not module_import else top_package)\n                    zip.write(fpath, v)\n\n    resources[\'zipfile\'] = zip_buffer.getvalue()\n    resources[\'top_package\'] = top_package\n    resources[\'module_import\'] = module_import\n    return resources, top_package\n\n    if f.endswith("__init__.py"):\n        for root, dirs, files in os.walk(os.path.dirname(f)):\n            for file in files:\n                if file.endswith(".py"):\n                    # print(file)\n                    # print()\n                    v = os.path.relpath(os.path.join(root, file), top_package)\n                    with open(os.path.join(root, file), \'r\') as ff:\n                        resources[v] = ff.read()\n    else:\n        v = os.path.relpath(f, top_package)\n        with open(f, \'r\') as ff:\n            resources[v] = ff.read()\n    return resources\n\nimport argparse\nparser = argparse.ArgumentParser(description=\'Evaluate your report.\', epilog="""Use this script to get the score of your report. Example:\n\n> python report1_grade.py\n\nFinally, note that if your report is part of a module (package), and the report script requires part of that package, the -m option for python may be useful.\nFor instance, if the report file is in Documents/course_package/report3_complete.py, and `course_package` is a python package, then change directory to \'Documents/` and run:\n\n> python -m course_package.report1\n\nsee https://docs.python.org/3.9/using/cmdline.html\n""", formatter_class=argparse.RawTextHelpFormatter)\nparser.add_argument(\'--noprogress\',  action="store_true",  help=\'Disable progress bars\')\nparser.add_argument(\'--autolab\',  action="store_true",  help=\'Show Autolab results\')\n\ndef gather_upload_to_campusnet(report, output_dir=None):\n    n = report.nL\n    args = parser.parse_args()\n    results, table_data = evaluate_report(report, show_help_flag=False, show_expected=False, show_computed=False, silent=True,\n                                          show_progress_bar=not args.noprogress,\n                                          big_header=not args.autolab)\n    print(" ")\n    print("="*n)\n    print("Final evaluation")\n    print(tabulate(table_data))\n    # also load the source code of missing files...\n\n    sources = {}\n\n    if not args.autolab:\n        if len(report.individual_imports) > 0:\n            print("By uploading the .token file, you verify the files:")\n            for m in report.individual_imports:\n                print(">", m.__file__)\n            print("Are created/modified individually by you in agreement with DTUs exam rules")\n            report.pack_imports += report.individual_imports\n\n        if len(report.pack_imports) > 0:\n            print("Including files in upload...")\n            for k, m in enumerate(report.pack_imports):\n                nimp, top_package = gather_imports(m)\n                _, report_relative_location, module_import = report._import_base_relative()\n\n                # report_relative_location = os.path.relpath(inspect.getfile(report.__class__), top_package)\n                nimp[\'report_relative_location\'] = report_relative_location\n                nimp[\'report_module_specification\'] = module_import\n                nimp[\'name\'] = m.__name__\n                sources[k] = nimp\n                # if len([k for k in nimp if k not in sources]) > 0:\n                print(f"*** {m.__name__}")\n                # sources = {**sources, **nimp}\n    results[\'sources\'] = sources\n\n    if output_dir is None:\n        output_dir = os.getcwd()\n\n    payload_out_base = report.__class__.__name__ + "_handin"\n\n    obtain, possible = results[\'total\']\n    vstring = "_v"+report.version if report.version is not None else ""\n\n    token = "%s_%i_of_%i%s.token"%(payload_out_base, obtain, possible,vstring)\n    token = os.path.join(output_dir, token)\n    with open(token, \'wb\') as f:\n        pickle.dump(results, f)\n\n    if not args.autolab:\n        print(" ")\n        print("To get credit for your results, please upload the single file: ")\n        print(">", token)\n        print("To campusnet without any modifications.")\n\n        # print("Now time for some autolab fun")\n\ndef source_instantiate(name, report1_source, payload):\n    eval("exec")(report1_source, globals())\n    pl = pickle.loads(bytes.fromhex(payload))\n    report = eval(name)(payload=pl, strict=True)\n    # report.set_payload(pl)\n    return report\n\n\n__version__ = "0.9.0"\n\nfrom homework1 import reverse_list, add\nimport unittest\n\nclass Week1(unittest.TestCase):\n    def test_add(self):\n        self.assertEqual(add(2,2), 4)\n        self.assertEqual(add(-100, 5), -95)\n\n    def test_reverse(self):\n        self.assertEqual(reverse_list([1,2,3]), [3,2,1])\n\n\nimport homework1\nclass Report1Flat(Report):\n    title = "CS 101 Report 1"\n    questions = [(Week1, 10)]  # Include a single question for 10 credits.\n    pack_imports = [homework1]'
-report1_payload = '8004953f000000000000007d948c055765656b31947d948c2c6e6f20636163686520736565205f73657475705f616e737765727320696e20756e69746772616465322e7079948873732e'
-name="Report1Flat"
-
-report = source_instantiate(name, report1_source, report1_payload)
-output_dir = os.path.dirname(__file__)
-gather_upload_to_campusnet(report, output_dir)
\ No newline at end of file
+'''WARNING: Modifying, decompiling or otherwise tampering with this script, it's data or the resulting .token file will be investigated as a cheating attempt.'''
+import bz2, base64
+exec(bz2.decompress(base64.b64decode('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')))
\ No newline at end of file
diff --git a/examples/example_moss/tmp/base/3_homework1.py b/examples/example_flat/instructor/output/homework1.py
similarity index 74%
rename from examples/example_moss/tmp/base/3_homework1.py
rename to examples/example_flat/instructor/output/homework1.py
index 286b79f..4412ca4 100644
--- a/examples/example_moss/tmp/base/3_homework1.py
+++ b/examples/example_flat/instructor/output/homework1.py
@@ -1,4 +1,5 @@
-def reverse_list(mylist): #!f
+# homework1.py
+def reverse_list(mylist): #!f 
     """
     Given a list 'mylist' returns a list consisting of the same elements in reverse order. E.g.
     reverse_list([1,2,3]) should return [3,2,1] (as a list).
@@ -11,6 +12,6 @@ def add(a,b): #!f
     return a+b
 
 if __name__ == "__main__":
-    # Problem 1: Write a function which add two numbers
+    # Example usage:
     print(f"Your result of 2 + 2 = {add(2,2)}")
-    print(f"Reversing a small list", reverse_list([2,3,5,7]))
+    print(f"Reversing a small list", reverse_list([2,3,5,7])) 
\ No newline at end of file
diff --git a/examples/example_flat/students/cs101flat/__pycache__/deploy.cpython-38.pyc b/examples/example_flat/students/cs101flat/__pycache__/deploy.cpython-38.pyc
deleted file mode 100644
index 9c91ca3192aaec26f60abe00c1109cb32983e52a..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 581
zcmWIL<>g{vU|=}nr<>Ts#K7<v#6iaF3=9ko3=9m#5ey6rDGVu$ISjdsQH+crHd78$
zE^`z!n9ZESlFJ&!%E*w)mco+FR1}iRoXVKO3WjXGEQ}1PtXZrn>?s^6oGDx>+$lWi
z%qhGe@f5yb22K8#AUib~Z*d2u7UUO|7`o*omS{5G5-(0IDJ_UkFG@^FjZe$WNsTW8
z%WE>;;wa9`EQn9ZEV{)JAD^3;nHL}LrpX+|mYbQEnN}IanV*zaTAZ9%k{ZRHT9KMu
zT9SH;p-MtePhU?@zqq6{B{i?4SU<Vg(7-S)C$S{t7I%DnL1l7caz<)=d=<NvUP*p-
zYF-s*N@_t)ex+VPr6x-hS8;x6QF1EC(kPCU)Z!8_OEftrH8C$9#Lvu2EXmBz0}HdK
zRwU<?rlk65vPW@4Tn)CVh>3xLAxf<@FS7*Vt%9P=vc!^9BfX5wl$6xG_~fG0#1e>a
zi;I{+irGP4El4dYVqsul0C_hrF*h|nekDT@Cj$e7_!Z}D6%$&VT2vfUQksz(<C33T
znhWw`42DH9sTGO21v#n3Fh)Em0Ae!pic5-0lS}f8V&I_?1NZ$c4x8Nkl+v73J4R4q
R0HqloMjl2UCJsgcHURWnuU!BD

diff --git a/examples/example_flat/students/cs101flat/__pycache__/homework1.cpython-38.pyc b/examples/example_flat/students/cs101flat/__pycache__/homework1.cpython-38.pyc
deleted file mode 100644
index 2cfea78a49471f080a8c0165a04b9f21a87e92dd..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 874
zcmWIL<>g{vU|<kCVv*><%)sy%#6iaF3=9ko3=9m#UJMKjDGX5zDU2yhEeuhNDa<J>
zEeugismv*?*-S-lsVpgMsZ1&CDeTQmvl-?xH8V0Yq_U)Nq%x+kr*NilrEsUSG&43c
zF*2m^1T$#zR;6>fRwU*Y<fJMTmz1WY=9MTU=clCVDTHKX7AvG>=A<fQ7Aqu{mgMIq
zmSiR;=Hyf=q^IVk7A2OXrYNKp<>xAtWTb)>7As`tfjOCZ#U(|h$tC$kx+$4OsUSur
zS281#f0!8<7(mz=<Ruvf28MKoTE-d%7lv5ATBaJt8m4qcafVvPLXH~7U<OUbszqE1
z3JMDDnPsVY3W*9inZ+dv>baF5T3w+iwWPEtuNWqtoS#>mSzMBtm#&bX26j$yVs5HJ
zYEEiyYF-K0jYX+tsYS)93i(ATsYQAUu6pTuVDq8k@gQ?Gq78M7bc|y)6^b+ROLJ17
z)+j_9>lo=6#wute!fe!pXkN*n$sEN7anvogqSWHjoRV9NIYl6EgNa}9&Q>v@#i>Qb
zF(suLsWC43$)#W?#gyh{mZTRYrliIf6lInrmZZj{LZYM?#)wbLNi2zhMo@7~a<QR-
zAy_CQKR2~JzbM;Kub}c453&bXKtam^3UgK#Mh-?E#v)b*28LuNkO&lm*dPp!1(4Dj
zh8jk322hCmft{?$bc-?Z7Gn~a10g`h-eOKnN#O&T57N!RSOn60iz7ZhH!(9WKE6sk
zGQYG)0TKkDNH9{+RxnbqRd@+fUL_U;4t`JsB`Or>Cg$XTBlIOGJ-h_D@g*p+`)RV?
zVvmnc$xn`t2fG|@NnT=ZYJB`H)`FtUyb_3`;9*<@b{>aKZhlH>PO2S9ycm?RSeQAu
KIM_LuL>K{ewB#HB

diff --git a/examples/example_flat/students/cs101flat/__pycache__/report1flat.cpython-38.pyc b/examples/example_flat/students/cs101flat/__pycache__/report1flat.cpython-38.pyc
deleted file mode 100644
index 2b843499aeb6a5314ec477e4a8ff9439e6927c59..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 1204
zcmWIL<>g{vU|`^O*G>Gy#K7<v#6iX^3=9ko3=9m#1q=)fDGVu$ISjdsQH+crHd78$
zE^`z!n9ZESlFJ&!n#&f&2IjNmut%}GGo-Mlu(dFxu%)tRaWpeWai%b&u;j2rvA8p&
zu%~deFr;v#GBz_uaiwynaAq?V<)kvFay2tFgUn|MX3*q%337`j<1MzJ)Pnq?5>3Wi
z;;ChcIi-musqsZ%q4?sG(v;M^5>2LCJVmKxsYS)9@j02rCAXLpQ&RkrLHdy~6U;v{
z3=9mZ3{i|J3{gxej44bl3{lJ}%qc7_3{fm8ticSLY`0j$Q&Y1IlNpipgV?ML3=Gbo
zAkko8V5nhOz)-@N!kEI?%#^~kkckl{!kog=%#^|k5=mhI8Rz#BWcN!@fM(A5|Ns9>
zkU5zP|NsB5$#jc5vA8(3sKm9fG%=?LB(ak57E5tzPTER_B3=dthF{6fRxzQ)sYS&x
zC8ZguF)sPZrManjCB-qNd6^~YMTse?@dZVhWr-!JF{u@axdl0?#V|&ET25j~OlDqj
zNl|HXNq$jGa<QR-Ay^O+gkZK_LFFxulGNgo_{5YHc98c#E@fa8Vyxl=hl3tW5+gv^
zU;(0l93V_7%<0U{j48}1Oeu`%%<zC<@p}mh#UhX$FPRw_7&MuRKxwcDWM2_C0|Ugz
zU~d=kF)%RP;sM(Xja-m|Vo*pjFjfg6ISeZ8r^$MYBR)PaF*h|n{uWn!d~SY9X%2|Z
z6CV!>U5HE(Kgb>-5CIBah-F|F$i^a&k3hH><R%VA4i>No?!*N0I3h7cF{iSmFr_i2
zGe)tdvZXUdv8ONxGib8h;)bMRL${p7k}7`ZU<E@1Lj{PKg5gV0Aoyu=6bXY|B?2Nu
zLB3}#$t=l91v?;$v#>O^xFj<_ulN>cMt*K;d45s0VH8h6VsdtTW-cg)6eD>B;U6&u
z1_l98oPs>X!N|hM#aILq0|ixXVrE`^ye3bSC_E_{=^>a!ps<dTMF=3|;xkfn3Q~)T
zjfz0gSR@H@GAO{n2{?)aqy-dnQ5+$u#U;*(#Sl+`Erxg!>_7wo3i?|dHjo&z10|AT
WkfV7Rc^Cy4IhcevIT!_4IhX;a(-RH=

diff --git a/examples/example_flat/students/cs101flat/homework1.py b/examples/example_flat/students/cs101flat/homework1.py
index c219775..d5c70ba 100644
--- a/examples/example_flat/students/cs101flat/homework1.py
+++ b/examples/example_flat/students/cs101flat/homework1.py
@@ -1,24 +1,18 @@
-"""
-Example student code. This file is automatically generated from the files in the instructor-directory
-"""
 def reverse_list(mylist): 
     """
     Given a list 'mylist' returns a list consisting of the same elements in reverse order. E.g.
     reverse_list([1,2,3]) should return [3,2,1] (as a list).
     """
-    result = []
-    for l in mylist:
-        result = result + [l]
-    return result
+    # TODO: 1 lines missing.
+    raise NotImplementedError("Implement function bod")
 
-def add(a,b):
-    return a+b
+def add(a,b): 
     """ Given two numbers `a` and `b` this function should simply return their sum:
     > add(a,b) = a+b """
     # TODO: 1 lines missing.
-    # raise NotImplementedError("Implement function body")
+    raise NotImplementedError("Implement function bod")
 
 if __name__ == "__main__":
-    # Problem 1: Write a function which add two numbers
+    # Example usage:
     print(f"Your result of 2 + 2 = {add(2,2)}")
-    print(f"Reversing a small list", reverse_list([2,3,5,7]))
+    print(f"Reversing a small list", reverse_list([2,3,5,7])) 
diff --git a/examples/example_flat/students/cs101flat/report1flat.py b/examples/example_flat/students/cs101flat/report1flat.py
index e80df4b..f944f97 100644
--- a/examples/example_flat/students/cs101flat/report1flat.py
+++ b/examples/example_flat/students/cs101flat/report1flat.py
@@ -1,9 +1,7 @@
-"""
-Example student code. This file is automatically generated from the files in the instructor-directory
-"""
-from src.unitgrade.framework import Report
-from src.unitgrade import evaluate_report_student
+from unitgrade.framework import Report
+from unitgrade.evaluate import evaluate_report_student
 from homework1 import reverse_list, add
+import homework1
 import unittest
 
 class Week1(unittest.TestCase):
@@ -14,14 +12,10 @@ class Week1(unittest.TestCase):
     def test_reverse(self):
         self.assertEqual(reverse_list([1,2,3]), [3,2,1])
 
-
-import homework1
 class Report1Flat(Report):
     title = "CS 101 Report 1"
     questions = [(Week1, 10)]  # Include a single question for 10 credits.
-    pack_imports = [homework1]
+    pack_imports = [homework1] # Unitgrade will recursively include all .py files from "cs101flat"
 
 if __name__ == "__main__":
-    # Uncomment to simply run everything as a unittest:
-    # unittest.main(verbosity=2)
     evaluate_report_student(Report1Flat())
diff --git a/examples/example_flat/students/cs101flat/report1flat_grade.py b/examples/example_flat/students/cs101flat/report1flat_grade.py
index 7d2b47d..b71dc43 100644
--- a/examples/example_flat/students/cs101flat/report1flat_grade.py
+++ b/examples/example_flat/students/cs101flat/report1flat_grade.py
@@ -1,351 +1,3 @@
-"""
-Example student code. This file is automatically generated from the files in the instructor-directory
-"""
-import numpy as np
-from tabulate import tabulate
-from datetime import datetime
-import pyfiglet
-import unittest
-# from unitgrade.unitgrade import MySuite
-
-import inspect
-import os
-import argparse
-import sys
-import time
-import threading # don't import Thread bc. of minify issue.
-import tqdm # don't do from tqdm import tqdm because of minify-issue
-
-parser = argparse.ArgumentParser(description='Evaluate your report.', epilog="""Example: 
-To run all tests in a report: 
-
-> python assignment1_dp.py
-
-To run only question 2 or question 2.1
-
-> python assignment1_dp.py -q 2
-> python assignment1_dp.py -q 2.1
-
-Note this scripts does not grade your report. To grade your report, use:
-
-> python report1_grade.py
-
-Finally, note that if your report is part of a module (package), and the report script requires part of that package, the -m option for python may be useful.
-For instance, if the report file is in Documents/course_package/report3_complete.py, and `course_package` is a python package, then change directory to 'Documents/` and run:
-
-> python -m course_package.report1
-
-see https://docs.python.org/3.9/using/cmdline.html
-""", formatter_class=argparse.RawTextHelpFormatter)
-parser.add_argument('-q', nargs='?', type=str, default=None, help='Only evaluate this question (e.g.: -q 2)')
-parser.add_argument('--showexpected',  action="store_true",  help='Show the expected/desired result')
-parser.add_argument('--showcomputed',  action="store_true",  help='Show the answer your code computes')
-parser.add_argument('--unmute',  action="store_true",  help='Show result of print(...) commands in code')
-parser.add_argument('--passall',  action="store_true",  help='Automatically pass all tests. Useful when debugging.')
-
-def evaluate_report_student(report, question=None, qitem=None, unmute=None, passall=None, ignore_missing_file=False, show_tol_err=False):
-    args = parser.parse_args()
-    if question is None and args.q is not None:
-        question = args.q
-        if "." in question:
-            question, qitem = [int(v) for v in question.split(".")]
-        else:
-            question = int(question)
-
-    if hasattr(report, "computed_answer_file") and not os.path.isfile(report.computed_answers_file) and not ignore_missing_file:
-        raise Exception("> Error: The pre-computed answer file", os.path.abspath(report.computed_answers_file), "does not exist. Check your package installation")
-
-    if unmute is None:
-        unmute = args.unmute
-    if passall is None:
-        passall = args.passall
-
-    results, table_data = evaluate_report(report, question=question, show_progress_bar=not unmute, qitem=qitem, verbose=False, passall=passall, show_expected=args.showexpected, show_computed=args.showcomputed,unmute=unmute,
-                                          show_tol_err=show_tol_err)
-
-
-    if question is None:
-        print("Provisional evaluation")
-        tabulate(table_data)
-        table = table_data
-        print(tabulate(table))
-        print(" ")
-
-    fr = inspect.getouterframes(inspect.currentframe())[1].filename
-    gfile = os.path.basename(fr)[:-3] + "_grade.py"
-    if os.path.exists(gfile):
-        print("Note your results have not yet been registered. \nTo register your results, please run the file:")
-        print(">>>", gfile)
-        print("In the same manner as you ran this file.")
-
-
-    return results
-
-
-def upack(q):
-    # h = zip([(i['w'], i['possible'], i['obtained']) for i in q.values()])
-    h =[(i['w'], i['possible'], i['obtained']) for i in q.values()]
-    h = np.asarray(h)
-    return h[:,0], h[:,1], h[:,2],
-
-class UnitgradeTextRunner(unittest.TextTestRunner):
-    def __init__(self, *args, **kwargs):
-        super().__init__(*args, **kwargs)
-
-class SequentialTestLoader(unittest.TestLoader):
-    def getTestCaseNames(self, testCaseClass):
-        test_names = super().getTestCaseNames(testCaseClass)
-        # testcase_methods = list(testCaseClass.__dict__.keys())
-        ls = []
-        for C in testCaseClass.mro():
-            if issubclass(C, unittest.TestCase):
-                ls = list(C.__dict__.keys()) + ls
-        testcase_methods = ls
-        test_names.sort(key=testcase_methods.index)
-        return test_names
-
-def evaluate_report(report, question=None, qitem=None, passall=False, verbose=False,  show_expected=False, show_computed=False,unmute=False, show_help_flag=True, silent=False,
-                    show_progress_bar=True,
-                    show_tol_err=False,
-                    big_header=True):
-
-    now = datetime.now()
-    if big_header:
-        ascii_banner = pyfiglet.figlet_format("UnitGrade", font="doom")
-        b = "\n".join( [l for l in ascii_banner.splitlines() if len(l.strip()) > 0] )
-    else:
-        b = "Unitgrade"
-    print(b + " v" + __version__)
-    dt_string = now.strftime("%d/%m/%Y %H:%M:%S")
-    print("Started: " + dt_string)
-    s = report.title
-    if hasattr(report, "version") and report.version is not None:
-        s += " version " + report.version
-    print("Evaluating " + s, "(use --help for options)" if show_help_flag else "")
-    # print(f"Loaded answers from: ", report.computed_answers_file, "\n")
-    table_data = []
-    nL = 80
-    t_start = time.time()
-    score = {}
-    loader = SequentialTestLoader()
-
-    for n, (q, w) in enumerate(report.questions):
-        # q = q()
-        # q_hidden = False
-        # q_hidden = issubclass(q.__class__, Hidden)
-        if question is not None and n+1 != question:
-            continue
-        suite = loader.loadTestsFromTestCase(q)
-        qtitle = q.question_title() if hasattr(q, 'question_title') else q.__qualname__
-        q_title_print = "Question %i: %s"%(n+1, qtitle)
-        print(q_title_print, end="")
-        q.possible = 0
-        q.obtained = 0
-        q_ = {} # Gather score in this class.
-        # unittest.Te
-        # q_with_outstanding_init = [item.question for item in q.items if not item.question.has_called_init_]
-        UTextResult.q_title_print = q_title_print # Hacky
-        UTextResult.show_progress_bar = show_progress_bar # Hacky.
-        UTextResult.number = n
-
-        res = UTextTestRunner(verbosity=2, resultclass=UTextResult).run(suite)
-
-        possible = res.testsRun
-        obtained = len(res.successes)
-
-        assert len(res.successes) +  len(res.errors) + len(res.failures) == res.testsRun
-
-        # possible = int(ws @ possible)
-        # obtained = int(ws @ obtained)
-        # obtained = int(myround(int((w * obtained) / possible ))) if possible > 0 else 0
-
-        obtained = int(w * obtained * 1.0 / possible ) if possible > 0 else 0
-        score[n] = {'w': w, 'possible': w, 'obtained': obtained, 'items': q_, 'title': qtitle}
-        q.obtained = obtained
-        q.possible = possible
-
-        s1 = f"*** Question q{n+1}"
-        s2 = f" {q.obtained}/{w}"
-        print(s1 + ("."* (nL-len(s1)-len(s2) )) + s2 )
-        print(" ")
-        table_data.append([f"Question q{n+1}", f"{q.obtained}/{w}"])
-
-    ws, possible, obtained = upack(score)
-    possible = int( msum(possible) )
-    obtained = int( msum(obtained) ) # Cast to python int
-    report.possible = possible
-    report.obtained = obtained
-    now = datetime.now()
-    dt_string = now.strftime("%H:%M:%S")
-
-    dt = int(time.time()-t_start)
-    minutes = dt//60
-    seconds = dt - minutes*60
-    plrl = lambda i, s: str(i) + " " + s + ("s" if i != 1 else "")
-
-    print(f"Completed: "+ dt_string + " (" + plrl(minutes, "minute") + ", "+ plrl(seconds, "second") +")")
-
-    table_data.append(["Total", ""+str(report.obtained)+"/"+str(report.possible) ])
-    results = {'total': (obtained, possible), 'details': score}
-    return results, table_data
-
-
-
-
-from tabulate import tabulate
-from datetime import datetime
-import inspect
-import json
-import os
-import bz2
-import pickle
-import os
-
-def bzwrite(json_str, token): # to get around obfuscation issues
-    with getattr(bz2, 'open')(token, "wt") as f:
-        f.write(json_str)
-
-def gather_imports(imp):
-    resources = {}
-    m = imp
-    # for m in pack_imports:
-    # print(f"*** {m.__name__}")
-    f = m.__file__
-    # dn = os.path.dirname(f)
-    # top_package = os.path.dirname(__import__(m.__name__.split('.')[0]).__file__)
-    # top_package = str(__import__(m.__name__.split('.')[0]).__path__)
-
-    if hasattr(m, '__file__') and not hasattr(m, '__path__'):  # Importing a simple file: m.__class__.__name__ == 'module' and False:
-        top_package = os.path.dirname(m.__file__)
-        module_import = True
-    else:
-        top_package = __import__(m.__name__.split('.')[0]).__path__._path[0]
-        module_import = False
-
-    # top_package = os.path.dirname(__import__(m.__name__.split('.')[0]).__file__)
-    # top_package = os.path.dirname(top_package)
-    import zipfile
-    # import strea
-    # zipfile.ZipFile
-    import io
-    # file_like_object = io.BytesIO(my_zip_data)
-    zip_buffer = io.BytesIO()
-    with zipfile.ZipFile(zip_buffer, 'w') as zip:
-        # zip.write()
-        for root, dirs, files in os.walk(top_package):
-            for file in files:
-                if file.endswith(".py"):
-                    fpath = os.path.join(root, file)
-                    v = os.path.relpath(os.path.join(root, file), os.path.dirname(top_package) if not module_import else top_package)
-                    zip.write(fpath, v)
-
-    resources['zipfile'] = zip_buffer.getvalue()
-    resources['top_package'] = top_package
-    resources['module_import'] = module_import
-    return resources, top_package
-
-    if f.endswith("__init__.py"):
-        for root, dirs, files in os.walk(os.path.dirname(f)):
-            for file in files:
-                if file.endswith(".py"):
-                    # print(file)
-                    # print()
-                    v = os.path.relpath(os.path.join(root, file), top_package)
-                    with open(os.path.join(root, file), 'r') as ff:
-                        resources[v] = ff.read()
-    else:
-        v = os.path.relpath(f, top_package)
-        with open(f, 'r') as ff:
-            resources[v] = ff.read()
-    return resources
-
-import argparse
-parser = argparse.ArgumentParser(description='Evaluate your report.', epilog="""Use this script to get the score of your report. Example:
-
-> python report1_grade.py
-
-Finally, note that if your report is part of a module (package), and the report script requires part of that package, the -m option for python may be useful.
-For instance, if the report file is in Documents/course_package/report3_complete.py, and `course_package` is a python package, then change directory to 'Documents/` and run:
-
-> python -m course_package.report1
-
-see https://docs.python.org/3.9/using/cmdline.html
-""", formatter_class=argparse.RawTextHelpFormatter)
-parser.add_argument('--noprogress',  action="store_true",  help='Disable progress bars')
-parser.add_argument('--autolab',  action="store_true",  help='Show Autolab results')
-
-def gather_upload_to_campusnet(report, output_dir=None):
-    n = report.nL
-    args = parser.parse_args()
-    results, table_data = evaluate_report(report, show_help_flag=False, show_expected=False, show_computed=False, silent=True,
-                                          show_progress_bar=not args.noprogress,
-                                          big_header=not args.autolab)
-    print(" ")
-    print("="*n)
-    print("Final evaluation")
-    print(tabulate(table_data))
-    # also load the source code of missing files...
-
-    sources = {}
-
-    if not args.autolab:
-        if len(report.individual_imports) > 0:
-            print("By uploading the .token file, you verify the files:")
-            for m in report.individual_imports:
-                print(">", m.__file__)
-            print("Are created/modified individually by you in agreement with DTUs exam rules")
-            report.pack_imports += report.individual_imports
-
-        if len(report.pack_imports) > 0:
-            print("Including files in upload...")
-            for k, m in enumerate(report.pack_imports):
-                nimp, top_package = gather_imports(m)
-                _, report_relative_location, module_import = report._import_base_relative()
-
-                # report_relative_location = os.path.relpath(inspect.getfile(report.__class__), top_package)
-                nimp['report_relative_location'] = report_relative_location
-                nimp['report_module_specification'] = module_import
-                nimp['name'] = m.__name__
-                sources[k] = nimp
-                # if len([k for k in nimp if k not in sources]) > 0:
-                print(f"*** {m.__name__}")
-                # sources = {**sources, **nimp}
-    results['sources'] = sources
-
-    if output_dir is None:
-        output_dir = os.getcwd()
-
-    payload_out_base = report.__class__.__name__ + "_handin"
-
-    obtain, possible = results['total']
-    vstring = "_v"+report.version if report.version is not None else ""
-
-    token = "%s_%i_of_%i%s.token"%(payload_out_base, obtain, possible,vstring)
-    token = os.path.join(output_dir, token)
-    with open(token, 'wb') as f:
-        pickle.dump(results, f)
-
-    if not args.autolab:
-        print(" ")
-        print("To get credit for your results, please upload the single file: ")
-        print(">", token)
-        print("To campusnet without any modifications.")
-
-        # print("Now time for some autolab fun")
-
-def source_instantiate(name, report1_source, payload):
-    eval("exec")(report1_source, globals())
-    pl = pickle.loads(bytes.fromhex(payload))
-    report = eval(name)(payload=pl, strict=True)
-    # report.set_payload(pl)
-    return report
-
-
-
-report1_source = 'import os\n\n# DONT\'t import stuff here since install script requires __version__\n\ndef cache_write(object, file_name, verbose=True):\n    import compress_pickle\n    dn = os.path.dirname(file_name)\n    if not os.path.exists(dn):\n        os.mkdir(dn)\n    if verbose: print("Writing cache...", file_name)\n    with open(file_name, \'wb\', ) as f:\n        compress_pickle.dump(object, f, compression="lzma")\n    if verbose: print("Done!")\n\n\ndef cache_exists(file_name):\n    # file_name = cn_(file_name) if cache_prefix else file_name\n    return os.path.exists(file_name)\n\n\ndef cache_read(file_name):\n    import compress_pickle # Import here because if you import in top the __version__ tag will fail.\n    # file_name = cn_(file_name) if cache_prefix else file_name\n    if os.path.exists(file_name):\n        try:\n            with open(file_name, \'rb\') as f:\n                return compress_pickle.load(f, compression="lzma")\n        except Exception as e:\n            print("Tried to load a bad pickle file at", file_name)\n            print("If the file appears to be automatically generated, you can try to delete it, otherwise download a new version")\n            print(e)\n            # return pickle.load(f)\n    else:\n        return None\n\n\n\n"""\ngit add . && git commit -m "Options" && git push &&  pip install git+ssh://git@gitlab.compute.dtu.dk/tuhe/unitgrade_v1.git --upgrade\n\n"""\n# from . import cache_read\nimport unittest\nimport numpy as np\nimport sys\nimport collections\nimport re\nimport threading\nimport tqdm\nimport time\nimport pickle\nimport os\nfrom io import StringIO\nfrom unittest.runner import _WritelnDecorator\nimport inspect\n\nmyround = lambda x: np.round(x)  # required.\nmsum = lambda x: sum(x)\nmfloor = lambda x: np.floor(x)\n\ndef setup_dir_by_class(C,base_dir):\n    name = C.__class__.__name__\n    # base_dir = os.path.join(base_dir, name)\n    # if not os.path.isdir(base_dir):\n    #     os.makedirs(base_dir)\n    return base_dir, name\n\nclass Hidden:\n    def hide(self):\n        return True\n\nclass Logger(object):\n    def __init__(self, buffer):\n        self.terminal = sys.stdout\n        self.log = buffer\n\n    def write(self, message):\n        self.terminal.write(message)\n        self.log.write(message)\n\n    def flush(self):\n        # this flush method is needed for python 3 compatibility.\n        pass\n\nclass Capturing(list):\n    def __init__(self, *args, stdout=None, unmute=False, **kwargs):\n        self._stdout = stdout\n        self.unmute = unmute\n        super().__init__(*args, **kwargs)\n\n    def __enter__(self, capture_errors=True): # don\'t put arguments here.\n        self._stdout = sys.stdout if self._stdout == None else self._stdout\n        self._stringio = StringIO()\n        if self.unmute:\n            sys.stdout = Logger(self._stringio)\n        else:\n            sys.stdout = self._stringio\n\n        if capture_errors:\n            self._sterr = sys.stderr\n            sys.sterr = StringIO() # memory hole it\n        self.capture_errors = capture_errors\n        return self\n\n    def __exit__(self, *args):\n        self.extend(self._stringio.getvalue().splitlines())\n        del self._stringio    # free up some memory\n        sys.stdout = self._stdout\n        if self.capture_errors:\n            sys.sterr = self._sterr\n\nclass Capturing2(Capturing):\n    def __exit__(self, *args):\n        lines = self._stringio.getvalue().splitlines()\n        txt = "\\n".join(lines)\n        numbers = extract_numbers(txt)\n        self.extend(lines)\n        del self._stringio    # free up some memory\n        sys.stdout = self._stdout\n        if self.capture_errors:\n            sys.sterr = self._sterr\n\n        self.output = txt\n        self.numbers = numbers\n\n\nclass QItem(unittest.TestCase):\n    title = None\n    testfun = None\n    tol = 0\n    estimated_time = 0.42\n    _precomputed_payload = None\n    _computed_answer = None # Internal helper to later get results.\n    weight = 1 # the weight of the question.\n\n    def __init__(self, question=None, *args, **kwargs):\n        if self.tol > 0 and self.testfun is None:\n            self.testfun = self.assertL2Relative\n        elif self.testfun is None:\n            self.testfun = self.assertEqual\n\n        self.name = self.__class__.__name__\n        # self._correct_answer_payload = correct_answer_payload\n        self.question = question\n\n        super().__init__(*args, **kwargs)\n        if self.title is None:\n            self.title = self.name\n\n    def _safe_get_title(self):\n        if self._precomputed_title is not None:\n            return self._precomputed_title\n        return self.title\n\n    def assertNorm(self, computed, expected, tol=None):\n        if tol == None:\n            tol = self.tol\n        diff = np.abs( (np.asarray(computed).flat- np.asarray(expected)).flat )\n        nrm = np.sqrt(np.sum( diff ** 2))\n\n        self.error_computed = nrm\n\n        if nrm > tol:\n            print(f"Not equal within tolerance {tol}; norm of difference was {nrm}")\n            print(f"Element-wise differences {diff.tolist()}")\n            self.assertEqual(computed, expected, msg=f"Not equal within tolerance {tol}")\n\n    def assertL2(self, computed, expected, tol=None):\n        if tol == None:\n            tol = self.tol\n        diff = np.abs( (np.asarray(computed) - np.asarray(expected)) )\n        self.error_computed = np.max(diff)\n\n        if np.max(diff) > tol:\n            print(f"Not equal within tolerance {tol=}; deviation was {np.max(diff)=}")\n            print(f"Element-wise differences {diff.tolist()}")\n            self.assertEqual(computed, expected, msg=f"Not equal within tolerance {tol=}, {np.max(diff)=}")\n\n    def assertL2Relative(self, computed, expected, tol=None):\n        if tol == None:\n            tol = self.tol\n        diff = np.abs( (np.asarray(computed) - np.asarray(expected)) )\n        diff = diff / (1e-8 + np.abs( (np.asarray(computed) + np.asarray(expected)) ) )\n        self.error_computed = np.max(np.abs(diff))\n        if np.sum(diff > tol) > 0:\n            print(f"Not equal within tolerance {tol}")\n            print(f"Element-wise differences {diff.tolist()}")\n            self.assertEqual(computed, expected, msg=f"Not equal within tolerance {tol}")\n\n    def precomputed_payload(self):\n        return self._precomputed_payload\n\n    def precompute_payload(self):\n        # Pre-compute resources to include in tests (useful for getting around rng).\n        pass\n\n    def compute_answer(self, unmute=False):\n        raise NotImplementedError("test code here")\n\n    def test(self, computed, expected):\n        self.testfun(computed, expected)\n\n    def get_points(self, verbose=False, show_expected=False, show_computed=False,unmute=False, passall=False, silent=False, **kwargs):\n        possible = 1\n        computed = None\n        def show_computed_(computed):\n            print(">>> Your output:")\n            print(computed)\n\n        def show_expected_(expected):\n            print(">>> Expected output (note: may have been processed; read text script):")\n            print(expected)\n\n        correct = self._correct_answer_payload\n        try:\n            if unmute: # Required to not mix together print stuff.\n                print("")\n            computed = self.compute_answer(unmute=unmute)\n        except Exception as e:\n            if not passall:\n                if not silent:\n                    print("\\n=================================================================================")\n                    print(f"When trying to run test class \'{self.name}\' your code threw an error:", e)\n                    show_expected_(correct)\n                    import traceback\n                    print(traceback.format_exc())\n                    print("=================================================================================")\n                return (0, possible)\n\n        if self._computed_answer is None:\n            self._computed_answer = computed\n\n        if show_expected or show_computed:\n            print("\\n")\n        if show_expected:\n            show_expected_(correct)\n        if show_computed:\n            show_computed_(computed)\n        try:\n            if not passall:\n                self.test(computed=computed, expected=correct)\n        except Exception as e:\n            if not silent:\n                print("\\n=================================================================================")\n                print(f"Test output from test class \'{self.name}\' does not match expected result. Test error:")\n                print(e)\n                show_computed_(computed)\n                show_expected_(correct)\n            return (0, possible)\n        return (1, possible)\n\n    def score(self):\n        try:\n            self.test()\n        except Exception as e:\n            return 0\n        return 1\n\nclass QPrintItem(QItem):\n    def compute_answer_print(self):\n        """\n        Generate output which is to be tested. By default, both text written to the terminal using print(...) as well as return values\n        are send to process_output (see compute_answer below). In other words, the text generated is:\n\n        res = compute_Answer_print()\n        txt = (any terminal output generated above)\n        numbers = (any numbers found in terminal-output txt)\n\n        self.test(process_output(res, txt, numbers), <expected result>)\n\n        :return: Optional values for comparison\n        """\n        raise Exception("Generate output here. The output is passed to self.process_output")\n\n    def process_output(self, res, txt, numbers):\n        return res\n\n    def compute_answer(self, unmute=False):\n        with Capturing(unmute=unmute) as output:\n            res = self.compute_answer_print()\n        s = "\\n".join(output)\n        s = rm_progress_bar(s) # Remove progress bar.\n        numbers = extract_numbers(s)\n        self._computed_answer = (res, s, numbers)\n        return self.process_output(res, s, numbers)\n\nclass OrderedClassMembers(type):\n    @classmethod\n    def __prepare__(self, name, bases):\n        return collections.OrderedDict()\n    def __new__(self, name, bases, classdict):\n        ks = list(classdict.keys())\n        for b in bases:\n            ks += b.__ordered__\n        classdict[\'__ordered__\'] = [key for key in ks if key not in (\'__module__\', \'__qualname__\')]\n        return type.__new__(self, name, bases, classdict)\n\nclass QuestionGroup(metaclass=OrderedClassMembers):\n    title = "Untitled question"\n    partially_scored = False\n    t_init = 0  # Time spend on initialization (placeholder; set this externally).\n    estimated_time = 0.42\n    has_called_init_ = False\n    _name = None\n    _items = None\n\n    @property\n    def items(self):\n        if self._items == None:\n            self._items = []\n            members = [gt for gt in [getattr(self, gt) for gt in self.__ordered__ if gt not in ["__classcell__", "__init__"]] if inspect.isclass(gt) and issubclass(gt, QItem)]\n            for I in members:\n                self._items.append( I(question=self))\n        return self._items\n\n    @items.setter\n    def items(self, value):\n        self._items = value\n\n    @property\n    def name(self):\n        if self._name == None:\n            self._name = self.__class__.__name__\n        return self._name #\n\n    @name.setter\n    def name(self, val):\n        self._name = val\n\n    def init(self):\n        # Can be used to set resources relevant for this question instance.\n        pass\n\n    def init_all_item_questions(self):\n        for item in self.items:\n            if not item.question.has_called_init_:\n                item.question.init()\n                item.question.has_called_init_ = True\n\n\nclass Report:\n    title = "report title"\n    version = None\n    questions = []\n    pack_imports = []\n    individual_imports = []\n    nL = 80 # Maximum line width\n\n    @classmethod\n    def reset(cls):\n        for (q,_) in cls.questions:\n            if hasattr(q, \'reset\'):\n                q.reset()\n\n    @classmethod\n    def mfile(clc):\n        return inspect.getfile(clc)\n\n    def _file(self):\n        return inspect.getfile(type(self))\n\n    def _import_base_relative(self):\n        if hasattr(self.pack_imports[0], \'__path__\'):\n            root_dir = self.pack_imports[0].__path__._path[0]\n        else:\n            root_dir = self.pack_imports[0].__file__\n\n        root_dir = os.path.dirname(root_dir)\n        relative_path = os.path.relpath(self._file(), root_dir)\n        modules = os.path.normpath(relative_path[:-3]).split(os.sep)\n        return root_dir, relative_path, modules\n\n    def __init__(self, strict=False, payload=None):\n        working_directory = os.path.abspath(os.path.dirname(self._file()))\n\n        self.wdir, self.name = setup_dir_by_class(self, working_directory)\n        # self.computed_answers_file = os.path.join(self.wdir, self.name + "_resources_do_not_hand_in.dat")\n        for (q,_) in self.questions:\n            q.nL = self.nL # Set maximum line length.\n\n        if payload is not None:\n            self.set_payload(payload, strict=strict)\n        # else:\n        #     if os.path.isfile(self.computed_answers_file):\n        #         self.set_payload(cache_read(self.computed_answers_file), strict=strict)\n        #     else:\n        #         s = f"> Warning: The pre-computed answer file, {os.path.abspath(self.computed_answers_file)} is missing. The framework will NOT work as intended. Reasons may be a broken local installation."\n        #         if strict:\n        #             raise Exception(s)\n        #         else:\n        #             print(s)\n\n    def main(self, verbosity=1):\n        # Run all tests using standard unittest (nothing fancy).\n        import unittest\n        loader = unittest.TestLoader()\n        for q,_ in self.questions:\n            import time\n            start = time.time() # A good proxy for setup time is to\n            suite = loader.loadTestsFromTestCase(q)\n            unittest.TextTestRunner(verbosity=verbosity).run(suite)\n            total = time.time()              - start\n            q.time = total\n\n    def _setup_answers(self):\n        self.main()  # Run all tests in class just to get that out of the way...\n        report_cache = {}\n        for q, _ in self.questions:\n            if hasattr(q, \'_save_cache\'):\n                q()._save_cache()\n                q._cache[\'time\'] = q.time\n                report_cache[q.__qualname__] = q._cache\n            else:\n                report_cache[q.__qualname__] = {\'no cache see _setup_answers in framework.py\':True}\n        return report_cache\n\n    def set_payload(self, payloads, strict=False):\n        for q, _ in self.questions:\n            q._cache = payloads[q.__qualname__]\n\ndef rm_progress_bar(txt):\n    # More robust version. Apparently length of bar can depend on various factors, so check for order of symbols.\n    nlines = []\n    for l in txt.splitlines():\n        pct = l.find("%")\n        ql = False\n        if pct > 0:\n            i = l.find("|", pct+1)\n            if i > 0 and l.find("|", i+1) > 0:\n                ql = True\n        if not ql:\n            nlines.append(l)\n    return "\\n".join(nlines)\n\ndef extract_numbers(txt):\n    # txt = rm_progress_bar(txt)\n    numeric_const_pattern = \'[-+]? (?: (?: \\d* \\. \\d+ ) | (?: \\d+ \\.? ) )(?: [Ee] [+-]? \\d+ ) ?\'\n    rx = re.compile(numeric_const_pattern, re.VERBOSE)\n    all = rx.findall(txt)\n    all = [float(a) if (\'.\' in a or "e" in a) else int(a) for a in all]\n    if len(all) > 500:\n        print(txt)\n        raise Exception("unitgrade_v1.unitgrade_v1.py: Warning, too many numbers!", len(all))\n    return all\n\nclass ActiveProgress():\n    def __init__(self, t, start=True, title="my progress bar",show_progress_bar=True):\n        self.t = t\n        self._running = False\n        self.title = title\n        self.dt = 0.1\n        self.n = int(np.round(self.t / self.dt))\n        self.show_progress_bar = show_progress_bar\n\n        # self.pbar = tqdm.tqdm(total=self.n)\n        if start:\n            self.start()\n\n    def start(self):\n        self._running = True\n        if self.show_progress_bar:\n            self.thread = threading.Thread(target=self.run)\n            self.thread.start()\n        self.time_started = time.time()\n\n    def terminate(self):\n        if not self._running:\n            raise Exception("Stopping a stopped progress bar. ")\n        self._running = False\n        if self.show_progress_bar:\n            self.thread.join()\n        if hasattr(self, \'pbar\') and self.pbar is not None:\n            self.pbar.update(1)\n            self.pbar.close()\n            self.pbar=None\n\n        sys.stdout.flush()\n        return time.time() - self.time_started\n\n    def run(self):\n        self.pbar = tqdm.tqdm(total=self.n, file=sys.stdout, position=0, leave=False, desc=self.title, ncols=100,\n                              bar_format=\'{l_bar}{bar}| [{elapsed}<{remaining}]\')  # , unit_scale=dt, unit=\'seconds\'):\n\n        for _ in range(self.n-1): # Don\'t terminate completely; leave bar at 99% done until terminate.\n            if not self._running:\n                self.pbar.close()\n                self.pbar = None\n                break\n\n            time.sleep(self.dt)\n            self.pbar.update(1)\n\n\n# class MySuite(unittest.suite.TestSuite): # Not sure we need this one anymore.\n#     raise Exception("no suite")\n#     pass\n\ndef instance_call_stack(instance):\n    s = "-".join(map(lambda x: x.__name__, instance.__class__.mro()))\n    return s\n\ndef get_class_that_defined_method(meth):\n    for cls in inspect.getmro(meth.im_class):\n        if meth.__name__ in cls.__dict__:\n            return cls\n    return None\n\ndef caller_name(skip=2):\n    """Get a name of a caller in the format module.class.method\n\n       `skip` specifies how many levels of stack to skip while getting caller\n       name. skip=1 means "who calls me", skip=2 "who calls my caller" etc.\n\n       An empty string is returned if skipped levels exceed stack height\n    """\n    stack = inspect.stack()\n    start = 0 + skip\n    if len(stack) < start + 1:\n      return \'\'\n    parentframe = stack[start][0]\n\n    name = []\n    module = inspect.getmodule(parentframe)\n    # `modname` can be None when frame is executed directly in console\n    # TODO(techtonik): consider using __main__\n    if module:\n        name.append(module.__name__)\n    # detect classname\n    if \'self\' in parentframe.f_locals:\n        # I don\'t know any way to detect call from the object method\n        # XXX: there seems to be no way to detect static method call - it will\n        #      be just a function call\n        name.append(parentframe.f_locals[\'self\'].__class__.__name__)\n    codename = parentframe.f_code.co_name\n    if codename != \'<module>\':  # top level usually\n        name.append( codename ) # function or a method\n\n    ## Avoid circular refs and frame leaks\n    #  https://docs.python.org/2.7/library/inspect.html#the-interpreter-stack\n    del parentframe, stack\n\n    return ".".join(name)\n\ndef get_class_from_frame(fr):\n\n      args, _, _, value_dict = inspect.getargvalues(fr)\n      # we check the first parameter for the frame function is\n      # named \'self\'\n      if len(args) and args[0] == \'self\':\n            # in that case, \'self\' will be referenced in value_dict\n            instance = value_dict.get(\'self\', None)\n            if instance:\n                  # return its class\n                  # isinstance(instance, Testing) # is the actual class instance.\n\n                  return getattr(instance, \'__class__\', None)\n      # return None otherwise\n      return None\n\nfrom typing import Any\nimport inspect, gc\n\ndef giveupthefunc():\n    frame = inspect.currentframe()\n    code  = frame.f_code\n    globs = frame.f_globals\n    functype = type(lambda: 0)\n    funcs = []\n    for func in gc.get_referrers(code):\n        if type(func) is functype:\n            if getattr(func, "__code__", None) is code:\n                if getattr(func, "__globals__", None) is globs:\n                    funcs.append(func)\n                    if len(funcs) > 1:\n                        return None\n    return funcs[0] if funcs else None\n\n\nfrom collections import defaultdict\n\nclass UTextResult(unittest.TextTestResult):\n    nL = 80\n    number = -1 # HAcky way to set question number.\n    show_progress_bar = True\n    def __init__(self, stream, descriptions, verbosity):\n        super().__init__(stream, descriptions, verbosity)\n        self.successes = []\n\n    def printErrors(self) -> None:\n        # if self.dots or self.showAll:\n        #     self.stream.writeln()\n        # if hasattr(self, \'cc\'):\n        #     self.cc.terminate()\n        # self.cc_terminate(success=False)\n        self.printErrorList(\'ERROR\', self.errors)\n        self.printErrorList(\'FAIL\', self.failures)\n\n    def addError(self, test, err):\n        super(unittest.TextTestResult, self).addFailure(test, err)\n        self.cc_terminate(success=False)\n\n    def addFailure(self, test, err):\n        super(unittest.TextTestResult, self).addFailure(test, err)\n        self.cc_terminate(success=False)\n        # if self.showAll:\n        #     self.stream.writeln("FAIL")\n        # elif self.dots:\n        #     self.stream.write(\'F\')\n        #     self.stream.flush()\n\n    def addSuccess(self, test: unittest.case.TestCase) -> None:\n        # super().addSuccess(test)\n        self.successes.append(test)\n        # super().addSuccess(test)\n        #     hidden = issubclass(item.__class__, Hidden)\n        #     # if not hidden:\n        #     #     print(ss, end="")\n        #     # sys.stdout.flush()\n        #     start = time.time()\n        #\n        #     (current, possible) = item.get_points(show_expected=show_expected, show_computed=show_computed,unmute=unmute, passall=passall, silent=silent)\n        #     q_[j] = {\'w\': item.weight, \'possible\': possible, \'obtained\': current, \'hidden\': hidden, \'computed\': str(item._computed_answer), \'title\': item.title}\n        #     tsecs = np.round(time.time()-start, 2)\n        self.cc_terminate()\n\n\n\n    def cc_terminate(self, success=True):\n        if self.show_progress_bar or True:\n            tsecs = np.round(self.cc.terminate(), 2)\n            sys.stdout.flush()\n            ss = self.item_title_print\n\n            state = "PASS" if success else "FAILED"\n\n            dot_parts = (\'.\' * max(0, self.nL - len(state) - len(ss)))\n            if self.show_progress_bar or True:\n                print(self.item_title_print + dot_parts, end="")\n            else:\n                print( dot_parts, end="")\n\n            if tsecs >= 0.1:\n                state += " (" + str(tsecs) + " seconds)"\n            print(state)\n\n\n    def startTest(self, test):\n        # super().startTest(test)\n        j =self.testsRun\n        self.testsRun += 1\n        # print("Starting the test...")\n        # show_progress_bar = True\n        n = UTextResult.number\n\n        item_title = self.getDescription(test)\n        # item_title = item_title.split("\\n")[0]\n        item_title = test.shortDescription() # Better for printing (get from cache).\n        if item_title == None:\n            # For unittest framework where getDescription may return None.\n            item_title = self.getDescription(test)\n        # test.countTestCases()\n        self.item_title_print = "*** q%i.%i) %s" % (n + 1, j + 1, item_title)\n        estimated_time = 10\n        nL = 80\n        #\n        if self.show_progress_bar or True:\n            self.cc = ActiveProgress(t=estimated_time, title=self.item_title_print, show_progress_bar=self.show_progress_bar)\n        else:\n            print(self.item_title_print + (\'.\' * max(0, nL - 4 - len(self.item_title_print))), end="")\n\n        self._test = test\n\n    def _setupStdout(self):\n        if self._previousTestClass == None:\n            total_estimated_time = 1\n            if hasattr(self.__class__, \'q_title_print\'):\n                q_title_print = self.__class__.q_title_print\n            else:\n                q_title_print = "<unnamed test. See unitgrade_v1.py>"\n\n            # q_title_print = "some printed title..."\n            cc = ActiveProgress(t=total_estimated_time, title=q_title_print, show_progress_bar=self.show_progress_bar)\n            self.cc = cc\n\n    def _restoreStdout(self): # Used when setting up the test.\n        if self._previousTestClass == None:\n            q_time = self.cc.terminate()\n            q_time = np.round(q_time, 2)\n            sys.stdout.flush()\n            if self.show_progress_bar:\n                print(self.cc.title, end="")\n            # start = 10\n            # q_time = np.round(time.time() - start, 2)\n            nL = 80\n            print(" " * max(0, nL - len(self.cc.title)) + (\n                " (" + str(q_time) + " seconds)" if q_time >= 0.1 else ""))  # if q.name in report.payloads else "")\n            # print("=" * nL)\n\n\n\nclass UTextTestRunner(unittest.TextTestRunner):\n    def __init__(self, *args, **kwargs):\n        from io import StringIO\n        stream = StringIO()\n        super().__init__(*args, stream=stream, **kwargs)\n\n    def _makeResult(self):\n        # stream = self.stream # not you!\n        stream = sys.stdout\n        stream = _WritelnDecorator(stream)\n        return self.resultclass(stream, self.descriptions, self.verbosity)\n\n# def wrapper(foo):\n#     def magic(self):\n#         # s = "-".join(map(lambda x: x.__name__, self.__class__.mro()))\n#         foo(self)\n#     magic.__doc__ = foo.__doc__\n#     return magic\n\nfrom functools import update_wrapper, _make_key, RLock\nfrom collections import namedtuple\n_CacheInfo = namedtuple("CacheInfo", ["hits", "misses", "maxsize", "currsize"])\n\ndef cache(foo, typed=False):\n    """ Magic cache wrapper\n    https://github.com/python/cpython/blob/main/Lib/functools.py\n    """\n    maxsize = None\n    def wrapper(self, *args, **kwargs):\n        key = (self.cache_id(), ("@cache", foo.__name__, _make_key(args, kwargs, typed)) )\n        if not self._cache_contains(key):\n            value = foo(self, *args, **kwargs)\n            self._cache_put(key, value)\n        else:\n            value = self._cache_get(key)\n        return value\n    return wrapper\n\n\nclass UTestCase(unittest.TestCase):\n    _outcome = None # A dictionary which stores the user-computed outcomes of all the tests. This differs from the cache.\n    _cache = None  # Read-only cache. Ensures method always produce same result.\n    _cache2 = None  # User-written cache.\n\n    def capture(self):\n        return Capturing2(stdout=self._stdout)\n\n    @classmethod\n    def question_title(cls):\n        """ Return the question title """\n        return cls.__doc__.strip().splitlines()[0].strip() if cls.__doc__ != None else cls.__qualname__\n\n    @classmethod\n    def reset(cls):\n        print("Warning, I am not sure UTestCase.reset() is needed anymore and it seems very hacky.")\n        cls._outcome = None\n        cls._cache = None\n        cls._cache2 = None\n\n    def _callSetUp(self):\n        self._stdout = sys.stdout\n        import io\n        sys.stdout = io.StringIO()\n        super().setUp()\n        # print("Setting up...")\n\n    def _callTearDown(self):\n        sys.stdout = self._stdout\n        super().tearDown()\n        # print("asdfsfd")\n\n    def shortDescriptionStandard(self):\n        sd = super().shortDescription()\n        if sd == None:\n            sd = self._testMethodName\n        return sd\n\n    def shortDescription(self):\n        # self._testMethodDoc.strip().splitlines()[0].strip()\n        sd = self.shortDescriptionStandard()\n        title = self._cache_get(  (self.cache_id(), \'title\'), sd )\n        return title if title != None else sd\n\n    @property\n    def title(self):\n        return self.shortDescription()\n\n    @title.setter\n    def title(self, value):\n        self._cache_put((self.cache_id(), \'title\'), value)\n\n    def _get_outcome(self):\n        if not (self.__class__, \'_outcome\') or self.__class__._outcome == None:\n            self.__class__._outcome = {}\n        return self.__class__._outcome\n\n    def _callTestMethod(self, testMethod):\n        t = time.time()\n        self._ensure_cache_exists() # Make sure cache is there.\n        if self._testMethodDoc != None:\n            # Ensure the cache is eventually updated with the right docstring.\n            self._cache_put((self.cache_id(), \'title\'), self.shortDescriptionStandard() )\n        # Fix temp cache here (for using the @cache decorator)\n        self._cache2[ (self.cache_id(), \'assert\') ] = {}\n\n        res = testMethod()\n        elapsed = time.time() - t\n        # self._cache_put( (self.cache_id(), \'title\'), self.shortDescription() )\n\n        self._get_outcome()[self.cache_id()] = res\n        self._cache_put( (self.cache_id(), "time"), elapsed)\n\n    # This is my base test class. So what is new about it?\n    def cache_id(self):\n        c = self.__class__.__qualname__\n        m = self._testMethodName\n        return (c,m)\n\n    def __init__(self, *args, **kwargs):\n        super().__init__(*args, **kwargs)\n        self._load_cache()\n        self._assert_cache_index = 0\n        # self.cache_indexes = defaultdict(lambda: 0)\n\n    def _ensure_cache_exists(self):\n        if not hasattr(self.__class__, \'_cache\') or self.__class__._cache == None:\n            self.__class__._cache = dict()\n        if not hasattr(self.__class__, \'_cache2\') or self.__class__._cache2 == None:\n            self.__class__._cache2 = dict()\n\n    def _cache_get(self, key, default=None):\n        self._ensure_cache_exists()\n        return self.__class__._cache.get(key, default)\n\n    def _cache_put(self, key, value):\n        self._ensure_cache_exists()\n        self.__class__._cache2[key] = value\n\n    def _cache_contains(self, key):\n        self._ensure_cache_exists()\n        return key in self.__class__._cache\n\n    def wrap_assert(self, assert_fun, first, *args, **kwargs):\n        key = (self.cache_id(), \'assert\')\n        if not self._cache_contains(key):\n            print("Warning, framework missing", key)\n        cache = self._cache_get(key, {})\n        id = self._assert_cache_index\n        if not id in cache:\n            print("Warning, framework missing cache index", key, "id =", id)\n        _expected = cache.get(id, first)\n        assert_fun(first, _expected, *args, **kwargs)\n        cache[id] = first\n        self._cache_put(key, cache)\n        self._assert_cache_index += 1\n\n    def assertEqualC(self, first: Any, msg: Any = ...) -> None:\n        self.wrap_assert(self.assertEqual, first, msg)\n\n    def _cache_file(self):\n        return os.path.dirname(inspect.getfile(self.__class__) ) + "/unitgrade_v1/" + self.__class__.__name__ + ".pkl"\n\n    def _save_cache(self):\n        # get the class name (i.e. what to save to).\n        cfile = self._cache_file()\n        if not os.path.isdir(os.path.dirname(cfile)):\n            os.makedirs(os.path.dirname(cfile))\n\n        if hasattr(self.__class__, \'_cache2\'):\n            with open(cfile, \'wb\') as f:\n                pickle.dump(self.__class__._cache2, f)\n\n    # But you can also set cache explicitly.\n    def _load_cache(self):\n        if self._cache != None: # Cache already loaded. We will not load it twice.\n            return\n            # raise Exception("Loaded cache which was already set. What is going on?!")\n        cfile = self._cache_file()\n        # print("Loading cache from", cfile)\n        if os.path.exists(cfile):\n            with open(cfile, \'rb\') as f:\n                data = pickle.load(f)\n                self.__class__._cache = data\n        else:\n            print("Warning! data file not found", cfile)\n\ndef hide(func):\n    return func\n\ndef makeRegisteringDecorator(foreignDecorator):\n    """\n        Returns a copy of foreignDecorator, which is identical in every\n        way(*), except also appends a .decorator property to the callable it\n        spits out.\n    """\n    def newDecorator(func):\n        # Call to newDecorator(method)\n        # Exactly like old decorator, but output keeps track of what decorated it\n        R = foreignDecorator(func)  # apply foreignDecorator, like call to foreignDecorator(method) would have done\n        R.decorator = newDecorator  # keep track of decorator\n        # R.original = func         # might as well keep track of everything!\n        return R\n\n    newDecorator.__name__ = foreignDecorator.__name__\n    newDecorator.__doc__ = foreignDecorator.__doc__\n    # (*)We can be somewhat "hygienic", but newDecorator still isn\'t signature-preserving, i.e. you will not be able to get a runtime list of parameters. For that, you need hackish libraries...but in this case, the only argument is func, so it\'s not a big issue\n    return newDecorator\n\nhide = makeRegisteringDecorator(hide)\n\ndef methodsWithDecorator(cls, decorator):\n    """\n        Returns all methods in CLS with DECORATOR as the\n        outermost decorator.\n\n        DECORATOR must be a "registering decorator"; one\n        can make any decorator "registering" via the\n        makeRegisteringDecorator function.\n\n        import inspect\n        ls = list(methodsWithDecorator(GeneratorQuestion, deco))\n        for f in ls:\n            print(inspect.getsourcelines(f) ) # How to get all hidden questions.\n    """\n    for maybeDecorated in cls.__dict__.values():\n        if hasattr(maybeDecorated, \'decorator\'):\n            if maybeDecorated.decorator == decorator:\n                print(maybeDecorated)\n                yield maybeDecorated\n\n\n\nimport numpy as np\nfrom tabulate import tabulate\nfrom datetime import datetime\nimport pyfiglet\nimport unittest\n# from unitgrade.unitgrade import MySuite\n\nimport inspect\nimport os\nimport argparse\nimport sys\nimport time\nimport threading # don\'t import Thread bc. of minify issue.\nimport tqdm # don\'t do from tqdm import tqdm because of minify-issue\n\nparser = argparse.ArgumentParser(description=\'Evaluate your report.\', epilog="""Example: \nTo run all tests in a report: \n\n> python assignment1_dp.py\n\nTo run only question 2 or question 2.1\n\n> python assignment1_dp.py -q 2\n> python assignment1_dp.py -q 2.1\n\nNote this scripts does not grade your report. To grade your report, use:\n\n> python report1_grade.py\n\nFinally, note that if your report is part of a module (package), and the report script requires part of that package, the -m option for python may be useful.\nFor instance, if the report file is in Documents/course_package/report3_complete.py, and `course_package` is a python package, then change directory to \'Documents/` and run:\n\n> python -m course_package.report1\n\nsee https://docs.python.org/3.9/using/cmdline.html\n""", formatter_class=argparse.RawTextHelpFormatter)\nparser.add_argument(\'-q\', nargs=\'?\', type=str, default=None, help=\'Only evaluate this question (e.g.: -q 2)\')\nparser.add_argument(\'--showexpected\',  action="store_true",  help=\'Show the expected/desired result\')\nparser.add_argument(\'--showcomputed\',  action="store_true",  help=\'Show the answer your code computes\')\nparser.add_argument(\'--unmute\',  action="store_true",  help=\'Show result of print(...) commands in code\')\nparser.add_argument(\'--passall\',  action="store_true",  help=\'Automatically pass all tests. Useful when debugging.\')\n\ndef evaluate_report_student(report, question=None, qitem=None, unmute=None, passall=None, ignore_missing_file=False, show_tol_err=False):\n    args = parser.parse_args()\n    if question is None and args.q is not None:\n        question = args.q\n        if "." in question:\n            question, qitem = [int(v) for v in question.split(".")]\n        else:\n            question = int(question)\n\n    if hasattr(report, "computed_answer_file") and not os.path.isfile(report.computed_answers_file) and not ignore_missing_file:\n        raise Exception("> Error: The pre-computed answer file", os.path.abspath(report.computed_answers_file), "does not exist. Check your package installation")\n\n    if unmute is None:\n        unmute = args.unmute\n    if passall is None:\n        passall = args.passall\n\n    results, table_data = evaluate_report(report, question=question, show_progress_bar=not unmute, qitem=qitem, verbose=False, passall=passall, show_expected=args.showexpected, show_computed=args.showcomputed,unmute=unmute,\n                                          show_tol_err=show_tol_err)\n\n\n    if question is None:\n        print("Provisional evaluation")\n        tabulate(table_data)\n        table = table_data\n        print(tabulate(table))\n        print(" ")\n\n    fr = inspect.getouterframes(inspect.currentframe())[1].filename\n    gfile = os.path.basename(fr)[:-3] + "_grade.py"\n    if os.path.exists(gfile):\n        print("Note your results have not yet been registered. \\nTo register your results, please run the file:")\n        print(">>>", gfile)\n        print("In the same manner as you ran this file.")\n\n\n    return results\n\n\ndef upack(q):\n    # h = zip([(i[\'w\'], i[\'possible\'], i[\'obtained\']) for i in q.values()])\n    h =[(i[\'w\'], i[\'possible\'], i[\'obtained\']) for i in q.values()]\n    h = np.asarray(h)\n    return h[:,0], h[:,1], h[:,2],\n\nclass UnitgradeTextRunner(unittest.TextTestRunner):\n    def __init__(self, *args, **kwargs):\n        super().__init__(*args, **kwargs)\n\nclass SequentialTestLoader(unittest.TestLoader):\n    def getTestCaseNames(self, testCaseClass):\n        test_names = super().getTestCaseNames(testCaseClass)\n        # testcase_methods = list(testCaseClass.__dict__.keys())\n        ls = []\n        for C in testCaseClass.mro():\n            if issubclass(C, unittest.TestCase):\n                ls = list(C.__dict__.keys()) + ls\n        testcase_methods = ls\n        test_names.sort(key=testcase_methods.index)\n        return test_names\n\ndef evaluate_report(report, question=None, qitem=None, passall=False, verbose=False,  show_expected=False, show_computed=False,unmute=False, show_help_flag=True, silent=False,\n                    show_progress_bar=True,\n                    show_tol_err=False,\n                    big_header=True):\n\n    now = datetime.now()\n    if big_header:\n        ascii_banner = pyfiglet.figlet_format("UnitGrade", font="doom")\n        b = "\\n".join( [l for l in ascii_banner.splitlines() if len(l.strip()) > 0] )\n    else:\n        b = "Unitgrade"\n    print(b + " v" + __version__)\n    dt_string = now.strftime("%d/%m/%Y %H:%M:%S")\n    print("Started: " + dt_string)\n    s = report.title\n    if hasattr(report, "version") and report.version is not None:\n        s += " version " + report.version\n    print("Evaluating " + s, "(use --help for options)" if show_help_flag else "")\n    # print(f"Loaded answers from: ", report.computed_answers_file, "\\n")\n    table_data = []\n    nL = 80\n    t_start = time.time()\n    score = {}\n    loader = SequentialTestLoader()\n\n    for n, (q, w) in enumerate(report.questions):\n        # q = q()\n        # q_hidden = False\n        # q_hidden = issubclass(q.__class__, Hidden)\n        if question is not None and n+1 != question:\n            continue\n        suite = loader.loadTestsFromTestCase(q)\n        qtitle = q.question_title() if hasattr(q, \'question_title\') else q.__qualname__\n        q_title_print = "Question %i: %s"%(n+1, qtitle)\n        print(q_title_print, end="")\n        q.possible = 0\n        q.obtained = 0\n        q_ = {} # Gather score in this class.\n        # unittest.Te\n        # q_with_outstanding_init = [item.question for item in q.items if not item.question.has_called_init_]\n        UTextResult.q_title_print = q_title_print # Hacky\n        UTextResult.show_progress_bar = show_progress_bar # Hacky.\n        UTextResult.number = n\n\n        res = UTextTestRunner(verbosity=2, resultclass=UTextResult).run(suite)\n\n        possible = res.testsRun\n        obtained = len(res.successes)\n\n        assert len(res.successes) +  len(res.errors) + len(res.failures) == res.testsRun\n\n        # possible = int(ws @ possible)\n        # obtained = int(ws @ obtained)\n        # obtained = int(myround(int((w * obtained) / possible ))) if possible > 0 else 0\n\n        obtained = int(w * obtained * 1.0 / possible ) if possible > 0 else 0\n        score[n] = {\'w\': w, \'possible\': w, \'obtained\': obtained, \'items\': q_, \'title\': qtitle}\n        q.obtained = obtained\n        q.possible = possible\n\n        s1 = f"*** Question q{n+1}"\n        s2 = f" {q.obtained}/{w}"\n        print(s1 + ("."* (nL-len(s1)-len(s2) )) + s2 )\n        print(" ")\n        table_data.append([f"Question q{n+1}", f"{q.obtained}/{w}"])\n\n    ws, possible, obtained = upack(score)\n    possible = int( msum(possible) )\n    obtained = int( msum(obtained) ) # Cast to python int\n    report.possible = possible\n    report.obtained = obtained\n    now = datetime.now()\n    dt_string = now.strftime("%H:%M:%S")\n\n    dt = int(time.time()-t_start)\n    minutes = dt//60\n    seconds = dt - minutes*60\n    plrl = lambda i, s: str(i) + " " + s + ("s" if i != 1 else "")\n\n    print(f"Completed: "+ dt_string + " (" + plrl(minutes, "minute") + ", "+ plrl(seconds, "second") +")")\n\n    table_data.append(["Total", ""+str(report.obtained)+"/"+str(report.possible) ])\n    results = {\'total\': (obtained, possible), \'details\': score}\n    return results, table_data\n\n\n\n\nfrom tabulate import tabulate\nfrom datetime import datetime\nimport inspect\nimport json\nimport os\nimport bz2\nimport pickle\nimport os\n\ndef bzwrite(json_str, token): # to get around obfuscation issues\n    with getattr(bz2, \'open\')(token, "wt") as f:\n        f.write(json_str)\n\ndef gather_imports(imp):\n    resources = {}\n    m = imp\n    # for m in pack_imports:\n    # print(f"*** {m.__name__}")\n    f = m.__file__\n    # dn = os.path.dirname(f)\n    # top_package = os.path.dirname(__import__(m.__name__.split(\'.\')[0]).__file__)\n    # top_package = str(__import__(m.__name__.split(\'.\')[0]).__path__)\n\n    if hasattr(m, \'__file__\') and not hasattr(m, \'__path__\'):  # Importing a simple file: m.__class__.__name__ == \'module\' and False:\n        top_package = os.path.dirname(m.__file__)\n        module_import = True\n    else:\n        top_package = __import__(m.__name__.split(\'.\')[0]).__path__._path[0]\n        module_import = False\n\n    # top_package = os.path.dirname(__import__(m.__name__.split(\'.\')[0]).__file__)\n    # top_package = os.path.dirname(top_package)\n    import zipfile\n    # import strea\n    # zipfile.ZipFile\n    import io\n    # file_like_object = io.BytesIO(my_zip_data)\n    zip_buffer = io.BytesIO()\n    with zipfile.ZipFile(zip_buffer, \'w\') as zip:\n        # zip.write()\n        for root, dirs, files in os.walk(top_package):\n            for file in files:\n                if file.endswith(".py"):\n                    fpath = os.path.join(root, file)\n                    v = os.path.relpath(os.path.join(root, file), os.path.dirname(top_package) if not module_import else top_package)\n                    zip.write(fpath, v)\n\n    resources[\'zipfile\'] = zip_buffer.getvalue()\n    resources[\'top_package\'] = top_package\n    resources[\'module_import\'] = module_import\n    return resources, top_package\n\n    if f.endswith("__init__.py"):\n        for root, dirs, files in os.walk(os.path.dirname(f)):\n            for file in files:\n                if file.endswith(".py"):\n                    # print(file)\n                    # print()\n                    v = os.path.relpath(os.path.join(root, file), top_package)\n                    with open(os.path.join(root, file), \'r\') as ff:\n                        resources[v] = ff.read()\n    else:\n        v = os.path.relpath(f, top_package)\n        with open(f, \'r\') as ff:\n            resources[v] = ff.read()\n    return resources\n\nimport argparse\nparser = argparse.ArgumentParser(description=\'Evaluate your report.\', epilog="""Use this script to get the score of your report. Example:\n\n> python report1_grade.py\n\nFinally, note that if your report is part of a module (package), and the report script requires part of that package, the -m option for python may be useful.\nFor instance, if the report file is in Documents/course_package/report3_complete.py, and `course_package` is a python package, then change directory to \'Documents/` and run:\n\n> python -m course_package.report1\n\nsee https://docs.python.org/3.9/using/cmdline.html\n""", formatter_class=argparse.RawTextHelpFormatter)\nparser.add_argument(\'--noprogress\',  action="store_true",  help=\'Disable progress bars\')\nparser.add_argument(\'--autolab\',  action="store_true",  help=\'Show Autolab results\')\n\ndef gather_upload_to_campusnet(report, output_dir=None):\n    n = report.nL\n    args = parser.parse_args()\n    results, table_data = evaluate_report(report, show_help_flag=False, show_expected=False, show_computed=False, silent=True,\n                                          show_progress_bar=not args.noprogress,\n                                          big_header=not args.autolab)\n    print(" ")\n    print("="*n)\n    print("Final evaluation")\n    print(tabulate(table_data))\n    # also load the source code of missing files...\n\n    sources = {}\n\n    if not args.autolab:\n        if len(report.individual_imports) > 0:\n            print("By uploading the .token file, you verify the files:")\n            for m in report.individual_imports:\n                print(">", m.__file__)\n            print("Are created/modified individually by you in agreement with DTUs exam rules")\n            report.pack_imports += report.individual_imports\n\n        if len(report.pack_imports) > 0:\n            print("Including files in upload...")\n            for k, m in enumerate(report.pack_imports):\n                nimp, top_package = gather_imports(m)\n                _, report_relative_location, module_import = report._import_base_relative()\n\n                # report_relative_location = os.path.relpath(inspect.getfile(report.__class__), top_package)\n                nimp[\'report_relative_location\'] = report_relative_location\n                nimp[\'report_module_specification\'] = module_import\n                nimp[\'name\'] = m.__name__\n                sources[k] = nimp\n                # if len([k for k in nimp if k not in sources]) > 0:\n                print(f"*** {m.__name__}")\n                # sources = {**sources, **nimp}\n    results[\'sources\'] = sources\n\n    if output_dir is None:\n        output_dir = os.getcwd()\n\n    payload_out_base = report.__class__.__name__ + "_handin"\n\n    obtain, possible = results[\'total\']\n    vstring = "_v"+report.version if report.version is not None else ""\n\n    token = "%s_%i_of_%i%s.token"%(payload_out_base, obtain, possible,vstring)\n    token = os.path.join(output_dir, token)\n    with open(token, \'wb\') as f:\n        pickle.dump(results, f)\n\n    if not args.autolab:\n        print(" ")\n        print("To get credit for your results, please upload the single file: ")\n        print(">", token)\n        print("To campusnet without any modifications.")\n\n        # print("Now time for some autolab fun")\n\ndef source_instantiate(name, report1_source, payload):\n    eval("exec")(report1_source, globals())\n    pl = pickle.loads(bytes.fromhex(payload))\n    report = eval(name)(payload=pl, strict=True)\n    # report.set_payload(pl)\n    return report\n\n\n__version__ = "0.9.0"\n\nfrom homework1 import reverse_list, add\nimport unittest\n\nclass Week1(unittest.TestCase):\n    def test_add(self):\n        self.assertEqual(add(2,2), 4)\n        self.assertEqual(add(-100, 5), -95)\n\n    def test_reverse(self):\n        self.assertEqual(reverse_list([1,2,3]), [3,2,1])\n\n\nimport homework1\nclass Report1Flat(Report):\n    title = "CS 101 Report 1"\n    questions = [(Week1, 10)]  # Include a single question for 10 credits.\n    pack_imports = [homework1]'
-report1_payload = '8004953f000000000000007d948c055765656b31947d948c2c6e6f20636163686520736565205f73657475705f616e737765727320696e20756e69746772616465322e7079948873732e'
-name="Report1Flat"
-
-report = source_instantiate(name, report1_source, report1_payload)
-output_dir = os.path.dirname(__file__)
-gather_upload_to_campusnet(report, output_dir)
+'''WARNING: Modifying, decompiling or otherwise tampering with this script, it's data or the resulting .token file will be investigated as a cheating attempt.'''
+import bz2, base64
+exec(bz2.decompress(base64.b64decode('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')))
\ No newline at end of file
diff --git a/examples/example_framework/instructor/cs102/Report2_handin_18_of_18.token b/examples/example_framework/instructor/cs102/Report2_handin_18_of_18.token
index 975e337..7079a40 100644
--- a/examples/example_framework/instructor/cs102/Report2_handin_18_of_18.token
+++ b/examples/example_framework/instructor/cs102/Report2_handin_18_of_18.token
@@ -32,10 +32,10 @@ if __name__ == "__main__":
 
 ### Content of cs102\report2.py ###
 
-from unitgrade.framework import Report, cache
+from unitgrade.framework import Report
 from unitgrade.evaluate import evaluate_report_student
 from cs102.homework1 import add, reverse_list
-from unitgrade import UTestCase #!s
+from unitgrade import UTestCase, cache  # !s
 
 class Week1(UTestCase):
     def test_add(self):
@@ -98,151 +98,151 @@ class Report2(Report):
 if __name__ == "__main__":
     evaluate_report_student(Report2(), unmute=True)
 ---------------------------------------------------------------------- ..ooO0Ooo.. ----------------------------------------------------------------------
-310d75b649cf15d84744951c630fbc02ffd3a8ad3f2086a47b3155071ead8398427a614590193acd23c26d1704e85b36cced74b4469764c600378518d90657f7 26252
+29a499197b06183c0c65459db09bcc31c2932226ab85f8fb5265bbf8eea55836b225806e20da0973f82c380f3be6f88122a92f6593c5ad59497bac0130ee530c 26240
 ---------------------------------------------------------------------- ..ooO0Ooo.. ----------------------------------------------------------------------
-./Td6WFoAAATm1rRGAgAhARYAAAB0L+Wj4HtGTKZdAEABDnFOU/0eA+7X8XxSlWmUnQXr6c5mdg9cCby6jNS4yD9H57j27y5ELF3hUiQThiE7lHE21EitZyJ7jLYL+CFAImQ2BzdWlW0KJf0Q8kM/gHKdHBtUQS9hNEW+knFkEUwrQhBneBT
+.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
-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.
\ No newline at end of file
+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.
\ No newline at end of file
diff --git a/examples/example_framework/instructor/cs102/__pycache__/report2.cpython-38.pyc b/examples/example_framework/instructor/cs102/__pycache__/report2.cpython-38.pyc
index b9dec210c599e98609d7e33f8df6a1134683266f..fbef3043934a8e926ef14f67c497772dd017ce54 100644
GIT binary patch
delta 578
zcmZn{Zx`nc<>lpKU|?V<s&`48K9N^Dijg6OA%!W2DVI5l8O&zRVaa8UV$EfXVgvJ8
za@cb@qBwFnqc|BE+!<0>Q`lM<QrJ>Cnwg`x+!<2XQ#e`}QaHeTZg++h&J?Z|h7_(;
zj){|0m6%icni*2~Qv`aM7#UKygBdghUxKXHWW2=|lv<EqR5I~_p%Bw8&d`w5;u7b?
z;?!HL$%)AslVun;GO|oQ$M~9&b@DEzi;TA>_b{(!RG8erF0na)<t`&5>tsE)(~NSH
zf3YPiD}p?v1R|6f7#MD`$H%ASC&$MZ34w$}L4*cKqqqtK1A_<y14A(f0|NsGBMT!3
zD+ha#%H;LzRlKYW3=En~Mf@PuYLm@4t|@DS%wjDmEyzhNk^%|yf(WoWW|%sC&Lk;R
z+l$yisz7>+^g))2YJm&}S;_{sl!=jxy+~{F4bChjT?PgQKTXaeGy_yY27p{xq%t{$
z%R<zEfq}sqVE_xG0ArEC<c(Y=Vo^e+d6^~YMTse?dZ}fJIi-musYT3_xJ4~lKxTlP
z8pR1$QUr1U#CZ_YL25v*D>4GHK-Lr~PHtcqpPaxgEW*Rc!zjQgz$CyYASxip!6?AW
G!3Y3LmvV{#

delta 595
zcmZn{Zx`nc<>lpKU|?Wi$#PDdI+0g9DwipWiIE|NA%!W2IhQ4h1<Yp7Va;WWV#{TZ
zVh8hCayW81qc|BE+!<0>Q`lM<QrJ>Co0+4y+!<2XQ#e`}QaHeTZg++h&J?Z|h7_(;
z&WV#$HCa;mni*2~Qv`ZJmT(6%XbQdrS+B`-i!CU%Ait>O7He{1az^UJn}*zsw>U#X
zQj1HR6N@LyFm7aIoqUe*H6z>PT}&4lqbBz-uV$2=+`uleIe_IZBO}{nJ+{+~vXg(Y
zB`Yg1FfbG;f(RuB28LVg@$o77$?@?;LLebg5TOpzD6Y)Fz#ziFz);M=z`(%4$im3M
z%E4ZwJb68P6)zhD1A``05kE+^>SQyHYsy+6vsg<?3vyD6q(H*FAOft88KzF3Gf4{7
z_9AAGDv;hHJ&>iMnjnKgmV$J0FfuW6u@`AhzQLKLq{G0#;HSx1gl2#W$N-QFi<Bp)
za9N1zGcYh%BMe|+6ksgUpS+RFBn50&lu&72W=VQcVoIuBYFT1VX<|ug5eowYLll2<
zv7v#HUPgXyYI%N9wqX$~$YhW+qB!Atir7Jd5bHoJkaLR+K`fBHMGBJ}*u^I&a0`nF
YF!C@8F!C@7@Ck?t2y!qAuyQa00L5;0(f|Me

diff --git a/examples/example_framework/instructor/cs102/report2.py b/examples/example_framework/instructor/cs102/report2.py
index 2f47be9..04682d2 100644
--- a/examples/example_framework/instructor/cs102/report2.py
+++ b/examples/example_framework/instructor/cs102/report2.py
@@ -1,7 +1,7 @@
-from unitgrade.framework import Report, cache
+from unitgrade.framework import Report
 from unitgrade.evaluate import evaluate_report_student
 from cs102.homework1 import add, reverse_list
-from unitgrade import UTestCase #!s
+from unitgrade import UTestCase, cache  # !s
 
 class Week1(UTestCase):
     def test_add(self):
diff --git a/examples/example_framework/instructor/cs102/report2_grade.py b/examples/example_framework/instructor/cs102/report2_grade.py
index 86b1486..13a61a6 100644
--- a/examples/example_framework/instructor/cs102/report2_grade.py
+++ b/examples/example_framework/instructor/cs102/report2_grade.py
@@ -1,3 +1,3 @@
-'''WARNING: Modifying, decompiling or otherwise tampering with this script, it's data or the resulting .token file will be investigated as a cheating attempt.'''
+''' WARNING: Modifying, decompiling or otherwise tampering with this script, it's data or the resulting .token file will be investigated as a cheating attempt. '''
 import bz2, base64
-exec(bz2.decompress(base64.b64decode('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')))
\ No newline at end of file
+exec(bz2.decompress(base64.b64decode('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')))
\ No newline at end of file
diff --git a/examples/example_framework/instructor/cs102/unitgrade_data/Week1.pkl b/examples/example_framework/instructor/cs102/unitgrade_data/Week1.pkl
index 6b4ee502e9c67e2ff3aba1b11c4911bb88195e34..3e94c9f63cd7ce80ac71dc95ae4e5981ebc3855a 100644
GIT binary patch
literal 403
zcmZo*ncBg~00y;FG<sOWQ&Y1Ir}S_Yr<Q~kIOil57f)%M(!)}cnVUMLZHhZsAp-+L
z24fFLNosLPd}2xpNC8`7adB!<$&|J!wNo^_8N6A%8NC+%|Np-<gE51xZAu19+Z1>E
zfK0G<h)@qla(-EAQDQpC+}bHULdnI321YR%`MIg(`9;}=dIgnJYNzz@rKF}QB&MWj
zB<dt-S}9EN=IY5&P*6}%Qc_ZI&n!#LQz$9VSI8^PO-d~)R!B%pP)N*6QAkKiP$<dB
zELKP>%}XxH%+FIO&d4v#Nl_@y%q_^NR47U<DJ{xVD9K38EK(>g&9&kJnP~^NNWoSi
zQ9B7_$&|J!#l;znJv?CF7NwS@78QeBoWTL|sy9RI6b)}?ZzgZX)Zz@r3^BM@v!Gt>
k5e93_FD)r3Es0M~EGQ{0Lg>$6%#ej?$(Ygr(o?Dj0IU9px&QzG

delta 68
zcmbQtoGRA9GBt_;0&1sd^st7fre+&XnP{o0*27bhT3ixelv<WrRGd1cZAu19+mzZV
T-VCu*G`yL;nY<ZOi%azYxr7yW

diff --git a/examples/example_framework/instructor/cs102/unitgrade_data/Week1Titles.pkl b/examples/example_framework/instructor/cs102/unitgrade_data/Week1Titles.pkl
index d483eaf228473f71b5a26d9e892bb23a134c63d2..afe435c082fd18662075c52a0d30a84774febfd7 100644
GIT binary patch
literal 470
zcmZo*nR=R$0Ss!VX!LN0r>15bhGdrHq!v%<;VMoo2`zBWNh~g&(l(`sr6e;qbxPY5
zcd&8>28ImA9*&aK;*$8ploXHx))J6L5KA#6wYWr~BqLQJF(oClBr`uxAvd)oBR>Vi
z*GSY!(wvgPn8DUIrH3uCxHz?_WJ=qV+9?{|4Bjl>j9v@>|NmbKk<Vaho8oR?;N<|a
z6C%{Zk(^(aT9lX$a!c)$9--u7Lj$9jjQrfx^8BJ~L%o8^DYa92_)=2S;I>&QO!4OG
z$x%>HP*74*QgF{KOU+X#DbH8PE6q(xEh<(>NK8;j%u7*7NJ>yB$;d2LNGr`t2D`gB
zBfm5!MWHw|w;-odp(wSav?vecv&<re;?i6zE|8gaaElad6%w_RK$c8tn^Ihy!PvtC
z4xysdvecqtkc%^TKwkA`h@GP0&FszO&6rx8!I&Y{HYJ0jZAy>6b4F@%c4l6>LS~u*
tR8xFTW^su|w4siIk&c3KtfqpkLbNfMV;BnxMvz``Fa;!mLW!YN4*=ZYo|ymu

delta 105
zcmcb{yp~bDfo19<1_-E~qS3=0o|>9%7?N3%lUh8bhodC5xFkL?C1uLQIys{r9x%5k
zwJf!$ICV<flnj=(DYa9)8Dghscr$x5c{8RKXE0{4w@v9`EdiM@WpXd02~(*a090lq
A9RL6T

diff --git a/examples/example_framework/instructor/output/report2.py b/examples/example_framework/instructor/output/report2.py
index fdc74f1..aa50d37 100644
--- a/examples/example_framework/instructor/output/report2.py
+++ b/examples/example_framework/instructor/output/report2.py
@@ -1,5 +1,5 @@
 # report2.py
-from unitgrade import UTestCase 
+from unitgrade import UTestCase, cache  
 
 class Week1(UTestCase):
     def test_add(self):
diff --git a/examples/example_framework/students/cs102/Report2_handin_18_of_18.token b/examples/example_framework/students/cs102/Report2_handin_18_of_18.token
new file mode 100644
index 0000000..59fb2e9
--- /dev/null
+++ b/examples/example_framework/students/cs102/Report2_handin_18_of_18.token
@@ -0,0 +1,252 @@
+# This file contains your results. Do not edit its content. Simply upload it as it is. 
+### Content of cs102\homework1.py ###
+
+def reverse_list(mylist): #!f #!s;keeptags
+    """
+    Given a list 'mylist' returns a list consisting of the same elements in reverse order. E.g.
+    reverse_list([1,2,3]) should return [3,2,1] (as a list).
+    """
+    ls = []
+    for l in mylist:
+        ls = [l] + ls
+    return ls
+    # return list(reversed(mylist))
+
+def add(a,b): #!f
+    """ Given two numbers `a` and `b` this function should simply return their sum:
+    > add(a,b) = a+b """
+    sum2 = a + b
+    return sum2
+
+if __name__ == "__main__":
+    # Example usage:
+    print(f"Your result of 2 + 2 = {add(2,2)}")
+    print(f"Reversing a small list", reverse_list([2,3,5,7])) #!s
+
+
+### Content of cs102\report2.py ###
+
+from unitgrade.framework import Report
+from unitgrade.evaluate import evaluate_report_student
+from cs102.homework1 import add, reverse_list
+from unitgrade import UTestCase, cache  
+
+class Week1(UTestCase):
+    def test_add(self):
+        self.assertEqualC(add(2,2))
+        self.assertEqualC(add(-100, 5))
+
+    def test_reverse(self):
+        self.assertEqualC(reverse_list([1, 2, 3])) 
+
+    def test_output_capture(self):
+        with self.capture() as out:
+            print("hello world 42")                     # Genereate some output (i.e. in a homework script)
+        self.assertEqual(out.numbers[0], 42)            # out.numbers is a list of all numbers generated
+        self.assertEqual(out.output, "hello world 42")  # you can also access the raw output.
+
+class Week1Titles(UTestCase): 
+    """ The same problem as before with nicer titles """
+    def test_add(self):
+        """ Test the addition method add(a,b) """
+        self.assertEqualC(add(2,2))
+        self.assertEqualC(add(-100, 5))
+
+    def test_reverse(self):
+        ls = [1, 2, 3]
+        reverse = reverse_list(ls)
+        self.assertEqualC(reverse)
+        # Although the title is set after the test potentially fails, it will *always* show correctly for the student.
+        self.title = f"Checking if reverse_list({ls}) = {reverse}"  # Programmatically set the title 
+
+    def ex_test_output_capture(self):
+        with self.capture() as out:
+            print("hello world 42")                     # Genereate some output (i.e. in a homework script)
+        self.assertEqual(out.numbers[0], 42)            # out.numbers is a list of all numbers generated
+        self.assertEqual(out.output, "hello world 42")  # you can also access the raw output.
+
+
+class Question2(UTestCase): 
+    @cache
+    def my_reversal(self, ls):
+        # The '@cache' decorator ensures the function is not run on the *students* computer
+        # Instead the code is run on the teachers computer and the result is passed on with the
+        # other pre-computed results -- i.e. this function will run regardless of how the student happens to have
+        # implemented reverse_list.
+        return reverse_list(ls)
+
+    def test_reverse_tricky(self):
+        ls = (2,4,8)
+        ls2 = self.my_reversal(tuple(ls))                   # This will always produce the right result, [8, 4, 2]
+        print("The correct answer is supposed to be", ls2)  # Show students the correct answer
+        self.assertEqualC(reverse_list(ls))                 # This will actually test the students code.
+        return "Buy world!"                                 # This value will be stored in the .token file  
+
+
+import cs102
+class Report2(Report):
+    title = "CS 101 Report 2"
+    questions = [(Week1, 10), (Week1Titles, 8)]
+    pack_imports = [cs102]
+
+if __name__ == "__main__":
+    evaluate_report_student(Report2(), unmute=True)
+---------------------------------------------------------------------- ..ooO0Ooo.. ----------------------------------------------------------------------
+4feb7306886b544a50d7c0783f0a521df06b49981bb92bbb57cf4ec9357af4b3e2d7fe806f0e3bee56e81e768363e5d79224c7a47cf9e626f04a66b2c4cba906 27932
+---------------------------------------------------------------------- ..ooO0Ooo.. ----------------------------------------------------------------------
+.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
+AAa6jAYeAAgLSj16xxGf7AgAAAAAEWVo=.
\ No newline at end of file
diff --git a/examples/example_framework/students/cs102/Report2_handin_3_of_18.token b/examples/example_framework/students/cs102/Report2_handin_3_of_18.token
new file mode 100644
index 0000000..7d7248b
--- /dev/null
+++ b/examples/example_framework/students/cs102/Report2_handin_3_of_18.token
@@ -0,0 +1,249 @@
+# This file contains your results. Do not edit its content. Simply upload it as it is. 
+### Content of cs102\homework1.py ###
+
+def reverse_list(mylist): 
+    """
+    Given a list 'mylist' returns a list consisting of the same elements in reverse order. E.g.
+    reverse_list([1,2,3]) should return [3,2,1] (as a list).
+    """
+    # TODO: 1 lines missing.
+    raise NotImplementedError("Implement function body")
+
+def add(a,b): 
+    """ Given two numbers `a` and `b` this function should simply return their sum:
+    > add(a,b) = a+b """
+    # TODO: 1 lines missing.
+    raise NotImplementedError("Implement function body")
+
+if __name__ == "__main__":
+    # Example usage:
+    print(f"Your result of 2 + 2 = {add(2,2)}")
+    print(f"Reversing a small list", reverse_list([2,3,5,7])) 
+
+
+### Content of cs102\report2.py ###
+
+from unitgrade.framework import Report
+from unitgrade.evaluate import evaluate_report_student
+from cs102.homework1 import add, reverse_list
+from unitgrade import UTestCase, cache  
+
+class Week1(UTestCase):
+    def test_add(self):
+        self.assertEqualC(add(2,2))
+        self.assertEqualC(add(-100, 5))
+
+    def test_reverse(self):
+        self.assertEqualC(reverse_list([1, 2, 3])) 
+
+    def test_output_capture(self):
+        with self.capture() as out:
+            print("hello world 42")                     # Genereate some output (i.e. in a homework script)
+        self.assertEqual(out.numbers[0], 42)            # out.numbers is a list of all numbers generated
+        self.assertEqual(out.output, "hello world 42")  # you can also access the raw output.
+
+class Week1Titles(UTestCase): 
+    """ The same problem as before with nicer titles """
+    def test_add(self):
+        """ Test the addition method add(a,b) """
+        self.assertEqualC(add(2,2))
+        self.assertEqualC(add(-100, 5))
+
+    def test_reverse(self):
+        ls = [1, 2, 3]
+        reverse = reverse_list(ls)
+        self.assertEqualC(reverse)
+        # Although the title is set after the test potentially fails, it will *always* show correctly for the student.
+        self.title = f"Checking if reverse_list({ls}) = {reverse}"  # Programmatically set the title 
+
+    def ex_test_output_capture(self):
+        with self.capture() as out:
+            print("hello world 42")                     # Genereate some output (i.e. in a homework script)
+        self.assertEqual(out.numbers[0], 42)            # out.numbers is a list of all numbers generated
+        self.assertEqual(out.output, "hello world 42")  # you can also access the raw output.
+
+
+class Question2(UTestCase): 
+    @cache
+    def my_reversal(self, ls):
+        # The '@cache' decorator ensures the function is not run on the *students* computer
+        # Instead the code is run on the teachers computer and the result is passed on with the
+        # other pre-computed results -- i.e. this function will run regardless of how the student happens to have
+        # implemented reverse_list.
+        return reverse_list(ls)
+
+    def test_reverse_tricky(self):
+        ls = (2,4,8)
+        ls2 = self.my_reversal(tuple(ls))                   # This will always produce the right result, [8, 4, 2]
+        print("The correct answer is supposed to be", ls2)  # Show students the correct answer
+        self.assertEqualC(reverse_list(ls))                 # This will actually test the students code.
+        return "Buy world!"                                 # This value will be stored in the .token file  
+
+
+import cs102
+class Report2(Report):
+    title = "CS 101 Report 2"
+    questions = [(Week1, 10), (Week1Titles, 8)]
+    pack_imports = [cs102]
+
+if __name__ == "__main__":
+    evaluate_report_student(Report2(), unmute=True)
+---------------------------------------------------------------------- ..ooO0Ooo.. ----------------------------------------------------------------------
+b07038a0b034c106f5b09a9caf41338fec2b87d22a1ec09e7e928ebdd8b369fafc7af5a17147e8169155306549044a9353a5631917c44709182c615ce4659f6c 28048
+---------------------------------------------------------------------- ..ooO0Ooo.. ----------------------------------------------------------------------
+.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.
\ No newline at end of file
diff --git a/examples/example_framework/students/cs102/homework1.py b/examples/example_framework/students/cs102/homework1.py
index d5c70ba..5ca8046 100644
--- a/examples/example_framework/students/cs102/homework1.py
+++ b/examples/example_framework/students/cs102/homework1.py
@@ -1,18 +1,21 @@
-def reverse_list(mylist): 
+def reverse_list(mylist): #!f #!s;keeptags
     """
     Given a list 'mylist' returns a list consisting of the same elements in reverse order. E.g.
     reverse_list([1,2,3]) should return [3,2,1] (as a list).
     """
-    # TODO: 1 lines missing.
-    raise NotImplementedError("Implement function bod")
+    ls = []
+    for l in mylist:
+        ls = [l] + ls
+    return ls
+    # return list(reversed(mylist))
 
-def add(a,b): 
+def add(a,b): #!f
     """ Given two numbers `a` and `b` this function should simply return their sum:
     > add(a,b) = a+b """
-    # TODO: 1 lines missing.
-    raise NotImplementedError("Implement function bod")
+    sum2 = a + b
+    return sum2
 
 if __name__ == "__main__":
     # Example usage:
     print(f"Your result of 2 + 2 = {add(2,2)}")
-    print(f"Reversing a small list", reverse_list([2,3,5,7])) 
+    print(f"Reversing a small list", reverse_list([2,3,5,7])) #!s
diff --git a/examples/example_framework/students/cs102/report2.py b/examples/example_framework/students/cs102/report2.py
index 67c56d7..894b769 100644
--- a/examples/example_framework/students/cs102/report2.py
+++ b/examples/example_framework/students/cs102/report2.py
@@ -1,7 +1,7 @@
-from unitgrade.framework import Report, cache
+from unitgrade.framework import Report
 from unitgrade.evaluate import evaluate_report_student
 from cs102.homework1 import add, reverse_list
-from unitgrade import UTestCase 
+from unitgrade import UTestCase, cache  
 
 class Week1(UTestCase):
     def test_add(self):
diff --git a/examples/example_framework/students/cs102/report2_grade.py b/examples/example_framework/students/cs102/report2_grade.py
index 86b1486..13a61a6 100644
--- a/examples/example_framework/students/cs102/report2_grade.py
+++ b/examples/example_framework/students/cs102/report2_grade.py
@@ -1,3 +1,3 @@
-'''WARNING: Modifying, decompiling or otherwise tampering with this script, it's data or the resulting .token file will be investigated as a cheating attempt.'''
+''' WARNING: Modifying, decompiling or otherwise tampering with this script, it's data or the resulting .token file will be investigated as a cheating attempt. '''
 import bz2, base64
-exec(bz2.decompress(base64.b64decode('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')))
\ No newline at end of file
+exec(bz2.decompress(base64.b64decode('QlpoOTFBWSZTWfP3C/4ATe3/gH/25FZ7/////+//vv////5gXH73vV696+z3uYvtxRbvb33j7qgBQQgDID0DpVD73OOUZ73Cbc91tlNSE9A0LLS2A+i757j3Trpr72+2F9uA56dwFX1dY+5997nt72H3vrvrJV26+277rw0Djdven2GzvLBo1baporStVzs3fezz003vTsDmtd81VZUfd99996efd99x67e28t3vfe+UIJ97j7vdNYXd2577znszrEp9Nve3e2DFb2z68e8LHq3drRCU9u2dUnWFdzS2519Z3XD5en23WkIHuhXxfO533vlPrlOweOX3zfQ5fN9zvc3d9zzvd72dm29dC1jjt1vZ6wlNEENAgAmkyEwCaNTNE9IjE1PZKeoaMh6Q0aA0DaQNMgQhBDRBHommqeU/UQ9RhBkyGmg02oAeoGgAAAlMSIQTTVPVGmynpPyamobTUD9SaHqGQaGj1AA0ADT1GgaAk0kUEAmIGhJmk9AVN5I9JH+pT0NQemU0bSNPUGQYgGgAiSIEE0yaAJk00JgUyZGVP2o1E2k9TeqbSY9KfpTEyA9RkeoyCQkEIJoT1DIymmyTVHjVP0npR6mnqND1NpAPUDQNNAaAAc6J8x7mFCCBTET+w9pSQgfPBVU9okYgCgSBYHzioqKqKn9Hz/K5pKv/Kvf964HnR+pXu3o9y9Ej3+P6yxCsXD+72xify88EAxuCBGYZyxILEdfyZ2j+/orB8kEeMoY4iW54Vsry3WkGWhqiLM6oa21eZSW5Xpw3WOO7l3BuCtfz4D8Vlwx2SI66Qns+I37kzQXMEUeCMIczRZDkMnKXk5lc+UH+B8yU4/P/5tmgS/7c36d093lLvX+MzUwkT0P3ztGfPDASFHf1HLqGHMFgzIAf5Z5ZcTAEAEOoRX4MRZAkEkZFkIsikAQQk+JCxFkV/WkySKpb98Gk3EBUKSKgVUpFIQFdGjOWDsZpoSc2foew+h8b7OvBzDhOs5UFuiHsTqI+UlCgqggKssjYgip+hhQYisBSCwFUJlsI/9fH/zz7ug5c4fw1EsdD1xw/9vWqZXq7uh8ZPDWQKGHo8WuCWrwbJIHMUE7xxPFYGqWjYSBskWnpMFCYmJJSldTI8OmkV6qlIN/Boeu1e2Tzu2nHNWSGyNHS8sY7W6PzHIrBgPMcfwvq1Q+VKeM+7X/77c5px8X0EdPp4G+TPjAcWtP8YskV/vm0/35RPk23W2LyY+lHtT8fgjt7XX+Dt3osDfUhjHAwOR7IPhd1g+MJ6Vi6Xqrv9i7TwgRgLBSZNUQ6bP0wWmVuf+XjEJn9+eGtH0SYge/Tcd3MZc3BYPk8RrpPmsvPvmvvGDQIGhrs9RHi6BHnxLdewuRuhgI0h7sXIjZeoCIRZFPTedb9DfIj7PL5ZYiaGo93hP2O0wXq8OjHm+nXydjt/18vucH3BckhXRHISK5IeFISOGmt3HD0+bfTCSw7FhVfCYrw7xL2JvlF63rlLfYPwG66fasb9c8unUV4504B2P+npD7xMZHAJ8Nb9cP4XE048j9bearCxi1MB+PXSW6sNben5Fdctm+2RoYdZZKKuRTXnODKnKma7SNY6OT8U7+upMeuS9ySNqiOz9KYf0x6vERTchlenJnuM9uWBd4uBXGfRoWc2+G56dnbthYgjC1h35EHm9jNCogWdoKEGPAjR+B2dpJcpLJ5vgjvutS5NV7TsgmP3PBVNmsUKRdAcWfwH8vy8SDIxyQoaDZk8Y+SQoWCa2GM6KOAEm1FopRpXfhjFG2dqVnzxj3ZFDZMYm5NS+69gYvTwuA1zMxsRsrRlDSKReYmdGHEwGY0dkOMMmtkiRDXGmxnKPILDJCkgEcHqFu2g1bcuSVBlJzrSIOChAKM2R4lUlfqj9WvtLYqEIgaoD8Pfp+XZUIbzE3xDfq4+tRgbceHOwGjSeYrtd4TEfsd8m6jIWxewM7C0+bbrOKWe7XTZcL0thyxQQkLVCzuY/vvnJsDH2WCve16yQ5X/LzLDX/QPyUbBnYnE5XHHS22c31okcRMwioj5kGPq4MOMQZg55/qlLUTQ9HPW5fxbuoNzo5261paGgWhpCR+E7ZDV13Cw+M5bjR+jhGEoRNjAgvzzfGj1xqOXGhKN9sc/UsdttrwdDgi3LDSb/xuEukjWMF3ZwMIITaPNVVxHrwKazqjPBS4ETp8puiPO8GeTtM3udOTtpkEsznxfhuzvEXKgv6ttwvTgX0uHHKFH5/fjK067ebFqNvsO24r9DmwgluwI/tuMELa923LjAWfZaI47XpDj1/B/SV/34Swz1FUEV77McOJpPg1vhl/FQQr/SOeP2idIsXhmWZtYWnIJFCQ4QaOFZd5ucTfQXl0GhF2Biye6imyaN4gcMi5mbGeRSpPHKxLx3aGZoXlAkVCdukq3VIxYReXFxUmwayOhDSEXn8oa9CRICt90pPJ7jabijjsjYy3ZfMy0jMFSi3D37TPpPWDUJlYcfrIi2wfaOKVZ7Zadp2EhIV+NB8mLIvqVFxMc73XknW4wOVs8DQsZl6JJAYklu8tFcyrCoQxFchxxXe2SBer8U5MvC2Rl0fZqi7UFmsGUj3/TMMlprz3bnZIQo+InhoE3CDOAec4HWp2tcUKFHwsGE5yioSRPddp889uHjQsb17ImimLzaWjuxU4D7t56YK2NOpj0E1Hvcglj3k/zykUyu8jYkaTb5NeTPn5vvxzHMw7xfAzMpkk2Rd8zXZibZ0P1PSjrdB3+MZX08uBDlXaTdggI+0tLiR4QwTakDw31ri9RERESEPtOPsgT2eQCXXaxsxlFtvuu7u9+XF+Txg0WGnFpMeWZGR4IjDh/ZYfB8KdyLixqy3t2mbkXmWHv0KsSPCawwlN2wXcU/zQgI+b7mbKS+tPBvAfGUwReZJDs1aEyVAy7lc+zDuI1LqYrzkNsXqyoaXzNcsC1J6vfHcOUMRSL3tepatl9kJlIvoxfG+ON5gRpE5ZVO7k5f6uWzymPEMjHU3m0gxQNOPifK+me03l7XUd7OR7EUl9OZXDnyqly2BSheYy2SMWBsE7CcR6JSJSMCGRyacSFsk5MQhSQ3ajUwDE4lXOCb7EKG2YnfPYHdPTljj2fGN5gU22Az2cH6mrtImVTCnDTnoaGuHkiRZmE0jgFj8Ojt6j05oIfU2HBFkPaSkh2kBA4dJxslvHmI4E9mBW31HDIxxmUC8LLIcCdxcXEKW2UGSqKL8pYCIZSKbnKywLlI9YTtK/qeWrYrJr0nLouGMtPqCJdsUGxociCxaFmk44OsZydXTQWlttHufiGGLvcOYQE95iP37MLmNmZmVNQVVg1xhE5hmr40NTEuGrjSzYLAgVIyJzxPKTa4upfEtjjuItapSsGVLgqCYQxOYisxw24qCJmpwkFdxWCK6ZMSKpJmiRgsDOZeNdlzMoxJQ9H79D60Ei8cWWU575jaUdhUnphbGE7osKfU1KaboOikX4A9txpkZozzKEqKWjpKZN7gtYi+Q9eWWgaHgIvywMMpEgPpMZ5YTNNMMEknMKCcZUdxQI1nOVuVchFoRo/AQeiVngRCIdCL3ASQBS9ESe0KKNR9hpiuJS5aGcXo07r+2GIclURUVyBJqtzI0lL4iKmdEcTB5l0plLnol3UJk0bndi9OdpvdlPv25c+3U6YDdLxzfc2eeVKV0toRW+tibBILtYW7CQ7qUTyJv7sOqItt4SnNy8Nd8Yl+jio6Lx3UiMROE4iwVRhU+hzumD3htN8r8QXJud1DdXphParTepPA3FCIHHCrFZFSCuUSc26XPp1peD9ADGrI8Pg7AeGqO8Xzig5YBMoNJ0Z2adI1DG+cPprnZq1pSV2LyvqpDzMGNxU1yD9nNnKckbAd62HSDQwlBUJCSmUJQtVTaZl2EaesN4jauvSYq/VjAkShoW3KJbaQ/cIGghx5a0K5mzHSlmFejG+Z4DzQYZXKpJjyFTlhK8l88pbjr3cD1HurXyQh26XfrBvGcxj07R03Ck95+/IR6IsYXMY5i5hn6Jl1z3397OaCwneZt7JE+puKhiIQEBVuqFjXcKGwOOnnnn5oOpdkJgN3LnL9K1S8jN9vykV8dOjF27t5Ltd2+Ib2r8LvSevaOwIcxchQuYjvBH3IJib2uPRsGLj4v1b0U0tXaSa9dudByMGZOv2/kL7z0Gw7d8GCC92i0YrQbFp8LZzCkIBGNgO2+Q4mpArGZnj8r8K896dbTZ11yO9+h4HpGCD2HuEo+ZUDXUfbCziuP6kbnzbJWjnnyeOvXqOh0ajMF/vc3c5u/OYypzs7/YXnrvztj4zfS1XyX0sliuFM4L/KjzA4ONskO3ZECyDzBgzZyOcZcB173OAnjui7zvfYM9kiA5/r8bv04Y93T0X2VPfFrtuvt12XUnwt2xzWzOaZpO+D06NdfuTogIeO3BITJMxmzQU55b2X5FNErIKLVtDiWyGCIlR5VQbQP1fyUzX8ZkucTIPG4RWKijNYI+hDr0u4abtY37o+WO7TP1vfgrkcP7v6MzTzY4mTo6nIzrcZmXBwFjPOJUNOjK+csLE06JEyOW3UMP9PbBZP7nylxUJeNQrprp0zHH+Z/aJNJw3KYqox/Jx46F/o/b/q/18jg5Bso40WcP8gkIfal6BaQ7KR7pt4wIyy+qkY+oVUFxSVEUDMU0zLh9Yf6jBksiS0JJm8wcAf74Uxd8DuGfaPV82SGB17RkYfH8nb7nwVXbw8g7+/57YEHU0Ev0UIy0lK2/ExyyA35P3LfSanX+H080RVVVWHcwOjo5cyvTw4ConeMogqqqkN8bJOKHHjvEM7fNblDQs+tUUJ9kZK9CtcVtstsq2xiFWMCqlQqxkrBQr/+tMMzAFnVyPw6DMYg0iN5SaNgqkP3faslhFmK/KIuDFdpDTEHG8diFnjkOA2PS2C2o0F2pwNlVEMfenP0Y+OcvOJf+Lm/Kv23LDRCE882TV4jdKs9GiYyM6YYrC7bY7/hSK6ujhl5dVMwYh53Wxc5mnEildmu5QLFVED92FdpibdCraMGZQtZpNFGySbhLj1gWKH3mFguO8fGRe1D8Mbh5L8acVeZX5kCHAkya9JEr+f9IVNaD4NDsCXuOrfocjUehoLLukYvEYlcPaMAizaSlS5MicoZoWcIbkYSVJJUcN5WSspBUWZXQSQltGnSTahFYGKyFOOvqpxAw0s+ByI07GD0lJgblpiyCTZVpqqs5YtGQ2CHQSiBD5tc5+4gyKJE8KQV2P3E/VPHa115YEVY1NeZoXmV4rjIqR/lEZBZkebZC8cCdzhrcEiKEIpwW8182QliYM5EAejO/SJtywmzZj9DdxFRImI1OvBr8CtXfSIaSJcqwF9JqIZHM1TdyejmuPfrlQlfaC4hOXxQnKLSabbFnSmkrpNXYj4ki0alji3fz2BTO5x4w/S+V5FNpw4Fh8zisyVoHqTKZuSIOJBdwF0v2rB6PNpEIPWOJiOFciP4/hf7UjprDzspmHI4L9V3Qg/SnJ/KPt96B155858vfTg9x+N14wuRMQc+J5mjb71AkSUfjVSNyibr/W/owlfj84ye84R3SdMLkTLH6h7iES/HWOczZun4Cv+p8+M8bGCp2tfDzMDkQ5BwncCtrKXdcxy3dItn3XmyxnnxTuleh0xNZi+oWiUbOp4SwJ+K/rVpWft7+LD0lky611aJ9XIeWBIqcIuufF4O5/JxfEz3c9TyPr6ZG5jRwMO7SYXLiFC/LIvIhu6IgZ7kuXH4B3d2M56LqNecjuAfmMWJI14IkCAmTICBPzXE00bGYh3liuu3fmXR1DXUeUgMOkzV2q6IjbXw04MCCUTwR7LJ9+YHvK8UevR87y4GhtjUNG3qUjhTOpwZK4+W4B2ngzyWIbRfbALsMxAdiEyDxEYlg/UhQQSEEHfAxE7yFk5ESe2V0p3q4dvRE13Vjkm457uN/N2vW3AIDjI9Affhtfv+U41XhA6+W7oh+myWZWswLk/G6J+RXXX0U5KQjyqH4Bkxzxc4Z5p4wH5epTNIIZwh4ShJop/p9nE4rutCnO+EjtnhHKxxXqXpW/baEjW8saEOTecqO8co3d14cDc5fb0OXjMOvihUtiZW89euZye8x5qfBLfO8QK36RDn5e5/YZnW66TvvY3Xve8mB7QcTCfvl8x4uPUXNd655LpEOCj8+yPo2p9iudbVXmoBq3lBQhQXlQjZbgioKx4LWtVYKd5dUl19E6n1Yzws47bSoYX8zBFyBSv3yHuRJd7yJO6QkEsOXSCh6NqrTYOrjAG1RboKBeGLqMMDCwGG227AtKBGjSyMG1gYGjCDEdlX7bb/XmsN+qpEBXWfHT28wMAaOiR/DEawmJCdAYcWZ2bhZ3otOPrX3VAes+2A/xdgrBoIJCeaB3kZIb3EebVQXrTJYcFfB/sjQ79p0P7s+m7X/4nW0u6t6EST7sw3pbe/Yq1lyp64JTcuZtbeaRE9as0qSfqFLgnnb1dK0+jF8SvBh8XCHW6F8uw+HTEXxBd2OwgNJn4desz4pEZpCOPjwhY3W7+kNHgXYWmvYV1VawOI79tnrMQ84Ol+PaRt0cvVPB/XdPDG2M6pe8em8sZ5zz41NoIwxoQxnKZkEs8oed7zJbL2lSyp0scLTSzn73wGFd12aCbEnnpa4xW2zktYIakohyNUKlZkEmQOmTMYGFS6QjlzuzXXuqWuH4xxMZFxKXfGcjShpMwvcfZvMJ3XeHNTzldzutbOf2HgjERV/P5dlrGLdzubfGvNm9/XLTnfht3EXl2hIo5PEu7SaSCQ/CPKuNzBnjVp1sQFjpdeSE/ko0m4cl4WkXo1q4YIaEanu3Z8xM8Obf5tHYcOqz3b/WHriP93IvstsIQH6afgI4T8whCTYnEmfLEk3FObb/Ycy4DnWoVR3zG1ICojDA6fFYKSjuxIJjiS9eMSR+Z84MayIko+6CIPem5tbGLJ4EPIZ2XjhlswKHuE0kxiXms6yX4nke30kqij6PoDWcdYbSIESciN6dwdHUBwYJB5P5eDv6KHlaQnueDCkvRb1YeWUZv365D7qqCfBoKKqMlOZxR+BPq5wvwNP0eDDRrRZvg708Wc5cMUxqNyyVz7So0hXa3A1dopqllqZwKGGLDLNJGpDFFOBR7ORyMgDcOR7wjRiOSB0XX4BofAcNkAJEebWX1azDFKKSjHYXPx9HjuM9ikdQeSbii5ReJQwojIGwr1MJxOt5D6sHXqzhoJglQ+ycxMbuopkIX0XBW+4mNu0aw2Z6m3IaaBHkXyOl7LGIcjpF6BlDpQfJkpgdAUCTSQTSQISDwKnMOdKAJs2sFgGIYMsKJAhQWM2FNCTHp+ougm4FTW8cvSk1GI/pOkLaIxfQOammJG3jdzti6jSHgMM4m0fJCq5w2KLkSk5x3WgshUBicS+IXV2YdcOptmJ1GdZ6zTS+3ZEkcKG5zXLMI8dqsKNUKCfs1Dy8XlME924c2YNSgEhywmEI2ePuyN3cGhtLHwYuD9B0zBQDg9CQeZKUHvv3hb9IT0DAvguT/IfVY+OezB/E7/fO6IwzX6UTHFmtAZYxkAj3X6dMpYk94fnucIAegNqCCRaR9lJs7CVYFUVKUPWzt/cdFohoVNLEVuNWBvZBDg8V2bXiWAKOyJowwPDwTzToZPzjuw41/zHq7H6RAUNxjqII8vz3nmH/Dwvo6Z9m3T66mnsGcL4pMqK5icWT9zj6ODDQcjdw+7HoOw9JYEGKiiqfxuY2vmOr14aFERQRAZCcHBNvQION8gntM5Y723ilJlicCsIwEOJKBg2GO4vN4ahb/9nPzs9UOTvdzDwB/VHq+cXUE1FsE3RRZD4uZY4ZR3M8w5X+bp1IJAbhEB52c9PY3DmheR56FDzU9peXQXFhOXCMTGYUOZQ4BkOifqoUWItfaBqaMDg1iHaJSQ8aC6S1FRdgvLqDSdPIxJCBw2c/f4Wh3CidBtRDX6Q6Y7Byc3+QKBcd6SWK9odLi1rsV2B3Q7RcTd3Xb3tQ8JJQrGDi7fy0jJU2BQwNSinCxrNTT1qWFscBIEnKAgTmQStaEPlXTEmYKfURFmQQRVxHoudsTWKyDWVWqUIK7zkRcYwIrWVRClU+MzMZygDdP6YyaQV7XjEkCECxTZJ1b5lCgILBIgzLjBMs+2LgNmwmeGWUdJVWTmMYNnEU61MXNlxLzLwnhpzFXEVbyevj5IhLwA6jkLYcMM0PBAeqYEyG+ANhQ7AqKMViKezhmRGC6gYJtQ1pVRRgsRnZk1o1e5IgwaVWUTDrkKx0aSkIgUCxpe06CdJzNg3nIw2aOIe/jzO8eyb6uglFVRVFERRV4HLnhoYiCrBTYgkROy2MkXTucJOEhpE4Ytkp5KCekGFkTwHLxuXKhQqEQhphU4FkgyNHVGxUyG5Vxvr0ULzcQm5h2E7ze2fIxBCRioQ4nVeINs8Ii8xEw+85eVTkEkQeUJsLFRBuTb4kL1C0QCUzZ4GGEYt98PzUk1tNp4gSYYORoXvgPzA4jD4QztltgUNbxR3OzzSsOMGRkO0gi8CmFZjlYBZLMYZoO+htAhjc24gyorW0CgRbAhrDxKO1wTAnK45bDQci7x+TG37e7xDNZAJDEgxT/jtWDuURJtByMrhgFiUmbHbAoXQ2pdqUMr6knkaXG+BABQhi1CAMB4kZGmdsuHEvXg2hmfHvFT3ldcS/JsHQmazZkx2HXR5QK1QVhRVBImEHdDI2zi+V0Wvi5UHZjNLfYbiHE4GqzfnwqzYFXsUkXG4EOaYJCSRmX3wUD8kB1O3H07F/s2A3NsTYjH3iRiW8S9PlEQp8YiUa9pM7p500qM8AfBxXOUnPmXXpToe4rYKecdnp3hnRbHAAh6ALJM3lt9WSNJEb7xWEXWq3UxervQL2EVkTAhAmYMAtsVDb5w2/1/e7fF/8nztHL6Xb+/D+aPqtjOsP+h7yvzUMW9aIwkSo6+mZCSAMBz3ohug4vnDH7D9/p85qYfbL91GtjL9ooE3G17G6+BeiSq7LV/iH/sMvgPtImKQ8DPmROmMOhhwGexPU9aeNu9GZPYyTTMQYvs5pnsdYmnAePfhDmJpnnYFVjOb6XGKc9ZPdc9PGOCFjoyy+RIhG3DqlZFRhGVxI6QrTaPALtsYmBycBwXgFGUERuNfM8z7XuIz3qZ6U8ZzX5Uu3/TSi1nKJXJiUOKcRuJG7p+5BZG2d61P2fwfUiSC/nZWRYFV/QWk/2uh0whoDVkFgSVhNIBWChBYONkAKkyDaIqUSrVKuWQC/abtYd/tkbkd304549OWiHa/GCXG4Znta9pCYmY7Ote+9XW2VtM2QasMY/E+4jedPFPcIHDnOtThMK7MMlu6xnAryZWYHr679BImDKmQsTBCsYIMPHe74qXLlPTbcI4LCt7xg1hMYUo5Ni1MQnLgj8TXOC7hYzO74ULTV6jlgTbZdqtLtaRPtfpdO162d+YcGLOhnNLiLkoz/owMW5zuNbi+toJLYWOtJKfd7yLt1B6Oxm5Y8Uzz5c6mc8INhD7rEbNCea1Ho2Umor4wU3aSI8G7ITD74yH85zGmmMr1NNm2u3qWiHgwWvt73rv8v1BNelfatn/H/I+P8P2H1YjocgUajAuWI3PhY3gdcqZ+3A2fecdmv5cpxTzSEQy/cp5wWZZJd00r8P4DTkn0eXuJ12qqgSSSbENfMGb4tBQ0N6yx/yR/ae/m4fNJbf5WqHf+GWgBo45ooIqCLEAJwPHaKAVV6R8k6iMYz3VYetXE297wZ70ZZn8QgHCB0IoUdByDkW7kmatBMd478oByayUfv/zD0VY/rxPAzKXQ3h3n4lnDAWjQSHAoo71xm/tA3hgA9okgEikEXUQ7tYLsGD7TaeP6xzn76d5+ow3hmNq0HkhJhzm/q4idzw2+fYaxOnQFhizmMOb5IzBiPhmdQgkOyZ5/H194cnNuNDuge+dQSBDeHcxOHpouZpK8PJaxmeBBjSt+1fc3+JiISSmphHAudMhQzEzJvcGSBuyaY4a4sILX3FixvPTJNjcuSSD4kJZD9nulmD7HLVVVmbCnaE+UwwnV4BAQxckjA+BKOxU+VSR7rjiuf4js4oQQv2GTp1UnXzDu93ibFKE8e7XBa+mhOqmStTDVTU5LNaaA7OKEEC7U1BDGQhH5z1EPN57aoSRLGAt5wJg3Qm0J++PJlMlUSuwsn9nxw/f4/IfwBCd10LrRxpBFro3Hqb1xk0E753IvhQ4T1Dolzf2T+Hv/fyBuOPkyyvHXCnJMi5xO7HDUl444z8tgtu51yzsE7DKcr8nbJPiDIi/G0RggcJSwYeOyoOTC2HCQh1R9P5CwoANwP3e19p5oNb0l8VdbifZCtsni56w1H4PW1vXA6z2MxaSQhsFZoCPs1hE0GbQOHpmHo/QyZds9ns34yfbIuMAHSz76qsTFHvhVKCRVCDQ6evAmJwM469VxKsGwVgyURJ/DMcQetFbxRJA3IohSutU59ysuDtfKYHBpwUZEbnVBVWoYOCeoKEys2pBIySSRqhDqHkwec8q3D5bv8M5JnvTmhqoxFRbLihCFpYSCGjk2nmHizwzTWMT2Q5/FT0RGirh3IGwSkIKB4PXddbmOORds/Is4QWxra04WVQKDvZAflLOWJBakgePF+XKe/dCQW22qH4X4eQtwSVKRox2TDlmGflw4dop9rl2dAoaT4I4BClHxmnG8qNOj+JPciQHVFPcU8rTkunXKUZVmSPIGADwFh2Rgt+cdZVUhk5TsXVHvIePTzi3+D0OyRJJIPxrs69BQL4teulK9XDNB06LjDaT3J1pw1ZNsKin7KeZmLB9bef5ryTXqpfu67jxpWC/NZU6Gz0bzFfXTM1n0MMUQ4MilijEQT13zGOZm+9nkpe/aJG/EgqSEqS7zhKdsOHo3EipE3OmFNmnHhVm+We7q0uFt046Rtp8IDDvOr8cFAUR69nBONFFLBFTkcH/mO+k9sipM70NeL02TzYl18sN/D5Txym1yfe7HbV9qGoyqRHhvkwGks/kmCIcg2vo7ZcTqrmQS0EcHn5qCieq/p2vPLTvljCchDT6V0O3Fz6CFlrf6EYJWfdo+yb6rbutAXION/aJWUsKVp6NIZoTXZOF8nZJmpHCHPHqtXqmvmKe6J5ovqiJ5o499U357bpx9222J7Pi6lz92XE7qcIfPK+a96W9dvHQy4ATHb5/n4+Xv7GbuMQMd1z8Qzmtmyh6/SmHzfj97+91k2Zw7xtv9O56xzpz7MDpVBSK5Kb5nF3GANpAh3cJkECLfcbS0umF80S3I/T9KGuiH1+w686fjSEkX28f6J7tXfh6e1U/L2ctKbVZOpbJcs88GDmdj4P7kNI9xtHG5CYCRlQNT/n+NNoiGFGjZA3t4T31K99tEfZApLzWsWAODdqxjarkbQcI+QCambofnhU/LqggMIYxGS8H3vE6J0kPgfSJNAgEDRfWF0hdmQLi5Fj8OQuw4a7Drc0YYi6YsEWJQXpEIwdKJQPlVHabB5AA5VgdO4LIKPWToD5Q+JOzrh5zYZkPQYsZAki6QHYFLUJF0PgcMA2CeI6Bwvo8QIMg0fdfcONGnAsZF5dNYfHQT2j8HkI7h5TZDUmxNnVvPYEMaNYmvpJDRhTTLG4d45OAuwhAiu42u3m+JJiFUyEIzENfNQRSOaMTYF9UkhIdZAuuvXQ6ymkLjANARBdrGHmD0Fw2Ds2WRc3GeUFgBjApIWZqGwdBynOGBiRQ4g/PBCgM1nkJA0HZlz3GuYKerjzmbiNt/IJTYnKOAZkGF1xgGIWGFwkGNlp7goH67gnj4e9ay18ZoF0WIKLB1OYiIntA5wKVxA3u8sc6cdpwhe594UFw3m2jSy0oh1mqQPU5NBfnLFDYjERn8/vNe995cnzFz3xaI3s2bHY7kKPzohxYg6m0wNi/hIaHaJ/FAFhFV5izdRYeP++QozX3r+L58Pp5nwP5PpoNzDKBYopFGCCgHkGPeR5iQAmwBwVxJEhAiwscDmgew4AxgiHotakVVgUQEBjLSsP58QxNzEkCEQ/qaUmZ2FwhUgpSoVBzA1Fs8AaXD0kh1fvsQiHzFJCJyE0wi9AekIES9pj5G+UGr7RJ99vZ5iILJlyYnTWo11UZsSLiUdRxUSwcqIR/t3pXcUPQ86aAbg++i5EaIEgJCMYAFFBQUuWSbQKfPcsQ3gdeAj9JAhJEDmEzcGdgwyuqhrXo0FoNgaBim8iWiJ3ICVZrldFOoNaloC6yHgdYRtkPoXbssfQQQT2ncHuPUrASHuS7k4MVYwfSJwAJ2bJ/Slu1L7w3CH4BBTlSARAIkTVjAcDLZB60gDJvTqAfbZ+OW1OpGgnXKYhEsEnECTs9YAjBRGBEQgMAz6YSfhrrnDarRJPoJZvdc02RE2tgmsUYj0TuPkwSwkGa8pzIangdtoDWTxXqCgyGZVYoXDVA0I045GYHE7ZIKsg/1eKkWQ7NG929ugoqBSF07xIJgDJk7gEwPQGYZ/d1LK8uHSGlVS7T+UNonsi+i8gSk3Aw4cTDw7CqiX1t+kaj/S7A6+8VFsqNzXj9YB+z7QX2ZHQJGTGlhtjkP78TZS8Z31TOkvyIdz3OtT6ieiMdDZWNCgH9uBeD5/z011oVEO8roOtKB/Qkzi8xdAo2kOX4z+HHBTWP5BshpIMSSQTZRQyDADD5a+pXYH98xTFRNYTC+gUgJOxINR0Jvh7PWXIrl54nBUmUFVfLeiX+9oH7Aw/rAPA9YQhENHsHR7IRcMfKzr4vlIHIsOr10HUmueqkp0fA6aFGnVMEiAq7Q0g6pDTAfdCNiICcksSBFAw1YdEjGPmjbfmKSHAL+v2z7GBr/3Ups9XpGAa9JBhTO+MIDB74gp4+tILWS5JCRU4gckU4He7GGvN4XDQEAn5aPP77mYSTWc4aVkxiKyhWj91U+zgv7YGcE2HTzi0khwYOwZnE+hwoG9lhyTAe71BI3W99hjYxC9ELl2kWgvJr2i2DWd1YiQwoKzLFHUH5HAZwMBwT85kLRFxH32ohAZjBPWwwJB6EiAcg/5DFMPCH5f85uQm3uIUhsK0galHW+kLHxpW30yEPGEGQhIJAJIwPEpXqaFsjb0MtclDDED1aG006lLrm8ASTOmtm04EokEFqKYSHdKSgkkgdCcxLwgzCVhiErdZy6qpFaxYMEDWscglDX0amTdm2uAyGetNvEI8WRl/VDIJSlYNgmNCI8O84ppaS3E2wuRJ2Z2htol+JKmOlMImtvVFNsEJNhkTP9xgFv5n8p9An+BRGRkTB1rjQkopCx5TpoxoFyZDAYdCvUgbANnAkwZChYyfXDIeHsPkZ9vzZ6jR8IqFhbWKt9pk/IM6ZNAkh2PcfdlRmYlyNASFZhLZQMgLYZaRNh1HxEoisPe68yujrh+xJNoB5vvcxEzIraW5cUczJjiMtra2ittRthG2fLqfH7y+nuOLOoaGrtMyPETAeaNwauek4c4Nj/GNeD/6FQmUia1YP1eSG/OCCy7wwfQd3QJYZIggbsH2DYm9t/AhUNY/fuofaQDrmsJ0qWt20PbsU16z5Bf9j59pgY9X8FAd4O4kAggQyOPOCojyMwCzXEm6dvqFR7goLRZSh4advkYGCfxCePATBezDVC8gkx5/d2O7pGyXSPs2TeP+irclOjEry2gEpciwqPbd2SqVFxF09R4NW4bLGZEhDUqRVPBFEOcEEs9qCSAQRplgX2ziTbGwto0AJv4FDh0Mi20KQ2BEj27X7Vn9XI1guWNztS2BfgWoFij32ChfFWCYSTQTvhvyR9p1G/JhnPMTwDAF8ZX2eBmhgZtwKKBJyVF3cmFsypmi/cXvdkZmTObMKXiFULiG2ZjjE1dNim6EOTXKYGMBCS2sqSOhFAZGNWrkSCHVGnkOSkavUygkYhS9XyHpu2U1tasBIbIubcSr2UFuitmbvfUDY4fk72zLqHQx875xOnTGwpZwdkPQ2wVvM4UHmQwIS3Cg9pqjPNluSrzDpq9hF1vemuhDKYYJmy6Ho7NKQWQInmMb6iozhjQgF51AaA4gSWl3mBmtxQuVWkIWh0CYPeqWu2cY6axsGKcaUE6btxSmLwcCSVWnm8DXsnDQNQ93buQLNHQshCJEu59e6aDJBpMWJXI6g41w5AMCjNKApLuLLhpKzM5AFISBq3oBCRpVkiHlwoQNFJXHiS+uaKcPuHxTduPPF69CJZ8bXDqK0iUAhPMnZOossbZk5gToA+wwJsVBTZtAoOgQ2BswwjFc7hkv0n0rQHWDRmkP9ZVHpE8eHLcOwnU1tayj3OYk87jMR2nhhlQ0USEg5qkN4d6ZUtBg0RaI4869N9S9EavbySlBIAiHXg6gIoojBElmsEFpacxvRm5sYjhZtwVxmDibJF6yZ7IxiUqwSRMUgoII9bbXx0xeXxMZTRxiRAaMk85g6qUkK0s3FcXguNpUDD2KInBGcyPEiHOAW+qMFwSxDBIRZEuG1xSBrCwGCmyJRtcRwFuMFhIIbgpjymK5jExDEEoGziUkDQUHBBRsbCwFi+RKxniFy1SCPxMgSZncCaZi6f8RZWY/GZRiCo/wFwDZcYsUk7IQ/prBBRIIigxLNfz8gZQGNAbiVWocVRltGolfiE8XM4Ja0wM4q+zLL2NQywlpBjGNTW5QFrwFBZUIHNwFcasYK59sGtxkNkv7C4V9KZ7Aov3eQ2OlnccECSyXWRYpB2LkQDkDMNZGI+np+2kPPhrFAT5zLJ5+U1dYbSCH7Qg7AyUP6Yp7zYRuR+jzzseRpBOsldq53Re4YGcEolXWys0z2XmFiYNKJKjJJRAYBUJL4kzPefIxAMoT7OA/VKlcKMMg9Sf0Ot2qHghi5kbu75MW3mpMXZwCBoE41gudiAVYPAKXbsqtGpCpDkHj6IhHfjpeGPpZCLBBhBkFMNqhga30BgPeZ9us+zyw58e7fYnRzjkmC8EfKeOyzGSoKhm8O9FBm1GTuuLg7GaHDPoQAs11qBqOhl6QvOui3aSUQ4BYi7AXqOkNEwJG6uCWMjNhibMSwDx1gydWGfvfmN57hiiFincdfV3YLFObKTpjAYjDGgqwMs92zjRT2yl7caypQuunJD0UFCRbWgyYn1I09tguMxg3PTZbZDvTu1E49hZjRtlkUXBZlzYkZd5nWy8Ixkqsmo6KyYwGaodiijpXT2mTiXDUQ2TgmhRctq+NTo+n7SIMZy4gUYBzQNpxssikRFgBkNA3X4wO0aaRSKxYLJAYpETo83ptcnICumoGy3Ytk8UIkJEYAGufen6y0X5rQUEGHhG7GyOmQzERKJygkCyw37xPyEkIpEdgFzLor9vdcTkBXdAI4BewHu85xgwh7I8MFad9FhPwjuQu7yOIadJ+v/rfEfWZNjtD1EgSEfTIWKGq6RTuVZgWShOoT/OCB7jm7uyV4fMeR9El9DOUkmaCxBjSwRitKVhUsEKkLCGWmM6jTcYQ0DBFGQlUSFECllkVEEVYwIgiKokWW1JQv/EQomDIjKljCnt39hvM8dSqo/wDf3B5T3aO0gCaVoBjAngIKhtYomowMQsIPhRPtPl+l/WWhUoZUofuxAMjVwLO6fxw3k8PpqQPNIs6A6PO6xekOwQIBA5/OON0ZvgGB9lh/dh9vxPb2RUGJiNqraB5OzxEE/S4Xv7EyDnhnKFpbxYsWS8YGYlETpEwzeAxWcWG19ZoAw2CJEYzm04mprUKKMH++aJs0IoxggvrNk1OPZdsfEjzZye8Yiv5k/N+nRl89W7p/L+ThRhlP8/MvREiK5IypAmYuSZsw5Ji8/lzFv4PjcM5nSCOZ7hw3JpLc34ptpulKTslQ/aXBtHLhjOmtbE/2fWeJ4bUiRqivZC1qU2kSmxUkxCZIxASHYM32BQCg7NyhSwoXFqpAKHk466YdMkDfHNHIIJGKjrLPgaDSboF3fIyclrQjGy1RFOfuxLmp6GvMcXxIZtGDddBMbCM4YBxwbg3XdKFzEEeAEDdbkCgR2mhsgQICyKkIELYQvnh7vDmZzcyfMw1oMwqAXvtGQyIRfGDUFkIM2xtYWd42YMkQpeycA1DUCZt5Mwxx9LoUXLKQEwRZT8OQf4WBdQoHMg/lSsCsKqVi0iUxSQJCoURSEKRWMUHPMwzG5+NfGH3G8DAGBahuDSCVqcdTgIHw8TuFlV3LYr2YkXMRz6PRlpw6+qRq1Gf/TVww5JCBJAkUZeo13m0Bkga0ndgENSKfxKIxWgAFZYdhhDuHZbBR4tH8C4EJCDh5yWCHnC5+rv0AqfSh/fCtYkijDbMSJ9Bw7v0ufziuX0gSJEiB3dXDsVJzfDUcqRvt4IfQdIce5Z4+m+Z3md9GD40ccTitLuLIWWhj7e2OYQSuoQUXVRBJPutimeIdnH59SBFmHYUTHLwVcLXe+WaRXd5uM1oHdMQLSlSmryeWqmnbBc6K5dOzZYbH1BPxiHYcq/QNh9dy4+9eoc306BqfieME7QPnjqACEAPGD/xIKLrCCnL3rpiGgtRWICPw+Pv8CAdLfznsRBfAsNtkPTIWHYohO2ijHK2xLZbSpZ81KZYsUUtu4TEkP0l60CHvYAKKCwD8iHoE0z5D96WiJIGbRIyIPv852BMSAdmIB2D8+oLEorhz3v5RKO9A2qhER+Jh14Hkd0eljy+az9Jh27U335rxShkF7FWTjNFANAD+VYScCWb8w4kFMdZgFlhjS4b+HOjusMXiw3yoOgQNzl2pERwskgLIThaUtC2klt/cLmaFGfrLSaRHMngJCjDrPXIcDvi8qC2M8/WXh1xAWQRkQSCqoEUFJIkSDBCQQ47OJBT+dP9CDQweKc5ZR6FX16iJQvcqbAXgJCRPy0FLARYKxRUQ+iHl5AewpoO4npAs90PMRfQQ3daFgd2JtlEYRMRuR5o2vYpgXIhvOAMDKj+gT1+OZyj+iEy0Q4Ih9hFNLZZ6o7MwB95tYPfoeQzwbNhjAHKuD3gGOtCwdpljCEAPp+PHbR65Ei84L6Avq316yxZhJB5TDAu/OGIngagzVHvt9hATMKxQxkIGzXt7D8DA+zrqRVEVEvSaQ7Q5Zn1nWBma5vZZwyA/sBnmzRru2i3SbzED78/jTOkzBqylQ+lPeOosyj85lJqhkGZaD2FhYhN8FLsBuxDFiyulonyMKEhKD9JFcSkX2D1wgua8UvfpG/nQj8yhIm9rjc7NiECfVzOUmM0oGhBwG1zxLrT4nmP5muX48gOIHKyGzwy1niMQfAHDnjsej5dSsIEIkCQIMBAAgQc+ZT/HpLy+T7af9UE5RDamIGwzYaMiPIPLh504prUh4fU38TjbsNUU1WJUpVZaVahhrWSCvHeII/UNgalL6coKNsKJHCpbWIowqsJVSsUbQrVm2g8AoMmpTYixLrJFSiUK0sGpUtOOzeqITYAgaJECbUKP7sQ5DY+z16YYHZEfTOyK/yXp6ggchGBym6t0WEKkiFe7eDwHjyDiUKAnvUtQ6n5iOZQQIFQfP+ju+cORDPmAxkxpcwkIzv5hRxOmEOv8cWIO05uIoskzKQOBSSlaIvWF9f3ZlodbYCiBTqKCzd5Z4vnDSKhRvDu4mA0zUJmoeDYTNLbAA2DgZ93Je58N+uhTPIcODIWjWIk3m5T67gQeeAhtWCBAGKfNydyoRYGmX42BcRDWoJmC9mbaxjAW5eY1HZdc3HJuSESEHZTnnwW4QWNuj5dbn3rbvvgnVvAE21eijPcVoEOJmIY5rotJCpGxyey2Ix8jX65uNaOWWbrqZ44KPLRAkC7qdv1qkbUQ0/cQF7dwYtKAJAeC4+hxvATsh6IB3+oM6hEeoSxErFpQSkVEgiUQWJSChVQikRiEFqLLBStBJInDrMlmdxyAPaRCnaRpgNIYsGjEfVobyWpBR5vaHWW5xXrRZIytlFcVJwebttmy8dA4dyaGuAGs2GQaodp1FO+HdVGwvXV0PDbQ9J0EBuG5wS1DFA++IqUOBdpRpOBkWjOQPfsfXt5Z0UlGJCmCcZeTaUWFeitluvZpyFfigirDgaqC+kQVyitb4rY3XyUwYMGxECTqWiIMVLguAghWVPqSm+G4aD4JvzpKcgdwZZRJGw45JmrriG5swTQWgybQ3TMDQUpBAQRUjDWrgrqlGujeuBjF1cRkui0EukzgYLHbdJqnQEt0FFwyMBvPMeVDUiiklYSqoxWCAIQIktSxUh1clNUNLe7HcN5zOQVWb8dCUPc8VioNbJogxNowXhCqpAnDWs855RJYNTpDvKoJHnhfJgZ0lICLJNpDoYHUhpOlgTTAkLfvL7zW4KI4i1EoDFcEREAhBsGGkK123+knb3HIOIybPAQEUU/wbN6Ob3oAignlhQ81bUeRTmTfWnSJLI2AOosFssUxkFnEsgXdCGTDCcYgIlYzJLIiGiGEaGqHCBKSU2WA6wpKGUiwBEWLAUFkUFIsQYEFFknCxQjENQtwKBT0NwOYgWMV1VI6ARBLQBDRc6QIS+Pb30EZZENYcyQx/PtCv+xEdxRJAHWoVu59nVyn+BDuHdqJBWTgwCMGazpi9nZxPIlidULFtQWoIi9IwRJIJ6KHrQ7/A+/iHHazAGFYbfFnmIejwPXE83hoohkKxSGzCZjQlEk8sT90xQLg0SDFUIBCARUkEISCwRCFsChsoVYgxaSwpQrGTIno1ozjrWMUS2sERBEBiIIYm5norLgnELYOPUJ6QxVmLmQeo3OvebZHcxvK7aT5EYQynCen+MlGBIEcoHiGvV1GkH4Y3crKJNmTByZLG5ZwDW+BuQI/XGmkmAvODFmTZbpeC7C5S5jkeJeQH6JR81KGRfRoLBq3dMYQOQcKULAfnA4wUv0iB84WQzKQchwADgaDzGKI/uBfT9R1AI7FJGIiMYxkDn1FMPJDs/ut92zpkDRqhjQXCCe7NwLIPygIeYC4QJAIMWITpoUECyqsIFBEQArDv8SyXE0ChHFU/rRygmWTQqFWpS66W90MhS7uIOsi7bPvJ1HNc2HQZGwAuKdexcxCsNG9z3gGiZlE6A8aUMjC/psCsKCQOKGJDQyME1aVDWlAXaQozaEGw66WgkGhgnoa/HnVUbOmTcFJKyiaOuHwAN7nAEKGw6zirAUJ5AEnYRFXqWAjfZEhyHpnr/Cjxlz0FFQqWiFEtGRkqDxfBdRAIiGm454g/jBe8iBYiARGdabvYhFwLhAz1lsT7BZweqHP0yECDyYqPQIPSD4Br6j+T3bZFLwkOk+kuf5nBwTQMqyRyAPifbT8SiGjKe7iSj83IIb0i+qJILXE6ToWRPvoSgV8FAtfWSdMypKpL4fVI+s8qIOoMR8nahdCmIQNj0SsN0bCpFGAstQGwMrVpWKCtTUDOjZYgYBQwLAg9KoPN2jA86OY15gYUBBCVPPd9wMDadQEA9ZiWIBmkftXq7tHY92hO9tjq9eGvX5WdcTJazRgAYxIcEYwQjXSa1KkOpkDKB731ngC8wwGufEX9YtXOlXssiZKSESy9Y6ck938e4s9EkwTQH9QSht+IWC2ht3XF1eWMJuHArIzF+E1fATR1nQhwIlz4oRZI4YwfYxu4HToUMwNttZIIMAQYQQQBSKDAkiKsUjIDJDM5j3ck7MP3Tt05e1P0Zg4o1wY/xdnPFDrJIQrbRbhfF5ycow5N1BdTzU3iaZ82W6zBR8v1Zis/7pVVF1x+64Gl3xRDsPpdBwZIFkWXa1OWQon52WpKi0Mm4WJrg2ubemTzmrFBnYJEkshL/S+XcffDwbDxQiZhVAQGiJZXHFxa9laAQQuo6lgZ0gY9Qw7phAG4fk7sPMYJUw9Aw9lUznhBENA3+tDxXmhZ6uYVvKWP2ghFi96QzsvMGAci1eLUyZjoe5nkEe5icYdOhyPoH65DE2g8qXiUFhZ4wDiTdTY2jYafHiVO4qYwOZKeJ5esFhosfutD7XS+4uymyuaIIWj+MpcpFBiRENmZkgIljdDZJSQSVhWqiMUQZidMwAvoGhwoZImZkgVxCtQ3kDM4u9Sui0isWpcLMuYrLt4ojtxMtXQigYgpCYmDFgMF1KtmUECxusCMVNAe5Sl1vMo0eAhU1yJYRPiMRPmA+IkmgXjqOXr42vrdwmdzMj9aBQ4BJCMiDJEUTDth2HcaknmIEwOAILbl+subjN5Zd20Cn1y3lsd60FcyQpA/D0AeyzaYfWcTizGtj6D3X7G6JDZrND1ETqby8NhJm6ivXf7bUkh6oSCdVvDiFerz0HKdTzFUGN9O+UD2Nk6JCiAwOaK5cByllGiboXpoOMGhFr5VKjUEHh7sxQnqhdNbdo+s3J6W9UiT18Tyog+hDqN9iFLQoIdAmor07ijLXXLB+uFPdDk7EdAioQrBNkZDVy08UNIUaydfdY6a/P+7dGmiUtKNi/XmP9rpytFbJwHMtZ53PUb7AOw2nVOUL7dnidp4hQdyinqCFy6/bTpjdC0wqg7JIkIrTAHMUQvQL5KPzA/sYTsPvyDUp7AImsmyKbAYFioIBJPFTaln5zPKGkBjEQ9gJ+lhydmJ1x6ZOrrLWmh8yAfZu9AdhvvkDUPAO8yffBFWAI3KIwWOq+OZECrcMkKW2BRBJGTQRoSMIdG5IbIamrCsKMIsCJEKggJAEZBFQGg0FJIRRYslCFiWUZUBlARCgDBESRiRhTyPIkQIpDrJOoEH3Sps+TOXI0VQ5YowphSHRRD39peeF1WCTJD5/K7G2mtHyPL9dXBkcjSxz9iPdv2342NDt1vwnHdGjfSEcGG1GjD+HmJESOjG+SwurfbBXl3ZRxIXF22MYla4tmFN3hhGf1CJLOEXyRjImTjtW9hrhUY2L9ZAwrGlymbEhccYJRsNiWCi22wWVwuDzvIowNXYxJoPNX0h2u+Z4O+SHCEMM22Xm7Bs3NGW9iRZuVu4Q6KROZpKxyE4XmWozBhQVk/hDoLHIZdpM5IsUb8GhHmKhKRLs4ge1OkO0JpY4wDwMQJNEu9JzinIjLIgTStC4dom4i3mxaEmLeWMLhx9HhDjCQ2FhgsQNLZ22eazIHvvGKGabDyM6mahToabaAbW1WTqIstM03bZMuJcPdv+C2yGiXAiVRMHkNCw4igzjMFtgQDylAUIseCLwYkw3IoOVMQHx702LXkYz3vSEmJoDahXbZSgl8OjE4Xkt6wiQsNDLwurWacw1VaxFyj/Bu+P9sK4sQIJ1KATEYTN6hqDgW7cjWAkaCZCaQoxQSIJZAxhAtFu49VZaAIIPankXLZ8l7cTGm921tMmo65mAAghpCZfAvi4jPYwmrIexIOJACwd6VAGvJhlNN5gF7uAui+9DFQBHskONXHdkJmLCYlEgLkSJpZuJT3ymGHfLOIk0iNSgqwiwjQECk1opAthgTCLomgMLIwQZArjzNk4GaHZbW7XbbYkpKn2neOTJhe0CaEBPP4UXPDMWUTLYD8NUXepQ2JYxBHTIoXClYOhDGRCYFTR80dRF04hYZEISwngakgiOQpkZcwo8TDWpN46yYzBhjg1oJZamNDVKHA6X5oPnvXOOzbQpfgG6Ih1QGyUEmldH5g6buEwqqDWw06z1+CIcqm5IrmZtAtPJGTuVURWKsfC9Wgl/y7/qcU08B3qb+WJCEzOCIcyQc8pJWxhAgUbg5QSDjvJ3IfcYbMw0dA8GSJ/tDTE7A4j0wMTj56OJrREE0Ow3Z5KBHRriwNHbFhjCMEliSOOHF6qHDRA1IoggkYxgiPAVHMDJ9gmGQpFrKW1gAwkQSIApCCehgeiEDCZIgzDz408TdNjpHW8qBqAxM0XAqoZaJUhhgApAwykkjlDABA7BjIcWdPaYdcaItSb4n5ouLLMd0d+cl+sWyMGWhobdm71TTbKcZtvERUre/KQBamyd4lF4P5QHbLT5ttLPQXe+9QdgqHJmA9zXz1qFrNqBZUwsDFyFMDEhiHIDEaMWP3w7yayZqS2zmwb5qAeWUC2J9sd1igjxTpYofA8EhCy+h8DIyaSJNMP0/DuPHq+Lz9d+g5J3MeorNS0Z1HbGK1SCs3UnJl1QzUBXE7KQHIHbDjqbka+SizfQUgS6EmKWd7AYoM5s9lYDcOzax5eiOCsVo5GuSCDDiDUsJdytEDKWmgQ+PoiLtoNi+/Om7AaQ0qF6MsshtbQgxBUQWLhwqiYIKwgcJ2cnc8ZMWypMN8FJqXqzFnWLWPAyOiMHqO1I0aynaSVvCxudy9/hmpL8MaIy20DGhIuNEYkPZajZqozflVL07MwRMCQxWbRGTJARGNXbyUGU21jBBYvGQcZpEZjotKLEiWLAIFrBggPAPLIuY6vYdXb6iYkSHmBErgGt7V3bZp3BmKCgmYcCGqIEPaDbYBAMkweTFywa64d7Ce7BReMhtwtQ0JmmzhwaJoSIMYxhwOBqgZJwQUZgUiISiG6KcphRA5CHIiScQScMGxfAOFIh0hFBDAoxGSpE8d8PORsbnOcPZxx1IuNwkULOswCwYIlws1IRGMiVcKUGKAtBbTF7MtUzWWaOcCWZq41nJJG7YsZjevVz22DUaRkMlaA0hjiaY2DOWdsYxJTDLKGiIk2ZJTUEpoZ2Qejh6zB9gxNtozBntMq8/C0Ex3oiQjJNMl4WBPmUTiNuVA5Qf5nkp0iWIoyI4hmWLDfjSbuh5Rci6uRFC2EIQ5yBQJvpMEERImBoyCAxYLIqNHQQRTTaoFvMdc58cGmSHGS8bbcJBl1CEJhCUEKAE0i8ogYhB3hyJlkY3fdQWB0TDCEFRxOKO1qleDbJUN4iu4SFwyfn588ZPGIglhFpT7HzsM0UvqtEOEg6GepUxhfIp3MjJ2AbD1d9klabnNU3HOXOVDMin5oI0CVEEogd0WkMlROm2UUtaXKvxurhZULAJs2uBlqQyOF8pSBcM0FqaDYKCGPaeXoFACgUDlvuYyEzX0RmjLhv6N/oZ5qkscqEepBILEp4sWoVkTJUUZjZKSYawKIM1LDDUJR0WlSKNNTrOqfk7/IiyC5KmYuMYvsXzURjIZhZQnIG1iHIKhW6V6UwTVADpiGbDjFVV7jpoIOgOHumLURm37jq0YbOV/LTvyW2Bwyqoqw5kLKHamAdUhT6Sych81ndtZ9U4Jt2dMx4m8EEEG0NkvLk1ZodZ1pmKcbljURSQIBEIgeRZhSu+IJtAgKULc59h7Pb6/HpqoUwkqg7Tt7y811RNje/M1qFVhxBtEQSOXeTJDEsogpg2VQhlJlNyRI6Ddw8mmUeBsvNYgSDSJRtSwj0m1S6+nSblbAIYgRixkB1qxBlizC3/5xIQiY5PueQoNRm5+LCbkONrLziHHmMp1kFzJggZIQz5CmCoMBGKoQrTmRJv/wYQFIoAa4HtE1S44j6h9lwME1gOZMRemIkYgHwIO1AzROwChxCJ/ydc0IRCVVQKKoIUpqV4P6vH3WerrpieEKXD1V5d9ywfHAs2zJIVRerf6btywbX5KetYaS5zo3bD3sLYpICfPuHuhkKR9KYIgYGCBAZuE4cXkwhNxNx1KCEb+D6JmLMJuQZt1/zfd36TEAKqi3/hkmCgIrEZCLBCcKSMTexQsA2ZaQZ3Grd/KQSExFM718qCp0nm42lwufV9AWH3C/aEB6TPsCD5hh7sh3SeECwSMCwUhQZ2BcH5biu6Gk5WGStqO6C503OpELtm2+qiDuhYoLabibXDDb4DIwH9AQL4xD6ywsCyGUUAlvPchZPa+AYMB4GS4Hka8VdjGCYQFhlmBT5sNy2L8ur/d07Ukkl+b8X2iktGDqw4k3ENGG1dgrJbcCLVMYP4EMrez4VrnMfWGs5+8rtQj5pC+Uw+ZGKkSRkNiQKySjO1IixBioSCG/1NQImR5u+4SsgvSeuP5o2fPmEN7PqrhKqPajBUq/0lGJ5yPaZz+64yxGv1UIK1jSzSCCGhLQI6W8EMVDM4NJJnFF5uoyr0QrC7ZuBoHIZpdeBA8rAng8MEE1imWGUNAmSjocprxASwdC5EV1ej00dvWe2y9rG/Ig2LHdZMZ+Z/OwzpFPD6QoyfCaM8Q2AoQtgeR8YnNH0FfWfor2E5nt/tMGFQ775p/ZqHVUv9Mry9f5l/8XckU4UJDz9wv+')))
\ No newline at end of file
diff --git a/examples/example_framework/students/cs102/unitgrade_data/Week1.pkl b/examples/example_framework/students/cs102/unitgrade_data/Week1.pkl
index 6b4ee502e9c67e2ff3aba1b11c4911bb88195e34..3e94c9f63cd7ce80ac71dc95ae4e5981ebc3855a 100644
GIT binary patch
literal 403
zcmZo*ncBg~00y;FG<sOWQ&Y1Ir}S_Yr<Q~kIOil57f)%M(!)}cnVUMLZHhZsAp-+L
z24fFLNosLPd}2xpNC8`7adB!<$&|J!wNo^_8N6A%8NC+%|Np-<gE51xZAu19+Z1>E
zfK0G<h)@qla(-EAQDQpC+}bHULdnI321YR%`MIg(`9;}=dIgnJYNzz@rKF}QB&MWj
zB<dt-S}9EN=IY5&P*6}%Qc_ZI&n!#LQz$9VSI8^PO-d~)R!B%pP)N*6QAkKiP$<dB
zELKP>%}XxH%+FIO&d4v#Nl_@y%q_^NR47U<DJ{xVD9K38EK(>g&9&kJnP~^NNWoSi
zQ9B7_$&|J!#l;znJv?CF7NwS@78QeBoWTL|sy9RI6b)}?ZzgZX)Zz@r3^BM@v!Gt>
k5e93_FD)r3Es0M~EGQ{0Lg>$6%#ej?$(Ygr(o?Dj0IU9px&QzG

delta 68
zcmbQtoGRA9GBt_;0&1sd^st7fre+&XnP{o0*27bhT3ixelv<WrRGd1cZAu19+mzZV
T-VCu*G`yL;nY<ZOi%azYxr7yW

diff --git a/examples/example_framework/students/cs102/unitgrade_data/Week1Titles.pkl b/examples/example_framework/students/cs102/unitgrade_data/Week1Titles.pkl
index d483eaf228473f71b5a26d9e892bb23a134c63d2..afe435c082fd18662075c52a0d30a84774febfd7 100644
GIT binary patch
literal 470
zcmZo*nR=R$0Ss!VX!LN0r>15bhGdrHq!v%<;VMoo2`zBWNh~g&(l(`sr6e;qbxPY5
zcd&8>28ImA9*&aK;*$8ploXHx))J6L5KA#6wYWr~BqLQJF(oClBr`uxAvd)oBR>Vi
z*GSY!(wvgPn8DUIrH3uCxHz?_WJ=qV+9?{|4Bjl>j9v@>|NmbKk<Vaho8oR?;N<|a
z6C%{Zk(^(aT9lX$a!c)$9--u7Lj$9jjQrfx^8BJ~L%o8^DYa92_)=2S;I>&QO!4OG
z$x%>HP*74*QgF{KOU+X#DbH8PE6q(xEh<(>NK8;j%u7*7NJ>yB$;d2LNGr`t2D`gB
zBfm5!MWHw|w;-odp(wSav?vecv&<re;?i6zE|8gaaElad6%w_RK$c8tn^Ihy!PvtC
z4xysdvecqtkc%^TKwkA`h@GP0&FszO&6rx8!I&Y{HYJ0jZAy>6b4F@%c4l6>LS~u*
tR8xFTW^su|w4siIk&c3KtfqpkLbNfMV;BnxMvz``Fa;!mLW!YN4*=ZYo|ymu

delta 105
zcmcb{yp~bDfo19<1_-E~qS3=0o|>9%7?N3%lUh8bhodC5xFkL?C1uLQIys{r9x%5k
zwJf!$ICV<flnj=(DYa9)8Dghscr$x5c{8RKXE0{4w@v9`EdiM@WpXd02~(*a090lq
A9RL6T

diff --git a/examples/example_in_progress/in_progress.py b/examples/example_in_progress/in_progress.py
index 1d90da8..eecba14 100644
--- a/examples/example_in_progress/in_progress.py
+++ b/examples/example_in_progress/in_progress.py
@@ -1,7 +1,8 @@
-from unitgrade.framework import Report, cache
+from unitgrade.framework import Report
 from unitgrade.evaluate import evaluate_report_student
 from cs102.homework1 import add, reverse_list
-from unitgrade import UTestCase
+from unitgrade import UTestCase, cache
+
 
 class Week1(UTestCase):
     def test_add(self):
diff --git a/examples/example_jupyter/instructor/cs105/.coverage b/examples/example_jupyter/instructor/cs105/.coverage
deleted file mode 100644
index d0ce9031e9a803a4b044ad516fefdc0192207aa0..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 53248
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

diff --git a/examples/example_jupyter/instructor/cs105/__pycache__/report5.cpython-38.pyc b/examples/example_jupyter/instructor/cs105/__pycache__/report5.cpython-38.pyc
index ddd0195a2135f16b209ad7e277b5de3c9a81ffbb..bcfc817a0feb36d0a11aeb5aef4f102074688e67 100644
GIT binary patch
delta 201
zcmaDU_+5}Ul$V!_fq{XcsNN;fVj^!)ID0Nf6bB<i3TqUnJ3|Uv3VRDf3VSM3GjkM|
zJ3|Ub3TF#L3MZJ)?aq+GmBQV^kiwnH-OL=t<Ia%6lfv7=kiwhF*vuToo648Mm(5hv
zm&%gLyK!3|doX{LcyUp(UTI!tNqSLYN~&I3QDSatd45rL5fjJ_%nS?+QM@QhidaAr
WIv|1@B+HM`Tw0QuQ#`qoBLM&%<TOP9

delta 187
zcmew^_)?HJl$V!_fq{V`;i5&N>qOq5aE4s=D0W7M6xJvXcZL+U6!sQ|6!ui6X67hP
zcZL*>6wVfg6izUo%bg*GD}}p-A%#1YtC=~9+nphWCxy3#A%!=Uv6(rFCzUsaFPo{T
zFO?;gXXCa$c2~YA$>O49z0$nQlJug)lvE=mW)Twu149ur0|P@8AF84v7Lbe%h~Q>m
KV3<6eBLM(_11@&}

diff --git a/examples/example_jupyter/instructor/cs105/deploy.py b/examples/example_jupyter/instructor/cs105/deploy.py
index 6229088..83cb942 100644
--- a/examples/example_jupyter/instructor/cs105/deploy.py
+++ b/examples/example_jupyter/instructor/cs105/deploy.py
@@ -5,7 +5,7 @@ from snipper import snip_dir
 if __name__ == "__main__":
     setup_grade_file_report(Report1Jupyter, minify=False, obfuscate=False, execute=False)
 
-    snip_dir.snip_dir(source_dir="", dest_dir="../../students/cs105", clean_destination_dir=True, exclude=['__pycache__', '*.token', 'deploy.py'])
+    snip_dir(source_dir="", dest_dir="../../students/cs105", exclude=['*.token', 'deploy.py'])
 
 
 
diff --git a/examples/example_jupyter/instructor/cs105/report5.py b/examples/example_jupyter/instructor/cs105/report5.py
index 6578a46..ff627cd 100644
--- a/examples/example_jupyter/instructor/cs105/report5.py
+++ b/examples/example_jupyter/instructor/cs105/report5.py
@@ -2,7 +2,7 @@ from src.unitgrade.framework import Report,  UTestCase
 from src.unitgrade import evaluate_report_student
 import homework1
 import importnb
-from src.unitgrade.framework import Capturing2
+from unitgrade.utils import Capturing2
 
 file = 'week2.ipynb'
 class Week1(UTestCase):
diff --git a/examples/example_jupyter/instructor/cs105/report5_grade.py b/examples/example_jupyter/instructor/cs105/report5_grade.py
index 7b8b931..3b4747f 100644
--- a/examples/example_jupyter/instructor/cs105/report5_grade.py
+++ b/examples/example_jupyter/instructor/cs105/report5_grade.py
@@ -1,339 +1,3 @@
-
-import numpy as np
-from tabulate import tabulate
-from datetime import datetime
-import pyfiglet
-import unittest
-import inspect
-import os
-import argparse
-import time
-
-parser = argparse.ArgumentParser(description='Evaluate your report.', epilog="""Example: 
-To run all tests in a report: 
-
-> python assignment1_dp.py
-
-To run only question 2 or question 2.1
-
-> python assignment1_dp.py -q 2
-> python assignment1_dp.py -q 2.1
-
-Note this scripts does not grade your report. To grade your report, use:
-
-> python report1_grade.py
-
-Finally, note that if your report is part of a module (package), and the report script requires part of that package, the -m option for python may be useful.
-For instance, if the report file is in Documents/course_package/report3_complete.py, and `course_package` is a python package, then change directory to 'Documents/` and run:
-
-> python -m course_package.report1
-
-see https://docs.python.org/3.9/using/cmdline.html
-""", formatter_class=argparse.RawTextHelpFormatter)
-parser.add_argument('-q', nargs='?', type=str, default=None, help='Only evaluate this question (e.g.: -q 2)')
-parser.add_argument('--showexpected',  action="store_true",  help='Show the expected/desired result')
-parser.add_argument('--showcomputed',  action="store_true",  help='Show the answer your code computes')
-parser.add_argument('--unmute',  action="store_true",  help='Show result of print(...) commands in code')
-parser.add_argument('--passall',  action="store_true",  help='Automatically pass all tests. Useful when debugging.')
-parser.add_argument('--noprogress',  action="store_true",  help='Disable progress bars.')
-
-def evaluate_report_student(report, question=None, qitem=None, unmute=None, passall=None, ignore_missing_file=False, show_tol_err=False):
-    args = parser.parse_args()
-    if question is None and args.q is not None:
-        question = args.q
-        if "." in question:
-            question, qitem = [int(v) for v in question.split(".")]
-        else:
-            question = int(question)
-
-    if hasattr(report, "computed_answer_file") and not os.path.isfile(report.computed_answers_file) and not ignore_missing_file:
-        raise Exception("> Error: The pre-computed answer file", os.path.abspath(report.computed_answers_file), "does not exist. Check your package installation")
-
-    if unmute is None:
-        unmute = args.unmute
-    if passall is None:
-        passall = args.passall
-
-
-    results, table_data = evaluate_report(report, question=question, show_progress_bar=not unmute and not args.noprogress, qitem=qitem, verbose=False, passall=passall, show_expected=args.showexpected, show_computed=args.showcomputed,unmute=unmute,
-                                          show_tol_err=show_tol_err)
-
-
-    if question is None:
-        print("Provisional evaluation")
-        tabulate(table_data)
-        table = table_data
-        print(tabulate(table))
-        print(" ")
-
-    fr = inspect.getouterframes(inspect.currentframe())[1].filename
-    gfile = os.path.basename(fr)[:-3] + "_grade.py"
-    if os.path.exists(gfile):
-        print("Note your results have not yet been registered. \nTo register your results, please run the file:")
-        print(">>>", gfile)
-        print("In the same manner as you ran this file.")
-
-
-    return results
-
-
-def upack(q):
-    # h = zip([(i['w'], i['possible'], i['obtained']) for i in q.values()])
-    h =[(i['w'], i['possible'], i['obtained']) for i in q.values()]
-    h = np.asarray(h)
-    return h[:,0], h[:,1], h[:,2],
-
-class UnitgradeTextRunner(unittest.TextTestRunner):
-    def __init__(self, *args, **kwargs):
-        super().__init__(*args, **kwargs)
-
-class SequentialTestLoader(unittest.TestLoader):
-    def getTestCaseNames(self, testCaseClass):
-        test_names = super().getTestCaseNames(testCaseClass)
-        # testcase_methods = list(testCaseClass.__dict__.keys())
-        ls = []
-        for C in testCaseClass.mro():
-            if issubclass(C, unittest.TestCase):
-                ls = list(C.__dict__.keys()) + ls
-        testcase_methods = ls
-        test_names.sort(key=testcase_methods.index)
-        return test_names
-
-def evaluate_report(report, question=None, qitem=None, passall=False, verbose=False,  show_expected=False, show_computed=False,unmute=False, show_help_flag=True, silent=False,
-                    show_progress_bar=True,
-                    show_tol_err=False,
-                    big_header=True):
-
-    from src.unitgrade.version import __version__
-    now = datetime.now()
-    if big_header:
-        ascii_banner = pyfiglet.figlet_format("UnitGrade", font="doom")
-        b = "\n".join( [l for l in ascii_banner.splitlines() if len(l.strip()) > 0] )
-    else:
-        b = "Unitgrade"
-    dt_string = now.strftime("%d/%m/%Y %H:%M:%S")
-    print(b + " v" + __version__ + ", started: " + dt_string+ "\n")
-    # print("Started: " + dt_string)
-    s = report.title
-    if hasattr(report, "version") and report.version is not None:
-        s += " version " + report.version
-    print(s, "(use --help for options)" if show_help_flag else "")
-    # print(f"Loaded answers from: ", report.computed_answers_file, "\n")
-    table_data = []
-    t_start = time.time()
-    score = {}
-    loader = SequentialTestLoader()
-
-    for n, (q, w) in enumerate(report.questions):
-        if question is not None and n+1 != question:
-            continue
-        suite = loader.loadTestsFromTestCase(q)
-        qtitle = q.question_title() if hasattr(q, 'question_title') else q.__qualname__
-        q_title_print = "Question %i: %s"%(n+1, qtitle)
-        print(q_title_print, end="")
-        q.possible = 0
-        q.obtained = 0
-        q_ = {} # Gather score in this class.
-        from src.unitgrade.framework import UTextTestRunner
-        UTextResult.q_title_print = q_title_print # Hacky
-        UTextResult.show_progress_bar = show_progress_bar # Hacky.
-        UTextResult.number = n
-        UTextResult.nL = report.nL
-
-        res = UTextTestRunner(verbosity=2, resultclass=UTextResult).run(suite)
-
-        possible = res.testsRun
-        obtained = len(res.successes)
-
-        assert len(res.successes) +  len(res.errors) + len(res.failures) == res.testsRun
-
-        obtained = int(w * obtained * 1.0 / possible ) if possible > 0 else 0
-        score[n] = {'w': w, 'possible': w, 'obtained': obtained, 'items': q_, 'title': qtitle}
-        q.obtained = obtained
-        q.possible = possible
-
-        s1 = f" * q{n+1})   Total"
-        s2 = f" {q.obtained}/{w}"
-        print(s1 + ("."* (report.nL-len(s1)-len(s2) )) + s2 )
-        print(" ")
-        table_data.append([f"q{n+1}) Total", f"{q.obtained}/{w}"])
-
-    ws, possible, obtained = upack(score)
-    possible = int( msum(possible) )
-    obtained = int( msum(obtained) ) # Cast to python int
-    report.possible = possible
-    report.obtained = obtained
-    now = datetime.now()
-    dt_string = now.strftime("%H:%M:%S")
-
-    dt = int(time.time()-t_start)
-    minutes = dt//60
-    seconds = dt - minutes*60
-    plrl = lambda i, s: str(i) + " " + s + ("s" if i != 1 else "")
-
-    from src.unitgrade.framework import dprint
-    dprint(first = "Total points at "+ dt_string + " (" + plrl(minutes, "minute") + ", "+ plrl(seconds, "second") +")",
-           last=""+str(report.obtained)+"/"+str(report.possible), nL = report.nL)
-
-    # print(f"Completed at "+ dt_string + " (" + plrl(minutes, "minute") + ", "+ plrl(seconds, "second") +"). Total")
-
-    table_data.append(["Total", ""+str(report.obtained)+"/"+str(report.possible) ])
-    results = {'total': (obtained, possible), 'details': score}
-    return results, table_data
-
-
-import bz2
-import pickle
-import os
-
-
-def bzwrite(json_str, token): # to get around obfuscation issues
-    with getattr(bz2, 'open')(token, "wt") as f:
-        f.write(json_str)
-
-def gather_imports(imp):
-    resources = {}
-    m = imp
-    # for m in pack_imports:
-    # print(f"*** {m.__name__}")
-    f = m.__file__
-    # dn = os.path.dirname(f)
-    # top_package = os.path.dirname(__import__(m.__name__.split('.')[0]).__file__)
-    # top_package = str(__import__(m.__name__.split('.')[0]).__path__)
-
-    if hasattr(m, '__file__') and not hasattr(m, '__path__'):  # Importing a simple file: m.__class__.__name__ == 'module' and False:
-        top_package = os.path.dirname(m.__file__)
-        module_import = True
-    else:
-        top_package = __import__(m.__name__.split('.')[0]).__path__._path[0]
-        module_import = False
-
-    # top_package = os.path.dirname(__import__(m.__name__.split('.')[0]).__file__)
-    # top_package = os.path.dirname(top_package)
-    import zipfile
-    # import strea
-    # zipfile.ZipFile
-    import io
-    # file_like_object = io.BytesIO(my_zip_data)
-    zip_buffer = io.BytesIO()
-    with zipfile.ZipFile(zip_buffer, 'w') as zip:
-        # zip.write()
-        for root, dirs, files in os.walk(top_package):
-            for file in files:
-                if file.endswith(".py"):
-                    fpath = os.path.join(root, file)
-                    v = os.path.relpath(os.path.join(root, file), os.path.dirname(top_package) if not module_import else top_package)
-                    zip.write(fpath, v)
-
-    resources['zipfile'] = zip_buffer.getvalue()
-    resources['top_package'] = top_package
-    resources['module_import'] = module_import
-    return resources, top_package
-
-    if f.endswith("__init__.py"):
-        for root, dirs, files in os.walk(os.path.dirname(f)):
-            for file in files:
-                if file.endswith(".py"):
-                    # print(file)
-                    # print()
-                    v = os.path.relpath(os.path.join(root, file), top_package)
-                    with open(os.path.join(root, file), 'r') as ff:
-                        resources[v] = ff.read()
-    else:
-        v = os.path.relpath(f, top_package)
-        with open(f, 'r') as ff:
-            resources[v] = ff.read()
-    return resources
-
-import argparse
-parser = argparse.ArgumentParser(description='Evaluate your report.', epilog="""Use this script to get the score of your report. Example:
-
-> python report1_grade.py
-
-Finally, note that if your report is part of a module (package), and the report script requires part of that package, the -m option for python may be useful.
-For instance, if the report file is in Documents/course_package/report3_complete.py, and `course_package` is a python package, then change directory to 'Documents/` and run:
-
-> python -m course_package.report1
-
-see https://docs.python.org/3.9/using/cmdline.html
-""", formatter_class=argparse.RawTextHelpFormatter)
-parser.add_argument('--noprogress',  action="store_true",  help='Disable progress bars')
-parser.add_argument('--autolab',  action="store_true",  help='Show Autolab results')
-
-def gather_upload_to_campusnet(report, output_dir=None):
-    n = report.nL
-    args = parser.parse_args()
-    results, table_data = evaluate_report(report, show_help_flag=False, show_expected=False, show_computed=False, silent=True,
-                                          show_progress_bar=not args.noprogress,
-                                          big_header=not args.autolab)
-    # print(" ")
-    # print("="*n)
-    # print("Final evaluation")
-    # print(tabulate(table_data))
-    # also load the source code of missing files...
-
-    sources = {}
-    print("")
-    if not args.autolab:
-        if len(report.individual_imports) > 0:
-            print("By uploading the .token file, you verify the files:")
-            for m in report.individual_imports:
-                print(">", m.__file__)
-            print("Are created/modified individually by you in agreement with DTUs exam rules")
-            report.pack_imports += report.individual_imports
-
-        if len(report.pack_imports) > 0:
-            print("Including files in upload...")
-            for k, m in enumerate(report.pack_imports):
-                nimp, top_package = gather_imports(m)
-                _, report_relative_location, module_import = report._import_base_relative()
-
-                # report_relative_location = os.path.relpath(inspect.getfile(report.__class__), top_package)
-                nimp['report_relative_location'] = report_relative_location
-                nimp['report_module_specification'] = module_import
-                nimp['name'] = m.__name__
-                sources[k] = nimp
-                # if len([k for k in nimp if k not in sources]) > 0:
-                print(f" * {m.__name__}")
-                # sources = {**sources, **nimp}
-    results['sources'] = sources
-
-    if output_dir is None:
-        output_dir = os.getcwd()
-
-    payload_out_base = report.__class__.__name__ + "_handin"
-
-    obtain, possible = results['total']
-    vstring = "_v"+report.version if report.version is not None else ""
-
-    token = "%s_%i_of_%i%s.token"%(payload_out_base, obtain, possible,vstring)
-    token = os.path.normpath(os.path.join(output_dir, token))
-
-
-    with open(token, 'wb') as f:
-        pickle.dump(results, f)
-
-    if not args.autolab:
-        print(" ")
-        print("To get credit for your results, please upload the single unmodified file: ")
-        print(">", token)
-        # print("To campusnet without any modifications.")
-
-        # print("Now time for some autolab fun")
-
-def source_instantiate(name, report1_source, payload):
-    eval("exec")(report1_source, globals())
-    pl = pickle.loads(bytes.fromhex(payload))
-    report = eval(name)(payload=pl, strict=True)
-    # report.set_payload(pl)
-    return report
-
-
-
-report1_source = 'import os\nimport lzma\nimport pickle\n\n# DONT\'t import stuff here since install script requires __version__\n\n# def cache_write(object, file_name, verbose=True):\n#     # raise Exception("bad")\n#     # import compress_pickle\n#     dn = os.path.dirname(file_name)\n#     if not os.path.exists(dn):\n#         os.mkdir(dn)\n#     if verbose: print("Writing cache...", file_name)\n#     with lzma.open(file_name, \'wb\', ) as f:\n#         pickle.dump(object, f)\n#     if verbose: print("Done!")\n#\n#\n# def cache_exists(file_name):\n#     # file_name = cn_(file_name) if cache_prefix else file_name\n#     return os.path.exists(file_name)\n#\n#\n# def cache_read(file_name):\n#     # import compress_pickle # Import here because if you import in top the __version__ tag will fail.\n#     # file_name = cn_(file_name) if cache_prefix else file_name\n#     if os.path.exists(file_name):\n#         try:\n#             with lzma.open(file_name, \'rb\') as f:\n#                 return pickle.load(f)\n#         except Exception as e:\n#             print("Tried to load a bad pickle file at", file_name)\n#             print("If the file appears to be automatically generated, you can try to delete it, otherwise download a new version")\n#             print(e)\n#             # return pickle.load(f)\n#     else:\n#         return None\n\n\n"""\ngit add . && git commit -m "Options" && git push &&  pip install git+ssh://git@gitlab.compute.dtu.dk/tuhe/unitgrade_v1.git --upgrade\n"""\nimport numpy as np\nimport sys\nimport re\nimport threading\nimport tqdm\nimport pickle\nimport os\nfrom io import StringIO\nimport io\nfrom unittest.runner import _WritelnDecorator\nfrom typing import Any\nimport inspect\nimport textwrap\nimport colorama\nfrom colorama import Fore\nfrom functools import _make_key, RLock\nfrom collections import namedtuple\nimport unittest\nimport time\n\n_CacheInfo = namedtuple("CacheInfo", ["hits", "misses", "maxsize", "currsize"])\n\ncolorama.init(autoreset=True)  # auto resets your settings after every output\n\ndef gprint(s):\n    print(f"{Fore.GREEN}{s}")\n\nmyround = lambda x: np.round(x)  # required.\nmsum = lambda x: sum(x)\nmfloor = lambda x: np.floor(x)\n\n\ndef setup_dir_by_class(C, base_dir):\n    name = C.__class__.__name__\n    return base_dir, name\n\n\nclass Logger(object):\n    def __init__(self, buffer):\n        assert False\n        self.terminal = sys.stdout\n        self.log = buffer\n\n    def write(self, message):\n        self.terminal.write(message)\n        self.log.write(message)\n\n    def flush(self):\n        # this flush method is needed for python 3 compatibility.\n        pass\n\n\nclass Capturing(list):\n    def __init__(self, *args, stdout=None, unmute=False, **kwargs):\n        self._stdout = stdout\n        self.unmute = unmute\n        super().__init__(*args, **kwargs)\n\n    def __enter__(self, capture_errors=True):  # don\'t put arguments here.\n        self._stdout = sys.stdout if self._stdout == None else self._stdout\n        self._stringio = StringIO()\n        if self.unmute:\n            sys.stdout = Logger(self._stringio)\n        else:\n            sys.stdout = self._stringio\n\n        if capture_errors:\n            self._sterr = sys.stderr\n            sys.sterr = StringIO()  # memory hole it\n        self.capture_errors = capture_errors\n        return self\n\n    def __exit__(self, *args):\n        self.extend(self._stringio.getvalue().splitlines())\n        del self._stringio  # free up some memory\n        sys.stdout = self._stdout\n        if self.capture_errors:\n            sys.sterr = self._sterr\n\n\nclass Capturing2(Capturing):\n    def __exit__(self, *args):\n        lines = self._stringio.getvalue().splitlines()\n        txt = "\\n".join(lines)\n        numbers = extract_numbers(txt)\n        self.extend(lines)\n        del self._stringio  # free up some memory\n        sys.stdout = self._stdout\n        if self.capture_errors:\n            sys.sterr = self._sterr\n\n        self.output = txt\n        self.numbers = numbers\n\n\n# @classmethod\n# class OrderedClassMembers(type):\n#     def __prepare__(self, name, bases):\n#         assert False\n#         return collections.OrderedDict()\n#\n#     def __new__(self, name, bases, classdict):\n#         ks = list(classdict.keys())\n#         for b in bases:\n#             ks += b.__ordered__\n#         classdict[\'__ordered__\'] = [key for key in ks if key not in (\'__module__\', \'__qualname__\')]\n#         return type.__new__(self, name, bases, classdict)\n\n\nclass Report:\n    title = "report title"\n    version = None\n    questions = []\n    pack_imports = []\n    individual_imports = []\n    nL = 120  # Maximum line width\n\n    @classmethod\n    def reset(cls):\n        for (q, _) in cls.questions:\n            if hasattr(q, \'reset\'):\n                q.reset()\n\n    @classmethod\n    def mfile(clc):\n        return inspect.getfile(clc)\n\n    def _file(self):\n        return inspect.getfile(type(self))\n\n    def _import_base_relative(self):\n        if hasattr(self.pack_imports[0], \'__path__\'):\n            root_dir = self.pack_imports[0].__path__._path[0]\n        else:\n            root_dir = self.pack_imports[0].__file__\n\n        root_dir = os.path.dirname(root_dir)\n        relative_path = os.path.relpath(self._file(), root_dir)\n        modules = os.path.normpath(relative_path[:-3]).split(os.sep)\n        return root_dir, relative_path, modules\n\n    def __init__(self, strict=False, payload=None):\n        working_directory = os.path.abspath(os.path.dirname(self._file()))\n        self.wdir, self.name = setup_dir_by_class(self, working_directory)\n        # self.computed_answers_file = os.path.join(self.wdir, self.name + "_resources_do_not_hand_in.dat")\n        for (q, _) in self.questions:\n            q.nL = self.nL  # Set maximum line length.\n\n        if payload is not None:\n            self.set_payload(payload, strict=strict)\n\n    def main(self, verbosity=1):\n        # Run all tests using standard unittest (nothing fancy).\n        loader = unittest.TestLoader()\n        for q, _ in self.questions:\n            start = time.time()  # A good proxy for setup time is to\n            suite = loader.loadTestsFromTestCase(q)\n            unittest.TextTestRunner(verbosity=verbosity).run(suite)\n            total = time.time() - start\n            q.time = total\n\n    def _setup_answers(self, with_coverage=False):\n        if with_coverage:\n            for q, _ in self.questions:\n                q._with_coverage = True\n                q._report = self\n\n        self.main()  # Run all tests in class just to get that out of the way...\n        report_cache = {}\n        for q, _ in self.questions:\n            # print(self.questions)\n            if hasattr(q, \'_save_cache\'):\n                q()._save_cache()\n                print("q is", q())\n                q()._cache_put(\'time\', q.time) # = q.time\n                report_cache[q.__qualname__] = q._cache2\n            else:\n                report_cache[q.__qualname__] = {\'no cache see _setup_answers in framework.py\': True}\n        if with_coverage:\n            for q, _ in self.questions:\n                q._with_coverage = False\n        return report_cache\n\n    def set_payload(self, payloads, strict=False):\n        for q, _ in self.questions:\n            q._cache = payloads[q.__qualname__]\n\n\ndef rm_progress_bar(txt):\n    # More robust version. Apparently length of bar can depend on various factors, so check for order of symbols.\n    nlines = []\n    for l in txt.splitlines():\n        pct = l.find("%")\n        ql = False\n        if pct > 0:\n            i = l.find("|", pct + 1)\n            if i > 0 and l.find("|", i + 1) > 0:\n                ql = True\n        if not ql:\n            nlines.append(l)\n    return "\\n".join(nlines)\n\n\ndef extract_numbers(txt):\n    # txt = rm_progress_bar(txt)\n    numeric_const_pattern = r\'[-+]? (?: (?: \\d* \\. \\d+ ) | (?: \\d+ \\.? ) )(?: [Ee] [+-]? \\d+ ) ?\'\n    rx = re.compile(numeric_const_pattern, re.VERBOSE)\n    all = rx.findall(txt)\n    all = [float(a) if (\'.\' in a or "e" in a) else int(a) for a in all]\n    if len(all) > 500:\n        print(txt)\n        raise Exception("unitgrade_v1.unitgrade_v1.py: Warning, too many numbers!", len(all))\n    return all\n\n\nclass ActiveProgress():\n    def __init__(self, t, start=True, title="my progress bar", show_progress_bar=True, file=None):\n        if file == None:\n            file = sys.stdout\n        self.file = file\n        self.t = t\n        self._running = False\n        self.title = title\n        self.dt = 0.01\n        self.n = int(np.round(self.t / self.dt))\n        self.show_progress_bar = show_progress_bar\n        self.pbar = None\n\n        if start:\n            self.start()\n\n    def start(self):\n        self._running = True\n        if self.show_progress_bar:\n            self.thread = threading.Thread(target=self.run)\n            self.thread.start()\n        self.time_started = time.time()\n\n    def terminate(self):\n        if not self._running:\n            raise Exception("Stopping a stopped progress bar. ")\n        self._running = False\n        if self.show_progress_bar:\n            self.thread.join()\n        if self.pbar is not None:\n            self.pbar.update(1)\n            self.pbar.close()\n            self.pbar = None\n\n        self.file.flush()\n        return time.time() - self.time_started\n\n    def run(self):\n        self.pbar = tqdm.tqdm(total=self.n, file=self.file, position=0, leave=False, desc=self.title, ncols=100,\n                              bar_format=\'{l_bar}{bar}| [{elapsed}<{remaining}]\')\n\n        for _ in range(self.n - 1):  # Don\'t terminate completely; leave bar at 99% done until terminate.\n            if not self._running:\n                self.pbar.close()\n                self.pbar = None\n                break\n\n            time.sleep(self.dt)\n            self.pbar.update(1)\n\ndef dprint(first, last, nL, extra = "", file=None, dotsym=\'.\', color=\'white\'):\n    if file == None:\n        file = sys.stdout\n\n    # ss = self.item_title_print\n    # state = "PASS" if success else "FAILED"\n    dot_parts = (dotsym * max(0, nL - len(last) - len(first)))\n    # if self.show_progress_bar or True:\n    print(first + dot_parts, end="", file=file)\n    # else:\n    # print(dot_parts, end="", file=self.cc.file)\n    last += extra\n    # if tsecs >= 0.5:\n    #     state += " (" + str(tsecs) + " seconds)"\n    print(last, file=file)\n\n\nclass UTextResult(unittest.TextTestResult):\n    nL = 80\n    number = -1  # HAcky way to set question number.\n    show_progress_bar = True\n    cc = None\n\n    def __init__(self, stream, descriptions, verbosity):\n        super().__init__(stream, descriptions, verbosity)\n        self.successes = []\n\n    def printErrors(self) -> None:\n        self.printErrorList(\'ERROR\', self.errors)\n        self.printErrorList(\'FAIL\', self.failures)\n\n    def addError(self, test, err):\n        super(unittest.TextTestResult, self).addFailure(test, err)\n        self.cc_terminate(success=False)\n\n    def addFailure(self, test, err):\n        super(unittest.TextTestResult, self).addFailure(test, err)\n        self.cc_terminate(success=False)\n\n    def addSuccess(self, test: unittest.case.TestCase) -> None:\n        self.successes.append(test)\n        self.cc_terminate()\n\n    def cc_terminate(self, success=True):\n        if self.show_progress_bar or True:\n            tsecs = np.round(self.cc.terminate(), 2)\n            self.cc.file.flush()\n            ss = self.item_title_print\n\n            state = "PASS" if success else "FAILED"\n\n            dot_parts = (\'.\' * max(0, self.nL - len(state) - len(ss)))\n            if self.show_progress_bar or True:\n                print(self.item_title_print + dot_parts, end="", file=self.cc.file)\n            else:\n                print(dot_parts, end="", file=self.cc.file)\n\n            if tsecs >= 0.5:\n                state += " (" + str(tsecs) + " seconds)"\n            print(state, file=self.cc.file)\n\n    def startTest(self, test):\n        # j =self.testsRun\n        self.testsRun += 1\n        # item_title = self.getDescription(test)\n        item_title = test.shortDescription()  # Better for printing (get from cache).\n        if item_title == None:\n            # For unittest framework where getDescription may return None.\n            item_title = self.getDescription(test)\n        self.item_title_print = " * q%i.%i) %s" % (UTextResult.number + 1, self.testsRun, item_title)\n        estimated_time = 10\n        if self.show_progress_bar or True:\n            self.cc = ActiveProgress(t=estimated_time, title=self.item_title_print, show_progress_bar=self.show_progress_bar, file=sys.stdout)\n        else:\n            print(self.item_title_print + (\'.\' * max(0, self.nL - 4 - len(self.item_title_print))), end="")\n\n        self._test = test\n        self._stdout = sys.stdout\n        sys.stdout = io.StringIO()\n\n    def stopTest(self, test):\n        sys.stdout = self._stdout\n        super().stopTest(test)\n\n    def _setupStdout(self):\n        if self._previousTestClass == None:\n            total_estimated_time = 1\n            if hasattr(self.__class__, \'q_title_print\'):\n                q_title_print = self.__class__.q_title_print\n            else:\n                q_title_print = "<unnamed test. See unitgrade_v1.py>"\n\n            cc = ActiveProgress(t=total_estimated_time, title=q_title_print, show_progress_bar=self.show_progress_bar)\n            self.cc = cc\n\n    def _restoreStdout(self):  # Used when setting up the test.\n        if self._previousTestClass is None:\n            q_time = self.cc.terminate()\n            q_time = np.round(q_time, 2)\n            sys.stdout.flush()\n            if self.show_progress_bar:\n                print(self.cc.title, end="")\n            print(" " * max(0, self.nL - len(self.cc.title)) + (" (" + str(q_time) + " seconds)" if q_time >= 0.5 else ""))\n\n\nclass UTextTestRunner(unittest.TextTestRunner):\n    def __init__(self, *args, **kwargs):\n        stream = io.StringIO()\n        super().__init__(*args, stream=stream, **kwargs)\n\n    def _makeResult(self):\n        # stream = self.stream # not you!\n        stream = sys.stdout\n        stream = _WritelnDecorator(stream)\n        return self.resultclass(stream, self.descriptions, self.verbosity)\n\n\ndef cache(foo, typed=False):\n    """ Magic cache wrapper\n    https://github.com/python/cpython/blob/main/Lib/functools.py\n    """\n    maxsize = None\n    def wrapper(self, *args, **kwargs):\n        key = (self.cache_id(), ("@cache", foo.__name__, _make_key(args, kwargs, typed)))\n        if not self._cache_contains(key):\n            value = foo(self, *args, **kwargs)\n            self._cache_put(key, value)\n        else:\n            value = self._cache_get(key)\n        return value\n\n    return wrapper\n\n\ndef get_hints(ss):\n    if ss == None:\n        return None\n    try:\n        ss = textwrap.dedent(ss)\n        ss = ss.replace(\'\'\'"""\'\'\', "").strip()\n        hints = ["hints:", ]\n        j = np.argmax([ss.lower().find(h) for h in hints])\n        h = hints[j]\n        ss = ss[ss.find(h) + len(h) + 1:]\n        ss = "\\n".join([l for l in ss.split("\\n") if not l.strip().startswith(":")])\n        ss = textwrap.dedent(ss)\n        ss = ss.strip()\n        return ss\n    except Exception as e:\n        print("bad hints", ss, e)\n\n\nclass UTestCase(unittest.TestCase):\n    _outcome = None  # A dictionary which stores the user-computed outcomes of all the tests. This differs from the cache.\n    _cache = None  # Read-only cache. Ensures method always produce same result.\n    _cache2 = None  # User-written cache.\n    _with_coverage = False\n    _report = None  # The report used. This is very, very hacky and should always be None. Don\'t rely on it!\n\n    def capture(self):\n        if hasattr(self, \'_stdout\') and self._stdout is not None:\n            file = self._stdout\n        else:\n            # self._stdout = sys.stdout\n            # sys._stdout = io.StringIO()\n            file = sys.stdout\n        return Capturing2(stdout=file)\n\n    @classmethod\n    def question_title(cls):\n        """ Return the question title """\n        return cls.__doc__.strip().splitlines()[0].strip() if cls.__doc__ is not None else cls.__qualname__\n\n    @classmethod\n    def reset(cls):\n        print("Warning, I am not sure UTestCase.reset() is needed anymore and it seems very hacky.")\n        cls._outcome = None\n        cls._cache = None\n        cls._cache2 = None\n\n    def _callSetUp(self):\n        if self._with_coverage:\n            if not hasattr(self._report, \'covcache\'):\n                self._report.covcache = {}\n            import coverage\n            self.cov = coverage.Coverage()\n            self.cov.start()\n        self.setUp()\n\n    def _callTearDown(self):\n        self.tearDown()\n        if self._with_coverage:\n            from pathlib import Path\n            from snipper import snipper_main\n            self.cov.stop()\n            data = self.cov.get_data()\n            base, _, _ = self._report._import_base_relative()\n            for file in data.measured_files():\n                file = os.path.normpath(file)\n                root = Path(base)\n                child = Path(file)\n                if root in child.parents:\n                    with open(child, \'r\') as f:\n                        s = f.read()\n                    lines = s.splitlines()\n                    garb = \'GARBAGE\'\n\n                    lines2 = snipper_main.censor_code(lines, keep=True)\n                    assert len(lines) == len(lines2)\n\n                    for l in data.contexts_by_lineno(file):\n                        if lines2[l].strip() == garb:\n                            if self.cache_id() not in self._report.covcache:\n                                self._report.covcache[self.cache_id()] = {}\n\n                            rel = os.path.relpath(child, root)\n                            cc = self._report.covcache[self.cache_id()]\n                            j = 0\n                            for j in range(l, -1, -1):\n                                if "def" in lines2[j] or "class" in lines2[j]:\n                                    break\n                            from snipper.legacy import gcoms\n                            fun = lines2[j]\n                            comments, _ = gcoms("\\n".join(lines2[j:l]))\n                            if rel not in cc:\n                                cc[rel] = {}\n                            cc[rel][fun] = (l, "\\n".join(comments))\n                            self._cache_put((self.cache_id(), \'coverage\'), self._report.covcache)\n\n    def shortDescriptionStandard(self):\n        sd = super().shortDescription()\n        if sd is None:\n            sd = self._testMethodName\n        return sd\n\n    def shortDescription(self):\n        sd = self.shortDescriptionStandard()\n        title = self._cache_get((self.cache_id(), \'title\'), sd)\n        return title if title is not None else sd\n\n    @property\n    def title(self):\n        return self.shortDescription()\n\n    @title.setter\n    def title(self, value):\n        self._cache_put((self.cache_id(), \'title\'), value)\n\n    def _get_outcome(self):\n        if not (self.__class__, \'_outcome\') or self.__class__._outcome is None:\n            self.__class__._outcome = {}\n        return self.__class__._outcome\n\n    def _callTestMethod(self, testMethod):\n        t = time.time()\n        self._ensure_cache_exists()  # Make sure cache is there.\n        if self._testMethodDoc is not None:\n            self._cache_put((self.cache_id(), \'title\'), self.shortDescriptionStandard())\n\n        self._cache2[(self.cache_id(), \'assert\')] = {}\n        res = testMethod()\n        elapsed = time.time() - t\n        self._get_outcome()[self.cache_id()] = res\n        self._cache_put((self.cache_id(), "time"), elapsed)\n\n    def cache_id(self):\n        c = self.__class__.__qualname__\n        m = self._testMethodName\n        return c, m\n\n    def __init__(self, *args, **kwargs):\n        super().__init__(*args, **kwargs)\n        self._load_cache()\n        self._assert_cache_index = 0\n\n    def _ensure_cache_exists(self):\n        if not hasattr(self.__class__, \'_cache\') or self.__class__._cache == None:\n            self.__class__._cache = dict()\n        if not hasattr(self.__class__, \'_cache2\') or self.__class__._cache2 == None:\n            self.__class__._cache2 = dict()\n\n    def _cache_get(self, key, default=None):\n        self._ensure_cache_exists()\n        return self.__class__._cache.get(key, default)\n\n    def _cache_put(self, key, value):\n        self._ensure_cache_exists()\n        self.__class__._cache2[key] = value\n\n    def _cache_contains(self, key):\n        self._ensure_cache_exists()\n        return key in self.__class__._cache\n\n    def wrap_assert(self, assert_fun, first, *args, **kwargs):\n        # sys.stdout = self._stdout\n        key = (self.cache_id(), \'assert\')\n        if not self._cache_contains(key):\n            print("Warning, framework missing", key)\n            self.__class__._cache[\n                key] = {}  # A new dict. We manually insert it because we have to use that the dict is mutable.\n        cache = self._cache_get(key)\n        id = self._assert_cache_index\n        if not id in cache:\n            print("Warning, framework missing cache index", key, "id =", id)\n        _expected = cache.get(id, f"Key {id} not found in cache; framework files missing. Please run deploy()")\n\n        # The order of these calls is important. If the method assert fails, we should still store the correct result in cache.\n        cache[id] = first\n        self._cache_put(key, cache)\n        self._assert_cache_index += 1\n        assert_fun(first, _expected, *args, **kwargs)\n\n    def assertEqualC(self, first: Any, msg: Any = ...) -> None:\n        self.wrap_assert(self.assertEqual, first, msg)\n\n    def _cache_file(self):\n        # The filename-directory stuff is a bit tricky but this seems robust.\n        return os.path.dirname(inspect.getabsfile(type(self))) + "/unitgrade_v1/" + self.__class__.__name__ + ".pkl"\n\n    def _save_cache(self):\n        # get the class name (i.e. what to save to).\n        cfile = self._cache_file()\n        if not os.path.isdir(os.path.dirname(cfile)):\n            os.makedirs(os.path.dirname(cfile))\n\n        if hasattr(self.__class__, \'_cache2\'):\n            with open(cfile, \'wb\') as f:\n                pickle.dump(self.__class__._cache2, f)\n\n    # But you can also set cache explicitly.\n    def _load_cache(self):\n        if self._cache is not None:  # Cache already loaded. We will not load it twice.\n            return\n            # raise Exception("Loaded cache which was already set. What is going on?!")\n        cfile = self._cache_file()\n        if os.path.exists(cfile):\n            try:\n                # print("\\ncache file", cfile)\n                with open(cfile, \'rb\') as f:\n                    data = pickle.load(f)\n                self.__class__._cache = data\n            except Exception as e:\n                print("Bad cache", cfile)\n                print(e)\n        else:\n            print("Warning! data file not found", cfile)\n\n    def _feedErrorsToResult(self, result, errors):\n        """ Use this to show hints on test failure. """\n        if not isinstance(result, UTextResult):\n            er = [e for e, v in errors if v != None]\n\n            if len(er) > 0:\n                hints = []\n                key = (self.cache_id(), \'coverage\')\n                if self._cache_contains(key):\n                    CC = self._cache_get(key)\n                    for id in CC:\n                        if id == self.cache_id():\n                            cl, m = id\n                            gprint(f"> An error occured while solving: {cl}.{m}. The files/methods you need to edit are:")  # For the test {id} in {file} you should edit:")\n                            for file in CC[id]:\n                                rec = CC[id][file]\n                                gprint(f">   * {file}")\n                                for l in rec:\n                                    _, comments = CC[id][file][l]\n                                    hint = get_hints(comments)\n\n                                    if hint != None:\n                                        hints.append(hint)\n                                    gprint(f">      - {l}")\n\n                er = er[0]\n                doc = er._testMethodDoc\n                if doc is not None:\n                    hint = get_hints(er._testMethodDoc)\n                    if hint is not None:\n                        hints = [hint] + hints\n                if len(hints) > 0:\n                    gprint("> Hints:")\n                    gprint(textwrap.indent("\\n".join(hints), ">   "))\n\n        super()._feedErrorsToResult(result, errors)\n\n    def startTestRun(self):\n        # print("asdfsdaf 11", file=sys.stderr)\n        super().startTestRun()\n        # print("asdfsdaf")\n\n    def _callTestMethod(self, method):\n        # print("asdfsdaf")\n        super()._callTestMethod(method)\n\n\ndef hide(func):\n    return func\n\n\ndef makeRegisteringDecorator(foreignDecorator):\n    """\n        Returns a copy of foreignDecorator, which is identical in every\n        way(*), except also appends a .decorator property to the callable it\n        spits out.\n    """\n\n    def newDecorator(func):\n        # Call to newDecorator(method)\n        # Exactly like old decorator, but output keeps track of what decorated it\n        R = foreignDecorator(func)  # apply foreignDecorator, like call to foreignDecorator(method) would have done\n        R.decorator = newDecorator  # keep track of decorator\n        # R.original = func         # might as well keep track of everything!\n        return R\n\n    newDecorator.__name__ = foreignDecorator.__name__\n    newDecorator.__doc__ = foreignDecorator.__doc__\n    return newDecorator\n\nhide = makeRegisteringDecorator(hide)\n\ndef methodsWithDecorator(cls, decorator):\n    """\n        Returns all methods in CLS with DECORATOR as the\n        outermost decorator.\n\n        DECORATOR must be a "registering decorator"; one\n        can make any decorator "registering" via the\n        makeRegisteringDecorator function.\n\n        import inspect\n        ls = list(methodsWithDecorator(GeneratorQuestion, deco))\n        for f in ls:\n            print(inspect.getsourcelines(f) ) # How to get all hidden questions.\n    """\n    for maybeDecorated in cls.__dict__.values():\n        if hasattr(maybeDecorated, \'decorator\'):\n            if maybeDecorated.decorator == decorator:\n                print(maybeDecorated)\n                yield maybeDecorated\n# 817\n\n\nimport numpy as np\nfrom tabulate import tabulate\nfrom datetime import datetime\nimport pyfiglet\nimport unittest\nimport inspect\nimport os\nimport argparse\nimport time\n\nparser = argparse.ArgumentParser(description=\'Evaluate your report.\', epilog="""Example: \nTo run all tests in a report: \n\n> python assignment1_dp.py\n\nTo run only question 2 or question 2.1\n\n> python assignment1_dp.py -q 2\n> python assignment1_dp.py -q 2.1\n\nNote this scripts does not grade your report. To grade your report, use:\n\n> python report1_grade.py\n\nFinally, note that if your report is part of a module (package), and the report script requires part of that package, the -m option for python may be useful.\nFor instance, if the report file is in Documents/course_package/report3_complete.py, and `course_package` is a python package, then change directory to \'Documents/` and run:\n\n> python -m course_package.report1\n\nsee https://docs.python.org/3.9/using/cmdline.html\n""", formatter_class=argparse.RawTextHelpFormatter)\nparser.add_argument(\'-q\', nargs=\'?\', type=str, default=None, help=\'Only evaluate this question (e.g.: -q 2)\')\nparser.add_argument(\'--showexpected\',  action="store_true",  help=\'Show the expected/desired result\')\nparser.add_argument(\'--showcomputed\',  action="store_true",  help=\'Show the answer your code computes\')\nparser.add_argument(\'--unmute\',  action="store_true",  help=\'Show result of print(...) commands in code\')\nparser.add_argument(\'--passall\',  action="store_true",  help=\'Automatically pass all tests. Useful when debugging.\')\nparser.add_argument(\'--noprogress\',  action="store_true",  help=\'Disable progress bars.\')\n\ndef evaluate_report_student(report, question=None, qitem=None, unmute=None, passall=None, ignore_missing_file=False, show_tol_err=False):\n    args = parser.parse_args()\n    if question is None and args.q is not None:\n        question = args.q\n        if "." in question:\n            question, qitem = [int(v) for v in question.split(".")]\n        else:\n            question = int(question)\n\n    if hasattr(report, "computed_answer_file") and not os.path.isfile(report.computed_answers_file) and not ignore_missing_file:\n        raise Exception("> Error: The pre-computed answer file", os.path.abspath(report.computed_answers_file), "does not exist. Check your package installation")\n\n    if unmute is None:\n        unmute = args.unmute\n    if passall is None:\n        passall = args.passall\n\n\n    results, table_data = evaluate_report(report, question=question, show_progress_bar=not unmute and not args.noprogress, qitem=qitem, verbose=False, passall=passall, show_expected=args.showexpected, show_computed=args.showcomputed,unmute=unmute,\n                                          show_tol_err=show_tol_err)\n\n\n    if question is None:\n        print("Provisional evaluation")\n        tabulate(table_data)\n        table = table_data\n        print(tabulate(table))\n        print(" ")\n\n    fr = inspect.getouterframes(inspect.currentframe())[1].filename\n    gfile = os.path.basename(fr)[:-3] + "_grade.py"\n    if os.path.exists(gfile):\n        print("Note your results have not yet been registered. \\nTo register your results, please run the file:")\n        print(">>>", gfile)\n        print("In the same manner as you ran this file.")\n\n\n    return results\n\n\ndef upack(q):\n    # h = zip([(i[\'w\'], i[\'possible\'], i[\'obtained\']) for i in q.values()])\n    h =[(i[\'w\'], i[\'possible\'], i[\'obtained\']) for i in q.values()]\n    h = np.asarray(h)\n    return h[:,0], h[:,1], h[:,2],\n\nclass UnitgradeTextRunner(unittest.TextTestRunner):\n    def __init__(self, *args, **kwargs):\n        super().__init__(*args, **kwargs)\n\nclass SequentialTestLoader(unittest.TestLoader):\n    def getTestCaseNames(self, testCaseClass):\n        test_names = super().getTestCaseNames(testCaseClass)\n        # testcase_methods = list(testCaseClass.__dict__.keys())\n        ls = []\n        for C in testCaseClass.mro():\n            if issubclass(C, unittest.TestCase):\n                ls = list(C.__dict__.keys()) + ls\n        testcase_methods = ls\n        test_names.sort(key=testcase_methods.index)\n        return test_names\n\ndef evaluate_report(report, question=None, qitem=None, passall=False, verbose=False,  show_expected=False, show_computed=False,unmute=False, show_help_flag=True, silent=False,\n                    show_progress_bar=True,\n                    show_tol_err=False,\n                    big_header=True):\n\n    from src.unitgrade.version import __version__\n    now = datetime.now()\n    if big_header:\n        ascii_banner = pyfiglet.figlet_format("UnitGrade", font="doom")\n        b = "\\n".join( [l for l in ascii_banner.splitlines() if len(l.strip()) > 0] )\n    else:\n        b = "Unitgrade"\n    dt_string = now.strftime("%d/%m/%Y %H:%M:%S")\n    print(b + " v" + __version__ + ", started: " + dt_string+ "\\n")\n    # print("Started: " + dt_string)\n    s = report.title\n    if hasattr(report, "version") and report.version is not None:\n        s += " version " + report.version\n    print(s, "(use --help for options)" if show_help_flag else "")\n    # print(f"Loaded answers from: ", report.computed_answers_file, "\\n")\n    table_data = []\n    t_start = time.time()\n    score = {}\n    loader = SequentialTestLoader()\n\n    for n, (q, w) in enumerate(report.questions):\n        if question is not None and n+1 != question:\n            continue\n        suite = loader.loadTestsFromTestCase(q)\n        qtitle = q.question_title() if hasattr(q, \'question_title\') else q.__qualname__\n        q_title_print = "Question %i: %s"%(n+1, qtitle)\n        print(q_title_print, end="")\n        q.possible = 0\n        q.obtained = 0\n        q_ = {} # Gather score in this class.\n        from src.unitgrade.unitgrade import UTextTestRunner\n        UTextResult.q_title_print = q_title_print # Hacky\n        UTextResult.show_progress_bar = show_progress_bar # Hacky.\n        UTextResult.number = n\n        UTextResult.nL = report.nL\n\n        res = UTextTestRunner(verbosity=2, resultclass=UTextResult).run(suite)\n\n        possible = res.testsRun\n        obtained = len(res.successes)\n\n        assert len(res.successes) +  len(res.errors) + len(res.failures) == res.testsRun\n\n        obtained = int(w * obtained * 1.0 / possible ) if possible > 0 else 0\n        score[n] = {\'w\': w, \'possible\': w, \'obtained\': obtained, \'items\': q_, \'title\': qtitle}\n        q.obtained = obtained\n        q.possible = possible\n\n        s1 = f" * q{n+1})   Total"\n        s2 = f" {q.obtained}/{w}"\n        print(s1 + ("."* (report.nL-len(s1)-len(s2) )) + s2 )\n        print(" ")\n        table_data.append([f"q{n+1}) Total", f"{q.obtained}/{w}"])\n\n    ws, possible, obtained = upack(score)\n    possible = int( msum(possible) )\n    obtained = int( msum(obtained) ) # Cast to python int\n    report.possible = possible\n    report.obtained = obtained\n    now = datetime.now()\n    dt_string = now.strftime("%H:%M:%S")\n\n    dt = int(time.time()-t_start)\n    minutes = dt//60\n    seconds = dt - minutes*60\n    plrl = lambda i, s: str(i) + " " + s + ("s" if i != 1 else "")\n\n    from src.unitgrade.unitgrade import dprint\n    dprint(first = "Total points at "+ dt_string + " (" + plrl(minutes, "minute") + ", "+ plrl(seconds, "second") +")",\n           last=""+str(report.obtained)+"/"+str(report.possible), nL = report.nL)\n\n    # print(f"Completed at "+ dt_string + " (" + plrl(minutes, "minute") + ", "+ plrl(seconds, "second") +"). Total")\n\n    table_data.append(["Total", ""+str(report.obtained)+"/"+str(report.possible) ])\n    results = {\'total\': (obtained, possible), \'details\': score}\n    return results, table_data\n\n\nimport bz2\nimport pickle\nimport os\n\n\ndef bzwrite(json_str, token): # to get around obfuscation issues\n    with getattr(bz2, \'open\')(token, "wt") as f:\n        f.write(json_str)\n\ndef gather_imports(imp):\n    resources = {}\n    m = imp\n    # for m in pack_imports:\n    # print(f"*** {m.__name__}")\n    f = m.__file__\n    # dn = os.path.dirname(f)\n    # top_package = os.path.dirname(__import__(m.__name__.split(\'.\')[0]).__file__)\n    # top_package = str(__import__(m.__name__.split(\'.\')[0]).__path__)\n\n    if hasattr(m, \'__file__\') and not hasattr(m, \'__path__\'):  # Importing a simple file: m.__class__.__name__ == \'module\' and False:\n        top_package = os.path.dirname(m.__file__)\n        module_import = True\n    else:\n        top_package = __import__(m.__name__.split(\'.\')[0]).__path__._path[0]\n        module_import = False\n\n    # top_package = os.path.dirname(__import__(m.__name__.split(\'.\')[0]).__file__)\n    # top_package = os.path.dirname(top_package)\n    import zipfile\n    # import strea\n    # zipfile.ZipFile\n    import io\n    # file_like_object = io.BytesIO(my_zip_data)\n    zip_buffer = io.BytesIO()\n    with zipfile.ZipFile(zip_buffer, \'w\') as zip:\n        # zip.write()\n        for root, dirs, files in os.walk(top_package):\n            for file in files:\n                if file.endswith(".py"):\n                    fpath = os.path.join(root, file)\n                    v = os.path.relpath(os.path.join(root, file), os.path.dirname(top_package) if not module_import else top_package)\n                    zip.write(fpath, v)\n\n    resources[\'zipfile\'] = zip_buffer.getvalue()\n    resources[\'top_package\'] = top_package\n    resources[\'module_import\'] = module_import\n    return resources, top_package\n\n    if f.endswith("__init__.py"):\n        for root, dirs, files in os.walk(os.path.dirname(f)):\n            for file in files:\n                if file.endswith(".py"):\n                    # print(file)\n                    # print()\n                    v = os.path.relpath(os.path.join(root, file), top_package)\n                    with open(os.path.join(root, file), \'r\') as ff:\n                        resources[v] = ff.read()\n    else:\n        v = os.path.relpath(f, top_package)\n        with open(f, \'r\') as ff:\n            resources[v] = ff.read()\n    return resources\n\nimport argparse\nparser = argparse.ArgumentParser(description=\'Evaluate your report.\', epilog="""Use this script to get the score of your report. Example:\n\n> python report1_grade.py\n\nFinally, note that if your report is part of a module (package), and the report script requires part of that package, the -m option for python may be useful.\nFor instance, if the report file is in Documents/course_package/report3_complete.py, and `course_package` is a python package, then change directory to \'Documents/` and run:\n\n> python -m course_package.report1\n\nsee https://docs.python.org/3.9/using/cmdline.html\n""", formatter_class=argparse.RawTextHelpFormatter)\nparser.add_argument(\'--noprogress\',  action="store_true",  help=\'Disable progress bars\')\nparser.add_argument(\'--autolab\',  action="store_true",  help=\'Show Autolab results\')\n\ndef gather_upload_to_campusnet(report, output_dir=None):\n    n = report.nL\n    args = parser.parse_args()\n    results, table_data = evaluate_report(report, show_help_flag=False, show_expected=False, show_computed=False, silent=True,\n                                          show_progress_bar=not args.noprogress,\n                                          big_header=not args.autolab)\n    # print(" ")\n    # print("="*n)\n    # print("Final evaluation")\n    # print(tabulate(table_data))\n    # also load the source code of missing files...\n\n    sources = {}\n    print("")\n    if not args.autolab:\n        if len(report.individual_imports) > 0:\n            print("By uploading the .token file, you verify the files:")\n            for m in report.individual_imports:\n                print(">", m.__file__)\n            print("Are created/modified individually by you in agreement with DTUs exam rules")\n            report.pack_imports += report.individual_imports\n\n        if len(report.pack_imports) > 0:\n            print("Including files in upload...")\n            for k, m in enumerate(report.pack_imports):\n                nimp, top_package = gather_imports(m)\n                _, report_relative_location, module_import = report._import_base_relative()\n\n                # report_relative_location = os.path.relpath(inspect.getfile(report.__class__), top_package)\n                nimp[\'report_relative_location\'] = report_relative_location\n                nimp[\'report_module_specification\'] = module_import\n                nimp[\'name\'] = m.__name__\n                sources[k] = nimp\n                # if len([k for k in nimp if k not in sources]) > 0:\n                print(f" * {m.__name__}")\n                # sources = {**sources, **nimp}\n    results[\'sources\'] = sources\n\n    if output_dir is None:\n        output_dir = os.getcwd()\n\n    payload_out_base = report.__class__.__name__ + "_handin"\n\n    obtain, possible = results[\'total\']\n    vstring = "_v"+report.version if report.version is not None else ""\n\n    token = "%s_%i_of_%i%s.token"%(payload_out_base, obtain, possible,vstring)\n    token = os.path.normpath(os.path.join(output_dir, token))\n\n\n    with open(token, \'wb\') as f:\n        pickle.dump(results, f)\n\n    if not args.autolab:\n        print(" ")\n        print("To get credit for your results, please upload the single unmodified file: ")\n        print(">", token)\n        # print("To campusnet without any modifications.")\n\n        # print("Now time for some autolab fun")\n\ndef source_instantiate(name, report1_source, payload):\n    eval("exec")(report1_source, globals())\n    pl = pickle.loads(bytes.fromhex(payload))\n    report = eval(name)(payload=pl, strict=True)\n    # report.set_payload(pl)\n    return report\n\n\n__version__ = "0.0.3"\n\nfrom src.unitgrade.unitgrade import Report,  UTestCase\nfrom src.unitgrade import evaluate_report_student\nimport homework1\nimport importnb\nfrom src.unitgrade.unitgrade import Capturing2\n\nfile = \'week2.ipynb\'\nclass Week1(UTestCase):\n    @classmethod\n    def setUpClass(cls) -> None:\n        with Capturing2():\n            cls.nb = importnb.Notebook.load(file)\n\n    def test_add(self):\n        self.assertEqual(Week1.nb.myfun(2,2), 4)\n        self.assertEqual(Week1.nb.myfun(2,4), 8)\n\n    def test_reverse(self):\n        self.assertEqual(Week1.nb.var, "hello world 2")\n\n# Nicer: Automatically load the notebook.\nclass NBTestCase(UTestCase):\n    notebook = None\n    _nb = None\n    @classmethod\n    def setUpClass(cls) -> None:\n        with Capturing2():\n            cls._nb = importnb.Notebook.load(cls.notebook)\n\n    @property\n    def nb(self):\n        return self.__class__._nb\n\nclass Question2(NBTestCase):\n    notebook = "week2.ipynb"\n    def test_add(self):\n        self.assertEqualC(self.nb.myfun(2,8))\n\nclass Report1Jupyter(Report):\n    title = "CS 105 Report 5"\n    questions = [(Week1, 10),\n                 (Question2, 8)\n                 ]  # Include a single question for 10 credits.\n    pack_imports = [homework1]'
-report1_payload = '8004955c000000000000007d94288c055765656b31947d948c0474696d6594473fe547a680000000738c095175657374696f6e32947d942868048c08746573745f6164649486948c066173736572749486947d944b004b10736803473fcd2f140000000075752e'
-name="Report1Jupyter"
-
-report = source_instantiate(name, report1_source, report1_payload)
-output_dir = os.path.dirname(__file__)
-gather_upload_to_campusnet(report, output_dir)
\ No newline at end of file
+''' WARNING: Modifying, decompiling or otherwise tampering with this script, it's data or the resulting .token file will be investigated as a cheating attempt. '''
+import bz2, base64
+exec(bz2.decompress(base64.b64decode('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')))
\ No newline at end of file
diff --git a/examples/example_jupyter/instructor/cs105/unitgrade_data/Question2.pkl b/examples/example_jupyter/instructor/cs105/unitgrade_data/Question2.pkl
new file mode 100644
index 0000000000000000000000000000000000000000..877d483d059025ebe95a9c08d31687e5fbd69881
GIT binary patch
literal 113
zcmZo*nVQA`0ku;!dN>11Q;SP7^Ye_R^l%lYmV_2K=Oh*vPidRd!%~u&n>wX!io5-R
zZC)T98H_y~C8@<F@rfxZAO&oR#l@*bB~#j_)K2kc@D?b}V9a1^o07o-(i7kh(!x-x
F2LO#`CKvz!

literal 0
HcmV?d00001

diff --git a/examples/example_jupyter/instructor/cs105/unitgrade_data/Week1.pkl b/examples/example_jupyter/instructor/cs105/unitgrade_data/Week1.pkl
new file mode 100644
index 0000000000000000000000000000000000000000..cb52b781d5b36368edaef0346dc55dce72624126
GIT binary patch
literal 148
zcmZo*ncB$!0ku;!dRW6#Q?m`H^l%lYmV_2K=Oh*vPidRd!%~u&n>wX!io5;ZO(G!G
z8H_y~C8@<F@rfxZAO&oR#l@*bB~#j_)K1A@%wTJqlEDH}9*_i5&5*&^!vj`clv<Wr
UR17jIg9ECT7p^uAthQ7S0IlybJ^%m!

literal 0
HcmV?d00001

diff --git a/examples/example_jupyter/students/cs105/.coverage b/examples/example_jupyter/students/cs105/.coverage
deleted file mode 100644
index d0ce9031e9a803a4b044ad516fefdc0192207aa0..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 53248
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

diff --git a/examples/example_jupyter/students/cs105/__pycache__/homework1.cpython-38.pyc b/examples/example_jupyter/students/cs105/__pycache__/homework1.cpython-38.pyc
deleted file mode 100644
index 4f997471bdac17f875412e83bfcd12b374441444..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 187
zcmWIL<>g{vU|>kNXpyMJz`*br#6iZ43=9ko3=9m#EDQ_`DGb33nv8xc8Hzx{2;x_Q
zvsFxJacWU<Oi5`*YK%*Ma%paAUP*CGX<lYYdQoCZYJ5RaW?5oMYD{WHVs1fBYB7uv
zpH*5=S&~{5lbKgsQdF8;l3x^)Tx@7y8k3Qqn_8Y<lx?V2P<e~PCO1E&G$+*#Wb<c`
F3ju2GGxPue

diff --git a/examples/example_jupyter/students/cs105/__pycache__/report5.cpython-38.pyc b/examples/example_jupyter/students/cs105/__pycache__/report5.cpython-38.pyc
deleted file mode 100644
index ddd0195a2135f16b209ad7e277b5de3c9a81ffbb..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 2281
zcmWIL<>g{vU|>kNXp!j3%E0g##6iX^3=9ko3=9m#lNcBnQW#Pga~N_NqZo6UqL>&#
ze5M@cT$U&nFq=7tHHtNbA%!`IEs8CLA%!J}A(uUhosl7hHHyQXA%!i4y@er#J(a1M
zIf~PrA%!D_vxOmr6U^swXGq~n;cj6_;ZEghW{%=^XGq~m;ca0^;Z0?1W{%=X<xSzs
zW-97SWl7~}W@u()WJqBSX3*q+339C_(=E23)Pnq?l3SdiA*sbB&WXjTnvA!^Q_B)_
zN)t;`<BPzu@x>*jDXDoSewvK8xSSIUN=l0|^U{reahIp2W*g~c7F6aXC4&q^#_%A}
zV_;xNWr$)-VTfW%WlmvCVVc93!kog=!qUtb#gf9B!q&nN#hSvN!qLJI#g@Vt%%I76
zi#0qoHQUf{CF3o&qSTVoqP%2AB*Q^$P6h@BXHXEUFfcHbFf=pti!d^jFlI3=U@l=<
z$XLS=&l=8P$`Hs9#1O%d!Vt``lF?6-t%#L@f#DWMW-iFrc}cf8{PIgulk)SkZ?WX$
zC#KwDNz2Shy~UK5w36`_b8=4cN`@jK1_p*-an4pTp~b01#W5wN8L2TY`N^fZsd**E
zF{OE#CFw<pDXH-VMVV!ZC8;r~6^Xe8IjO}kMtoLjL1js5QA}oDaY<2Wa!GzsOmeZI
zfoTjRbWQaNDsOQWr<Q~kIOil57lS-j3<^C4CJx3b0dPR*A*3+^f(;fB1`G@gH4F=&
zfsn$O!nlwrg=rxZBdRFVLZ%dEkSHinG+F#!GBGePyaZYJl7oSPL6hYccVcmIYEg-6
zVQFGc5jz6|LlHkH)L3&X(@OJJGTve-PR&UJhYN%d2FY@iq!yRNC#IzEfg%ND90Q{m
zV-+97{V+)k*Mk&-qfrFO^;ygyw}Wy=FoPzOUlnggYEDkRLV12sPKtt&CQFe7$WaKF
zF_$G46-j}_K#_&yC?2rAMX6<}Ma8KgxnhuK85paCkemgT)?~lM5g(tIn420Oe~T+V
zJ~uz5GzY}yiH`?`1XPAQ85BvmsU;ctDMcVh7s-GumIDzW8z8oWS)gzMhaV_hi$Mej
zBNL+l3kM5W6nB;}Ldr5Jj8V)fj8QD9tY}$>EtMUTd72rcIKbJ4{T7#>6D%M56@e_o
z2yaeUYEgq_8!=e6sbR>%nsJIiWgRr@6mf(6$pa#I!LgnP%RkKVc}YbAAPKPF!2~z}
zKw%^aPZOXtEsAg@zJv|R<=~_N@<<Is7DE<eFayLfOt(1W<G~RTA77*jvJ^|~gHtUi
zULcXqRK<&AZ(fonXOTQervivj1QDQ;1Y(*JhzoM~Eslbs{DRb?l1i{?NRf;1pfUpk
zgBZwzpkU!(WMO0h$1)RR5l99jmO&{HTsKId$1+n2a|=ThOA1RcgC^@O&cM>t;*!k#
zJfk8|7RQK5kRUjCK<0q*eGNkv;{qm7Dp|<15LD7L1T$zd`xS|TJR=Uu+RRZrNLkw%
z;w4brV9Pw<bPWm;NboUM3Bett2hLWBDJg!MtXKmPoF%{^gdo6)L4$#T0Tj640uB^b
zMIaH3Fk*()pP*C<t2{tCA(bVCDUB(WHHA5iDV-^bEtNeTl=>kd#s{g)480%)ZWX_C
zu!5n1sRBe;!Sp34As2x{!Ve?zZ?TqSmgJ;@GbY$gQJjU)@Gri_nUSBHTAp8&Z5YK<
zkeHku52-(ju_gyi1_lOoP;vm-2J#{sBinx#<|2?dsD#N)%*>0A*W`<mEG|mcgV!HM
zNX#No8Yuz=LKGjWq9RavS)>DsQE*NKRcA$@5*OldP=W)y9&8&VY7j91W`UyN7KaU_
jbh88Hv0_l-6=39H<Y44r<Y8iA6yOu!5nvTy=U@Z?jNQ#e

diff --git a/examples/example_jupyter/students/cs105/__pycache__/week2.cpython-38.pyc b/examples/example_jupyter/students/cs105/__pycache__/week2.cpython-38.pyc
deleted file mode 100644
index d81c0675c7056e7e11ab8b96d289c407997be566..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 466
zcmWIL<>g{vU|?{asFQe(fq~&Mh=Yuo85kHG7#J9e?HCvsQW&BbQW&EcQ<zeiTNt94
zQkha%QdparQrN^9qL@=zQW={W85vSpQkg+?3VRf53P%cO3qurJ3Rf_LCU=#fvVv<x
zYEg1#ajJrmo{^p*R~2tYYEDkRLV12sPKtt2G82;JAT|g)gY4&EU|^_Ws9_Xg2xib^
z^jpcG$#jb`@fKrJ5hDWw1DLqQU7nhnZKRi3P??u>i#4}0tu#*tq!(le17i^@0|UcL
z5c?&_S1&;xfBA}mfgu@W0?b|z8zc?3l#hXdp@gA^A%(G-DTPTKWHqy25gW)HkUC9>
znVO8Z7*oJ5fDkMU3=AOab4zoyk*w!oU|{gmWWU88AD@z+93Ov+xh$~=?5JC8`K2WV
zr6spm3yL!HN^UV$6@e5(Oaoa2VS&x%u*uC&Da}c>V+R=xav+Nc3nK?JA0r1N2PX?7
E09j2^v;Y7A

diff --git a/examples/example_jupyter/students/cs105/report5.py b/examples/example_jupyter/students/cs105/report5.py
index 6578a46..ff627cd 100644
--- a/examples/example_jupyter/students/cs105/report5.py
+++ b/examples/example_jupyter/students/cs105/report5.py
@@ -2,7 +2,7 @@ from src.unitgrade.framework import Report,  UTestCase
 from src.unitgrade import evaluate_report_student
 import homework1
 import importnb
-from src.unitgrade.framework import Capturing2
+from unitgrade.utils import Capturing2
 
 file = 'week2.ipynb'
 class Week1(UTestCase):
diff --git a/examples/example_jupyter/students/cs105/report5_grade.py b/examples/example_jupyter/students/cs105/report5_grade.py
index 8fef99e..3b4747f 100644
--- a/examples/example_jupyter/students/cs105/report5_grade.py
+++ b/examples/example_jupyter/students/cs105/report5_grade.py
@@ -1,338 +1,3 @@
-import numpy as np
-from tabulate import tabulate
-from datetime import datetime
-import pyfiglet
-import unittest
-import inspect
-import os
-import argparse
-import time
-
-parser = argparse.ArgumentParser(description='Evaluate your report.', epilog="""Example: 
-To run all tests in a report: 
-
-> python assignment1_dp.py
-
-To run only question 2 or question 2.1
-
-> python assignment1_dp.py -q 2
-> python assignment1_dp.py -q 2.1
-
-Note this scripts does not grade your report. To grade your report, use:
-
-> python report1_grade.py
-
-Finally, note that if your report is part of a module (package), and the report script requires part of that package, the -m option for python may be useful.
-For instance, if the report file is in Documents/course_package/report3_complete.py, and `course_package` is a python package, then change directory to 'Documents/` and run:
-
-> python -m course_package.report1
-
-see https://docs.python.org/3.9/using/cmdline.html
-""", formatter_class=argparse.RawTextHelpFormatter)
-parser.add_argument('-q', nargs='?', type=str, default=None, help='Only evaluate this question (e.g.: -q 2)')
-parser.add_argument('--showexpected',  action="store_true",  help='Show the expected/desired result')
-parser.add_argument('--showcomputed',  action="store_true",  help='Show the answer your code computes')
-parser.add_argument('--unmute',  action="store_true",  help='Show result of print(...) commands in code')
-parser.add_argument('--passall',  action="store_true",  help='Automatically pass all tests. Useful when debugging.')
-parser.add_argument('--noprogress',  action="store_true",  help='Disable progress bars.')
-
-def evaluate_report_student(report, question=None, qitem=None, unmute=None, passall=None, ignore_missing_file=False, show_tol_err=False):
-    args = parser.parse_args()
-    if question is None and args.q is not None:
-        question = args.q
-        if "." in question:
-            question, qitem = [int(v) for v in question.split(".")]
-        else:
-            question = int(question)
-
-    if hasattr(report, "computed_answer_file") and not os.path.isfile(report.computed_answers_file) and not ignore_missing_file:
-        raise Exception("> Error: The pre-computed answer file", os.path.abspath(report.computed_answers_file), "does not exist. Check your package installation")
-
-    if unmute is None:
-        unmute = args.unmute
-    if passall is None:
-        passall = args.passall
-
-
-    results, table_data = evaluate_report(report, question=question, show_progress_bar=not unmute and not args.noprogress, qitem=qitem, verbose=False, passall=passall, show_expected=args.showexpected, show_computed=args.showcomputed,unmute=unmute,
-                                          show_tol_err=show_tol_err)
-
-
-    if question is None:
-        print("Provisional evaluation")
-        tabulate(table_data)
-        table = table_data
-        print(tabulate(table))
-        print(" ")
-
-    fr = inspect.getouterframes(inspect.currentframe())[1].filename
-    gfile = os.path.basename(fr)[:-3] + "_grade.py"
-    if os.path.exists(gfile):
-        print("Note your results have not yet been registered. \nTo register your results, please run the file:")
-        print(">>>", gfile)
-        print("In the same manner as you ran this file.")
-
-
-    return results
-
-
-def upack(q):
-    # h = zip([(i['w'], i['possible'], i['obtained']) for i in q.values()])
-    h =[(i['w'], i['possible'], i['obtained']) for i in q.values()]
-    h = np.asarray(h)
-    return h[:,0], h[:,1], h[:,2],
-
-class UnitgradeTextRunner(unittest.TextTestRunner):
-    def __init__(self, *args, **kwargs):
-        super().__init__(*args, **kwargs)
-
-class SequentialTestLoader(unittest.TestLoader):
-    def getTestCaseNames(self, testCaseClass):
-        test_names = super().getTestCaseNames(testCaseClass)
-        # testcase_methods = list(testCaseClass.__dict__.keys())
-        ls = []
-        for C in testCaseClass.mro():
-            if issubclass(C, unittest.TestCase):
-                ls = list(C.__dict__.keys()) + ls
-        testcase_methods = ls
-        test_names.sort(key=testcase_methods.index)
-        return test_names
-
-def evaluate_report(report, question=None, qitem=None, passall=False, verbose=False,  show_expected=False, show_computed=False,unmute=False, show_help_flag=True, silent=False,
-                    show_progress_bar=True,
-                    show_tol_err=False,
-                    big_header=True):
-
-    from src.unitgrade.version import __version__
-    now = datetime.now()
-    if big_header:
-        ascii_banner = pyfiglet.figlet_format("UnitGrade", font="doom")
-        b = "\n".join( [l for l in ascii_banner.splitlines() if len(l.strip()) > 0] )
-    else:
-        b = "Unitgrade"
-    dt_string = now.strftime("%d/%m/%Y %H:%M:%S")
-    print(b + " v" + __version__ + ", started: " + dt_string+ "\n")
-    # print("Started: " + dt_string)
-    s = report.title
-    if hasattr(report, "version") and report.version is not None:
-        s += " version " + report.version
-    print(s, "(use --help for options)" if show_help_flag else "")
-    # print(f"Loaded answers from: ", report.computed_answers_file, "\n")
-    table_data = []
-    t_start = time.time()
-    score = {}
-    loader = SequentialTestLoader()
-
-    for n, (q, w) in enumerate(report.questions):
-        if question is not None and n+1 != question:
-            continue
-        suite = loader.loadTestsFromTestCase(q)
-        qtitle = q.question_title() if hasattr(q, 'question_title') else q.__qualname__
-        q_title_print = "Question %i: %s"%(n+1, qtitle)
-        print(q_title_print, end="")
-        q.possible = 0
-        q.obtained = 0
-        q_ = {} # Gather score in this class.
-        from src.unitgrade.framework import UTextTestRunner
-        UTextResult.q_title_print = q_title_print # Hacky
-        UTextResult.show_progress_bar = show_progress_bar # Hacky.
-        UTextResult.number = n
-        UTextResult.nL = report.nL
-
-        res = UTextTestRunner(verbosity=2, resultclass=UTextResult).run(suite)
-
-        possible = res.testsRun
-        obtained = len(res.successes)
-
-        assert len(res.successes) +  len(res.errors) + len(res.failures) == res.testsRun
-
-        obtained = int(w * obtained * 1.0 / possible ) if possible > 0 else 0
-        score[n] = {'w': w, 'possible': w, 'obtained': obtained, 'items': q_, 'title': qtitle}
-        q.obtained = obtained
-        q.possible = possible
-
-        s1 = f" * q{n+1})   Total"
-        s2 = f" {q.obtained}/{w}"
-        print(s1 + ("."* (report.nL-len(s1)-len(s2) )) + s2 )
-        print(" ")
-        table_data.append([f"q{n+1}) Total", f"{q.obtained}/{w}"])
-
-    ws, possible, obtained = upack(score)
-    possible = int( msum(possible) )
-    obtained = int( msum(obtained) ) # Cast to python int
-    report.possible = possible
-    report.obtained = obtained
-    now = datetime.now()
-    dt_string = now.strftime("%H:%M:%S")
-
-    dt = int(time.time()-t_start)
-    minutes = dt//60
-    seconds = dt - minutes*60
-    plrl = lambda i, s: str(i) + " " + s + ("s" if i != 1 else "")
-
-    from src.unitgrade.framework import dprint
-    dprint(first = "Total points at "+ dt_string + " (" + plrl(minutes, "minute") + ", "+ plrl(seconds, "second") +")",
-           last=""+str(report.obtained)+"/"+str(report.possible), nL = report.nL)
-
-    # print(f"Completed at "+ dt_string + " (" + plrl(minutes, "minute") + ", "+ plrl(seconds, "second") +"). Total")
-
-    table_data.append(["Total", ""+str(report.obtained)+"/"+str(report.possible) ])
-    results = {'total': (obtained, possible), 'details': score}
-    return results, table_data
-
-
-import bz2
-import pickle
-import os
-
-
-def bzwrite(json_str, token): # to get around obfuscation issues
-    with getattr(bz2, 'open')(token, "wt") as f:
-        f.write(json_str)
-
-def gather_imports(imp):
-    resources = {}
-    m = imp
-    # for m in pack_imports:
-    # print(f"*** {m.__name__}")
-    f = m.__file__
-    # dn = os.path.dirname(f)
-    # top_package = os.path.dirname(__import__(m.__name__.split('.')[0]).__file__)
-    # top_package = str(__import__(m.__name__.split('.')[0]).__path__)
-
-    if hasattr(m, '__file__') and not hasattr(m, '__path__'):  # Importing a simple file: m.__class__.__name__ == 'module' and False:
-        top_package = os.path.dirname(m.__file__)
-        module_import = True
-    else:
-        top_package = __import__(m.__name__.split('.')[0]).__path__._path[0]
-        module_import = False
-
-    # top_package = os.path.dirname(__import__(m.__name__.split('.')[0]).__file__)
-    # top_package = os.path.dirname(top_package)
-    import zipfile
-    # import strea
-    # zipfile.ZipFile
-    import io
-    # file_like_object = io.BytesIO(my_zip_data)
-    zip_buffer = io.BytesIO()
-    with zipfile.ZipFile(zip_buffer, 'w') as zip:
-        # zip.write()
-        for root, dirs, files in os.walk(top_package):
-            for file in files:
-                if file.endswith(".py"):
-                    fpath = os.path.join(root, file)
-                    v = os.path.relpath(os.path.join(root, file), os.path.dirname(top_package) if not module_import else top_package)
-                    zip.write(fpath, v)
-
-    resources['zipfile'] = zip_buffer.getvalue()
-    resources['top_package'] = top_package
-    resources['module_import'] = module_import
-    return resources, top_package
-
-    if f.endswith("__init__.py"):
-        for root, dirs, files in os.walk(os.path.dirname(f)):
-            for file in files:
-                if file.endswith(".py"):
-                    # print(file)
-                    # print()
-                    v = os.path.relpath(os.path.join(root, file), top_package)
-                    with open(os.path.join(root, file), 'r') as ff:
-                        resources[v] = ff.read()
-    else:
-        v = os.path.relpath(f, top_package)
-        with open(f, 'r') as ff:
-            resources[v] = ff.read()
-    return resources
-
-import argparse
-parser = argparse.ArgumentParser(description='Evaluate your report.', epilog="""Use this script to get the score of your report. Example:
-
-> python report1_grade.py
-
-Finally, note that if your report is part of a module (package), and the report script requires part of that package, the -m option for python may be useful.
-For instance, if the report file is in Documents/course_package/report3_complete.py, and `course_package` is a python package, then change directory to 'Documents/` and run:
-
-> python -m course_package.report1
-
-see https://docs.python.org/3.9/using/cmdline.html
-""", formatter_class=argparse.RawTextHelpFormatter)
-parser.add_argument('--noprogress',  action="store_true",  help='Disable progress bars')
-parser.add_argument('--autolab',  action="store_true",  help='Show Autolab results')
-
-def gather_upload_to_campusnet(report, output_dir=None):
-    n = report.nL
-    args = parser.parse_args()
-    results, table_data = evaluate_report(report, show_help_flag=False, show_expected=False, show_computed=False, silent=True,
-                                          show_progress_bar=not args.noprogress,
-                                          big_header=not args.autolab)
-    # print(" ")
-    # print("="*n)
-    # print("Final evaluation")
-    # print(tabulate(table_data))
-    # also load the source code of missing files...
-
-    sources = {}
-    print("")
-    if not args.autolab:
-        if len(report.individual_imports) > 0:
-            print("By uploading the .token file, you verify the files:")
-            for m in report.individual_imports:
-                print(">", m.__file__)
-            print("Are created/modified individually by you in agreement with DTUs exam rules")
-            report.pack_imports += report.individual_imports
-
-        if len(report.pack_imports) > 0:
-            print("Including files in upload...")
-            for k, m in enumerate(report.pack_imports):
-                nimp, top_package = gather_imports(m)
-                _, report_relative_location, module_import = report._import_base_relative()
-
-                # report_relative_location = os.path.relpath(inspect.getfile(report.__class__), top_package)
-                nimp['report_relative_location'] = report_relative_location
-                nimp['report_module_specification'] = module_import
-                nimp['name'] = m.__name__
-                sources[k] = nimp
-                # if len([k for k in nimp if k not in sources]) > 0:
-                print(f" * {m.__name__}")
-                # sources = {**sources, **nimp}
-    results['sources'] = sources
-
-    if output_dir is None:
-        output_dir = os.getcwd()
-
-    payload_out_base = report.__class__.__name__ + "_handin"
-
-    obtain, possible = results['total']
-    vstring = "_v"+report.version if report.version is not None else ""
-
-    token = "%s_%i_of_%i%s.token"%(payload_out_base, obtain, possible,vstring)
-    token = os.path.normpath(os.path.join(output_dir, token))
-
-
-    with open(token, 'wb') as f:
-        pickle.dump(results, f)
-
-    if not args.autolab:
-        print(" ")
-        print("To get credit for your results, please upload the single unmodified file: ")
-        print(">", token)
-        # print("To campusnet without any modifications.")
-
-        # print("Now time for some autolab fun")
-
-def source_instantiate(name, report1_source, payload):
-    eval("exec")(report1_source, globals())
-    pl = pickle.loads(bytes.fromhex(payload))
-    report = eval(name)(payload=pl, strict=True)
-    # report.set_payload(pl)
-    return report
-
-
-
-report1_source = 'import os\nimport lzma\nimport pickle\n\n# DONT\'t import stuff here since install script requires __version__\n\n# def cache_write(object, file_name, verbose=True):\n#     # raise Exception("bad")\n#     # import compress_pickle\n#     dn = os.path.dirname(file_name)\n#     if not os.path.exists(dn):\n#         os.mkdir(dn)\n#     if verbose: print("Writing cache...", file_name)\n#     with lzma.open(file_name, \'wb\', ) as f:\n#         pickle.dump(object, f)\n#     if verbose: print("Done!")\n#\n#\n# def cache_exists(file_name):\n#     # file_name = cn_(file_name) if cache_prefix else file_name\n#     return os.path.exists(file_name)\n#\n#\n# def cache_read(file_name):\n#     # import compress_pickle # Import here because if you import in top the __version__ tag will fail.\n#     # file_name = cn_(file_name) if cache_prefix else file_name\n#     if os.path.exists(file_name):\n#         try:\n#             with lzma.open(file_name, \'rb\') as f:\n#                 return pickle.load(f)\n#         except Exception as e:\n#             print("Tried to load a bad pickle file at", file_name)\n#             print("If the file appears to be automatically generated, you can try to delete it, otherwise download a new version")\n#             print(e)\n#             # return pickle.load(f)\n#     else:\n#         return None\n\n\n"""\ngit add . && git commit -m "Options" && git push &&  pip install git+ssh://git@gitlab.compute.dtu.dk/tuhe/unitgrade_v1.git --upgrade\n"""\nimport numpy as np\nimport sys\nimport re\nimport threading\nimport tqdm\nimport pickle\nimport os\nfrom io import StringIO\nimport io\nfrom unittest.runner import _WritelnDecorator\nfrom typing import Any\nimport inspect\nimport textwrap\nimport colorama\nfrom colorama import Fore\nfrom functools import _make_key, RLock\nfrom collections import namedtuple\nimport unittest\nimport time\n\n_CacheInfo = namedtuple("CacheInfo", ["hits", "misses", "maxsize", "currsize"])\n\ncolorama.init(autoreset=True)  # auto resets your settings after every output\n\ndef gprint(s):\n    print(f"{Fore.GREEN}{s}")\n\nmyround = lambda x: np.round(x)  # required.\nmsum = lambda x: sum(x)\nmfloor = lambda x: np.floor(x)\n\n\ndef setup_dir_by_class(C, base_dir):\n    name = C.__class__.__name__\n    return base_dir, name\n\n\nclass Logger(object):\n    def __init__(self, buffer):\n        assert False\n        self.terminal = sys.stdout\n        self.log = buffer\n\n    def write(self, message):\n        self.terminal.write(message)\n        self.log.write(message)\n\n    def flush(self):\n        # this flush method is needed for python 3 compatibility.\n        pass\n\n\nclass Capturing(list):\n    def __init__(self, *args, stdout=None, unmute=False, **kwargs):\n        self._stdout = stdout\n        self.unmute = unmute\n        super().__init__(*args, **kwargs)\n\n    def __enter__(self, capture_errors=True):  # don\'t put arguments here.\n        self._stdout = sys.stdout if self._stdout == None else self._stdout\n        self._stringio = StringIO()\n        if self.unmute:\n            sys.stdout = Logger(self._stringio)\n        else:\n            sys.stdout = self._stringio\n\n        if capture_errors:\n            self._sterr = sys.stderr\n            sys.sterr = StringIO()  # memory hole it\n        self.capture_errors = capture_errors\n        return self\n\n    def __exit__(self, *args):\n        self.extend(self._stringio.getvalue().splitlines())\n        del self._stringio  # free up some memory\n        sys.stdout = self._stdout\n        if self.capture_errors:\n            sys.sterr = self._sterr\n\n\nclass Capturing2(Capturing):\n    def __exit__(self, *args):\n        lines = self._stringio.getvalue().splitlines()\n        txt = "\\n".join(lines)\n        numbers = extract_numbers(txt)\n        self.extend(lines)\n        del self._stringio  # free up some memory\n        sys.stdout = self._stdout\n        if self.capture_errors:\n            sys.sterr = self._sterr\n\n        self.output = txt\n        self.numbers = numbers\n\n\n# @classmethod\n# class OrderedClassMembers(type):\n#     def __prepare__(self, name, bases):\n#         assert False\n#         return collections.OrderedDict()\n#\n#     def __new__(self, name, bases, classdict):\n#         ks = list(classdict.keys())\n#         for b in bases:\n#             ks += b.__ordered__\n#         classdict[\'__ordered__\'] = [key for key in ks if key not in (\'__module__\', \'__qualname__\')]\n#         return type.__new__(self, name, bases, classdict)\n\n\nclass Report:\n    title = "report title"\n    version = None\n    questions = []\n    pack_imports = []\n    individual_imports = []\n    nL = 120  # Maximum line width\n\n    @classmethod\n    def reset(cls):\n        for (q, _) in cls.questions:\n            if hasattr(q, \'reset\'):\n                q.reset()\n\n    @classmethod\n    def mfile(clc):\n        return inspect.getfile(clc)\n\n    def _file(self):\n        return inspect.getfile(type(self))\n\n    def _import_base_relative(self):\n        if hasattr(self.pack_imports[0], \'__path__\'):\n            root_dir = self.pack_imports[0].__path__._path[0]\n        else:\n            root_dir = self.pack_imports[0].__file__\n\n        root_dir = os.path.dirname(root_dir)\n        relative_path = os.path.relpath(self._file(), root_dir)\n        modules = os.path.normpath(relative_path[:-3]).split(os.sep)\n        return root_dir, relative_path, modules\n\n    def __init__(self, strict=False, payload=None):\n        working_directory = os.path.abspath(os.path.dirname(self._file()))\n        self.wdir, self.name = setup_dir_by_class(self, working_directory)\n        # self.computed_answers_file = os.path.join(self.wdir, self.name + "_resources_do_not_hand_in.dat")\n        for (q, _) in self.questions:\n            q.nL = self.nL  # Set maximum line length.\n\n        if payload is not None:\n            self.set_payload(payload, strict=strict)\n\n    def main(self, verbosity=1):\n        # Run all tests using standard unittest (nothing fancy).\n        loader = unittest.TestLoader()\n        for q, _ in self.questions:\n            start = time.time()  # A good proxy for setup time is to\n            suite = loader.loadTestsFromTestCase(q)\n            unittest.TextTestRunner(verbosity=verbosity).run(suite)\n            total = time.time() - start\n            q.time = total\n\n    def _setup_answers(self, with_coverage=False):\n        if with_coverage:\n            for q, _ in self.questions:\n                q._with_coverage = True\n                q._report = self\n\n        self.main()  # Run all tests in class just to get that out of the way...\n        report_cache = {}\n        for q, _ in self.questions:\n            # print(self.questions)\n            if hasattr(q, \'_save_cache\'):\n                q()._save_cache()\n                print("q is", q())\n                q()._cache_put(\'time\', q.time) # = q.time\n                report_cache[q.__qualname__] = q._cache2\n            else:\n                report_cache[q.__qualname__] = {\'no cache see _setup_answers in framework.py\': True}\n        if with_coverage:\n            for q, _ in self.questions:\n                q._with_coverage = False\n        return report_cache\n\n    def set_payload(self, payloads, strict=False):\n        for q, _ in self.questions:\n            q._cache = payloads[q.__qualname__]\n\n\ndef rm_progress_bar(txt):\n    # More robust version. Apparently length of bar can depend on various factors, so check for order of symbols.\n    nlines = []\n    for l in txt.splitlines():\n        pct = l.find("%")\n        ql = False\n        if pct > 0:\n            i = l.find("|", pct + 1)\n            if i > 0 and l.find("|", i + 1) > 0:\n                ql = True\n        if not ql:\n            nlines.append(l)\n    return "\\n".join(nlines)\n\n\ndef extract_numbers(txt):\n    # txt = rm_progress_bar(txt)\n    numeric_const_pattern = r\'[-+]? (?: (?: \\d* \\. \\d+ ) | (?: \\d+ \\.? ) )(?: [Ee] [+-]? \\d+ ) ?\'\n    rx = re.compile(numeric_const_pattern, re.VERBOSE)\n    all = rx.findall(txt)\n    all = [float(a) if (\'.\' in a or "e" in a) else int(a) for a in all]\n    if len(all) > 500:\n        print(txt)\n        raise Exception("unitgrade_v1.unitgrade_v1.py: Warning, too many numbers!", len(all))\n    return all\n\n\nclass ActiveProgress():\n    def __init__(self, t, start=True, title="my progress bar", show_progress_bar=True, file=None):\n        if file == None:\n            file = sys.stdout\n        self.file = file\n        self.t = t\n        self._running = False\n        self.title = title\n        self.dt = 0.01\n        self.n = int(np.round(self.t / self.dt))\n        self.show_progress_bar = show_progress_bar\n        self.pbar = None\n\n        if start:\n            self.start()\n\n    def start(self):\n        self._running = True\n        if self.show_progress_bar:\n            self.thread = threading.Thread(target=self.run)\n            self.thread.start()\n        self.time_started = time.time()\n\n    def terminate(self):\n        if not self._running:\n            raise Exception("Stopping a stopped progress bar. ")\n        self._running = False\n        if self.show_progress_bar:\n            self.thread.join()\n        if self.pbar is not None:\n            self.pbar.update(1)\n            self.pbar.close()\n            self.pbar = None\n\n        self.file.flush()\n        return time.time() - self.time_started\n\n    def run(self):\n        self.pbar = tqdm.tqdm(total=self.n, file=self.file, position=0, leave=False, desc=self.title, ncols=100,\n                              bar_format=\'{l_bar}{bar}| [{elapsed}<{remaining}]\')\n\n        for _ in range(self.n - 1):  # Don\'t terminate completely; leave bar at 99% done until terminate.\n            if not self._running:\n                self.pbar.close()\n                self.pbar = None\n                break\n\n            time.sleep(self.dt)\n            self.pbar.update(1)\n\ndef dprint(first, last, nL, extra = "", file=None, dotsym=\'.\', color=\'white\'):\n    if file == None:\n        file = sys.stdout\n\n    # ss = self.item_title_print\n    # state = "PASS" if success else "FAILED"\n    dot_parts = (dotsym * max(0, nL - len(last) - len(first)))\n    # if self.show_progress_bar or True:\n    print(first + dot_parts, end="", file=file)\n    # else:\n    # print(dot_parts, end="", file=self.cc.file)\n    last += extra\n    # if tsecs >= 0.5:\n    #     state += " (" + str(tsecs) + " seconds)"\n    print(last, file=file)\n\n\nclass UTextResult(unittest.TextTestResult):\n    nL = 80\n    number = -1  # HAcky way to set question number.\n    show_progress_bar = True\n    cc = None\n\n    def __init__(self, stream, descriptions, verbosity):\n        super().__init__(stream, descriptions, verbosity)\n        self.successes = []\n\n    def printErrors(self) -> None:\n        self.printErrorList(\'ERROR\', self.errors)\n        self.printErrorList(\'FAIL\', self.failures)\n\n    def addError(self, test, err):\n        super(unittest.TextTestResult, self).addFailure(test, err)\n        self.cc_terminate(success=False)\n\n    def addFailure(self, test, err):\n        super(unittest.TextTestResult, self).addFailure(test, err)\n        self.cc_terminate(success=False)\n\n    def addSuccess(self, test: unittest.case.TestCase) -> None:\n        self.successes.append(test)\n        self.cc_terminate()\n\n    def cc_terminate(self, success=True):\n        if self.show_progress_bar or True:\n            tsecs = np.round(self.cc.terminate(), 2)\n            self.cc.file.flush()\n            ss = self.item_title_print\n\n            state = "PASS" if success else "FAILED"\n\n            dot_parts = (\'.\' * max(0, self.nL - len(state) - len(ss)))\n            if self.show_progress_bar or True:\n                print(self.item_title_print + dot_parts, end="", file=self.cc.file)\n            else:\n                print(dot_parts, end="", file=self.cc.file)\n\n            if tsecs >= 0.5:\n                state += " (" + str(tsecs) + " seconds)"\n            print(state, file=self.cc.file)\n\n    def startTest(self, test):\n        # j =self.testsRun\n        self.testsRun += 1\n        # item_title = self.getDescription(test)\n        item_title = test.shortDescription()  # Better for printing (get from cache).\n        if item_title == None:\n            # For unittest framework where getDescription may return None.\n            item_title = self.getDescription(test)\n        self.item_title_print = " * q%i.%i) %s" % (UTextResult.number + 1, self.testsRun, item_title)\n        estimated_time = 10\n        if self.show_progress_bar or True:\n            self.cc = ActiveProgress(t=estimated_time, title=self.item_title_print, show_progress_bar=self.show_progress_bar, file=sys.stdout)\n        else:\n            print(self.item_title_print + (\'.\' * max(0, self.nL - 4 - len(self.item_title_print))), end="")\n\n        self._test = test\n        self._stdout = sys.stdout\n        sys.stdout = io.StringIO()\n\n    def stopTest(self, test):\n        sys.stdout = self._stdout\n        super().stopTest(test)\n\n    def _setupStdout(self):\n        if self._previousTestClass == None:\n            total_estimated_time = 1\n            if hasattr(self.__class__, \'q_title_print\'):\n                q_title_print = self.__class__.q_title_print\n            else:\n                q_title_print = "<unnamed test. See unitgrade_v1.py>"\n\n            cc = ActiveProgress(t=total_estimated_time, title=q_title_print, show_progress_bar=self.show_progress_bar)\n            self.cc = cc\n\n    def _restoreStdout(self):  # Used when setting up the test.\n        if self._previousTestClass is None:\n            q_time = self.cc.terminate()\n            q_time = np.round(q_time, 2)\n            sys.stdout.flush()\n            if self.show_progress_bar:\n                print(self.cc.title, end="")\n            print(" " * max(0, self.nL - len(self.cc.title)) + (" (" + str(q_time) + " seconds)" if q_time >= 0.5 else ""))\n\n\nclass UTextTestRunner(unittest.TextTestRunner):\n    def __init__(self, *args, **kwargs):\n        stream = io.StringIO()\n        super().__init__(*args, stream=stream, **kwargs)\n\n    def _makeResult(self):\n        # stream = self.stream # not you!\n        stream = sys.stdout\n        stream = _WritelnDecorator(stream)\n        return self.resultclass(stream, self.descriptions, self.verbosity)\n\n\ndef cache(foo, typed=False):\n    """ Magic cache wrapper\n    https://github.com/python/cpython/blob/main/Lib/functools.py\n    """\n    maxsize = None\n    def wrapper(self, *args, **kwargs):\n        key = (self.cache_id(), ("@cache", foo.__name__, _make_key(args, kwargs, typed)))\n        if not self._cache_contains(key):\n            value = foo(self, *args, **kwargs)\n            self._cache_put(key, value)\n        else:\n            value = self._cache_get(key)\n        return value\n\n    return wrapper\n\n\ndef get_hints(ss):\n    if ss == None:\n        return None\n    try:\n        ss = textwrap.dedent(ss)\n        ss = ss.replace(\'\'\'"""\'\'\', "").strip()\n        hints = ["hints:", ]\n        j = np.argmax([ss.lower().find(h) for h in hints])\n        h = hints[j]\n        ss = ss[ss.find(h) + len(h) + 1:]\n        ss = "\\n".join([l for l in ss.split("\\n") if not l.strip().startswith(":")])\n        ss = textwrap.dedent(ss)\n        ss = ss.strip()\n        return ss\n    except Exception as e:\n        print("bad hints", ss, e)\n\n\nclass UTestCase(unittest.TestCase):\n    _outcome = None  # A dictionary which stores the user-computed outcomes of all the tests. This differs from the cache.\n    _cache = None  # Read-only cache. Ensures method always produce same result.\n    _cache2 = None  # User-written cache.\n    _with_coverage = False\n    _report = None  # The report used. This is very, very hacky and should always be None. Don\'t rely on it!\n\n    def capture(self):\n        if hasattr(self, \'_stdout\') and self._stdout is not None:\n            file = self._stdout\n        else:\n            # self._stdout = sys.stdout\n            # sys._stdout = io.StringIO()\n            file = sys.stdout\n        return Capturing2(stdout=file)\n\n    @classmethod\n    def question_title(cls):\n        """ Return the question title """\n        return cls.__doc__.strip().splitlines()[0].strip() if cls.__doc__ is not None else cls.__qualname__\n\n    @classmethod\n    def reset(cls):\n        print("Warning, I am not sure UTestCase.reset() is needed anymore and it seems very hacky.")\n        cls._outcome = None\n        cls._cache = None\n        cls._cache2 = None\n\n    def _callSetUp(self):\n        if self._with_coverage:\n            if not hasattr(self._report, \'covcache\'):\n                self._report.covcache = {}\n            import coverage\n            self.cov = coverage.Coverage()\n            self.cov.start()\n        self.setUp()\n\n    def _callTearDown(self):\n        self.tearDown()\n        if self._with_coverage:\n            from pathlib import Path\n            from snipper import snipper_main\n            self.cov.stop()\n            data = self.cov.get_data()\n            base, _, _ = self._report._import_base_relative()\n            for file in data.measured_files():\n                file = os.path.normpath(file)\n                root = Path(base)\n                child = Path(file)\n                if root in child.parents:\n                    with open(child, \'r\') as f:\n                        s = f.read()\n                    lines = s.splitlines()\n                    garb = \'GARBAGE\'\n\n                    lines2 = snipper_main.censor_code(lines, keep=True)\n                    assert len(lines) == len(lines2)\n\n                    for l in data.contexts_by_lineno(file):\n                        if lines2[l].strip() == garb:\n                            if self.cache_id() not in self._report.covcache:\n                                self._report.covcache[self.cache_id()] = {}\n\n                            rel = os.path.relpath(child, root)\n                            cc = self._report.covcache[self.cache_id()]\n                            j = 0\n                            for j in range(l, -1, -1):\n                                if "def" in lines2[j] or "class" in lines2[j]:\n                                    break\n                            from snipper.legacy import gcoms\n                            fun = lines2[j]\n                            comments, _ = gcoms("\\n".join(lines2[j:l]))\n                            if rel not in cc:\n                                cc[rel] = {}\n                            cc[rel][fun] = (l, "\\n".join(comments))\n                            self._cache_put((self.cache_id(), \'coverage\'), self._report.covcache)\n\n    def shortDescriptionStandard(self):\n        sd = super().shortDescription()\n        if sd is None:\n            sd = self._testMethodName\n        return sd\n\n    def shortDescription(self):\n        sd = self.shortDescriptionStandard()\n        title = self._cache_get((self.cache_id(), \'title\'), sd)\n        return title if title is not None else sd\n\n    @property\n    def title(self):\n        return self.shortDescription()\n\n    @title.setter\n    def title(self, value):\n        self._cache_put((self.cache_id(), \'title\'), value)\n\n    def _get_outcome(self):\n        if not (self.__class__, \'_outcome\') or self.__class__._outcome is None:\n            self.__class__._outcome = {}\n        return self.__class__._outcome\n\n    def _callTestMethod(self, testMethod):\n        t = time.time()\n        self._ensure_cache_exists()  # Make sure cache is there.\n        if self._testMethodDoc is not None:\n            self._cache_put((self.cache_id(), \'title\'), self.shortDescriptionStandard())\n\n        self._cache2[(self.cache_id(), \'assert\')] = {}\n        res = testMethod()\n        elapsed = time.time() - t\n        self._get_outcome()[self.cache_id()] = res\n        self._cache_put((self.cache_id(), "time"), elapsed)\n\n    def cache_id(self):\n        c = self.__class__.__qualname__\n        m = self._testMethodName\n        return c, m\n\n    def __init__(self, *args, **kwargs):\n        super().__init__(*args, **kwargs)\n        self._load_cache()\n        self._assert_cache_index = 0\n\n    def _ensure_cache_exists(self):\n        if not hasattr(self.__class__, \'_cache\') or self.__class__._cache == None:\n            self.__class__._cache = dict()\n        if not hasattr(self.__class__, \'_cache2\') or self.__class__._cache2 == None:\n            self.__class__._cache2 = dict()\n\n    def _cache_get(self, key, default=None):\n        self._ensure_cache_exists()\n        return self.__class__._cache.get(key, default)\n\n    def _cache_put(self, key, value):\n        self._ensure_cache_exists()\n        self.__class__._cache2[key] = value\n\n    def _cache_contains(self, key):\n        self._ensure_cache_exists()\n        return key in self.__class__._cache\n\n    def wrap_assert(self, assert_fun, first, *args, **kwargs):\n        # sys.stdout = self._stdout\n        key = (self.cache_id(), \'assert\')\n        if not self._cache_contains(key):\n            print("Warning, framework missing", key)\n            self.__class__._cache[\n                key] = {}  # A new dict. We manually insert it because we have to use that the dict is mutable.\n        cache = self._cache_get(key)\n        id = self._assert_cache_index\n        if not id in cache:\n            print("Warning, framework missing cache index", key, "id =", id)\n        _expected = cache.get(id, f"Key {id} not found in cache; framework files missing. Please run deploy()")\n\n        # The order of these calls is important. If the method assert fails, we should still store the correct result in cache.\n        cache[id] = first\n        self._cache_put(key, cache)\n        self._assert_cache_index += 1\n        assert_fun(first, _expected, *args, **kwargs)\n\n    def assertEqualC(self, first: Any, msg: Any = ...) -> None:\n        self.wrap_assert(self.assertEqual, first, msg)\n\n    def _cache_file(self):\n        # The filename-directory stuff is a bit tricky but this seems robust.\n        return os.path.dirname(inspect.getabsfile(type(self))) + "/unitgrade_v1/" + self.__class__.__name__ + ".pkl"\n\n    def _save_cache(self):\n        # get the class name (i.e. what to save to).\n        cfile = self._cache_file()\n        if not os.path.isdir(os.path.dirname(cfile)):\n            os.makedirs(os.path.dirname(cfile))\n\n        if hasattr(self.__class__, \'_cache2\'):\n            with open(cfile, \'wb\') as f:\n                pickle.dump(self.__class__._cache2, f)\n\n    # But you can also set cache explicitly.\n    def _load_cache(self):\n        if self._cache is not None:  # Cache already loaded. We will not load it twice.\n            return\n            # raise Exception("Loaded cache which was already set. What is going on?!")\n        cfile = self._cache_file()\n        if os.path.exists(cfile):\n            try:\n                # print("\\ncache file", cfile)\n                with open(cfile, \'rb\') as f:\n                    data = pickle.load(f)\n                self.__class__._cache = data\n            except Exception as e:\n                print("Bad cache", cfile)\n                print(e)\n        else:\n            print("Warning! data file not found", cfile)\n\n    def _feedErrorsToResult(self, result, errors):\n        """ Use this to show hints on test failure. """\n        if not isinstance(result, UTextResult):\n            er = [e for e, v in errors if v != None]\n\n            if len(er) > 0:\n                hints = []\n                key = (self.cache_id(), \'coverage\')\n                if self._cache_contains(key):\n                    CC = self._cache_get(key)\n                    for id in CC:\n                        if id == self.cache_id():\n                            cl, m = id\n                            gprint(f"> An error occured while solving: {cl}.{m}. The files/methods you need to edit are:")  # For the test {id} in {file} you should edit:")\n                            for file in CC[id]:\n                                rec = CC[id][file]\n                                gprint(f">   * {file}")\n                                for l in rec:\n                                    _, comments = CC[id][file][l]\n                                    hint = get_hints(comments)\n\n                                    if hint != None:\n                                        hints.append(hint)\n                                    gprint(f">      - {l}")\n\n                er = er[0]\n                doc = er._testMethodDoc\n                if doc is not None:\n                    hint = get_hints(er._testMethodDoc)\n                    if hint is not None:\n                        hints = [hint] + hints\n                if len(hints) > 0:\n                    gprint("> Hints:")\n                    gprint(textwrap.indent("\\n".join(hints), ">   "))\n\n        super()._feedErrorsToResult(result, errors)\n\n    def startTestRun(self):\n        # print("asdfsdaf 11", file=sys.stderr)\n        super().startTestRun()\n        # print("asdfsdaf")\n\n    def _callTestMethod(self, method):\n        # print("asdfsdaf")\n        super()._callTestMethod(method)\n\n\ndef hide(func):\n    return func\n\n\ndef makeRegisteringDecorator(foreignDecorator):\n    """\n        Returns a copy of foreignDecorator, which is identical in every\n        way(*), except also appends a .decorator property to the callable it\n        spits out.\n    """\n\n    def newDecorator(func):\n        # Call to newDecorator(method)\n        # Exactly like old decorator, but output keeps track of what decorated it\n        R = foreignDecorator(func)  # apply foreignDecorator, like call to foreignDecorator(method) would have done\n        R.decorator = newDecorator  # keep track of decorator\n        # R.original = func         # might as well keep track of everything!\n        return R\n\n    newDecorator.__name__ = foreignDecorator.__name__\n    newDecorator.__doc__ = foreignDecorator.__doc__\n    return newDecorator\n\nhide = makeRegisteringDecorator(hide)\n\ndef methodsWithDecorator(cls, decorator):\n    """\n        Returns all methods in CLS with DECORATOR as the\n        outermost decorator.\n\n        DECORATOR must be a "registering decorator"; one\n        can make any decorator "registering" via the\n        makeRegisteringDecorator function.\n\n        import inspect\n        ls = list(methodsWithDecorator(GeneratorQuestion, deco))\n        for f in ls:\n            print(inspect.getsourcelines(f) ) # How to get all hidden questions.\n    """\n    for maybeDecorated in cls.__dict__.values():\n        if hasattr(maybeDecorated, \'decorator\'):\n            if maybeDecorated.decorator == decorator:\n                print(maybeDecorated)\n                yield maybeDecorated\n# 817\n\n\nimport numpy as np\nfrom tabulate import tabulate\nfrom datetime import datetime\nimport pyfiglet\nimport unittest\nimport inspect\nimport os\nimport argparse\nimport time\n\nparser = argparse.ArgumentParser(description=\'Evaluate your report.\', epilog="""Example: \nTo run all tests in a report: \n\n> python assignment1_dp.py\n\nTo run only question 2 or question 2.1\n\n> python assignment1_dp.py -q 2\n> python assignment1_dp.py -q 2.1\n\nNote this scripts does not grade your report. To grade your report, use:\n\n> python report1_grade.py\n\nFinally, note that if your report is part of a module (package), and the report script requires part of that package, the -m option for python may be useful.\nFor instance, if the report file is in Documents/course_package/report3_complete.py, and `course_package` is a python package, then change directory to \'Documents/` and run:\n\n> python -m course_package.report1\n\nsee https://docs.python.org/3.9/using/cmdline.html\n""", formatter_class=argparse.RawTextHelpFormatter)\nparser.add_argument(\'-q\', nargs=\'?\', type=str, default=None, help=\'Only evaluate this question (e.g.: -q 2)\')\nparser.add_argument(\'--showexpected\',  action="store_true",  help=\'Show the expected/desired result\')\nparser.add_argument(\'--showcomputed\',  action="store_true",  help=\'Show the answer your code computes\')\nparser.add_argument(\'--unmute\',  action="store_true",  help=\'Show result of print(...) commands in code\')\nparser.add_argument(\'--passall\',  action="store_true",  help=\'Automatically pass all tests. Useful when debugging.\')\nparser.add_argument(\'--noprogress\',  action="store_true",  help=\'Disable progress bars.\')\n\ndef evaluate_report_student(report, question=None, qitem=None, unmute=None, passall=None, ignore_missing_file=False, show_tol_err=False):\n    args = parser.parse_args()\n    if question is None and args.q is not None:\n        question = args.q\n        if "." in question:\n            question, qitem = [int(v) for v in question.split(".")]\n        else:\n            question = int(question)\n\n    if hasattr(report, "computed_answer_file") and not os.path.isfile(report.computed_answers_file) and not ignore_missing_file:\n        raise Exception("> Error: The pre-computed answer file", os.path.abspath(report.computed_answers_file), "does not exist. Check your package installation")\n\n    if unmute is None:\n        unmute = args.unmute\n    if passall is None:\n        passall = args.passall\n\n\n    results, table_data = evaluate_report(report, question=question, show_progress_bar=not unmute and not args.noprogress, qitem=qitem, verbose=False, passall=passall, show_expected=args.showexpected, show_computed=args.showcomputed,unmute=unmute,\n                                          show_tol_err=show_tol_err)\n\n\n    if question is None:\n        print("Provisional evaluation")\n        tabulate(table_data)\n        table = table_data\n        print(tabulate(table))\n        print(" ")\n\n    fr = inspect.getouterframes(inspect.currentframe())[1].filename\n    gfile = os.path.basename(fr)[:-3] + "_grade.py"\n    if os.path.exists(gfile):\n        print("Note your results have not yet been registered. \\nTo register your results, please run the file:")\n        print(">>>", gfile)\n        print("In the same manner as you ran this file.")\n\n\n    return results\n\n\ndef upack(q):\n    # h = zip([(i[\'w\'], i[\'possible\'], i[\'obtained\']) for i in q.values()])\n    h =[(i[\'w\'], i[\'possible\'], i[\'obtained\']) for i in q.values()]\n    h = np.asarray(h)\n    return h[:,0], h[:,1], h[:,2],\n\nclass UnitgradeTextRunner(unittest.TextTestRunner):\n    def __init__(self, *args, **kwargs):\n        super().__init__(*args, **kwargs)\n\nclass SequentialTestLoader(unittest.TestLoader):\n    def getTestCaseNames(self, testCaseClass):\n        test_names = super().getTestCaseNames(testCaseClass)\n        # testcase_methods = list(testCaseClass.__dict__.keys())\n        ls = []\n        for C in testCaseClass.mro():\n            if issubclass(C, unittest.TestCase):\n                ls = list(C.__dict__.keys()) + ls\n        testcase_methods = ls\n        test_names.sort(key=testcase_methods.index)\n        return test_names\n\ndef evaluate_report(report, question=None, qitem=None, passall=False, verbose=False,  show_expected=False, show_computed=False,unmute=False, show_help_flag=True, silent=False,\n                    show_progress_bar=True,\n                    show_tol_err=False,\n                    big_header=True):\n\n    from src.unitgrade.version import __version__\n    now = datetime.now()\n    if big_header:\n        ascii_banner = pyfiglet.figlet_format("UnitGrade", font="doom")\n        b = "\\n".join( [l for l in ascii_banner.splitlines() if len(l.strip()) > 0] )\n    else:\n        b = "Unitgrade"\n    dt_string = now.strftime("%d/%m/%Y %H:%M:%S")\n    print(b + " v" + __version__ + ", started: " + dt_string+ "\\n")\n    # print("Started: " + dt_string)\n    s = report.title\n    if hasattr(report, "version") and report.version is not None:\n        s += " version " + report.version\n    print(s, "(use --help for options)" if show_help_flag else "")\n    # print(f"Loaded answers from: ", report.computed_answers_file, "\\n")\n    table_data = []\n    t_start = time.time()\n    score = {}\n    loader = SequentialTestLoader()\n\n    for n, (q, w) in enumerate(report.questions):\n        if question is not None and n+1 != question:\n            continue\n        suite = loader.loadTestsFromTestCase(q)\n        qtitle = q.question_title() if hasattr(q, \'question_title\') else q.__qualname__\n        q_title_print = "Question %i: %s"%(n+1, qtitle)\n        print(q_title_print, end="")\n        q.possible = 0\n        q.obtained = 0\n        q_ = {} # Gather score in this class.\n        from src.unitgrade.unitgrade import UTextTestRunner\n        UTextResult.q_title_print = q_title_print # Hacky\n        UTextResult.show_progress_bar = show_progress_bar # Hacky.\n        UTextResult.number = n\n        UTextResult.nL = report.nL\n\n        res = UTextTestRunner(verbosity=2, resultclass=UTextResult).run(suite)\n\n        possible = res.testsRun\n        obtained = len(res.successes)\n\n        assert len(res.successes) +  len(res.errors) + len(res.failures) == res.testsRun\n\n        obtained = int(w * obtained * 1.0 / possible ) if possible > 0 else 0\n        score[n] = {\'w\': w, \'possible\': w, \'obtained\': obtained, \'items\': q_, \'title\': qtitle}\n        q.obtained = obtained\n        q.possible = possible\n\n        s1 = f" * q{n+1})   Total"\n        s2 = f" {q.obtained}/{w}"\n        print(s1 + ("."* (report.nL-len(s1)-len(s2) )) + s2 )\n        print(" ")\n        table_data.append([f"q{n+1}) Total", f"{q.obtained}/{w}"])\n\n    ws, possible, obtained = upack(score)\n    possible = int( msum(possible) )\n    obtained = int( msum(obtained) ) # Cast to python int\n    report.possible = possible\n    report.obtained = obtained\n    now = datetime.now()\n    dt_string = now.strftime("%H:%M:%S")\n\n    dt = int(time.time()-t_start)\n    minutes = dt//60\n    seconds = dt - minutes*60\n    plrl = lambda i, s: str(i) + " " + s + ("s" if i != 1 else "")\n\n    from src.unitgrade.unitgrade import dprint\n    dprint(first = "Total points at "+ dt_string + " (" + plrl(minutes, "minute") + ", "+ plrl(seconds, "second") +")",\n           last=""+str(report.obtained)+"/"+str(report.possible), nL = report.nL)\n\n    # print(f"Completed at "+ dt_string + " (" + plrl(minutes, "minute") + ", "+ plrl(seconds, "second") +"). Total")\n\n    table_data.append(["Total", ""+str(report.obtained)+"/"+str(report.possible) ])\n    results = {\'total\': (obtained, possible), \'details\': score}\n    return results, table_data\n\n\nimport bz2\nimport pickle\nimport os\n\n\ndef bzwrite(json_str, token): # to get around obfuscation issues\n    with getattr(bz2, \'open\')(token, "wt") as f:\n        f.write(json_str)\n\ndef gather_imports(imp):\n    resources = {}\n    m = imp\n    # for m in pack_imports:\n    # print(f"*** {m.__name__}")\n    f = m.__file__\n    # dn = os.path.dirname(f)\n    # top_package = os.path.dirname(__import__(m.__name__.split(\'.\')[0]).__file__)\n    # top_package = str(__import__(m.__name__.split(\'.\')[0]).__path__)\n\n    if hasattr(m, \'__file__\') and not hasattr(m, \'__path__\'):  # Importing a simple file: m.__class__.__name__ == \'module\' and False:\n        top_package = os.path.dirname(m.__file__)\n        module_import = True\n    else:\n        top_package = __import__(m.__name__.split(\'.\')[0]).__path__._path[0]\n        module_import = False\n\n    # top_package = os.path.dirname(__import__(m.__name__.split(\'.\')[0]).__file__)\n    # top_package = os.path.dirname(top_package)\n    import zipfile\n    # import strea\n    # zipfile.ZipFile\n    import io\n    # file_like_object = io.BytesIO(my_zip_data)\n    zip_buffer = io.BytesIO()\n    with zipfile.ZipFile(zip_buffer, \'w\') as zip:\n        # zip.write()\n        for root, dirs, files in os.walk(top_package):\n            for file in files:\n                if file.endswith(".py"):\n                    fpath = os.path.join(root, file)\n                    v = os.path.relpath(os.path.join(root, file), os.path.dirname(top_package) if not module_import else top_package)\n                    zip.write(fpath, v)\n\n    resources[\'zipfile\'] = zip_buffer.getvalue()\n    resources[\'top_package\'] = top_package\n    resources[\'module_import\'] = module_import\n    return resources, top_package\n\n    if f.endswith("__init__.py"):\n        for root, dirs, files in os.walk(os.path.dirname(f)):\n            for file in files:\n                if file.endswith(".py"):\n                    # print(file)\n                    # print()\n                    v = os.path.relpath(os.path.join(root, file), top_package)\n                    with open(os.path.join(root, file), \'r\') as ff:\n                        resources[v] = ff.read()\n    else:\n        v = os.path.relpath(f, top_package)\n        with open(f, \'r\') as ff:\n            resources[v] = ff.read()\n    return resources\n\nimport argparse\nparser = argparse.ArgumentParser(description=\'Evaluate your report.\', epilog="""Use this script to get the score of your report. Example:\n\n> python report1_grade.py\n\nFinally, note that if your report is part of a module (package), and the report script requires part of that package, the -m option for python may be useful.\nFor instance, if the report file is in Documents/course_package/report3_complete.py, and `course_package` is a python package, then change directory to \'Documents/` and run:\n\n> python -m course_package.report1\n\nsee https://docs.python.org/3.9/using/cmdline.html\n""", formatter_class=argparse.RawTextHelpFormatter)\nparser.add_argument(\'--noprogress\',  action="store_true",  help=\'Disable progress bars\')\nparser.add_argument(\'--autolab\',  action="store_true",  help=\'Show Autolab results\')\n\ndef gather_upload_to_campusnet(report, output_dir=None):\n    n = report.nL\n    args = parser.parse_args()\n    results, table_data = evaluate_report(report, show_help_flag=False, show_expected=False, show_computed=False, silent=True,\n                                          show_progress_bar=not args.noprogress,\n                                          big_header=not args.autolab)\n    # print(" ")\n    # print("="*n)\n    # print("Final evaluation")\n    # print(tabulate(table_data))\n    # also load the source code of missing files...\n\n    sources = {}\n    print("")\n    if not args.autolab:\n        if len(report.individual_imports) > 0:\n            print("By uploading the .token file, you verify the files:")\n            for m in report.individual_imports:\n                print(">", m.__file__)\n            print("Are created/modified individually by you in agreement with DTUs exam rules")\n            report.pack_imports += report.individual_imports\n\n        if len(report.pack_imports) > 0:\n            print("Including files in upload...")\n            for k, m in enumerate(report.pack_imports):\n                nimp, top_package = gather_imports(m)\n                _, report_relative_location, module_import = report._import_base_relative()\n\n                # report_relative_location = os.path.relpath(inspect.getfile(report.__class__), top_package)\n                nimp[\'report_relative_location\'] = report_relative_location\n                nimp[\'report_module_specification\'] = module_import\n                nimp[\'name\'] = m.__name__\n                sources[k] = nimp\n                # if len([k for k in nimp if k not in sources]) > 0:\n                print(f" * {m.__name__}")\n                # sources = {**sources, **nimp}\n    results[\'sources\'] = sources\n\n    if output_dir is None:\n        output_dir = os.getcwd()\n\n    payload_out_base = report.__class__.__name__ + "_handin"\n\n    obtain, possible = results[\'total\']\n    vstring = "_v"+report.version if report.version is not None else ""\n\n    token = "%s_%i_of_%i%s.token"%(payload_out_base, obtain, possible,vstring)\n    token = os.path.normpath(os.path.join(output_dir, token))\n\n\n    with open(token, \'wb\') as f:\n        pickle.dump(results, f)\n\n    if not args.autolab:\n        print(" ")\n        print("To get credit for your results, please upload the single unmodified file: ")\n        print(">", token)\n        # print("To campusnet without any modifications.")\n\n        # print("Now time for some autolab fun")\n\ndef source_instantiate(name, report1_source, payload):\n    eval("exec")(report1_source, globals())\n    pl = pickle.loads(bytes.fromhex(payload))\n    report = eval(name)(payload=pl, strict=True)\n    # report.set_payload(pl)\n    return report\n\n\n__version__ = "0.0.3"\n\nfrom src.unitgrade.unitgrade import Report,  UTestCase\nfrom src.unitgrade import evaluate_report_student\nimport homework1\nimport importnb\nfrom src.unitgrade.unitgrade import Capturing2\n\nfile = \'week2.ipynb\'\nclass Week1(UTestCase):\n    @classmethod\n    def setUpClass(cls) -> None:\n        with Capturing2():\n            cls.nb = importnb.Notebook.load(file)\n\n    def test_add(self):\n        self.assertEqual(Week1.nb.myfun(2,2), 4)\n        self.assertEqual(Week1.nb.myfun(2,4), 8)\n\n    def test_reverse(self):\n        self.assertEqual(Week1.nb.var, "hello world 2")\n\n# Nicer: Automatically load the notebook.\nclass NBTestCase(UTestCase):\n    notebook = None\n    _nb = None\n    @classmethod\n    def setUpClass(cls) -> None:\n        with Capturing2():\n            cls._nb = importnb.Notebook.load(cls.notebook)\n\n    @property\n    def nb(self):\n        return self.__class__._nb\n\nclass Question2(NBTestCase):\n    notebook = "week2.ipynb"\n    def test_add(self):\n        self.assertEqualC(self.nb.myfun(2,8))\n\nclass Report1Jupyter(Report):\n    title = "CS 105 Report 5"\n    questions = [(Week1, 10),\n                 (Question2, 8)\n                 ]  # Include a single question for 10 credits.\n    pack_imports = [homework1]'
-report1_payload = '8004955c000000000000007d94288c055765656b31947d948c0474696d6594473fe547a680000000738c095175657374696f6e32947d942868048c08746573745f6164649486948c066173736572749486947d944b004b10736803473fcd2f140000000075752e'
-name="Report1Jupyter"
-
-report = source_instantiate(name, report1_source, report1_payload)
-output_dir = os.path.dirname(__file__)
-gather_upload_to_campusnet(report, output_dir)
+''' WARNING: Modifying, decompiling or otherwise tampering with this script, it's data or the resulting .token file will be investigated as a cheating attempt. '''
+import bz2, base64
+exec(bz2.decompress(base64.b64decode('QlpoOTFBWSZTWUvcybwAShb/gH/2xFR7////////vv////5gWD73j3nn3zvfYoDFt17293dAUVRCKLu7knQ0IdddHu2M+fcb73YD4RUBdmq077B6UPr6e998727eQeu3d1gd9e4Ge8zz2zzkde+5u5F9nvsddwfSPD3r000+NcuyxqV5NVUVU7ud3K3NN7j729F91nwB9KDfYb5rt7jvbXl2FnQja+dpuy3bmtld894nt77e80jb332323w588tjcnHuKruli1Np7u03MmxR77cn33PtePu9Hq93W3fe54VL3nxvTO+w+322fXdt93dNM3z6NmeSr75j6t73e+zXzTbBkd25X3uASmiE0aAgE0BAEYmpiYI1NMKeT1Tyah6mjENGmT0jNTQJTQIIgQJPU0nopPyU/TFT1MyhpskyPR6oAAD1AAAAEpiQiECm0g9U2psSep6TTT1PJNMgNANHqDQwg0aA0AAk0kSIAJkmVPNT1GmTU/VMeqNBpspoBoBkDQAaAaA0ESRCaAI0NE00npiT0EAmVP0T1E/UxqaR6mmxI9RhomTCaZoJNSIEEynkNDQmgin6Kb0m0U8U/QmUDIaA9QNAAAA5wTz9lIiBIi/CIh5EBQSMFkAkCwPaKioqoqf1+34nNLPyM/4/z1gf6p8CvhxR9+9JH9ub4SxCsXL5HvjE/f/SFivkIL3uoqSFSOr4t+N/H0vQutjXNuzbmvFdGFbK9i61BloaoizO1Da2rzKS4K9cuFjjvWJBatPh7+xOl6gZcO6PG3K9YzPPk7NKhSi16o3DnVHCHIZOUvJzLs/rg/kfWSnH1f5WzQJf4dH13T3c5xFP75zpOTulqvyq0r/CrBMeW/Yz2AGAD/3dSnAmzAwzAchFfexFkCQSRWRFkWQQIEBfrEphIsk/PBsoilv74NIAkRgQFJITDBB6DGzCRrU83QejvrsxK9VYuF8jww6YfEnw9hLZKFBVBAVZZGxBFT7rCgxFYCkFgKoTLYR/24/511yK3sf0cxLHQ/jHL/491yZXqrp07XoFDDyeL7CezwsJIOpY8RPFcXk3b7WB3FhIT07Dx0lptynOpDWVEUTvRwBLl0Khb8J4W/PV1zuiQwkOmNVdp/galJEw5Gf6FuvYWsM/q/df/+/TOnLyfQR6fhwhuNoDk2k/9kWSLv4zaf7MonzbdrbF5MelHyp+XzI7vldfydu9FhmKlTke2D4U7IPnhPS6NZeu7f7V244QRwFwV0q0Iarx/Nhxwa2f/O7Iqfrc/DeHjbyw+Njv4iJBgEg9fpE2x7pHSz3/EQJgQOh15ehHp7NBz/GkTdvxrU9EEyHSLTiUYO+OMNT1yO2up1kR9Pm80sRNDUevlP+Xyw1GXt83ax2fNbz9Fj/L0+iBegfN3KbOrx3T5vu3Pxq5caNdXODSKRa6MQmmOSClH+Wb0z4DzVxO7OV2GNM5t9K+UxfX6rjHa/PXYpzvcMLL+PUjGU5XmQlw3lst18cKyndB0XuynSlXrk1MB7dukt90Nbgn5l2uW3C2RoYdsslFzkU16TgypzpfTjMwrrCXfXP0XSn6KUYpLi5n1jvbH7Z+f2Jtupp/fSryVdMF3i5PXpr5tmFrEZbtuGhvXL5lGX3mI6oXaMGrLmTC4lOSp9EbRt2lKE7vldYwjy+/i8psPxXCCh+14Lk2axQpFYDkz+R5/r8j3UMymqFBXQUQVPnjwkKFgmuAxnRRzASb0WiU1RheDOYbxuGmX9rj+fOBoNshDJO+i+KkEJcW8AncxMxyI2Voyk0ikXkJnTnYbDjKn+G5OkmDMkQ0FY0TR2Eh3GSR0XgfltDXvr0Y2tRKwdNuqkc2i7ThknXjUk+hn0cysZARYC9Az/N8K/TZ0I2LjZMGt/Dzs6Aw35cZAVTMsO1JvkD26/Kq4sHrNAjHuVH599GbGmVlidgiM2lzc+O85NgQvPsJ5FXfGznx8XaLFX+weFjUGodpYVe3Sjjj5lOoZBMhPsLGvjBGHMQ834ojYnQ5Z32UcW2oNnRX21pg+BgJpNMd191caGvvyPl+anyOzoNO6JDRBnp0fi3xxgcyZko3Wxy9ar8lrXVWBki6Exg7f/cnfWZhWqiGgKuOTudaPS5xHswNZNngo4EX4fZN0yMsXaZvc58XsEYnLi/DdlUR1oP/DaovVgX0xHHKFH6YxhKm3NjCjb8B23F3mc2IJdMCP+tTBC2eu2XKAs+1ojluekOPd97+gu/twlhnqK4EXd1mOPI0nxa348vgoIV/aOeH0idIsXhmWZtYXMIJkDhBm4Ul3G9xNd8TeXy0IvoYsnrRTZEcBA4ZFWZsZ5FLieOBHjvzyOpksJMBW/ecZwRwwjRkyYKYO0nuQ0iNH2Q16EiQF19ZSeT1KbG8ucdkast2X2mWkXgqUXB79xn2T1g1CZdDj9ZEW2H3DildPPujASEhVssWMEb6FBci2eTrwndUwOds8DQsZmFUkDJJN5ppvsnwPZLIvqdK82ygvV+zwjn6d8nPu/fS/QMM1ZlQ90gos9Oe/c7JCFH4hPDQJuEGUA9VA67G8FFFPrYaqpjASivHT+D5+vjfQ4byX82JRPF5tKxLSUmKm8fd97lLGnQw5iaj1cglbtJ/bKRTGvc2JGc2+pryZ93H7McxzMPOL3mZlMkmyK/cbWN0pn8776Ot8HPwjK+njgQ5c7SbtCB14JpwTOEmHbdB6c730xuZmZmhz9P6Ar1ugSh/XBwyp03H8MRERj4dMfCJymNjsuupMHo6NwR9eCMqndF+mDnCb6uKrFGNUx9ey8FHpV5Yp29cqILj7JcJ/pfr1hO7/dXRYyRnTsOoqkiGbFlE2HT4rL+N/EjuZpinbVevG6hm8zTHCctHrHUcxMRSL3tepaNl9sJlIvoxfG+ON5gaPOMrjrycr7OW3kY+sMjHU4G4gxQNOPnPqvz3HAq103ez4KXyIun78ytenO5LUJzKlpaycMDaTsJxH5ZkmTRDI9mqJF3lyhCEzd1GngD4nEvc4JvpQobXvlsHWWfLG3c9o4GBTaw2Wnc/U1ckTLkwpw05563+EbFmYTSOAWPydjt7D15oIfU2OKLIe0lJDtICBwk+sbx+BLWeG/Av1JQYDS2OBWTJkhd4c4WBRridiIZSX4Zq9zBKO8D7CfCtKrzNHSdEC8Kl8oHVeg6YowaqBcvRdkaaG3DHh5tAvV9+brfUGKTvcOYQE+BiP3bYVY2zMy41BXLBqmETmGavjQ7nJzobL3w21sgVx0Krk+opsVrU+HEOccYLxB0vIYBMIYqhGKHDy5UEUdz1kMeZiCLtMmJFySZokYLAzmXjV+JjYzd6d+h8UEF44sspz4TG0o7C0xs6MBV6mpRMimYPlsY4FkWsWTanl0lRT5bjgjUj49vfzD1DPOjXMkgfnOK51R1672kJObsTjK3cUCO0d4babqIlCMNiylDsRCJ0IvcCSAK/BLfCKZrL6efivS8sup0jSOvvrXAeisRYsIEmv3R7E9qn94ydbR6nD2ZmjRjUYS98FFI83djac+enz1rr4/J8/ufNob5sjnjniZrrroY88bJYJDPeF56kd1MVyU/4b91HHj1iTQd/OOTPZxW6MjupI5E9RGwwjeD0udZg94bzlLEObdJG+fZW8hTIzN5aI3pwcHLHOnHfec+b9gUbpHm7B5c0tzfM2QmB2ct0c7aa6BxD56denDXVRvl5zpSPRtjwYO3QP2ezOX6o8A744HSDsbmDASJKiyYXdX5HUzudxeW9Di/HepvHzZyUU5sw3WabiiPIk2OdPXezHU2x0pZhXoxvmd47GGVVQkx3FDnfLAl92Ut537sj3LdTD2Sc463Xdorq33yr2WlCPzbDrQHWRhiLp6pFOT1r3s7Vlobm+SRPqby4LCEBAXN1QrXbhQ2Byz9U8/PB1Mi9gN3KPvWiXgzfj+yRTyzu26+F2e26IbkvSeveVASjXRZs9QnaCfQhgM9lFYzOZny1ynoxytdqSa9dnKg5GDCdfq/oPE4Ew0mNRktZDuJkkwTpJnebrcGMdU0JVSvk2c5uMJnT1n7V5R984UYPgo3u8Rd2xIuOB7CTrvTyL9T6h61pj/Y6xXybSfa116RPfv3O62rnUqP4u0QtYx+Sp09a4iP0P34b77V7ldrc9PNfT6MXWS5XaQYeZHvBwcbdIdu5ECzDzhgzaSOyMuQ697nITx3RX0PfYM9pEB2fn8q/fhj3dfVeT9eNq7tfl12rSfG3djmts5pmk74PTsat+9OiAi58XmoxZDNmgp0Zb232qaJWEUtochuqIIQhoWzSBN1XueVkv8BKc0ShacGSTJIUZ/ZaD1odfodw14bceD/Zlw10+V7YKqOX92mZ3fH19Z2VOtyM7HGZlwcBU8xKhp0ZXzLCxNOiRMjjW6hh/P3QWT7P0y4qEvKsNOOnTMcf40hvNpm1VR/O1xoX8OzHgVprGlUJ3DAzyYmRGCU8Hy8aj3rf4MNX7xtm1DLeUZFi81jGIThtPeVrCppKrb7A5Bf7YNE6QPkKPvPH8MSxgU/kMSg7/j7vy/7D3a/jJh7/O+IhzRCsN1hMorVtP5YSroGvI99/lMzn+XwzhCKqqrDewNWrPQp144qicBlCCqqrIb5WSckOXLeIZ3eFuUNCz5VRQn1oyV6Va4rbZbZVtjEKsYFVKhVjJWChX8lphmZAWdfM9/SZjYHOw6yzE0hayT2/e5FxLwcN9JgEHCKRiB1p1I5KvuJxIWZsnQmCkz9DbQxBX4x49ofNnLziX/e5xyr9tyw1Seepk2eI2xpV5tlRVGdUMVhdtsd/cYfdGru7OWXo7K7061m+y8qFurgot8YV+byYLuZPxl8YdksQ5eGnKqnMPq3abWEksS79foCj9TFiw3p8kaazxysn7Y/ljHw927nfoOI4Atk2Ekc4o7yPJR9QROjz1g6GR8GBW8kicri6lxKoP1FgiTyJm9JkVMM0LMIb4G5UWkrcPQxK4UhgXVP2KQ78TuHd23Lp8mb0PWe/z3BJmmjJ1RuHHB8QycDaxUkCTuNKdM0naw0FHUzECH6tlz9hBkUSJ4Ugu2ftJ+yeO5q3hRjU16GhUxqKpiXEfrEYhZkefWF5YE6uGlQkQwhDPArFf10CJCcHNCAHucHrnJO5Vj7G6kXCRMRodnJr8C5LOsNJEuTmCwpNQobmaJuqejn7sfDXKhazlSE5qKKmOJam8Lrd9pzLX6o+h3TTumWe2Zn6eRO0Qte0x3x2xstuIIDBGqjFE8wPgovs5JB7EGfYXvo16W9NJCD7hx2R0fFH+D78fySd94iuHqphGSjZ90nI1pCXrXl6nFh33+E+fppAty8IfjJ80pSV/wXZWsRzclFJ18nujzUU6/xP+Xc65/XHR9HrHxl0wvvJ0LI/Vo/PWPEX4ljxl21MFTuvvh5mJyIcg4TqCtQlLthjlu7Iwy7bzXgZ58U7pXodMTR+IWaWm3YeMsCfkv96tKz9vw5MPSWTLrdq0T6uQ8sCRccYrV8Xg8X8OT59Kxiu3O4wUtFUrENNSfLGTyf2ouhtojAv2d+WW211a6P+Gxh4UNwRoX1Jo4JafwgJkmdnCZT2VlOjOkI0ug8SZHCXjV5scBNwOY4IOBdE00bOxhfthApEknSzR5XJeq+R6k/R1trF+M4MC1cJCePi9HR53OVOB46fZMi4onrjq21XGRQxqZIpDqXJtgqdSHapIYyTY2vHJbG7ZLXm7vppEUulDdkp03Urm7Y6YwY+MNdhbIQQXnMjHJsP3c51wpwkbc8YdEa2d75vhfIumvCHS873U26UhJ3OVIpkKlPbOKy0VcTkjr871VuOay56U5StPH08zivFuU51hI7csI5WOK9i9a37WhI1vPHEnKetzvHON/bgQHRajn5oUTqYf6Je34Sp+a8vLVaXop+T16u/OuZkvHWUoXo3R4qc8PPlG1MsqmT+mLsFI8wqzk8cJxfLnB3KLPW+ndRtEE14eL9R9nLU5J9OuWc912LOphjtj8OyhLJ8xGEk9/J7YWpcJ4icPR3jf1fCffW/J7687SoYK/qYIqgU7+Uh6oklBDukJBF/TrBQ9e0zn0B4MhTO0wJ8u9yodwhqThVXQTnkgZsmQgsxEDNChId1sOd9nrytivptcsF2s+Onu5gYA0dEj8MRrCYkJ0BhPkzQzcbRFyalPC7dSRFL/Lsjt5D1FQcdyurrKZghvOjva5Betc1hyV6P7tX56W/zT5nDo3pRNPpeGqWXdkrrpcKe2CU3Ks3C3ORE9bmaVJPzClQnnb2cbqfNW7Kb8GOzJza6hdnxPk1rK7KSiGViQ01P27bTnyd0Iq46dZ5OSOJ+PgMqxvcl9e5HlEyCdj463qhD1B765/ck8uzk+9/ZdbDG2M7kv1j04FjPOefK43AjDGhDGcpmQSzyh53vMlte0qWVOyxxlZZz974DCr120E2JPPS1TleXDk94Ia5iHI7oV4oglkDpkzGzeDMiOfSua69txao/KORjIqSl3xnI0oaTML3H24GE618einnKvStrZz+k8UYouc8tYwwLN1dzbxrzZul+XKt+uxFSuZIo5OxXrJpIJD748VwqwZ43NO6xAWOdbyQn7qNJuHFd9pF6NbnDBDQjBuuld4qz37dt7Ym7nZ7OHggft2L5ai5AfppOe/cQhI6TiYB9nxl3oc2v9ZzKgc63BcjumNoQFwjDA6fOsFJR1xIJjEl4OUtHrvnhy1ZLU9qE+dZ51ceU4pwQ7KdLxwy2wKHtE0kxiXlj4ClwPQe30idxz4fALHCwZCZj5BDOwtGGm7ahtDyIFJIWkHTjEdlDpdVGHG1sMLYs552wlX0y+C/sfPqVBP0mgUVUQHNmUL7Rvu2w/2kr83omJJkdqtVKwm0zwQpjUblkrn5hUchNs6gZthjMnJl5cSDRjBxheKmZRjYpwKPducjIA3jkfQEaMRyE6rr9IZnWOGuCyI8+ovp1GGKUUlGOwufh6vTuM9kgzUHrNxRcouwoiUMUNg/rZC4HVsz6JtbCqa8TBKh9E5iY39RTIQrgx0ZFx5vI3Oodp5vPBbhCZldhrm3usymgzNgvWM9UydqD8LJTXzFaHYDzDc3xVBFDzF52h20oMm2bIMAGIYNcKJAhQWNmFNCTHXuZgpwMHjQ5pKUzoY/yngJyxdZD2Z827pK+PWbpnTMKwtHwPIfohYc9vCjKJlznvtBZCoDE4l84Vu2w7cO0yVDoVeti++WWKYSabjSN8iGQm4ZMzIcwVBP3lDzTOUToCeu8c2wbuuuAmOYiYQjd5e7Q4dwbG8sfMxUPvOuYKAcHoSDRKUHvv4Bb+YJ6BQb6G1X9Z9fmXqmdv7nr9pJ2KX/SxFM0XwNchAhke7sx7dz5cftdhYfSBZkVTf6dpjttiGF8VLJccLSwnDgm+aMn1inwHGt9o9zt+UQFDBl5vt1POP93j0o6Z9sp/GcUFPlfi27uuNcuF+fq3Pf1Ow29VL631eaosFPBsY/tJRHnxm2xeKKKJ2jdnPlqwmPI6b9fXOQzLLkk9cSh9jkCSkYPMyewa//cT+Rn+ZOVh3b2N7PtejSQZ9Xi9D4VthhaO5nqGxh5c+XdzgSECRQUUWZagivtbEWnxhnh3RgohbPn0biJ5g3IOvYGBedEkr17Q00171vizk/YUopedfJ8w9Ix0ys1ire8RC1UZh4HjPrejV0Y1UXKjUzMgrqPG2ygidDjvmHWcqzCEYFCa1IkJCvTxVKq4qrM4UxUk5T1Ku5U5UkLGbMYyreM3VarWLHmXLmVd3biHRLLE4omXdQ70Zi1i7qcXN1TqojBOh2M40nV6MKcijE3DvVQ6WcSpi9Yys5zWLwpq80m7eXmy8g0hjhwaDLoDogWiKKCu1ofzNKXJmoZEISEMkqMygQizlRqAEyTZ8RY3oE8+Ge0rf8E169NjEYoqqxViwTXrpiiKjNJ3oC8bDRk6/B1zXOV35+a3uehzzzFatceOtH8zGHvBUoeunXZa4fmMPAkiql5lktadoQsvkguETFIJEkJerGrjOMajerop3i0o17MbxqrrcXL2TmZ5cdZeucEYshcxf5nLTZdn3Q66PJS3WUTIUmSpPvbpXqIV6I6ddGMH8vP+qBtJlGqy8AGSznHN7MiefNr9XuCgY/JnvmUUDiW2Hc58pjCvsOzYSWW64Pyodh3bzUfdlDaMFhf5CgrXCbGWRegtNb19bg36lTfkVwc+hSpbHmGkk7A2QaEomWlS2BhcpF0ospgTCDLPyDT/d+N2+Z/0/XfHd8rt/6w/JHwtjPUf1Hua9lSjj4EThZeWvVwRJAHAZ6qJXnjF7Mr2z8Pp906a4evf3c1x5X9sUFXXLh0XgtiTfZH8gf4DL5ifCMMYJ5zPjCHJhNSGInNOx2p01WFy1pzZJdlkYvPRLc29ku2g5cLSGgl2dTAqxZ0NPgtYp0ayezWeze+tHfbxTVqJz6vRk2MNp3vYZYjptr2Dk6nW9HbgYOaF1Tjo5N/ZFV9UYmdeb1Xe/qql+N59Pvu13qYnKYmKHC1uJc49v7CGtOGGjvPu+v4USQX3oUkWBVf1S0n4XQ6YQ0BqwiwJKwmmSVgpILBxsgBUmJMZCQo3K3RgAS7TSweHyJNITafVStOd2iHa/GCXKozPa17SExMx263d96rba60zaDVhjHn+lFjXJPgIHg2jxUYxSmSnIl5aroU2Wrgi/wjuUVKp6ofNSh8GUKYnziM3UKE8W3HRz1W8aeNtwJjd25THFMQnx/Ua51K8bGZ2/PQtNXqOeBNtq6rSutIn3X6Vna9bd+YcWLOhnNKkVSjP8+Bi3SdTWpfdaCS2LHWklPt95Fd9B6Oxm5Y8kzz59LjOeEGxD77EbaE81qVjNt5i6W1OFS6W8874RD6QSj8DqGMRLeSZIwvw8mqwqFCU8Pir9vR+cFa/+Zgdv4/5Hw/0/A+mjFTnB1wMH+jBYjB9CHmHPTRPfgYPGawX+OM0g5kWBPmkDpCRwpZdzzr8+wack+fw9xOu1VSCquyBr4hnPRKCiWnsNZ/Un6D8XZQe9Xh/5ryDw+vbugbqKNzYtkCXEAasHxXSAMnYeE7RGMZ76sPVrmN/j9HPc5uc98LBhBoRky0HMOZbtSZrqCZI7z6x9gDTETn9/+oeh4P30PIqUuo5g9R+ss4YC09GkSjiUUepcpz9oHOGCD2iSASKQVdRDt4WNRnqQ+s5zv+8o7Pkx8D+ctxDRjZoOMJMOdHj28xQ55bvTsaxOnAFbFnLKEcJIzBiPjmdQgkOyZuPn9ngGe/QvO5B710ARsHcyY3epyRVhP4+hmsZniQY0v3Lx+xv9TIStVTZMQtXSZ2jCXUwNr7wyQN+TTHAdZGFpTwPqq9U0aFUfIhLIff9hQwfhctVJJJomDmYzeRBA1vEICGKgjA+YlHcXH1XEj3VOK6fsHZxQghfoKGtVEeOwfP/DIvBQR8kFPvRqS5MS9MzyNz0O7cFShshYeeO4Eh3Ej+A+0h1SrywhJJMpH5rJUrFlYcr+M+DPU09En4td+rlWN/LyX6RCeTZrxRkyCFW53h6lllEXCeW0ohcIMY85nFW/qn83v/DmDcsfDLK8dcaBzKuJ3Y46kvLHGfm3Yhjv6OodtBGhDl7+GrM32gmZCfuWiMEDiUsEPk6ZgeCGuGlpZ6K+P9JIZwBJw/A6nNx1gku1eLwncM5O1aHpmTguK5/XnfPAqY+ejC6qIoS6AU8tlFRRgYUfF+Fle6HtTn4fl5vB++jE5BbfX13d5qbXlL3TjunslWd/fJU1k1nxB4jpD4Fi3jKtOi1+NT0leLT8zaSDlFoen8XcL9x8KBcY5qTorgTqieVux7vchCXhPVPrD0JBpG7Jh5ilK7V1vkjTefprSVebwrMqHENC0uiEIWJCIEOjobTzD088s01jE7lxeXMyi+CerkQcRvAx2ekX5YvlT06qG19L6yuL4w8j6fAnIjCCOtNCZITJC6e0detefLlCbe7novx6GIEk6Senf1djEp83KEq8TfoxKjEzi5EtlLZww72jXlc87BgI8pyYdveJRx82GsPKwjzhWC5D2lNWq8S5bvOWbrdylKeV2kS/Q6L1PUmTttpJJC7j65fU0Xya9lKV6+M0HVouMNoexOxONWTbCop9+ngzFg+pvR9F5pr1Uvv7LjypWC/YsqdLZ6d5ivrpmaz5WGKIcMilijEQT1rfA34HGvXx3Oa6ujFOreYMUWL67hkuqGPKUJEO7JPs5CRXPKJJa3d26swlZ86ukmWVAh4mz1QUBRHbgYplQopUEVM5iv/Ap2O6RcTO9DXi9Vk82JdX8yb9v1zxym1U/B2O7V/JDWyaPTnKkB/g7Do2hYf9311BW7xVCTSjJaeDwUT3L9+555ad8sYTkIaa7LtDu5OekhZa19SMErPv0eS0W7fhAXIOVe6JYKWF0/VnDHzSdJmud2SkwZmmHVR23r4XVxKngh3Mnp+GoQ8UMvOhV+utlw1zpJ8uD31upC++cE/M873PZN/XdlR8qc92BfADsrezfl6OG9TuulWRXd/bWneYYXYtg53dXY9n9Pqj1Q96uU6xE8c/3+U8da8l9WSqO9F9XrHZZxicmqCYiB2ccRdGJabTh2LtHSbNfv/e5hq57+RtpSMsHC7lz/rv3YXXcOvGnP5eektywTqW0ueeWDB0O8+L+9DSPebDjcxMBcyoGp/Z/4ptBQwozbIHBvCfCpXwtmj7YFJealixBwbtWMbVcjaDhHxQTSzdD7IVD670EAiJaMItYz1zI0uoTyPMg3BADhlv4QpmG98AUN3JP6+ApB01sUcJi4JgwcSnGrBhZKKgSzS0Hvew0hxQDfTA15wWQUdpNQeQe8nRth1GAWtDrLLFQVk0QmwKkpFk0PacMA2EPQTQOF9JxAgyDR/FfcONGfMWMi8umoPlzE9o/B2kdBtTFGDGLGPTY9gIo5YYtzEi9kOzsoNBvMTKYEmwRBkm42zbx9ouIVUURjiGvjQMgzOEYbAvqVRTtENevEmsqVAuIBUGHG50OsCDoHaXBYLrmuG4p+QNQBDAskLM0jYOk3nQGBiRQ4g/PBCgNCzwEgZjry6LjXOFBy45YDW/YJTYm4cAyIMLrjAMQsMLhIMbLQdoUDYE5uHoWmVTwlwW5UQUWDeZiIicwOIFC4gbncWOdObWcIXuf9AoLhvNlGdlphDaXqAdbaXCvSVJgIxEZ7beS4Hx4Q0TJR7IReqFGtIG5YgX7lMjkQ+5AkRgrvs3UWHb/NIUbV9q/k9VvHM7z83jQSqasBUFFIowQUA5mJwFANZCXkmAsEQZE14Hih8pwDGCIedrUiqsCiAgMZaVh/DwHB2xgoLA/klkHmdhcEpSQqSBSTMDUWzwCVJh6BTl/hYRgesoBEzwhexzCgqT1m/1LvocNVSPhf195SF2GBWJ1VpJI60pcCjkcVEsb0QTfB5lE6p0wzA2z9ui4wlCChBGMQAooKClyyTWNPquWIbgOWAj85AhIgHmIZYAnYIZTzWGabswzFAzDGy5EmhK7UCWZvc16R1KWi80RNZDuOoIW0D6JOjZY+QRBO48wcz9CsBId6VhJixVik5EMQCbtc/7pb0JfgG4Q/WEFN6QCIBEiacYDgZa4nWkFJOCcgH47Puy2JyFoJ1yliMKSDkAu3rAIRJCEUUYQEAz5Iv4a66g2yUqvtG0veTOTYwTY2CahqCeivSezEq4oZW6ToKPA7LUEcTxnkFgxDIqsSFw0Q2jUxyMwOk5qkkij/P3qU5B16JNWuSwWLUFkeGtEKxAyMj0gRA9IZhn9vZI16uHINKZP2Q2EPYyeneoNQ3BCjrNXn7x7c6ocPnLP2ErKzAX6RxfNgZE6OD+Pznh/V9HYD5MaWG2ch7NY+emwzvqmdJfgQ7nur3n1iemMdDZWNCgH48C8Pn9FNe9CpA5yuo7E9dhPxpM4PQYKUbSHD4T/90YKax+QbIZyDEkkE2UUMgwA+3V4j6FdgfumMNchDhZg4jcC9QuG8pGc/i+IzTLb67YWMiZQVzfLOB5/iqH5hBof9Gbqj0t6nbKnuRis3DMgPH7SHi17+TmSw/8sqOVslBSAq7QMSGMB+GEbEQE5pYlCym0NKIuDGFrnZ3cxCfm9b/nQF/+kPCR4MBXUdB2o51Cgg9dgY8fPIGshoVFkh5E7WQ8DvmyJrznC4aEAB+avH47mYK6zqDSsoxhI0Kw/bH2cwH9EDRI6evvJuvCkQ7R2nSeuhxDidslrajlED3eQXOOv22SNjEL0QvdpFoaXr7STA6T2Xggm6F5mFPXPfNkfQbJufWZC0RcR9tqIQIY4lcIGKIehSk3h/kGNoHhR/8/wrUjJNRCkNZWcTSg6nxUJ9ET0UJFEUggKxDyKknKiS0Jb0S1xQMrA+zR4OvuXnLfJJM6bjo1QJRIQVxQSWrpw0qFg3N5rbOMMm6IurOOLJLmnegoga1jgJZr5dTIzTtwGQz1Jt5BHk5lNbCrHCo0GlRHX6Brjcq8s1cTbC5EnZneG+kvzJUx0phEi0im2CFKYYky/aYBb5P3P6oF3NcKElFIUzJ10RlAuTIYRnQr1IGwDZwSYMhQsZPmhaHDtO9nxee3IueqKhUKqmKtcy0+gZq1mAMIdvefYttLMxmTKAkKzCWlAwgthlpE4DsPuCUYw+m68FdHbD8CSbQDx+y5iJmRVG5cUczJjiMtra2itVKRqiDVTz3n1e0rlvyZsGg34G084wD0W4hq56Tl2QbP8Y14v+9UJlImtGD6vCG/ICCy8AwfQqqgSadkLFh7Q+gdZxePSQqGof0bqHzIB2KwLmzER2uNYSYLz7g7v2t5bi8t1fxUB3g7igIWEidfZYyE8ZAHqciYUbuwVHeFAtCyig43cHuLBYT8gnl1DA0ITINCxLH2ff9B8fePE+8fo8U8f8VjKVWxoikAlExFOwog/YMmJhEs+R6Mu8Gre3oofdPRdxKLRCymIw8pIEI2z5Meus0sMsD8TsCsfmT9I1CMNstzgRR9XGPqfX69G8mVzly+NmtnFnBb64CzUYYKCU0Fahv7CP49zz1Y1rsUdBSGOm3/T0NWZNYgLTiSUXd0b46mDqjXmafPJ0I6tB43LWGBP46jsHGbZQd0QlfWpMo3mI7o2GjFq5JEQ9V0HJk7vg6QSchelqR77121ThA3YtvIm/psfbp/Rm843J2WYd7Zn8EOY+2M4rUOy0PFQHZDzN8FYtMeJCxCW4oPaaRnpZLxDTcHYpVoRTbes4ILThREEMXh5MMgkgJrqZ6bm5w2oLityNJBJSaoipNXyWYw86hC0OgTB8VS23zjHRWNww4xIgnTcvCp2USslJPe4xk39M4aTcxvGIhBhWtmEOTRUEL48u0qkK3ZMk/VblZ30hApLVW8j0ogwoGpPqq0BblBvEWDlG3vSJioHlxWQzUK3etYghOf3hdRKevrdR8R5XWaDyIy7NAIT0VwnUHO+pPQCrAc8GymMAqZuwYk0BNgbMMGMkzuHy5yTsCe7Mj998bw2E1NbWso9rmJPJxmIO08MMmHJxRQ7kyHennFqJQUYRKIeHvPWfC9TeOPZ3px3BEw/lDyOnToyikzYEJqatTzbN87HI4cN4DHNA4jojS6M/COYmcQSihSPKEfFunKO+LzGKnLtMDjPhLtuVq6d3L0+cTfOMqDdPJm2RimGaaaYZPSmF24z9F82wsSJBGRYXDe4pA1BYDBTXEo2OI4C3GCwkENwUx3mgckxDEEoGziWUIhYNgljZsawkwM0GOoTMIY/FDiTM7gUmYxX7SbNKfhgYtjAci3yk6A4ZmsMV3In9VRIyEIIigxLNfzcxlAYwDqMJzDqYcWpkSn7BPU3Q5izpHyrBUmgwgeXcQhCZ98EAvDCmVqmMO2mUYFVmSdvsYqXE0Glf6y4W+ph5J6S5jXE0nCHpNiouRgZDjYDrd5QG9YYxyIJ9XD81kejDUgqHzGWT0bzT17CCH6wg6wyUP5op8xpE1J+Loy0ok5iux46hrQbE65KTPFMzTPhvpCxMGlElRkkoQGAUhJXSOZ8R9ZiAZI/VwJ87TXCjDIPJ/Tqdih6kIbDn9H1px3lydtAFhsUOYcrDUOMPaDjoEZBSHcHl6YhHflpeMeqKMkgokICSKmGxQwNL6wwHuNHo1H9P669L+hzz9/UeIoiqX3OQ00NAmHI2HvKkcyxR+7MLh5HMHF+IAJM5aAyP5IIKzBWNZuUmo2BYi7AXkdQZuBI3VwTI0MMTXgWAnTrBk2WLfN7zC3gMUQqKbzXvKUzaJqYY4ZgOrLrAy6+PalPjyn7+cTdmc1KHtQWSTqAwW/77GftkKFdnCztt4D5MqTOyNjYdI1bkKFysRMaIhyLf6XLpFWM1mR2GsqhmuYZOnW3xcYdngqBrQ2llKy1CbeOm62vh+AyDGZ5AUMA0QMEWRSIiwAxJQNkOwfkaRSAEWKyQGKRA6fT42uTaKuewGy3Ytg70IEJEYq3zf5DnoX6loCDD0RuxsjphMxEhR7wghZYcOCHykkIpFdYFzLpr9fbcTaou6ARwC9gPd8Rxgwh5wObCnhRYT9UdyF3gRxc+o/P/9viPsMmx6A8iQJCPjIWKGq6hTtVZgWShOQn+8ED3HP2k9XrPJfj6I5KtrhTBjSwRitKVhWwQqQsIZbDqMbphDQMEUZCVRIUQKWWRUQYsYESIiqJFltZQv4hCiYMiMpKjCjnh8Zha3G4Uo/aNe0c533N0kkLySgC0AeYgIhsYomkwMQsgPdQ/j/nn2T7BwAMTTzFp0P3pvHw91LOayPUG06vGYg3IOwQIBDHNm94YHz2lHtv+j4ns6oqDExG5NhAe3w95An6Yyt4JyB48Y0gklYU5ST0JymObyiJ1CYZvAYrOTDa+s0AYbBEiMZo0ZF5e8KFGD9RcmBcRRjBBfWbJqcu27Y+gj0M5viIIr9tPt/e0ZfOrd0+/7+MOEx+bld4WQs2WplsvKzvE6UO+JOnK6LftfGozmdII6HyD70yTSW8/Ym3G9yUndkqH5tAcw5dzz5TlWtj+f8R3nxbUiRqivOFrUptIFmFkmITJGICQ7hm+4KQKDs3KFLCknEtUCk7vPqonqVDxZzhOQJBYqOot8RmNJugXeEjJttaEY2WqIp099CRqegvxxfEhm0YN9YaY2EZwwDjg3Ju3fKF2xBDgAhW0NwQm00NiCCEiyQRCFUiV0J3c+ZbOWsnriXuFrFRGmKUwIvlBqCyEGaY2sLPAbMGSIUvZOA1DQEzbyZhjj8DoUXLKQEwRZR7sw+5gVcKJoQRQiqfMxolSowFCpRBEshIjIE58zfMmj8J8f4DrA4AxHMNQaKRvaVJsEJs8j0ji4804TNS5oS3LsrGO7p7fZc3zGV/FlQauSjFQSKVsL8C6AgQvd9NgIXgfaopEACskPLjByDsviWPKJ+l2lFSqOsqwQ7wuff6s1qfSh/ZCtRBZCJtcRh+M4/b9kz9xJPmAzYMGAeHbw5szC39cDVhNLLcwfQahl8VTLvfY7HOqJnhDw8J4rS9cshZaGPv9+RWxvWbY71nN2kl39UnUu5UPJnAXpXKMoijyklBtYxtLQksPdxNaB3TEC0pUpq83nqpp2wXOmuW8wMCkwJyB8SBtN6/QNh+O9x+C8h0PjmGl+U74J6APnjpACEAO+D+0iouoIKb+4zxDNGorEBP4/h8/gUBwnyHklh+ouSSFPiTQmjRUb+VhRjlbYlstpUs+pSmWLFFLbuEwEkP2i9iSB8bABRQWAe5nWJdnifPLMIKGcoWLAn4vI7gmJAOzEA7B+fSFiUVzdF7+ESjuQNioRGG+Yn2TPQdybmybXviNZyhuNGlPi7wzj+Dzqrq0Tg0hHteXeApg/BWIZi/4ighmTW7NXjy9WHdYYvFhwlQcwgYOjdBhCWKBQkUnFpS0LaSW37JczQoz7xaTSI5k9AkKGG07ZDE4Rc6BajOraVjtiAoRGRBkVVAiwkFYMEiQFIHTs6SCn6E/eQaGDxToLIPQdKr7NREoXtVNpCcYCLD3UFQgICLJ8MM+4DmUXDeTkBU8DwGek3dsCgm7E2tDEQxJcZxW17FMC5EOBzAwMqP+wns79BvH7oTLNTmUD7SKbtWzfuO1VeCHv2npNmObsRMwo0UFZgGrFCwdhljCEAPo+HPso8pEi8QXvC/kdXi5hTAUneZvZZs98ESkPpHSHOSE9mfUIQzCsQLMhAwL8+g+YsHxbaSKoioh7EkGgZnxOthmare2zhkB/YDPMaNd+43ybvFj6+fx5584Mm6GTqpchR1pw8KJSgmI0qD7CRrl2/M9QDcshMnxb7S+Cl5dynI70X0p3UWHuwgq14pe7SOHShHzqEib2qb3ZsQgT6uc93RzoZYgUBNqdY7tdZ1HupqP2tgNAbUpr9WWo7xiD6gcOiOt6f4OSsIEIwhAiBDIEwAgQ3ToU/l2S83h9NP8UE5RDamIGxnRU5idnZnto0iVR2vUT9KN2F2K2mqQ0MaWWlWoYa1kgvG6h+XS0bA1KX4MoKLBEjhUtrEUYVUkqpWKNoVqzbQeAoMmpTYixLrJFSiUK0sGpUtOWzeqITYAgaJECYKFH9OIbTW+fssdkR8Z2RX8t6eQQNhGBvJsiwgM3g8B5tw4FIKh71LUOh9hH3lAghSTy+vv+QOyBnxAxXGpMwUXgla4Q2+si3TNsiyS1qIHAoahKGTsvq+3MsI6MQA4gdtRwhpNqvJ84aRcFG8e/kYDTNQmah4thM0tsAGw4Gfbr8FljfUhGLDpEnGF2U8LgUOGwgskSAIEYGznCAyIacaUbqGYJBDJXcmmxnx+I2FOujkTCEiQ4dVOeW5dBBY9mj5dlX3rdvvgubwBG5embPcUoEOJhoY2WckkJkWNHvV5Dj6FfzGBVjSjmEmimUxj66IEgXWnb+dUjciGn8pAXt2hiDgWA8Xr9dE4idEOuQ4dgW1iI6xKiJTFpRpFRIIlEFiUgoVUIpEYhBaiywUrQSSJx2GSzO85gHeRCtxTEBkEmJmkP1MzYVewFjl8JOJfqqYWzkyK2UV0yDwnHnbON2aBw74aEDUbDEM4eg5FPCHbVGovXLpeHNQ9R0kBuG5wSDZQP5IIDQ4F2gGk5jItGbQ92t8tm+dNJRiQpgnGXk2FFhXp1tdevPaV/QgorDm00F7OgnS6u/SvPLGiIECBIBg35m1DEVJwuAghWVPmSm+Nw0H9CefBKc4O4MsowjYcsJmrrkbmzBNBaDJtBLQwKUgyIIokYb1cFdUo6N5wayZhGS6LQS0zkYLHbdJqnQEtlFDhKYDejMeYUNSKKSVhKqjFYIAhAiS1LFSHVyU1Q0uLsdw4nUdASax28y4PU8ZxlGdMYUSKTg3SmZkCKdUj5HqYNg1TRPEqgWdSXyiGdQqSQFkcIJpiGuBeGqCN4KJVfMV6y+CSCbSaElAkwCFQoCihQQzotpq2d5Xd4GYZDJgcRARRT78DC5o8EARQTusUTjWxHapc2d2HeWC17dCc+WvrElkbdkVhYLaeJwpI9RZAu7IGTDCcogIlYzJLIiGiGEaGqHECUkpssB1hSUMpFgCIsWAoLIoKRYgyEFCRXGlQjENgtwoFPW3A6CBYxXRqssqAgQskIGkmdEBG/h5ZgxsSBqDpSGP17Ar+8iO5ohIA6lCt3LX2bz9xDuJu1CkkXhEBiR1ncydnf0nrGw80sW1BagYSchgjCQTroO5DiYVxsfjuGWCywDCsNvkzwIen0HriejDxEMhWKQ2YTMlA0QWk/ZgrYG0gwFCAQgEVFICMFgiELQKGihViDFaRClCsSZE89aM41rGKNpKIxEBZCBDE3Ms1guCfUVwTzhi5mKsg7jc695tI5pdruqH5hiOTwfg+8aMBQZkh6derkaUPrx1b7tLIZGJvhVzU5YhHXQagU/iIxYgXnBizJt8eC7Rc5dByPEqQH5ZR9ylDIvo0EBx3dUYQNo4UoWA+teMAb9QAfMFkNFIOQ4IvMZjzmII/sBfD6jWciBEQdikWIiMYxkDVtKLHchh9LXhgawhcvQWChoSHu5mzIE+hgB7ANAgoCRAWQ6qFiBasIFBEYAVh4+RZNEMwoRxVP0I5QTLJoQSrUpdc7e2GQpd3EHURdln3E5HPzDgbDpNBsALinXsXMgVhqb3PjANEzKJ1Q86UMjD7zAxhQSByQxIaGRg6tKhrSgLtIUTVRQodNpnCBmYlc2fhloWNTZK1hYkvIlzYnkDhg4hAoMNhlJEJAewQXaQVXrWALfXEhtPGez+ejvlz1lFQqWiFEtGRkqDxepdMAiIZ7joiD+yC9xECxAAYR7YbvZAZMC4IIJrrA9wR4HYnVyYQIOzFR6RB6gfUGrkfx+7ZIpeEh1HxlW/TLEsSSKykCc57/VZqHp0Eo/FtEOCRfKJILXE6jpSQP5aEoFfUwJv8y9RZjfIv4vo2eM7qIdgUT2HWTaLAhAkLaqsShwKlEFhLaASAwxpM0kBGjQGMpEjhYNRiOIh2tg6ewgHWnQR6ggUBBCVPC78YRDadgCB8JiWEDODPfPLwzbntzK8VRth6tOPWnGolXuwwAESQaIZ4lFM8xparVRzQoMkJrnOeAPUQCPRtF/AWrnUr2WBMlJCJYDrHPbPd/z3FnpkmEbB/5C9njrDUFtDdvqVu54wm48S6RmL8k1fATRv0YTg43HNhjUh2ccH7KLsDw5mCcCqrJBBkBBhBBAFIoJCSIqxSIQSErQd+adFj3G67atyffaw2UacIn3d3UkDtFRH0MkwdsXQUjm52F1R3HV0i1XejdyCQuz3MxWfjSqqLrl77kNb5VMh9/LNock5OTk9b0zKXhp8MJ3pm61biLym1MLjVdZbpIFtIMFpRr+knXvPmTmbDzrE0BVAQGiJZHHFxrzrMCA3AdKwNFIGPUMPRNJj3FgHEPl7cvSYJUw9Yw87Wh04oUkQk+6jxeTkrSe2n4En8gOO11UMa4f6RSLRh8Zw9UqnyfKZsT44vPnlyna+s/YBEWeqT5DA0Tl22B0Fa7KLDUMejoLV4lpZgaEo6Tv5gsLrUffaH13S+wuymyuaIMtH4i3KRQYkRDZlkDBLG6LJEkElYVqLFEEXE6pgBX0locUMkTMyQK4hVoMSgk0sXTVjZFYti4WZcwRZkeKJdXGmnUEgUQiJRoUdhs1MmqcIQLG6wIxU0D4KCvDjExZEDRexToYfaRhDvQ+0itwXjpN/XxtfU7lLGRH7ECiXBQUCKoom6HQby0k5HAgS4cAxbdX3FziM3ll2oU9xb07HetBXMkKIHz8gOdTBLHynI5SHX6z9PPh3SbWO4S+M6jMOBcfQTgvD22pJDyhIJ12+LiFeXfQbzk85VBxro9rQna2TpkKIDA6EVy4DlLKLEYYPiwcYNCLXrUqNgQd/yZihPUC6av9A/iYJ7nfEBDdlx1cQcnDEnmgcdwcEGoS8V5bijLXW9J9KVO9OjuhNAZICVgHWinT305IaQo1k7O+zVr8n2ro00SlpRsX3Zj+J05Witk4HMtZ5ueo32gdqeg7DvCg9CinkELlx/HThZCpeqDrkiQIrTAHJQQvQL4IPmD+lhOs/lyDSp5gTUTjFNYMC1QQCSfEpsSz8xjoRzYiHmifcw28sTpj6ZOvkWtM32IB/y3d4bTDmUNQ9HiZPzYIqwBG5REV1XyzIgVbYspJS0SC3BgLQJpwVMBLt6GoFGEWQiRCoICQBGQRUBoNBZJCKLFksJYllGVAZQEgUgRIkILGDEp7DsFgDIJsU5AgXo00YO5NtixpBtKaCIJQoQZ4uwm/nm0UFcQe/kpYVc9SovoTiHe0OlPb8cPha+07y489ZeYywh0WZCMXC+CqY/p4jMOMaUxd5Bu5myPbjDHUcob55KT6ih0pcwxf6h2Zrtisjjsh+u45QatoL2V5jhbZkdGx3JE6BmdINkg5vYRQSGOYZ0NuR1Twj51OPrjWDmQzDOW68vdGzg0Zb3JFm5XDlDnpE6jUrHQNpu8mVODiUmp+encao94m2RO+GzDr4NhzF5tvBiVCzuuNnbvmJWaW+4toWspSYcW2or3poMZemauVepNS8mWYVu6UR4uu4W7myxjcmn3DbxepD7LzizVtmKNbqrl6yZ3kDc6bB5DthMjPG5wYUAeP53P6WxgMs3QdmwJg8DQsOItcCRAzA+wQDylAUIseKLwheE5GJRkbAK2eDMyrdN6WF0Dgjjwvewl6sVG5sl+0EJCp0OTS88xjuGU2YRMMeUf+8Pc2SSlqnB2Rh2b3NSsmIboryO6TImnKU0O6EmcU5cTTiIPe9NIShedxRh5x5VNY4UZl7MijzLYAcYTMMirG+XQR9rIW8D1pBSn0pUAa9bDGZ7zAL3cycp9kAyAE9lyiZa+HQMhrGF7gZpYurLxKPRKLGHiVZyQ0gjEFWEWEaAgUmtFCFUlgbDJLjcCloGBoO92UBthS8Jzz1lU3+Y7yjAwDKWGSAJ1cKFtwtYWUJlsB+TVF3qUNiWMQR0yKFwpWCGjKhMKmj2x1ialxHdMRF23Y1JBRyFSCZcwo4iF3VYiuVFUFRFg1oJZa40NUodx6Z9ZJ7dX0E6+ykhr1hugrygNmgkzro+miPTdwl6qg1MOs8u5EN8hugyTIylBJUyRJvVURWKseNdWgl/g3/i4pp4Hepv5+BEeZ4QgeMEnPkrWthAgU7g5wSDjwJ3IfcYa9A5uYeqSP4BfQ6hwG5oKHDyc5GtEQTQ7DdzyUCOxqlglu/ZCGq2pXYXKOvVk7KC9yBeRRBSMYiMRHgVHMDJ7hMMhSLWUtqIERYEGAEggQ6Yh0ohYbLBkw88aeRumGayoG4Mc0XAqoZaJUhhhAMMoAChQBJ2iyHJnV3GHZGhFpK2VHlU6EujhDxyyMOJNUMTJgwV0u8xipjU7CDLM9/EIBrFL9Ikp9V9wDrkx81ZOXabereUdBlO5OA+wz6+dAa0rQXbQLAxchTAxIYhtBiNYhD0k0kyUltXDBvkAB68oFsT7I7bFBDoTpYAe48YIl58jtMhKzqpGIe/merzeHXww6DdHHxKxtWTo7npnN7tx8LF0tKoezVyPia+t6CEHrmDwsUZ+9iThgZMJdXFHzSEsF1J+tUGx5NSPl6RyVls6DbJBCRhxBsWEu5VKqWcgz6p7Qw6TBsrpjjiwRh3JgtEsJNtxxCCxBoQWiQQXCBw2icPHRjcBuxnfBMShr5dsliHIQLIphjKbDKXd+Ag2pJw+XK1VhsxzhkrARCQwGFIQdU0FNJSctVHiK0ZGIBszNW6NGhhQ0KsJaJRpVnIys4aGJo2dGmoW4aMGKVAxVoUoJJ6aMVPiMEPjEbmpooipJpyuLe7tlm3Ki3pKpgJa5kmMONvIOBgez0uiQ1q3eiPTwYbqU6evWDCJz6XAwSIMYxhs2aoGSbQUYkBEN0U5zCiBzENkZA1ghrg4UGM0TDuTY5ktTOk9Fc+cxWjhYrWsxhXe2ZmuQSBobgoICmGJDJVGEYsM2GSiSknMnTeN6TWXlnJOafoPKNJ02MDu6UwYnDrXl672GxMxgMEaBCWMRYM553RjElMMsoaIiTZkaTEDkhnQenj7DB9hiYbhmDPcZXdPC0Ex3oi5DZHAl4WBPYonONt6BvB/B205xLEUZEcQ0Fiw340m7pd4uRdXIihbCEE8xCgm+omCJEwNGQQGLBZFRo6CkMYsyE6/Q8E8+3g58irqqrS0TUpiMEW5gDO06DhCGIewPgNnWn6Oix8pULoWNBh0HQnppjfA0xJY1iTQUdfB8/R0Yw8oiCWEWlPc+bDNFL6rRDiQbjOxUHuKN7IydAGIdnCpJTRhNFTccS5vU0EB+mKlAlRBKIHbFpDIUB7TMP7qR59JGaoAYgBjo0l6As8p5mQXHJBhTMbBQQx8h5uwKAFAoHPhVjITNOrGVjJo2btnNOVqq5vsQ9EFCqI00JKhKlIozhoFJMOMCiDNSww1CUdFjEUa29I7Xu9nQZWaXQqZi4xi9u+pRGMhmEqg6A2xgdAEDdavXDymUNaSdjA0idSqqvmENgNwMfGWWkRmD7TbcsYGdfPRxtKqoHGVVFWHQQsod6YB1yFPmKF8B9M5a9V3jW2K3bJj6zZIBUA1UapOWRomZ3HdDMXjcsaSKSBAIhEDxLMKAXWBAU4C3OjWeft5eXVTGElU+g9HcXb62GBXNVr3Sqw5A2iIMHLvJkhiam8gaQU1oSFmFpKqlNxq2cc8k8DS9VyBINIlGxLCPVsW6+JuRpUDACJqNgHZsSxs1qJ0/nFETAow51cbG8J2eRJugdNSdUgdPEyfWJJydkDnBOfaUSRBgIxVCFaZjBw/0LKEgwgAXxPapYcB8h87ga01AOgmKPVASMAD4EHYpoROwChxCJ/7dUzIQZQVUCiqCFIaVfi5yT7691nl10xPVClw8q8O65YPkwLNtBJCqL1b/fduWDa+2nrWGcudCNyw9zD95kihgeOPclkoZySwoFiWGSAMwhMuVXgjOR0nMxETq663shrgzsDonP8/0+O6AYKqLX9lpLCwFFJEgmNCxTgxQsiWZaQZ6TTu/KQSMxFtPyUFTkd3G0uFz8X0BYfeL+MIj1HYGY9yw9+Q7ZPigWCRjYKQoNFgXB/JuK7UbrppGozuMrriT8yhmEjhykdB3GWQL24l6dhwMUj9oKGt7p9BonBO4OUMAk6z3wcjzmwxMQ8DIwA34cbPiZQhFIFA3heNnq1FBk+Z/N3fV29+OKr8/5as7oHdChZ1huhN9QN15bgMlVGJPwEyt7PbWt4n1BrOrxK5wGeCl8m3fCMkGCxTAghUVojugwkYCyQFIHm9cpBhkeHjcGsgvUPgT6EtPLMIb7l+9jcYR9yN3j85bE9bPwOtYOeBs9lCCn67dIIIaEshHS4AhioZvg1JM4ovN1GO9EKMLtm4GYZJZeBA2vruCdzwwMVQ1CmWN5mGSjYzNxqsAlg6FxIrp7/Cjs5HnZ9kJOKGkudt2EP8J74GUZ6/qCxifTlY8AzAoQtges+ETnj3lfYfd8ZbmfR/aYMDuvoT/1pHRGfvoft9X6p/wLuSKcKEgl7mTeA')))
\ No newline at end of file
diff --git a/examples/example_jupyter/students/cs105/unitgrade_data/Question2.pkl b/examples/example_jupyter/students/cs105/unitgrade_data/Question2.pkl
new file mode 100644
index 0000000000000000000000000000000000000000..877d483d059025ebe95a9c08d31687e5fbd69881
GIT binary patch
literal 113
zcmZo*nVQA`0ku;!dN>11Q;SP7^Ye_R^l%lYmV_2K=Oh*vPidRd!%~u&n>wX!io5-R
zZC)T98H_y~C8@<F@rfxZAO&oR#l@*bB~#j_)K2kc@D?b}V9a1^o07o-(i7kh(!x-x
F2LO#`CKvz!

literal 0
HcmV?d00001

diff --git a/examples/example_jupyter/students/cs105/unitgrade_data/Week1.pkl b/examples/example_jupyter/students/cs105/unitgrade_data/Week1.pkl
new file mode 100644
index 0000000000000000000000000000000000000000..cb52b781d5b36368edaef0346dc55dce72624126
GIT binary patch
literal 148
zcmZo*ncB$!0ku;!dRW6#Q?m`H^l%lYmV_2K=Oh*vPidRd!%~u&n>wX!io5;ZO(G!G
z8H_y~C8@<F@rfxZAO&oR#l@*bB~#j_)K1A@%wTJqlEDH}9*_i5&5*&^!vj`clv<Wr
UR17jIg9ECT7p^uAthQ7S0IlybJ^%m!

literal 0
HcmV?d00001

diff --git a/examples/example_moss/report/index.html b/examples/example_moss/report/index.html
index 2292a2e..805b364 100644
--- a/examples/example_moss/report/index.html
+++ b/examples/example_moss/report/index.html
@@ -4,7 +4,7 @@
 </head>
 <body>
 Moss Results<p>
-Thu Sep  9 08:01:09 PDT 2021
+Sat Sep 18 04:12:08 PDT 2021
 </p><p>
 Options -l python -m 10
 </p><hr/>
@@ -12,15 +12,9 @@ Options -l python -m 10
 <hr/>
 <table>
 <tr><th>File 1</th><th>File 2</th><th>Lines Matched
-</th></tr><tr><td><a href="match0.html">C:/Users/tuhe/Documents/unitgrade_private/examples/example_moss/tmp/submissions/s1002/0_homework1.py (85%)</a>
-</td><td><a href="match0.html">C:/Users/tuhe/Documents/unitgrade_private/examples/example_moss/tmp/submissions/s1003/0_homework1.py (83%)</a>
-</td><td align="right">20
-</td></tr><tr><td><a href="match1.html">C:/Users/tuhe/Documents/unitgrade_private/examples/example_moss/tmp/submissions/s1001/0_homework1.py (34%)</a>
-</td><td><a href="match1.html">C:/Users/tuhe/Documents/unitgrade_private/examples/example_moss/tmp/submissions/s1003/0_homework1.py (30%)</a>
-</td><td align="right">6
-</td></tr><tr><td><a href="match2.html">C:/Users/tuhe/Documents/unitgrade_private/examples/example_moss/tmp/submissions/s1001/0_homework1.py (34%)</a>
-</td><td><a href="match2.html">C:/Users/tuhe/Documents/unitgrade_private/examples/example_moss/tmp/submissions/s1002/0_homework1.py (31%)</a>
-</td><td align="right">6
+</th></tr><tr><td><a href="match0.html">C:/Users/tuhe/Documents/unitgrade_private/examples/example_moss/tmp/submissions/s1002/0_homework1.py (82%)</a>
+</td><td><a href="match0.html">C:/Users/tuhe/Documents/unitgrade_private/examples/example_moss/tmp/submissions/s1003/0_homework1.py (82%)</a>
+</td><td align="right">19
 </td></tr></table>
 <hr/>
 Any errors encountered during this query are listed below.<p></p></body>
diff --git a/examples/example_moss/report/match0-0.html b/examples/example_moss/report/match0-0.html
index c65722f..53b082d 100644
--- a/examples/example_moss/report/match0-0.html
+++ b/examples/example_moss/report/match0-0.html
@@ -5,35 +5,29 @@
 <body bgcolor="white">
 <hr/>
 C:/Users/tuhe/Documents/unitgrade_private/examples/example_moss/tmp/submissions/s1002/0_homework1.py<p></p><pre>
-<a name="0"></a><font color="#FF0000"><a href="match0-1.html#0" target="1"><img align="left" alt="other" border="0" src="http://moss.stanford.edu/bitmaps/tm_0_48.gif"/></a>
-
-"""
-Example student code. This file is automatically generated from the files in the instructor-directory
-"""
-def reverse_list(mylist): 
+def reverse_list(mylist): #!f #!s;keeptags
     """
+<a name="0"></a><font color="#FF0000"><a href="match0-1.html#0" target="1"><img align="left" alt="other" border="0" src="http://moss.stanford.edu/bitmaps/tm_0_82.gif"/></a>
+
     Given a list 'mylist' returns a list consisting of the same elements in reverse order. E.g.
     reverse_list([1,2,3]) should return [3,2,1] (as a list).
     """
-    mylist = mylist * 10
-</font>    reverse(mylist)
-    return mylist.reverse(30)
-    # TODO: 1 lines missing.
-    raise NotImplementedError("Implement function body")
-
-<a name="1"></a><font color="#00FF00"><a href="match0-1.html#1" target="1"><img align="left" alt="other" border="0" src="http://moss.stanford.edu/bitmaps/tm_1_36.gif"/></a>
+    ls = []
+    for l in mylist:
+        ls = [l] + ls
+    return ls
+    # return list(reversed(mylist))
 
-def add(a,b):
-    return a+b
+def add(a,b): #!f
     """ Given two numbers `a` and `b` this function should simply return their sum:
     &gt; add(a,b) = a+b """
-    # TODO: 1 lines missing.
-    # raise NotImplementedError("Implement function body")
+    sum = a + b
+    return sum
 
 if __name__ == "__main__":
-    # Problem 1: Write a function which add two numbers
+    # Example usage:
     print(f"Your result of 2 + 2 = {add(2,2)}")
-    print(f"Reversing a small list", reverse_list([2,3,5,7]))
+    print(f"Reversing a small list", reverse_list([2,3,5,7])) #!s
 </font></pre>
 </body>
 </html>
diff --git a/examples/example_moss/report/match0-1.html b/examples/example_moss/report/match0-1.html
index 8c3b364..9cba134 100644
--- a/examples/example_moss/report/match0-1.html
+++ b/examples/example_moss/report/match0-1.html
@@ -5,34 +5,29 @@
 <body bgcolor="white">
 <hr/>
 C:/Users/tuhe/Documents/unitgrade_private/examples/example_moss/tmp/submissions/s1003/0_homework1.py<p></p><pre>
-<a name="0"></a><font color="#FF0000"><a href="match0-0.html#0" target="0"><img align="left" alt="other" border="0" src="http://moss.stanford.edu/bitmaps/tm_0_47.gif"/></a>
-
-"""
-Example student code. This file is automatically generated from the files in the instructor-directory
-"""
-def reverse_list(mylist): 
+def reverse_list(mylist): #!f #!s;keeptags
     """
+<a name="0"></a><font color="#FF0000"><a href="match0-0.html#0" target="0"><img align="left" alt="other" border="0" src="http://moss.stanford.edu/bitmaps/tm_0_82.gif"/></a>
+
     Given a list 'mylist' returns a list consisting of the same elements in reverse order. E.g.
     reverse_list([1,2,3]) should return [3,2,1] (as a list).
     """
-    result = []
-</font>    for l in mylist:
-        result = result + [l]
-    return result
-
-<a name="1"></a><font color="#00FF00"><a href="match0-0.html#1" target="0"><img align="left" alt="other" border="0" src="http://moss.stanford.edu/bitmaps/tm_1_35.gif"/></a>
+    ls = []
+    for l in mylist:
+        ls = [l] + ls
+    return ls
+    # return list(reversed(mylist))
 
-def add(a,b):
-    return a+b
+def add(a,b): #!f
     """ Given two numbers `a` and `b` this function should simply return their sum:
     &gt; add(a,b) = a+b """
-    # TODO: 1 lines missing.
-    # raise NotImplementedError("Implement function body")
+    sum2 = a + b
+    return sum2
 
 if __name__ == "__main__":
-    # Problem 1: Write a function which add two numbers
+    # Example usage:
     print(f"Your result of 2 + 2 = {add(2,2)}")
-    print(f"Reversing a small list", reverse_list([2,3,5,7]))
+    print(f"Reversing a small list", reverse_list([2,3,5,7])) #!s
 </font></pre>
 </body>
 </html>
diff --git a/examples/example_moss/report/match0-top.html b/examples/example_moss/report/match0-top.html
index b287c1b..d5a98c1 100644
--- a/examples/example_moss/report/match0-top.html
+++ b/examples/example_moss/report/match0-top.html
@@ -1,13 +1,9 @@
 <html>
 <head>
 <title>Top</title>
-</head><body bgcolor="white"><center><table bgcolor="#d0d0d0" border="1" cellspacing="0"><tr><th>C:/Users/tuhe/Documents/unitgrade_private/examples/example_moss/tmp/submissions/s1002/0_homework1.py (85%)</th><th><img align="left" border="0" src="http://moss.stanford.edu/bitmaps/tm_0_85.gif"/></th><th>C:/Users/tuhe/Documents/unitgrade_private/examples/example_moss/tmp/submissions/s1003/0_homework1.py (83%)</th><th><img align="left" border="0" src="http://moss.stanford.edu/bitmaps/tm_0_83.gif"/></th><th>
-</th></tr><tr><td><a href="match0-0.html#0" name="0" target="0">1-9</a>
-</td><td><a href="match0-0.html#0" name="0" target="0"><img align="left" alt="link" border="0" src="http://moss.stanford.edu/bitmaps/tm_0_48.gif"/></a>
-</td><td><a href="match0-1.html#0" name="0" target="1">1-9</a>
-</td><td><a href="match0-1.html#0" name="0" target="1"><img align="left" alt="link" border="0" src="http://moss.stanford.edu/bitmaps/tm_0_47.gif"/></a>
-</td></tr><tr><td><a href="match0-0.html#1" name="1" target="0">15-25</a>
-</td><td><a href="match0-0.html#1" name="1" target="0"><img align="left" alt="link" border="0" src="http://moss.stanford.edu/bitmaps/tm_1_36.gif"/></a>
-</td><td><a href="match0-1.html#1" name="1" target="1">14-24</a>
-</td><td><a href="match0-1.html#1" name="1" target="1"><img align="left" alt="link" border="0" src="http://moss.stanford.edu/bitmaps/tm_1_35.gif"/></a>
+</head><body bgcolor="white"><center><table bgcolor="#d0d0d0" border="1" cellspacing="0"><tr><th>C:/Users/tuhe/Documents/unitgrade_private/examples/example_moss/tmp/submissions/s1002/0_homework1.py (82%)</th><th><img align="left" border="0" src="http://moss.stanford.edu/bitmaps/tm_0_82.gif"/></th><th>C:/Users/tuhe/Documents/unitgrade_private/examples/example_moss/tmp/submissions/s1003/0_homework1.py (82%)</th><th><img align="left" border="0" src="http://moss.stanford.edu/bitmaps/tm_0_82.gif"/></th><th>
+</th></tr><tr><td><a href="match0-0.html#0" name="0" target="0">3-21</a>
+</td><td><a href="match0-0.html#0" name="0" target="0"><img align="left" alt="link" border="0" src="http://moss.stanford.edu/bitmaps/tm_0_82.gif"/></a>
+</td><td><a href="match0-1.html#0" name="0" target="1">3-21</a>
+</td><td><a href="match0-1.html#0" name="0" target="1"><img align="left" alt="link" border="0" src="http://moss.stanford.edu/bitmaps/tm_0_82.gif"/></a>
 </td></tr></table></center></body></html>
\ No newline at end of file
diff --git a/examples/example_moss/report/match1-0.html b/examples/example_moss/report/match1-0.html
index 002ec5e..d47535b 100644
--- a/examples/example_moss/report/match1-0.html
+++ b/examples/example_moss/report/match1-0.html
@@ -1,33 +1,77 @@
 <html>
 <head>
-<title>C:/Users/tuhe/Documents/unitgrade_private/examples/example_moss/tmp/submissions/s1001/0_homework1.py</title>
+<title>C:/Users/tuhe/Documents/unitgrade_private/examples/example_moss/tmp/submissions/s1001/2_report2.py</title>
 </head>
 <body bgcolor="white">
 <hr/>
-C:/Users/tuhe/Documents/unitgrade_private/examples/example_moss/tmp/submissions/s1001/0_homework1.py<p></p><pre>
-<a name="0"></a><font color="#FF0000"><a href="match1-1.html#0" target="1"><img align="left" alt="other" border="0" src="http://moss.stanford.edu/bitmaps/tm_0_34.gif"/></a>
-
-"""
-Example student code. This file is automatically generated from the files in the instructor-directory
-"""
-def reverse_list(mylist): 
-    """
-    Given a list 'mylist' returns a list consisting of the same elements in reverse order. E.g.
-</font>    reverse_list([1,2,3]) should return [3,2,1] (as a list).
-    """
-    # TODO: 1 lines missing.
-    raise NotImplementedError("Implement function body")
-
-def add(a,b): 
-    """ Given two numbers `a` and `b` this function should simply return their sum:
-    &gt; add(a,b) = a+b """
-    # TODO: 1 lines missing.
-    raise NotImplementedError("Implement function body")
+C:/Users/tuhe/Documents/unitgrade_private/examples/example_moss/tmp/submissions/s1001/2_report2.py<p></p><pre>
+<a name="0"></a><font color="#FF0000"><a href="match1-1.html#0" target="1"><img align="left" alt="other" border="0" src="http://moss.stanford.edu/bitmaps/tm_0_98.gif"/></a>
+
+from unitgrade.framework import Report
+from unitgrade.evaluate import evaluate_report_student
+from cs102.homework1 import add, reverse_list
+from unitgrade import UTestCase, cache  # !s
+
+class Week1(UTestCase):
+    def test_add(self):
+        self.assertEqualC(add(2,2))
+        self.assertEqualC(add(-100, 5))
+
+    def test_reverse(self):
+        self.assertEqualC(reverse_list([1, 2, 3])) #!s
+
+    def test_output_capture(self):
+        with self.capture() as out:
+            print("hello world 42")                     # Genereate some output (i.e. in a homework script)
+        self.assertEqual(out.numbers[0], 42)            # out.numbers is a list of all numbers generated
+        self.assertEqual(out.output, "hello world 42")  # you can also access the raw output.
+
+class Week1Titles(UTestCase): #!s=b
+    """ The same problem as before with nicer titles """
+    def test_add(self):
+        """ Test the addition method add(a,b) """
+        self.assertEqualC(add(2,2))
+        self.assertEqualC(add(-100, 5))
+
+    def test_reverse(self):
+        ls = [1, 2, 3]
+        reverse = reverse_list(ls)
+        self.assertEqualC(reverse)
+        # Although the title is set after the test potentially fails, it will *always* show correctly for the student.
+        self.title = f"Checking if reverse_list({ls}) = {reverse}"  # Programmatically set the title #!s
+
+    def ex_test_output_capture(self):
+        with self.capture() as out:
+            print("hello world 42")                     # Genereate some output (i.e. in a homework script)
+        self.assertEqual(out.numbers[0], 42)            # out.numbers is a list of all numbers generated
+        self.assertEqual(out.output, "hello world 42")  # you can also access the raw output.
+
+
+class Question2(UTestCase): #!s=c
+    @cache
+    def my_reversal(self, ls):
+        # The '@cache' decorator ensures the function is not run on the *students* computer
+        # Instead the code is run on the teachers computer and the result is passed on with the
+        # other pre-computed results -- i.e. this function will run regardless of how the student happens to have
+        # implemented reverse_list.
+        return reverse_list(ls)
+
+    def test_reverse_tricky(self):
+        ls = (2,4,8)
+        ls2 = self.my_reversal(tuple(ls))                   # This will always produce the right result, [8, 4, 2]
+        print("The correct answer is supposed to be", ls2)  # Show students the correct answer
+        self.assertEqualC(reverse_list(ls))                 # This will actually test the students code.
+        return "Buy world!"                                 # This value will be stored in the .token file  #!s=c
+
+
+import cs102
+class Report2(Report):
+    title = "CS 101 Report 2"
+    questions = [(Week1, 10), (Week1Titles, 8)]
+    pack_imports = [cs102]
 
 if __name__ == "__main__":
-    # Problem 1: Write a function which add two numbers
-    print(f"Your result of 2 + 2 = {add(2,2)}")
-    print(f"Reversing a small list", reverse_list([2,3,5,7]))
-</pre>
+    evaluate_report_student(Report2(), unmute=True)
+</font></pre>
 </body>
 </html>
diff --git a/examples/example_moss/report/match1-1.html b/examples/example_moss/report/match1-1.html
index 436a8f3..6abef36 100644
--- a/examples/example_moss/report/match1-1.html
+++ b/examples/example_moss/report/match1-1.html
@@ -1,36 +1,77 @@
 <html>
 <head>
-<title>C:/Users/tuhe/Documents/unitgrade_private/examples/example_moss/tmp/submissions/s1001/0_homework1.py</title>
+<title>C:/Users/tuhe/Documents/unitgrade_private/examples/example_moss/tmp/submissions/s1001/2_report2.py</title>
 </head>
 <body bgcolor="white">
 <hr/>
-C:/Users/tuhe/Documents/unitgrade_private/examples/example_moss/tmp/submissions/s1003/0_homework1.py<p></p><pre>
-<a name="0"></a><font color="#FF0000"><a href="match1-0.html#0" target="0"><img align="left" alt="other" border="0" src="http://moss.stanford.edu/bitmaps/tm_0_30.gif"/></a>
-
-"""
-Example student code. This file is automatically generated from the files in the instructor-directory
-"""
-def reverse_list(mylist): 
-    """
-    Given a list 'mylist' returns a list consisting of the same elements in reverse order. E.g.
-</font>    reverse_list([1,2,3]) should return [3,2,1] (as a list).
-    """
-    result = []
-    for l in mylist:
-        result = result + [l]
-    return result
-
-def add(a,b):
-    return a+b
-    """ Given two numbers `a` and `b` this function should simply return their sum:
-    &gt; add(a,b) = a+b """
-    # TODO: 1 lines missing.
-    # raise NotImplementedError("Implement function body")
+C:/Users/tuhe/Documents/unitgrade_private/examples/example_moss/tmp/submissions/s1003/2_report2.py<p></p><pre>
+<a name="0"></a><font color="#FF0000"><a href="match1-0.html#0" target="0"><img align="left" alt="other" border="0" src="http://moss.stanford.edu/bitmaps/tm_0_98.gif"/></a>
+
+from unitgrade.framework import Report
+from unitgrade.evaluate import evaluate_report_student
+from cs102.homework1 import add, reverse_list
+from unitgrade import UTestCase, cache  # !s
+
+class Week1(UTestCase):
+    def test_add(self):
+        self.assertEqualC(add(2,2))
+        self.assertEqualC(add(-100, 5))
+
+    def test_reverse(self):
+        self.assertEqualC(reverse_list([1, 2, 3])) #!s
+
+    def test_output_capture(self):
+        with self.capture() as out:
+            print("hello world 42")                     # Genereate some output (i.e. in a homework script)
+        self.assertEqual(out.numbers[0], 42)            # out.numbers is a list of all numbers generated
+        self.assertEqual(out.output, "hello world 42")  # you can also access the raw output.
+
+class Week1Titles(UTestCase): #!s=b
+    """ The same problem as before with nicer titles """
+    def test_add(self):
+        """ Test the addition method add(a,b) """
+        self.assertEqualC(add(2,2))
+        self.assertEqualC(add(-100, 5))
+
+    def test_reverse(self):
+        ls = [1, 2, 3]
+        reverse = reverse_list(ls)
+        self.assertEqualC(reverse)
+        # Although the title is set after the test potentially fails, it will *always* show correctly for the student.
+        self.title = f"Checking if reverse_list({ls}) = {reverse}"  # Programmatically set the title #!s
+
+    def ex_test_output_capture(self):
+        with self.capture() as out:
+            print("hello world 42")                     # Genereate some output (i.e. in a homework script)
+        self.assertEqual(out.numbers[0], 42)            # out.numbers is a list of all numbers generated
+        self.assertEqual(out.output, "hello world 42")  # you can also access the raw output.
+
+
+class Question2(UTestCase): #!s=c
+    @cache
+    def my_reversal(self, ls):
+        # The '@cache' decorator ensures the function is not run on the *students* computer
+        # Instead the code is run on the teachers computer and the result is passed on with the
+        # other pre-computed results -- i.e. this function will run regardless of how the student happens to have
+        # implemented reverse_list.
+        return reverse_list(ls)
+
+    def test_reverse_tricky(self):
+        ls = (2,4,8)
+        ls2 = self.my_reversal(tuple(ls))                   # This will always produce the right result, [8, 4, 2]
+        print("The correct answer is supposed to be", ls2)  # Show students the correct answer
+        self.assertEqualC(reverse_list(ls))                 # This will actually test the students code.
+        return "Buy world!"                                 # This value will be stored in the .token file  #!s=c
+
+
+import cs102
+class Report2(Report):
+    title = "CS 101 Report 2"
+    questions = [(Week1, 10), (Week1Titles, 8)]
+    pack_imports = [cs102]
 
 if __name__ == "__main__":
-    # Problem 1: Write a function which add two numbers
-    print(f"Your result of 2 + 2 = {add(2,2)}")
-    print(f"Reversing a small list", reverse_list([2,3,5,7]))
-</pre>
+    evaluate_report_student(Report2(), unmute=True)
+</font></pre>
 </body>
 </html>
diff --git a/examples/example_moss/report/match1-top.html b/examples/example_moss/report/match1-top.html
index 67c6aee..202bfe5 100644
--- a/examples/example_moss/report/match1-top.html
+++ b/examples/example_moss/report/match1-top.html
@@ -1,9 +1,9 @@
 <html>
 <head>
 <title>Top</title>
-</head><body bgcolor="white"><center><table bgcolor="#d0d0d0" border="1" cellspacing="0"><tr><th>C:/Users/tuhe/Documents/unitgrade_private/examples/example_moss/tmp/submissions/s1001/0_homework1.py (34%)</th><th><img align="left" border="0" src="http://moss.stanford.edu/bitmaps/tm_0_34.gif"/></th><th>C:/Users/tuhe/Documents/unitgrade_private/examples/example_moss/tmp/submissions/s1003/0_homework1.py (30%)</th><th><img align="left" border="0" src="http://moss.stanford.edu/bitmaps/tm_0_30.gif"/></th><th>
-</th></tr><tr><td><a href="match1-0.html#0" name="0" target="0">1-6</a>
-</td><td><a href="match1-0.html#0" name="0" target="0"><img align="left" alt="link" border="0" src="http://moss.stanford.edu/bitmaps/tm_0_34.gif"/></a>
-</td><td><a href="match1-1.html#0" name="0" target="1">1-6</a>
-</td><td><a href="match1-1.html#0" name="0" target="1"><img align="left" alt="link" border="0" src="http://moss.stanford.edu/bitmaps/tm_0_30.gif"/></a>
+</head><body bgcolor="white"><center><table bgcolor="#d0d0d0" border="1" cellspacing="0"><tr><th>C:/Users/tuhe/Documents/unitgrade_private/examples/example_moss/tmp/submissions/s1001/2_report2.py (98%)</th><th><img align="left" border="0" src="http://moss.stanford.edu/bitmaps/tm_0_98.gif"/></th><th>C:/Users/tuhe/Documents/unitgrade_private/examples/example_moss/tmp/submissions/s1003/2_report2.py (98%)</th><th><img align="left" border="0" src="http://moss.stanford.edu/bitmaps/tm_0_98.gif"/></th><th>
+</th></tr><tr><td><a href="match1-0.html#0" name="0" target="0">1-65</a>
+</td><td><a href="match1-0.html#0" name="0" target="0"><img align="left" alt="link" border="0" src="http://moss.stanford.edu/bitmaps/tm_0_98.gif"/></a>
+</td><td><a href="match1-1.html#0" name="0" target="1">1-65</a>
+</td><td><a href="match1-1.html#0" name="0" target="1"><img align="left" alt="link" border="0" src="http://moss.stanford.edu/bitmaps/tm_0_98.gif"/></a>
 </td></tr></table></center></body></html>
\ No newline at end of file
diff --git a/examples/example_moss/report/match1.html b/examples/example_moss/report/match1.html
index 35763eb..b2a735c 100644
--- a/examples/example_moss/report/match1.html
+++ b/examples/example_moss/report/match1.html
@@ -1,3 +1,3 @@
 <html>
-<head><title>Matches for C:/Users/tuhe/Documents/unitgrade_private/examples/example_moss/tmp/submissions/s1001/0_homework1.py and C:/Users/tuhe/Documents/unitgrade_private/examples/example_moss/tmp/submissions/s1003/0_homework1.py</title>
+<head><title>Matches for C:/Users/tuhe/Documents/unitgrade_private/examples/example_moss/tmp/submissions/s1001/2_report2.py and C:/Users/tuhe/Documents/unitgrade_private/examples/example_moss/tmp/submissions/s1003/2_report2.py</title>
 </head><frameset rows="150,*"><frameset cols="1000,*"><frame frameborder="0" name="top" src="match1-top.html"/></frameset><frameset cols="50%,50%"><frame name="0" src="match1-0.html"/><frame name="1" src="match1-1.html"/></frameset></frameset></html>
\ No newline at end of file
diff --git a/examples/example_moss/report/match10-0.html b/examples/example_moss/report/match10-0.html
new file mode 100644
index 0000000..02005fe
--- /dev/null
+++ b/examples/example_moss/report/match10-0.html
@@ -0,0 +1,14 @@
+<html>
+<head>
+<title>C:/Users/tuhe/Documents/unitgrade_private/examples/example_moss/tmp/submissions/s1001/3_report2_grade.py</title>
+</head>
+<body bgcolor="white">
+<hr/>
+C:/Users/tuhe/Documents/unitgrade_private/examples/example_moss/tmp/submissions/s1001/3_report2_grade.py<p></p><pre>
+<a name="0"></a><font color="#FF0000"><a href="match10-1.html#0" target="1"><img align="left" alt="other" border="0" src="http://moss.stanford.edu/bitmaps/tm_0_91.gif"/></a>
+
+''' WARNING: Modifying, decompiling or otherwise tampering with this script, it's data or the resulting .token file will be investigated as a cheating attempt. '''
+import bz2, base64
+exec(bz2.decompress(base64.b64decode('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')))</font></pre>
+</body>
+</html>
diff --git a/examples/example_moss/report/match10-1.html b/examples/example_moss/report/match10-1.html
new file mode 100644
index 0000000..62291a2
--- /dev/null
+++ b/examples/example_moss/report/match10-1.html
@@ -0,0 +1,14 @@
+<html>
+<head>
+<title>C:/Users/tuhe/Documents/unitgrade_private/examples/example_moss/tmp/submissions/s1001/3_report2_grade.py</title>
+</head>
+<body bgcolor="white">
+<hr/>
+C:/Users/tuhe/Documents/unitgrade_private/examples/example_moss/tmp/submissions/s1003/3_report2_grade.py<p></p><pre>
+<a name="0"></a><font color="#FF0000"><a href="match10-0.html#0" target="0"><img align="left" alt="other" border="0" src="http://moss.stanford.edu/bitmaps/tm_0_91.gif"/></a>
+
+''' WARNING: Modifying, decompiling or otherwise tampering with this script, it's data or the resulting .token file will be investigated as a cheating attempt. '''
+import bz2, base64
+exec(bz2.decompress(base64.b64decode('QlpoOTFBWSZTWdq5KB0ARo7/gH725FZ7/////+//vv////5gVN73nvvvjvnb2H05Rd73uW8A7skNnc6HARrVVIPdh3s9jMOpoO2EE9sqqXrTswfR153F332+nbBXHTrtgN9evvvnZMR4986hvt77HVhQh9ylOmd232ijayTQA6e73OZ3O2dez5dD75m+BQH07e5327Zsu23z3k+9yhC8+4S7LC7brzsS77dUdVNN9wYZdvZ72UwPu5OIpPradzJKVvt3vdnN99ntvvn0dLtfWuO4b3vqAl68zoZX3cBzvOiRKr3e46zdzS5lrTTJvb3ea3HwlNEEAEAIATQmJpU/0k/TTU0aA0o9TZTT1GjINNpDRpskEpoEEJMghMKp+TVPKfppIz0SDTNJpp5R6g0AaAAAACUxIRFT8qn6pp6anlPU9Q9qGk9Ro/RNRmk00A0ekNNHqeoB6gGQ9QBJpIiQCGRGE00nqek0TEZBPamjSMgbUaaaMAhoGQyAiSQEAmmhkmQYphMSYpsTKeU0eoYT1PSek09Gpo9Q0DQNBISImEJhBMTIp+oyYUn6U/TSR6gPUNGjT1A2oAAAAcATz+ohQqAUwQr9ZSCeeACJIKpIAfjh9QqKiqiqsP/P9uYH/Zh/xdcf+X4L0l8fm/WWIViVfE+V3P4/2hYr9AQPZU1SQqR9H+G/O/5TomhdDGuW7M+heK+RhWyvZutQZaGmIVx5wZl1NwyW1OOdyPDziogWJT7/zZI6vUCekjOjOF+dbLa8YlZ07MwfQzOobmaMhScKWk5lcvtg/zPtJTj5f435IEv8OL6bJ7OM4in8ZzpOTulun0TTdn+LJC8q7n5jZzKIK/8344cC8AEAOKoh64EgkisijIgkCKPyCUwkCSfkg2QFS3+sGjYREApIoNVKWYEIYYymMYQKTEIBlqPkti7L31tR9qe2l8TzYGuuHj7ad0H2SUKKgKsLI2MFP0MKDEVgKQUBiKoTLYR/8b/8tbixv26iV+h6uH/2daplYrNFGsohtUChh6PF9gT3eFhJHkWPET1XV5KWlY7iLt427Dy7JWklKcbR4OmB6JakbdqHlM31usduFWSG0uh1QhRLL/AzIoUDgY6WMLKGdfur/p+mlKbex8RHD27TZJ8IDc1/4OTo0bTTKtjyPoR5p9vs5ecL/N25ovBvahjC42noc+itkH0wnplFkvHlw9C5TugRcK6TOwk2f1QX3FbH6v5RCI9eV1sHud6O1bjs3ikXBIPf3CbQ9a67HF/TOAIBA0NfP8aOnn/XHqqYdewug4wwEaQ7otXkCC9FfTYdLNDfIj4ePhLaJoaj2S7mkC4t3+yvaV2f/vCO5L4D4O5XF1aO6f6HNiJY1m5TBzGKxrMbYpMeiYu/vq/OHou+pvXF9UfgvvF5fos47568u5f3a3AL3L/n8COZqdHQl6758Zj1MTVwe9fm5q7y+cGuFw8c5It3J+JPO/TbbeYl3SWSirkU05TgxpwpbTdRvPcj51z8rpT8qUYpIrhTPxjvbH+efj7ibbsaf6tKvNFe3bJjGcSX1r4bMcPvM6by4hoLdFvTuKT2kmZOFmU5Kn1Rlfeu8NSUJIVqszSbyfVaTUPz6okWIMEKCyA4s/cP4V/F3kjEp0QoLB3KHsJvbKLA6eZIZhqKskUyKNK78r4UZ4456D088fi5JTmIwW9W+zWwRdtBr2GZjQQnTbp1aAS3ETjDkYDM3jO5ZyhreyRIg1WyqR+0KXIgEgR0vA/TaGvfXZ3th6WWecY9kLDp3xZ1OYRJfcz46ecrBCWbA9/uy/P1jGcMDg0HDPl6FGBnu20gxYnhFZrwCXj9XYcQWGLqQR9Uv+1v0OzNj6aztuqg2J5IBx3JjLWDPmxrRwBC7N1A7h1M6Mfu9IsR5wXWhwDVxkaTE7pbL33TojgJmEVEfaQYereDjEGTOeX1SlmTocs7sFHBtlBs6K3W1WlomsbAd19E77Rqa4D2PKNufNA9soRMLSCzHF71fMsKmRKN1+GntVm+++tiuMEVGhv5NioLKUUQ0Bgs1Zo9FCqeu4lpOqMr1LeROnxUyPJ4MsXJm7nxk2eIZHLXCgia4C/qqemwsnUceZsfl8ucr512cgvo268ds6mlg//ShYhaPdvtC7K6W3N6Q49fm/mW/2RbjmKgIp13Bs2mU+d/v1/rUEK3zH+J3ukXlrZF7NpCz4BIoSHCBFI7jlBryNhjRuK2ZGimzB3TVcxhA1NiS1vyMMFc9cnn26OxgyElhW/hOLH4ZGTBgsoY8pORDSEXn8oLUKQFbbJyeT6mwm47I0ZbPmX554gqFNgrdhIx5UzgzChZDj85EX7R9g4qy2Rn3T4EhIWebH6Y2jWDAvxHPZa/mVjJs31o7GzovSSQwkkEV0nseiWR59HPN+G0gxvHs7dfXx0Y83z5lmgLJXMpHtkGSyz47NjgkiPgKIaBNugcFKUDrM6rpkyb3BnKV8UGnsvtyp88tbu6wobfVE0Uxo0tHdipuPqPORS4y6F3MRR+LkEsOwn85SKY2drYESPi1hI+z5XYDmBYfSXm2ZNNMr8zLPzNZ0PvmGEcPP489uWHpzKhjFZdoURotCxxsiLK4eOzPN6mZmZ5Zxz84T6RIKF6WbZU/o/H8ExERn26y8Yp2HKTbxJgXmYgih7X21EI+vFYI1lD96qTeUbjPk+neCl8rK1MyIJ6n2Nspt97HNa2Jt6zocShmrMkSmHPWx9eZoVv8B29N8jG2ZneWzlk9kdByhtFIse61SzbD4BItoxbG6OFhdGyIxqPwcr579O4z6Q0M95yORWrSL/SfVlfdxORsWWEmkK9bMLe/cY3ceFUuGoUoWmEovAZMWjnlskSkXEMji04NYckIQpobqo1LgwOBV2PkhOaXnXPRsbbep7o1KnDS0DHPa/MydpEyqYU4ac9DM8O14LmYTXm4Lz8fJ2+R5s+Whqb0Xoe+Skh2kBA4cpxrLcPMR7FeNmP3D25OOOiw0HHQgKyZMkKfOYOlgUa6nYiGUlouNEkMfaD/Ej+VYTTcYM9zy7UF4TLw7N8UDp3CSZhhOnUXjB47wEvvK4X4wpDfRw94QFehyP9PGGPHRXcFSy1SGZeg5VR3O5syNjd7ba2QK44KryPsKMmb1E93HcRxxi8QdXkMAmEMVQjFDh58qCKPM9pDHoYgjHl0xI0G1s7SZGvr3nUcTD2/08j8EEmhxY4znumNnR2FSed1+ETd4vFTmaFM9sHORbeF+4zxDLEmPNZZukpk3uDC8i2Q9eOOYZncItxtxghm9xfOyRnnlakk5bQTjKjuKBGkaw1qbIRJjMZ4lExdu9kQ0MtmBVUJz59LOrq86DmcCtMx6oz6tOu28OKqIqKxAk1W5EZSl8BFTGiPcbejM0Xl7S+VlFI83djSc+dPnqvp8Ovh8/ifHY3O0c3WNlljSlc88ERW2t82CVmkbbpDuoieJN/Z04jjz9ppaDu/EFDusEbE4do0GEbwfc5ILAaEW3AuDca7jXlGl10UL7jUpEOOFWKyKkFeqJc47z8N7f6o7gp1yj1/CAPXZy9piB5WHhzTV1oF+jrPTK5qYUpKxWUWA8i5jaUNMQ/PyZynFGoO+OB0g8jcwYCRJUWTCK8zoxqdeJxlvc3GPPvV/HFmCXOCztNNzRHmScjnvyV0eN9udsd3ObZncPNBdjYqkmO0qcbpWkvnjLadNmJKzwhzHq29QqVsslyujO8fitv3zI0SaSzMMhcgy85llj2djXGYrp2mTfRIn0NpUMBCAgKt0QsK7RQ1xwz8p5eMHQsxEM23jyl+RGnaN/R8ZFe/Pmxt6+2um3dEN7F+Oz0nr1dgc2QQoTdgI+xNITexx5taxU+D8286ZX11JNavb83BTOuRr+//pF+4ek2Hhvhggvm0WjFbGJyM+eRZBCEAjGwHbWQ3GRArDGY+3f5RxnCi57lG13iK8YkcixG88BT7FdqfEe2tf7EqS7AVirljEtddDJaUlbCj8uyOiumUvf612U21vraq51enfbFMvc74rfZrBd4h6wcbykO3YiBYB5BczZyOcY8DSDfXyuDzy1qSDl+fws/J1Vpf7osz2YziNlnO2Z0fG+iZpedTuc632To94Q8fHwkJkgIokHNQtx80i6AaEmN1obogkIaFsMTde942S/9kZ4qQwqvDMkkKMlcjxQ683ds1ro+x/jfsyx9T2WqxG7+79OJl34YGLowUMIxh2dOKAEJbhBJa1PIyUTWiS5HF1DD+TwgoCqE/G8BV66atWoovgXkEVaM4pkSSQqXf1K/Z5P0+XVbCynoEP6Aj62DiKzNMwdzGpfMs8spmGXFtny4tCRMN1XbDgD/fCmLsgdQz7x3fHkhgde4UHDu/D+TN3XfSKfw9kqAGiDFAVTDP9P60K2TAe2w/ZL4lpt/P6bUISSSSSSY0TBdWy5JX0oJIT0DKIKqqoG+bIcoc87xzw87mBoWfYqQ+/GSq1tstsq2xiFWMCqxSVCv/60wzMAWcH6Ohe6wO6w7TIw6wzB/D/BOTRDSTaBjIoTuyuyhrfTwLZZO6zWDRTAkwn/ZHf3Q/N291E/95jNqXhrQo3f7VM5u8tpVPVoMZGdcMRYXba7/cRkkoLp88OqlTMVt+FGquSmt8YV93kwXc/sxN4QkVbYysU+H1bziHdK5d+vkFln6QwQeDsRa1D531Hkvy05q0xtzIEYQBNk1ySJ3cf3hYd7HowfYETwenGDuZHw1Q2CpqHEpg/SUCJOxM3lCKmGaF2hDe/ZcJW4epcrhSGRdk/cFXE7h3dty6fJm9D1nx9dwSZamjIadxwt2UAaupJElKhHlMIsMhB0TECMR02XP1EFtO6jHh/oV91c+Gzo2CMMeh18DsaOtCydGCeMRyrjS6dh5Yc8hZKEIpwW5rx5CWJg5iQA9XObIi3Gady0sOZFRImIxOWxrbiuHxHaZakT65gMXSiBHscpvqT255c/L9/qydcEZITmosp+IaW8LtXlGMt8sHyd007rSH1mKn6cCdpha90x3z2xstnHCzcpPBI5CEe4cn2F8Neay73FNBCD8o47I2+KJ/xffj9VHrvPEzNtH2LtE95xrNyWtYS9C7/JxX91vdPp5UgW1dsPxk+SUpK3is1RVjCkiZNOu16TNyibr/g++6VuHyjF7TfHVJ0wuJMvPvLB0S/bpHKZtl3lv1Y8JX3V6+FkPeXHEhyDfOxr30lLqsDjt5xfl1Wmt5hwWY9qHTE1kL6jN1GvQ7pXEwte3p7Nw9L25Uya2aH5SuJFTbFlj/weDo/ZvfA2cbZ6Xx8snE6WTLtKh+uZdflp70aknv1xz/Gd+/Gc7fjX0o7hHRnBtMOmQWT/OifRnSKR9CSPEn0ljzGHE5kBhwu6u1N8WW/KDopuN6s8MG/LZY8k+91pnGEnC0pZDoi3o8jF5zwnipvj41mK+eKnk+ZwtoSnjQoYqZIZDs5MRmWI7oeUJDjkZMxPNj6Wia9dRTvUOzx3nlNx1qDf0huNcHAQWj8sGt/dvnW2myR18L4dEZ3jvbN7rZFZrrh0u963399wk7k+64jyxU4aLeMGOvqcqXuC+VtHpTsapH9PdspjTZVynHGEjqvujjecF6V5rfsvhI0tvMyHwEXF1h3j0jOfi5ByjjfwgfXyrisrm+O+q1284qvNHuk+C9WzLspPRaT0wodvoephWFXRzmppLCq1d0QJ/VqF793G09crd383kV98zadU5gf2wTy/Qi5T583z67smYxEe5+t2Y9cZz2o+qufLo30XBpAo36KVREl1vKTjiQSt3uTPPUitpnk4CTQSz2SBvHl4DkQ0ByqroJ1YQOpk5EFnAydSDiA6on5S6vGsUS74kQFdZ8M/ZzAuBo2JH7cBuBDJAb9zM7N7O+E2J8TE4cf4qRImeHFmTKG8EdbVQb1pgtt9sH/HwOvU5H92XLPd/k+9bS3mHo3bA3pbevYq1lyp6oJWNTDwmbJaVZpUk+oUsDL085y+qlMJzmu/ThjgY69Jul9aqUpkWFb18ujbfpkWyEce16sk4n6dwyrG+AtfAvxEyCdjWlmRDz7+PjfWH4/bf7p0uN1tfzx78zZz6117YPAI3xZDHU0dwnt1D1p5ku+1pX1pyv33mXuVzAq88jVsCeWeVhetl7ktIIakohyM0KlZkEmTM7MXF1SyQjjysyXt6qlRcMOBhIsJS7IykZ0M5l1rj67iVa93FYZSs5XZR9Z3IuELy0PBal7dTubO+nJm93Thlytu12EWlmRIo5PAs65NJBIffHgt6LAywq0q3kBec7LSQn7aNJuXHuvkWo3Y0GiDaGh7NuXOTK/n5u3N1G/jZ7PO+eKfdrD020iEDfF29wpeIhCTXG4kfG8k25OcPoOJUDjSgbkdkxtCAqIuuOXwVyko6YEEx29ahH1vlBfSRElH2QOHFrn0TqBnZdtl+lxQ9gma4tuOQpbTxPo/ANjj+n6Q3HHQNo0A0PcCtFvDoqWKHZIWUcOERM3lHclrEkk3OteTPb4vFTh1jOeTszI6HRH4k+94Qv1mnxwzL8kd8N08s6pcMctxmOfgKjkJtF7ATaTGZHjZKbSbTTFMyFDcUejc4GABvHH3QjRMExQKX1hsPcKyA1aFzzLZZl8ESBDDQsffz9O42apDWYeQbyFiFmQUINmpPgmPmdi3H1XWmex5DFYwPqvcaOXmHcpj+fYGWJYXLetBbj1rk0iwQmRXJ16WMDI0kmiNBpgTlFosGgMAuaSCaSBCQdpU5BypQBNleF4DEMGN1EgQocTnQsISo7p1bQwwNHRuM3StU0UfyngJyxdZD1Z825fHrV0zpgVhaPY8x+kLDm/VRYiUnOG2+CbDEnj4BWmtvRZdDFciyyy8ti/uBRhhSirPLsIJTomxvunB8OfTm+AbLYOZ3NSgEhzgJhCNPP24mzqDM1Lz3sWB9xzyBQDg9CQeKUoPdbuC/8gTzCjfW2i/tPs8F5z/evEdvG5v4QeeaN5WqVbcuPoxB4ssIamrGeHGqYs0Mxcw+riJqd+9HGmTaOhw8PBO6cpP2xT1MIGv+0ex2PuEzXlgd326ncP8+vwVGfXZl766vWVgqWv0mpypmW1S+eX0mSlYYPcyblwEJCQkm2u4LUQ4JCQknE4bUbqTJ5kWbG1FhIqszcWTRcIcSUDBkaFpsC3/THvZUQ8qos/oB/OPP5RZQRRZnKL0SRhhbhHNnmG2zo/MPR49vV1B+t3TJEUQUS3kQxGDBP37sy2eUDn0ehBJNlbr06oRwFE6A3jjsfkHo3dQUDpam9Ycbbty8PbRFXzMYu5x+S/SFnFrGKrWk8yY1Nac1pOTF4uKxTHvQkLThUlVpGn1T2qbBUJ6l9bxbzTITarNZq1WS7qsvmB9YxZqsYzeERLvOqnWXedIT7Mi09xvbLxuxgmhpie/DhDdZiY8zazTK4SX1ZzAJ5UJ8beJnOVUTrOMuVe8xjOZxGJiHzVRJOM4ReJmcOZF6+3hDv5hXJuT1UKTvDSHbpERiiMX8Foqgpk5FR3kpJCSEkyIJcQP0m+PbNMBOMS/R5GpYGpUgqVDxMzYK+rTSSEmEkJISEuvmmIixgqqLoQmeXhhk0UOozv7L0Tra62Ppj3e5J6pK42KDUELe59Kvr34kxS3uiejb+uMVy75lEzOGrTzMzmMQ9xDpAiU+FWJxELCxR/DgdCXxYRWFNqOoIWZp7Jkq35xWB8+YcYHt9c7OE7rXaLXC5WrxeSqND5wyzrJ7tYnIDrnh2eFTxHHHElCsTGAiat+FJXD9d9D1jMaZCiMYRAxxkvt05k5zzzRw6U15t6rjnG2wMbSfJBqGdkhGx265iaMX4P2fqgaxCMXsD9abkdNnTQ4/muNUkyRRArxm5o1YUkyHB8tpvUh0q5e1i+rcVPn3BjihbgNjJM1TLZOdJ2igopSJg0JhM2PHv6v6vi573/T9u6LPY7f+/uf38OPoBqP23ua9pSjj3UThZeWvpYIkgDgM7yJXEcX2QH5j9nl3Ghd9cv1Ua/D9BOBBuiUGcpiUukP/iH7wx9Q+BEwTeidMEygHXE6o8+usbi1nrjJpmMYvs6kz2OsTTgPPnwJgzyQKrHK9yIQk2ZhvnPzqeEp7YcnyIhMI1w7UhpTV5EQyFKd3XK3M1PUNAokTqnbg1+Ovrq4173nRPuiX4Tr7J7lnKUVsTEocU4jUkcf1c2L0aztzPv/H5oSQX7WsiyfumUn8qaHSENAapBYQlQmkArBYQWCkkmJMSYyQg4nh08iBmaXQzvDt9aTSE2f3Uspxroh2twglUZlddY0hMX8G7uyyx63abb5msGgwX8f1IwNMU9wgeDxH1qOYpTJTkS8tV0KbLVwRf5o7lFSqeqHzUofBlCmJ9HzcwoTxbcdOey3jbxtuBMbu3KY4vkKn2R+s6cx7bOj5fhZul6KPfspvGe68s6UifXbnZO+1a9mTb2L3QzmdhFiUZfnuMG5TsNLC2t8SWpedKSU+r2kWbaD0djJ7zp3u0U5c7DOd8NsIfdgRs0J5rUehjWbVVsrl+tySI722AyD5CHP4HAVKkIncQkcN+XcrahZMl44dS39T7oLhs/FVSvj/wfV8/vnhzVbnIGcDBZBVZ9SHQByponwwMHfNYL7MZpHaoKQRnWqnK22f3POU6zR1dPeF2I20EkkmkTTvDI8rQUNn0Gk/bD7j19VB+KSb//dOId/2bd4BvhFDAKN4wTlL6LMQDS+s9ZyKhCH5nYPatpl/f34edm4+8IEBq5eMOsOsz7m02ygg7B30AMrxOfx/mHi8H76HcWDs2Nzah2n8ClcAeYhnEhDwSu+4DgFhI/L3iGwI0wmZhsRHXrBZcwfE2nh+gc2/TTtPzl24MhtWg7oSYc5P6+Anc79no1J6SpHMFgyMMHN0lkMEfVkeDQSHBM2/x9XcGW3Mt60HuXIEgRqdbJtnm8ixhd/oZrzI7iDCmy4+TfzLxCSRIN5WSZCaGYqan1hirtxaY37YsIDX8hYscx4STUXFxJEfKBLIfL6JZg+1y1VWZsKeB8DDCdv0hAQFiSLj3ko6ypQg9lW4/gOziZ1Ixov0R25h3/J4jehQne4bYLXtoTqpkrYw1NjmjnzB0xM4vlXkCGORCP3j7iHp68NhIUk4IuSbcv+scBsYtpWLEn3FqX6t92zf3r9IhPU0XamK0UoqXJ8IxFEtJP5OYT8jKLG/rn7/d/r4A3DDtwsxSW+nFMixxO7G/Ql34eF123kRDYiMSHM37c2Y+0EwkvtdxDBA4lKP3eueGg1w0tKeivm/nNEsItD+bouhxce9zqXc8J475DW0PRrSCwfr9lkrJjtTvcnJKiLCaYBX19VLGBzqh3e+8PR9qXl1z6/yc3g/pIxOQW31+O7vNTa9Je6cd09kqzv8slTWTWfHh+sOhYE+VKdGV+up6leLT8zaSDlFoen8XcL7XwoFx2mDpVAnWieVux7vctAl4E5VPrD9Lfh3Rl06SXfN1yRo9PXWkq28KzKhxhnVTtREXAZTm4nfa5Z925F6fTdv8PfnYicJ3iIQYHfgfziiLm64U1zDY/E84cfSv2w8DqlkiMII6poTJCa3cXPujrqvSOYKE3HGJjp/19ucyJKLd1hT7Ox23LRnmCGm44xUNDic295o6EPbr3XDcqYxDp/WHuigVpKY1NxT7hcuXv3XdeXeHqHI9xemSumfiTl52ZlRrn2XXi1VZ7mvg15/hzPBKa8tanXosNpPoTxTbNJOGFRYnneUxQfU3PzXlNemm8sWHN8daPpfSmzf3cDFYvKRbFGKI9xraXt29W11bOGVnBpsbG/GiU2NaQm6RmukjZTq+m+YS1fGx0CwcEHYYeTCTCQhYzKIq4kJDsISR221X94sDrgqSOxDXC88E8wl0vhfvfLftdk2PnEd3ROLFq28WW56ZOwrtV1xEZSFV/fvtgndSs5iTaJuxXRNUbWZLWkWGTnVzcrztzO/g54kLHytbRXYbNusqRRtq2poo5w63Lp2zr4+XlDNsa2a1SeTibLNTCHW12bYXwk1nIa87R4NCXYmnq72459W2klX15RVcou+dJwlJd+T3Wv+9FMPN4pt43koAcFd6fTf+/fxU61lZIs1rOyy5rPOwOH9PoisOcVKsRX2cb/k7z2uF9Mnldj0X+T2i8mcYyHEhERA444ikYF+DToGmjpNmv3fucvsc9vA1zpGFzk0V4cf+U9l1a7t05vx+jflQt1lpEX2MHI969qGg9p1DjbxMBIaDCT/f77WshKXogqAM1Zj98c91fgQvYwiLPRDYgurKUYVLDVNF2vIAM097PrZE/Y1QQEAxiMl4fqeQ6zsIfI+wSaBAHDLfvhQw3vwBQ3cn9WApGdCclDdCGol5QaUiEYOlEomz2qj2GYcwF0RoNLwWQUe4nWH0h+Ynf3Q9JsMyHqMWKgqucB1BS1CRcz1m+8NQnlHMN92bwAgwYofq23iwmXEoxLOyNA+GQj2C963NbxdBqzNNWrcegIX0aBNHSSGTCmmWNg7hxbwdJCBFdhqdW/2kmAVTIQjMA076CKRyRiagu0SSEhxgXLp00OkppC4gBkrQ+ZjDqDuLhmHZmsTukOoFgAxMIhlJ5jYOk3HQF5gRQ4A+8QAoDJZ3iQMx1Y2Gbwo48/AxcBtu1iU2JtG8MiBC5cIBgFhhcEgxstHYFA/HcCc53JDeFgjhYgosHJ0ERE9wHiBZJwB5p5jJyRx1ODLWD90IFg6DbDKkomM2logOt0rBfiWKGxYoy/B+BdmodE4Ufxn0wlfaFGmCG2RgGRf2SGZxE+iKJCKLuLNyiw8f9chRkvqXs8tjwzO4/N4UEq1i1AUyESKMEFAPnDj2jPEUAe2BNyTgUEQZE9k0eJ5IfI5BiCMVk+ZVYFQIBGMJE/Pg7nGE/Q0OXiLghUgpSoVByHSWyvBpfMYQ5fusQiHgUkImwl6WgHnCIiXzF/Jvog1dpZeNuXWRBZDLkwJmaKqM0hFvKOJwUSwbAQj+znSuwoeh4JmuwIWIIH5SMGKNFBQUOOKawKbFQ2r1XAPxECEAOwTzXhDkQMTfYjtxHEkAxC+0mAuKV2oEqzW51KcQ0qWijpIeQ5BHEO4Neqx7xCBDsNwdpxkiEE7YVeuEZJGJOohgATrPrSvEHNzBtEPsCCm4IBAAiTRhAbzHVE5JFSTmDioeiz7rjrTijQcqpYpCkg4gLs5AEIEIoQgDEDLqhJ9mmugNatEk9pZuuXJNURNdg0q+Ku08+DVwIY26ToozO864Etg/G32BAYDI72BIGRNsLxkD1PkkhmZkH9HmUoxDllJp1SWCxamyOkULwMDA7VDuDEOf5+Syu/f1BlVUuo+kNYHpi9xcEpMwYcOBd3dYqol72+4aj/S7A6+IqLWo3Jd/6PgMz/MP9TzBRqjfmLhCp79Dow4Ck6Go2/yFSHuj6D7CeqMdDZUGhST/1gXh9P56a7kKiHoPUckuE+ZJlF5y5ArXDd7Z/3wvU0j7w2QzkSBJIJqooZBgBf8unirqT78EwUTddEXoJASgJNoOhN7/UVRTxfGhImUb2QpUD8wg/tYO4F4MeLtdP1o673wiAxJBp8EGidZ2KIdj/GlRcqyUIq7Q0jqkNMD2BLYiAnRsEoWUOHQ4Woj+OHX282Kdwb+Hzz9hgZf91KbPDtGCy4QYU++MIDDVoKeHzK3WS4khIqcF2QDedjqYacnfcGags9+jx4l2g4BlWDGBuiC1YVo+2qfc3r/bAzQj28/mLSSHBm6wzOIgmG5lbxTAez0hI2XeyhNUYBaDLFlEJQLN56oKDQ7pgId4FZFijiHtbxnMXjenxGKNEXAfdhYgQvnmheKHiUoDcH7wwDuuPv/dWgXWVSGorOB1hJ2T6Qw/Uskz8iifBEiopBAViHlKV4tC2Rt5mWuJQwwA8MzebeswyyfaESZ03HZqgSiQg4tUEjuTBKSaAeKmaQU4ybwRdWcMktcdaKCBrWOQSz68LNWacBIX1pt6EHlzKav5w4BdRwLQy4RCLeXjCxTQtS3E2wuRK4jO8Ml/A1SrhnBNreyKSBCE1Wv1FhPc9/2vB7F+YsVJF5nbJ0pBpYFj1ztoygOTIYCTwXZQF4BeYC2ilBQRfWmDcnR2nlj7e+3WXH3oqFltYq33mT8oztk0CSHg+Y/WyozMS5GgJCswlsoGQFsFIzc7T7RKIrD7rr0K6O6H8TJJ5/yPOImZFbS3LijmZMcRltbW0VtqNsI2z7mp9vs+BHPQsRiJw1dpmR4iYD0Ebg1c9ZtLhuppN8ga7H2h0zMkjBvj3Kig7Q+ItDhxOJGaC/JvgvoGB1PQHzSKrzQXZqkaaH2Bb8q8OJnr+hIHaFooCHvEier58ORPdIA8E1Tw+cVHwCgtFlKGeO09hgYJ+6J7/SMDqkJyFpBJjx9vWdXKNJco/FrN4/vVbEp0YlaSdMESiFNMfxvMkMyJhEs+R6Mu8GlUklm6ei7iUWmyhJnw9ISG2z5MfPWaWGWB+J2NWPypzqHNGG2W5wIo+zjCz+nJrGFwkq3o0S2RZCC8bAoJTQYcP3VmPt6DGJ7HI8hjjT/o6NWZNYgZLSeLu6OqP7SMehi+Dk4ZzvjIhWGCG8cjjFLFM7dkOl3mDOBzKbSYgMXlQQId5OBEQaWmbkFwUsUCnt0zum4VGwKttJYd1B1q97N57jD9oimZ/Qhy/uiNadlby0A8kHnmmPIulA9xBQktEC4jN+JTzNwd2nQiW4fNjlJwmKklh1BlkEEBivIzzubnWWVkiityNJBJSanrvJvHRmVeIIMocBwXKZb1dVtp0FM8OlAnZ3l4VOyiVkpJ73FZ+uL0iTT3PDwFqtmUQTRWZwvkuUUrSy7JJ+y4lb11CBSWqt5HpRBhQNSfVaAqyg3iLByjb3ui5iDtiySqwLLeN9QiZ+UXOkr5RdoH11GA8zyy7NAIT0VwnUcLnjtIE2B4NmTASzeQYG0COQ5qkhic0GRj3g2BvwPztNSHBOtra1lHubhPFxDEYmwpw4osO7oYyOO9ZlqsaRhEceec6F1jfPD0m8MbBF1wlWI44ws0sBpqytttrgl1o1IGa4BjpcHE3On6fhHMxiKKFLyhHxbjHXfONRmp05PWakJ0l5VK3KscvesRfWMqCqTyZmSlWFjNeiNGumOT+dmHSlYkQRIsmg7ZxBDsDAL1NcSjW4DeLcMBhIIbQpjuMFyGTFhYMODQ1kMwJggOgINmxrCSsRKyx3BctUgj8bKG0mkGy38+3RFrhDInvJwDdiaEwXWCf31EgSEEhCQIwpu+zIJnATJgNkM2Q6TFu6MiX2imKuiJWKHOp+duVRoMIHl3EIQmfVNAE04M42JCBzcBXYWMCufmg1oYhmL+u6r4jPIKL9nA0HNDsNYiuJe4jhZDi7igNwQwjiRD4Ob6bI9F+kABMMOG0z4pqIIfpCDpDFA+tiPeZiPgHx6cczmwRORK7V03Re4YDNqUSrxTNant6gYlGlElRAlEBgFQkrgT0HyF6uEJPi3j8EqVvouxDwT6nQalDyLhRwOXd9SNOZ0FxBEQcFmDRAd8TxDCXdyKikKkOQ8fTEI78dLxj6khFhAiIyTDE8GZpl7eITG7CzpefHynup1awLvE/CJkyeb+uZInRmgTDl4c4UDlrFD6ZQsHkOVMKbIAJM5aAyOw5OIJvOFvG5liTkIEzcsDfA6g0JeSNyt6WMTOGBrwLKnDUGulli3vl1dhJIUm41adtiRkMo0OhQNKCbCY2Fdeff2nxGOLiqMYqUO5RBeYDBb/usZ/JIUIo3nbbsPmytM7J1obA+bh4E75C3qPo5LTVgZNDKMmc1SmWNt7vWZp04MqmNNVvns53y+n78iDGdOQKMA6kDac0sikRJAAxaQuX1w4jTQLBYsRkYDFIiebpO642ArnoBxW5i2TygQISKQANdXmT/QWz4WgqDDxjdjQHTmIwpNxAssObmX6ghIxSI6gLjHor9NkNai7Ikbg8VgPT5DhBhE5rlaYUJ9kdYHM7iOAZeH9H+d2A+BR1h4EgQO+QsUNV0oniRZeWCkOof/oi+k5/FylePzneeAfN03Bmq3XhUQY0sEYrSlYVLBCpCwDLTGdxpzCBoGCKJCWJCiBSyyKiCKsSQQRFUSLLZEP+ZgUcGRGVLGFPdv75vM6jUqqP5xv4R9+HgQCFpJQBaAPOQRQ1sBTMvMAsKnqcX3fqD7l+uYBQt0IbFfejMXaIOphbQsLu0cG3hyEDzgCCD+P5iBuLN7wvPrwf24fi+B9HRFQRcYbIHu8PIoc7NLZjITw8a3VZvS8sTAvYubyiJ2CYZvAYrOUm19ZoAw2CJEYzqacmprQVRg/aaJsNIxBBfnNk1Oe+7Y+JHqZ0fOCiv5k/N/n0ZfKrd0/27ptN/q37HdKQs2WouMebDzROtDzRJ6eL1fpmmIobcKK6z2kSp8F+410HC1rRsb5HxXuMg4i2cTr2apo/H9fpNqPFDUk9jKYG0aLURIppGCxjIwPATfeFAKDs3KFLCknEtIUOzo00w4yQN8ckcQiwgI6Sz5HMYjew4Xab3VQxpqiQaR1d+BY6F6lkaPQ1S3oOULCzy3UgIQF0ru5Wp+YYM4gMW/cmoOszNUCBAWRUhAhVIldCdvPkW0OZPqZrQZhWSX0WjJkQi+UGoLIQZtjaws9A2YMkQp3zgMhgQzb0Zhjj8zoUXLKQEwRZT8vQP3kC6hQOog/rpUlYVUqLQbGQUFKlEhCFADGIDlkX5DcfqfYn1moDADAcw0hY4zShOofEYFj5nYNVq7VraErAly5vRlnv6evR5pxL/HzQ6/mUQYkUZ2mvQaQGBDek3WAS5ZD6JCEW6hVtjA5GAXhyuwLHuRH762kJCOHYSgZ6Asfb4ZIPqQf2smiEG65ZPhN/Z/G5e+K4+xZEiRA7OO/rRJz+zQbkhfL0aDvnQHLwLPLtuvmIi+dJHE52mvBZCy0309MiSvE0O9YkSS6c0nUt0zv7WF6VyjSpzKVwtd76ZpFd3qcZrQO6YgVFpq9HpdULoNcqmFXS8vKTiJ4EDYbl98bD57i4fWvEcnwzDY+X2viDNVkF8sH9ZFBdAQE29q5YBkFRCIL9Pf73cUBuk9Z4JQHwlxJEp7bTQ6MLfXhRjlbRLZbSpRS2KKKW3UJiSH+ovawgfBJIqyQ8hTxHwN8EJAxaJGRB9XacQiHG8A4j7dAUOEfoaKO4AzSQNCD3F+u56Dta5prh3TtTnpR/DfreKZx/o+s6zacGkI9spwlm/MqEMxfpLwssM6W/m386O2wxe1hzSoObAvctsIiOFhJFCHFpS0LbCW39QuZoUjINoQn5LPORXWcVMDeyZUElMejWVhrUBSCMiCQVVkgshBWDBIiEghw1cCAn50/gQaGDwDoLAvSq5nyDQviBNSjvQixggQkSSEhJCPeHLkPXRc7R6QKexOwi+QhxQoHXewhBosg4tSqImFhoN5wBMN8PuEYeXlDeL64THMTmFfjIpt07OmHiAA+M3oerYdprzdahmEMYEyAM0EDtMLsYwD4e3lqQ+dsGvBB8wXaN3gUUwkg7S4sewLxPIYaCKj4V+IYI2BMAQi5tPpuvZtjE25CDTM7M3LHafhOyhJfRpkGoH9AKXSrjwHxpekonLbfW9i4WUfCPXMZxcCxlEo+LA+4aJiL97VgZpiaamGMyb52GXm6xfW0laGjLZLIeXtnHqufC1NmeJwiWQUOb4bbWEwKGDBk4ko2n3Tnlq+PEDBCKauzDQeMYA9gN/PHS8Pm6lUgECTIYDhwKfz4y+jr+6n/lBOUQ2jYAamTDYnrD3b9KbTWp4/JvvcrsNUXVYlSlUZaVahhrWSCvO8QfsGTUwvzZQUbYUSOFS2oijCqyFVrFG0K1ZtoPAUGTVNiLEuskVKJQqUsGpUbzsqboTYAgaJECbkCn9ew2Gt8/hnfedcAf56p6QgaiEDYa61xYSiIV6doO4d+ocCgAE9SlqND7hDIoIEQ8ny9fsDYhl5XCTCjNd+YUS0NKJr7mRgRzlQkkVqKG8oZQtEXimWn58i0OLYChA7XDhDSbRdz5Q0ioUbt6cC4aZoEzQO0kZ3agBqOBl1aN7VdZUwRuMNiHFIo7MlWZC230THWJIjBAgpFPc2digRYGeP22BWCA0SBpBkg4o1oNOv0nQRPt3QheFhlhB1znlvW0QXmzN8elj7ls3WwTq3cCD0TZ6lJhDiBoY8l1KSEyMnZ9LRDj9jP8Rsyx2tzcqsOZdI/FgwbTfdh3/a8K4spX95QZLuDVWoCweLXV9sFyGb0dSA49gVqMY9RkG403CAlRgIlZSFZRkFiMZI22ClSmAsMNdmm24yAOwYFG0qMAikHA2MRjoNJtnV6g4lucV6wWIxzSE5JD4Lj21sTs1kHDuDI0YBoamIZs7TrIvkzvkNS07Ol366HqOkgNwbS9LUMRD80VEoby5pQouJiU09y92prvOllylBoOTs3qQpCXTNK7NMtpP5gQgSZwM4FtkQVvhTt4Ww0xIwcQUDYW+echRJk4XAQZWVBNb1DQfFNyJwDqDLKJI2HGSZq8BqaNiaBCybZumYGgpSICCKkYY0VylLdGeJrXBrHjUNMzUadhs0VYgklygQuGRkeb9mVDUiikmkhVWCAIglx1mhiZNGZKwq9l1dYdh5zwCTWOew4LiszMYqpCKSowWxkkoKSONM8h3RJYM3KHaVQSPRC7FgZUlICSArsRmwG9GFno0Is0kIk+BPSWuhsRwFkJQGK4IiIBCDYMGTLPXuJ3m0MCLcbyISQ/HeX3GU5ohCQIHKxQ761I60N6bq6UKRoA6jSFscEwkBmJShV9IGTMJzGRErEXCWRENEMI0NUOIEshTZYDrCkoZSLJFUFgKCyKCkWIIEFFhOLJAYydZJcBQr5m4DeQLGC6Kkc0IgjmMQMiWw6+2gjLCBpedIYagn7iI7CiSKmhQrZw09O4+8h1js0EiLJzMAjE0nTE4+TnPMOD8yYZ1ghkCeoYIyEEQ+dDz+g2G7pH3hgVEvjtU6OY4sNu+4ogWSoyCXlhsQGxEeVk+2YIFwNEgRFYBCAJAUARgIhC2BTZQoIMWksKUKsmRPLWjOdaxiiW1goxEBIQIYm5jkr1tTiFoOPUJ5Q1WYsPBOHme6v4DD6ImX25D7RiJw+h/QfKmxQeUPqh18TLTO/DTZiyGBeEsZl94R0UGaCfQRixgNN7Gxk2O2XcusXGXIcjvLSA+co+1ShkW0aCA0beqQgbBv22ULgPwrwiDf1CB7QshmUg4jeAHOaB0OAI/ag+HwHEBHUpCLGMaY00gy1IUdrDd8nPPc0BFi0ClA0DDmaKBPtQge4DQILIkZFCddCggWVVkAoIiAFYefxLJoh0ChHAU+xEwwaRQrGhLlr1QwFLGwg6CJqs+6TqN9xpOg3I2FOOpcSBUS40XnmANEzKJ1h40oZGF/gsCsKCAcoYkNDIxNIoaNQKW7SFE66Unjk6EQyJ1x/Vhm2NEtCtIWVuWFxrTwVucAgYBeGrGSDIhyUR1kRV4rFBu1RIdx8X8X8lPg6PqKVK4wKOMWLUnie+TrECIhnt6IoHaRAqCsUnFNnnQgF5cEDHQWwPwizmeqHDpkgQdeCj0CD0g+MOz5j/X9ncshpFPUfIufpcHBNAyrJHAj5Hqo8chG4tR2Yko/i2AHMkXwjIjXA6jpB/JBEEJeAwfrKFwwtiW9/51j4HpZR2iCvlFgZhUIQJCyNIlBsaAgsJbQCQDiDPMyAwxkuKDAGjAcBDsbB1dZAOKdBHqBCgJAb8NffCIdx84CB8jkwQOkGfI7+yxSPdYP2pIUTjyt28EbXZDykmKACEMw4IwwhGuBlUqQ4sgYoHq+R5AusYDXTuF/pFq46leVgTEGQiWXkOeyer59pZ6ZJemgP94Sht2AX4owzNm20ts44hv3laGYvnNWwE0bjRhODs2/JhiTMY0ofehKYGthAigkklgRBAEEIIIRSKCBJEVYpEgMkMzqHzdE78P1jw05fBP3MwcUa7Y/J19EUOuSEKhW+96Cbhhr2UFynbTcwu7kjuQSF2vekSXxJpCFepEry0Shs9PNmU5b1lnKPxs+qnEmliXhTSd1FLbN6EuyQJ3EGC0I1+2ctp7U3tk50IGQVQxGiJZW9vcN9ZgRAuUdCxypAw6BhyiDAe7nLoTYdT7xkemIW8oA7CY+bt4txlCm0cCR/EDjtxVQxri42qZMhaMvm8PVKp7Lw0UI+tkyytVqNE6j6IQZEOhe4sFw47KA2FabSDaMxp7txU7ylTQZChyPN1g2ixE/fIHsel9xdlNlc0QQtH7hS5SDEiIbMzIAiWOjLJKSCSsqVRiiDMTjUoB9cTDLCVSJJQEI2gaawSgk5d6ldFpjoehrRqcObnF1dwy6uNNOoJAohEaNKOw2amTVOEMDRbNibmchevJXW8wo0eBCproSwiftDET4AfrIrcg8NBzys3WhhcYEPiQKG8JIRjAiqKJh3B2neakngQJgcDFty/WXNxlZt2An3pb02O8BbqQpA/J5AeyzaWPeOBwU0HefFlueqQdUNeJVX4nA4PMXLxJmvD6KiXzMbEdleHMJ83jA7DkcoYWy8HAW5wWaRRAYHUiuXAcpZRom6F7KFyhWMs/cmjYDD0fThTor1hZR5eoniZuYyaiYqHTogXBNgTEIQItEQI45DlLn0Q3xQ7dbNvahZAxIGS6NWNme+LFhZhBxpbd8jpr+RwxolLSjYv8WY/3unK0Vsn1jVSMJWoGpZmawRO+5xO49IQO9ISPnBli5flpzwuQtJA4yRIRWmAOQKuNCPeC+gH6mE4n5cQ0CekCJpNRSmoGBYqCrJ41NaU/gMsYZwGMBD0onzsO696YuPIiFU9TA32Y+AYE9AYkGoaEN9TCEmYQrlFgsdV9GZGFW4YBS2wKIJIyaCNCRhDr2ENkNDpJWFGEUCJEKxASSIyDEBoNBSSEUWLJQhYllZCygIhZIwREkZBlHI5CxUkE1o6ggTsS87bssi4qQNpTQRBAUIM6uwYfTipk1I/X66hw23h6q2XxdqIVKqO/D5WmemWl8jE9Oy3ibc6jNExmsCGEH8nsww7MeVcPI3nxFke7eQ6cob4yWtVjDkFoXDH7CJLHBF8SMcTnRnWrC6hfM5Aw0aDOG2S9CdDDOwoZyNaCWoKBXyOOgMqS1kWJrLnxWF+JTY5y5BTmP2fgcOcNelIrmDfMA/guGnsJ3p7TOiy2caWX6HOxJ5CKTMjyYkg4syPFTcu9FQ0En2PDv7S5TLORdGaq4i3M3SJ0zoKt8OYmCaxOJxhzCvEUKX6g/P6TlScGBh4N64huIq5D7rxijNtiKM6qrVZM2Gow1ngdrTIxveMJ2br9A2aC2bgcR5zaZEGXFBIMugKCWtQYFbzwZqhFhHSYEMTUCa97WqyK1vymBV2LHhDhaFuaNZcWXMWJ0J0VR+3mMeAymzCJhj/k3pP/3L4nBJK9aDEZPcdZwb3O94V2WXW6bdKqZ2Ui3g+O4CEKXgp69JjorG1mpWD2UexYDOMQRl+A+TWQ9LCaMTrCOBACweMKihXewxme+8LrnQTlPkgmKBD1XFB7rk6+GwimohrNE6tVNqzcS/GUww8SzkSaRGpQVYRYSgUCw1osAthgTJNE0BhEmhgmDyPJbolvZE+S8+zlpqWs8PkeBLlw6pgkICeryoueWYsoiwH68ou9ShsSxiCOmRQuFKwdCGMjIYfFMTZ8Y7xNS4o1xoummFczI5cwlMpxm3LiYa1JvNZKzBmOGmF1qZiY0NUUHOcn0we66ukdeyhS7nDdAQ5RCwUEmclVVOTDDkefygutTUkVyMmgWnKEXWqoisVY+a+vRC/p3/a4pp4Hepv9vgRJkbkQ5kg5YyStRCBAo2u4Eg4cx4kPyk8LAta0O5kkx+AXUOQbhvmgobu9zgaURBNkQu6WdDPMthoCru1QjOs23qWOrPF6wMLEDUBjGMYwRHgVHMDD6BMMhSNRtYEZJEAWBB9TJ6oQMJkiDMPTjTy3TYzNtkyAxM2XCUQyxYGGEihhlJJHKGACB3jEhyzs8MO6NEWp2sfms702jv6OeTfVDc4YMFcXWYxUxqdXZAsya4IAZVL9RJZ8X8ADrhj4qyc9xt7N5R0GU704D8TPw51BrSyhqWgWBi4gl5gQwDWDEaMCP5YdpNJMgJbVzXt2Sq91QJefLA22KCPOnRFD2HjhCRRXlRDw7syZfLw6Hjp18dZ5GbKZTsisPJ0abrM3u3HwsXS0qh7NXI+Jp+IoJQbzB3xRmfvBNwzMJjpJ1EnwoKYLuT9NBuJIFTtyoFieHHQwQahyYGcaycoWDzyFPj4UNrA6K5xmgxwZhyoIYSbbjiE1iDgwOFooEGoQOFcOVl46Y46ug5cZ30VEpsJs6VodQw+hTDGU2BJTHJJwqKr8+EuqyxSSIjIBoYVgD0OtOkqdvJlubOCxAtOM51Tk5KQKs2vJk5is44KTjdSjUy7GHUEvGCWpgcTYFKCJF20YqfEYIfGCNzVEj0Qpl+h3WOsRnO9NuHFUWTGJcJMTJMacOMg7Ngez0uiQ1q1UjLiyCnQ5vqmgidOtw4pqBjDg4NUDJOEFGYFIiEohsp0mFEDoIdCJJyCTjs1nQWXomHcmxzJamdJ6K5+qYrRwsVrT2qztmG3oEZA5nYcBgbkhoMlUZBiwzYYziGcyNt7qUTD3iW0o6HlGk6bGB3Hm5OavVyHAyGg0bDUgjYxFgzed0YxFCiooFhMYrlELIZCwomHl6jTcIsZgwbtDCnLtugmO9ESEYJpikiDzZhjYNmIbVP7HZTnAsQRkQvDEpNnB2oXFwBwMgZtETxELE31mCCIwTA0ZBAYsFkVGjoLAxizJDtOPX5d3B05KdrvFVpaJuUxGCLkzAKGjqOGEKYd66i4a4/hu9SIq8Ciho1NrPTGna5cVOxJ+qKPbs/P06Yw8QRGhFEvqtENSEuI9MkLRK4lAa11AXh0xWTbe5yQ1nOXGwTIiHwxEoEqIJRA64tIYqoc6xaRVOxONCVroEUAjXarmOaDFsHy1QW0yCxQR694TZiYTDx2VDYJu+r0TmGXTE4GjzYQ+kC0m7jxo1hNBMlRRmWRJMNYFEGalhhqEo6LGJDnoe8v8fr88x2D3NQvaoQf22jLXC9UkD1DRNBqkIJtd+IbCHqZOYniqqr3nXQQdAePumLURm38J26MNnS/lp6MltgcZVUVYdRClFANEiHqIpvHzWGeVnxmqbdnTMPLkCCCDRRoXliZwytp5HJM0ThgWNJEJAgEGIHcWYUrzRBNgEEShbjo0/H6fc8vVVQpRbQ9p7zJnZE0N8+ZrUKrDgG0RBBy7yZIYmpYGIpmEEyJi22Q7+vt8sse40NuoJBpQo7UsicTWJcPfnNqtkENDaB3TATNuqQ+f3DYxlyF++WHS6BLs9CE2IcLWXoQOG8xnKKZEvQMQIZbCmCoMBGKsgVp1ESb/vMICkUANcHpE0XDgPgPovAvTSA5EwR5QQjEA9ZB1oGSJ1gUOAR/a6cyiASpSVVBGJGYl6OR+zJ7GuzzQaPFkFf5p5eFig99ylWwblUXVb+G3asS12ynkMM5cdAtzYfGwtgihC5OwKSh6abJYLEBAjcj0R6N5yM4Q8fK97IdkE9QfGez9j3d2hAFVRb/yyTBQEQRkIsEJuwGQ8IkDAJkcUk8Rns+kgkJgiZXV+Kk6Ts57S9ufg/AFh9Qv4winSZdYQewYerEdsnjgWCRgWCkKDKyBXX2bydzMn0JmKSqHfBdNNziiF2zOaoPnJJATngfdBaS6EOmZfuA4VdufvEjWNgMUsKOo9iOJ55rDAwDuMS9OEO9LyAwHZiiJICN7hov2dH/Hz66SSS+H4akSWTHMHEJdIbkG+AY2SrgNKRNMX8gzGvX7tK859YaHT4F9sjPoU1zMPqRisGQQNjJIjPBUEUEFhAUA8/yks5Po9+o3kNWH1s/XZDd9jQ3vpbFEfQi1U9j+4oxPKR7DKfxsMcBtLoQVrnh2VQwSopyGWPYCUYXjZzmZxsNZJgS0GS9lS33DNbzJF0uIw8qBHitl0CNFTG9zZgqZm406QEsHSuJFdHd4UeLkeqz6IScENBcdtzCH+09kDHKmu/4QsYnwVlDwDQtK2vO/3InPHuK+I+aryb3r+4vYVDtuyT9mgcoTNh7Pb+Ff/F3JFOFCQ2rkoHQ==')))</font></pre>
+</body>
+</html>
diff --git a/examples/example_moss/report/match10-top.html b/examples/example_moss/report/match10-top.html
new file mode 100644
index 0000000..195cf26
--- /dev/null
+++ b/examples/example_moss/report/match10-top.html
@@ -0,0 +1,9 @@
+<html>
+<head>
+<title>Top</title>
+</head><body bgcolor="white"><center><table bgcolor="#d0d0d0" border="1" cellspacing="0"><tr><th>C:/Users/tuhe/Documents/unitgrade_private/examples/example_moss/tmp/submissions/s1001/3_report2_grade.py (91%)</th><th><img align="left" border="0" src="http://moss.stanford.edu/bitmaps/tm_0_91.gif"/></th><th>C:/Users/tuhe/Documents/unitgrade_private/examples/example_moss/tmp/submissions/s1003/3_report2_grade.py (91%)</th><th><img align="left" border="0" src="http://moss.stanford.edu/bitmaps/tm_0_91.gif"/></th><th>
+</th></tr><tr><td><a href="match10-0.html#0" name="0" target="0">1-3</a>
+</td><td><a href="match10-0.html#0" name="0" target="0"><img align="left" alt="link" border="0" src="http://moss.stanford.edu/bitmaps/tm_0_91.gif"/></a>
+</td><td><a href="match10-1.html#0" name="0" target="1">1-3</a>
+</td><td><a href="match10-1.html#0" name="0" target="1"><img align="left" alt="link" border="0" src="http://moss.stanford.edu/bitmaps/tm_0_91.gif"/></a>
+</td></tr></table></center></body></html>
\ No newline at end of file
diff --git a/examples/example_moss/report/match10.html b/examples/example_moss/report/match10.html
new file mode 100644
index 0000000..ce6e65e
--- /dev/null
+++ b/examples/example_moss/report/match10.html
@@ -0,0 +1,3 @@
+<html>
+<head><title>Matches for C:/Users/tuhe/Documents/unitgrade_private/examples/example_moss/tmp/submissions/s1001/3_report2_grade.py and C:/Users/tuhe/Documents/unitgrade_private/examples/example_moss/tmp/submissions/s1003/3_report2_grade.py</title>
+</head><frameset rows="150,*"><frameset cols="1000,*"><frame frameborder="0" name="top" src="match10-top.html"/></frameset><frameset cols="50%,50%"><frame name="0" src="match10-0.html"/><frame name="1" src="match10-1.html"/></frameset></frameset></html>
\ No newline at end of file
diff --git a/examples/example_moss/report/match11-0.html b/examples/example_moss/report/match11-0.html
new file mode 100644
index 0000000..422adc1
--- /dev/null
+++ b/examples/example_moss/report/match11-0.html
@@ -0,0 +1,14 @@
+<html>
+<head>
+<title>C:/Users/tuhe/Documents/unitgrade_private/examples/example_moss/tmp/submissions/s1001/3_report2_grade.py</title>
+</head>
+<body bgcolor="white">
+<hr/>
+C:/Users/tuhe/Documents/unitgrade_private/examples/example_moss/tmp/submissions/s1001/3_report2_grade.py<p></p><pre>
+<a name="0"></a><font color="#FF0000"><a href="match11-1.html#0" target="1"><img align="left" alt="other" border="0" src="http://moss.stanford.edu/bitmaps/tm_0_91.gif"/></a>
+
+''' WARNING: Modifying, decompiling or otherwise tampering with this script, it's data or the resulting .token file will be investigated as a cheating attempt. '''
+import bz2, base64
+exec(bz2.decompress(base64.b64decode('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')))</font></pre>
+</body>
+</html>
diff --git a/examples/example_moss/report/match11-1.html b/examples/example_moss/report/match11-1.html
new file mode 100644
index 0000000..08b1ad8
--- /dev/null
+++ b/examples/example_moss/report/match11-1.html
@@ -0,0 +1,14 @@
+<html>
+<head>
+<title>C:/Users/tuhe/Documents/unitgrade_private/examples/example_moss/tmp/submissions/s1001/3_report2_grade.py</title>
+</head>
+<body bgcolor="white">
+<hr/>
+C:/Users/tuhe/Documents/unitgrade_private/examples/example_moss/tmp/submissions/s1002/3_report2_grade.py<p></p><pre>
+<a name="0"></a><font color="#FF0000"><a href="match11-0.html#0" target="0"><img align="left" alt="other" border="0" src="http://moss.stanford.edu/bitmaps/tm_0_91.gif"/></a>
+
+''' WARNING: Modifying, decompiling or otherwise tampering with this script, it's data or the resulting .token file will be investigated as a cheating attempt. '''
+import bz2, base64
+exec(bz2.decompress(base64.b64decode('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')))</font></pre>
+</body>
+</html>
diff --git a/examples/example_moss/report/match11-top.html b/examples/example_moss/report/match11-top.html
new file mode 100644
index 0000000..630cbe9
--- /dev/null
+++ b/examples/example_moss/report/match11-top.html
@@ -0,0 +1,9 @@
+<html>
+<head>
+<title>Top</title>
+</head><body bgcolor="white"><center><table bgcolor="#d0d0d0" border="1" cellspacing="0"><tr><th>C:/Users/tuhe/Documents/unitgrade_private/examples/example_moss/tmp/submissions/s1001/3_report2_grade.py (91%)</th><th><img align="left" border="0" src="http://moss.stanford.edu/bitmaps/tm_0_91.gif"/></th><th>C:/Users/tuhe/Documents/unitgrade_private/examples/example_moss/tmp/submissions/s1002/3_report2_grade.py (91%)</th><th><img align="left" border="0" src="http://moss.stanford.edu/bitmaps/tm_0_91.gif"/></th><th>
+</th></tr><tr><td><a href="match11-0.html#0" name="0" target="0">1-3</a>
+</td><td><a href="match11-0.html#0" name="0" target="0"><img align="left" alt="link" border="0" src="http://moss.stanford.edu/bitmaps/tm_0_91.gif"/></a>
+</td><td><a href="match11-1.html#0" name="0" target="1">1-3</a>
+</td><td><a href="match11-1.html#0" name="0" target="1"><img align="left" alt="link" border="0" src="http://moss.stanford.edu/bitmaps/tm_0_91.gif"/></a>
+</td></tr></table></center></body></html>
\ No newline at end of file
diff --git a/examples/example_moss/report/match11.html b/examples/example_moss/report/match11.html
new file mode 100644
index 0000000..826d4a1
--- /dev/null
+++ b/examples/example_moss/report/match11.html
@@ -0,0 +1,3 @@
+<html>
+<head><title>Matches for C:/Users/tuhe/Documents/unitgrade_private/examples/example_moss/tmp/submissions/s1001/3_report2_grade.py and C:/Users/tuhe/Documents/unitgrade_private/examples/example_moss/tmp/submissions/s1002/3_report2_grade.py</title>
+</head><frameset rows="150,*"><frameset cols="1000,*"><frame frameborder="0" name="top" src="match11-top.html"/></frameset><frameset cols="50%,50%"><frame name="0" src="match11-0.html"/><frame name="1" src="match11-1.html"/></frameset></frameset></html>
\ No newline at end of file
diff --git a/examples/example_moss/report/match2-0.html b/examples/example_moss/report/match2-0.html
new file mode 100644
index 0000000..db1f97b
--- /dev/null
+++ b/examples/example_moss/report/match2-0.html
@@ -0,0 +1,77 @@
+<html>
+<head>
+<title>C:/Users/tuhe/Documents/unitgrade_private/examples/example_moss/tmp/submissions/s1001/2_report2.py</title>
+</head>
+<body bgcolor="white">
+<hr/>
+C:/Users/tuhe/Documents/unitgrade_private/examples/example_moss/tmp/submissions/s1001/2_report2.py<p></p><pre>
+<a name="0"></a><font color="#FF0000"><a href="match2-1.html#0" target="1"><img align="left" alt="other" border="0" src="http://moss.stanford.edu/bitmaps/tm_0_98.gif"/></a>
+
+from unitgrade.framework import Report
+from unitgrade.evaluate import evaluate_report_student
+from cs102.homework1 import add, reverse_list
+from unitgrade import UTestCase, cache  # !s
+
+class Week1(UTestCase):
+    def test_add(self):
+        self.assertEqualC(add(2,2))
+        self.assertEqualC(add(-100, 5))
+
+    def test_reverse(self):
+        self.assertEqualC(reverse_list([1, 2, 3])) #!s
+
+    def test_output_capture(self):
+        with self.capture() as out:
+            print("hello world 42")                     # Genereate some output (i.e. in a homework script)
+        self.assertEqual(out.numbers[0], 42)            # out.numbers is a list of all numbers generated
+        self.assertEqual(out.output, "hello world 42")  # you can also access the raw output.
+
+class Week1Titles(UTestCase): #!s=b
+    """ The same problem as before with nicer titles """
+    def test_add(self):
+        """ Test the addition method add(a,b) """
+        self.assertEqualC(add(2,2))
+        self.assertEqualC(add(-100, 5))
+
+    def test_reverse(self):
+        ls = [1, 2, 3]
+        reverse = reverse_list(ls)
+        self.assertEqualC(reverse)
+        # Although the title is set after the test potentially fails, it will *always* show correctly for the student.
+        self.title = f"Checking if reverse_list({ls}) = {reverse}"  # Programmatically set the title #!s
+
+    def ex_test_output_capture(self):
+        with self.capture() as out:
+            print("hello world 42")                     # Genereate some output (i.e. in a homework script)
+        self.assertEqual(out.numbers[0], 42)            # out.numbers is a list of all numbers generated
+        self.assertEqual(out.output, "hello world 42")  # you can also access the raw output.
+
+
+class Question2(UTestCase): #!s=c
+    @cache
+    def my_reversal(self, ls):
+        # The '@cache' decorator ensures the function is not run on the *students* computer
+        # Instead the code is run on the teachers computer and the result is passed on with the
+        # other pre-computed results -- i.e. this function will run regardless of how the student happens to have
+        # implemented reverse_list.
+        return reverse_list(ls)
+
+    def test_reverse_tricky(self):
+        ls = (2,4,8)
+        ls2 = self.my_reversal(tuple(ls))                   # This will always produce the right result, [8, 4, 2]
+        print("The correct answer is supposed to be", ls2)  # Show students the correct answer
+        self.assertEqualC(reverse_list(ls))                 # This will actually test the students code.
+        return "Buy world!"                                 # This value will be stored in the .token file  #!s=c
+
+
+import cs102
+class Report2(Report):
+    title = "CS 101 Report 2"
+    questions = [(Week1, 10), (Week1Titles, 8)]
+    pack_imports = [cs102]
+
+if __name__ == "__main__":
+    evaluate_report_student(Report2(), unmute=True)
+</font></pre>
+</body>
+</html>
diff --git a/examples/example_moss/report/match2-1.html b/examples/example_moss/report/match2-1.html
new file mode 100644
index 0000000..f191666
--- /dev/null
+++ b/examples/example_moss/report/match2-1.html
@@ -0,0 +1,77 @@
+<html>
+<head>
+<title>C:/Users/tuhe/Documents/unitgrade_private/examples/example_moss/tmp/submissions/s1001/2_report2.py</title>
+</head>
+<body bgcolor="white">
+<hr/>
+C:/Users/tuhe/Documents/unitgrade_private/examples/example_moss/tmp/submissions/s1002/2_report2.py<p></p><pre>
+<a name="0"></a><font color="#FF0000"><a href="match2-0.html#0" target="0"><img align="left" alt="other" border="0" src="http://moss.stanford.edu/bitmaps/tm_0_98.gif"/></a>
+
+from unitgrade.framework import Report
+from unitgrade.evaluate import evaluate_report_student
+from cs102.homework1 import add, reverse_list
+from unitgrade import UTestCase, cache  # !s
+
+class Week1(UTestCase):
+    def test_add(self):
+        self.assertEqualC(add(2,2))
+        self.assertEqualC(add(-100, 5))
+
+    def test_reverse(self):
+        self.assertEqualC(reverse_list([1, 2, 3])) #!s
+
+    def test_output_capture(self):
+        with self.capture() as out:
+            print("hello world 42")                     # Genereate some output (i.e. in a homework script)
+        self.assertEqual(out.numbers[0], 42)            # out.numbers is a list of all numbers generated
+        self.assertEqual(out.output, "hello world 42")  # you can also access the raw output.
+
+class Week1Titles(UTestCase): #!s=b
+    """ The same problem as before with nicer titles """
+    def test_add(self):
+        """ Test the addition method add(a,b) """
+        self.assertEqualC(add(2,2))
+        self.assertEqualC(add(-100, 5))
+
+    def test_reverse(self):
+        ls = [1, 2, 3]
+        reverse = reverse_list(ls)
+        self.assertEqualC(reverse)
+        # Although the title is set after the test potentially fails, it will *always* show correctly for the student.
+        self.title = f"Checking if reverse_list({ls}) = {reverse}"  # Programmatically set the title #!s
+
+    def ex_test_output_capture(self):
+        with self.capture() as out:
+            print("hello world 42")                     # Genereate some output (i.e. in a homework script)
+        self.assertEqual(out.numbers[0], 42)            # out.numbers is a list of all numbers generated
+        self.assertEqual(out.output, "hello world 42")  # you can also access the raw output.
+
+
+class Question2(UTestCase): #!s=c
+    @cache
+    def my_reversal(self, ls):
+        # The '@cache' decorator ensures the function is not run on the *students* computer
+        # Instead the code is run on the teachers computer and the result is passed on with the
+        # other pre-computed results -- i.e. this function will run regardless of how the student happens to have
+        # implemented reverse_list.
+        return reverse_list(ls)
+
+    def test_reverse_tricky(self):
+        ls = (2,4,8)
+        ls2 = self.my_reversal(tuple(ls))                   # This will always produce the right result, [8, 4, 2]
+        print("The correct answer is supposed to be", ls2)  # Show students the correct answer
+        self.assertEqualC(reverse_list(ls))                 # This will actually test the students code.
+        return "Buy world!"                                 # This value will be stored in the .token file  #!s=c
+
+
+import cs102
+class Report2(Report):
+    title = "CS 101 Report 2"
+    questions = [(Week1, 10), (Week1Titles, 8)]
+    pack_imports = [cs102]
+
+if __name__ == "__main__":
+    evaluate_report_student(Report2(), unmute=True)
+</font></pre>
+</body>
+</html>
diff --git a/examples/example_moss/report/match2-top.html b/examples/example_moss/report/match2-top.html
new file mode 100644
index 0000000..a2a1fa9
--- /dev/null
+++ b/examples/example_moss/report/match2-top.html
@@ -0,0 +1,9 @@
+<html>
+<head>
+<title>Top</title>
+</head><body bgcolor="white"><center><table bgcolor="#d0d0d0" border="1" cellspacing="0"><tr><th>C:/Users/tuhe/Documents/unitgrade_private/examples/example_moss/tmp/submissions/s1001/2_report2.py (98%)</th><th><img align="left" border="0" src="http://moss.stanford.edu/bitmaps/tm_0_98.gif"/></th><th>C:/Users/tuhe/Documents/unitgrade_private/examples/example_moss/tmp/submissions/s1002/2_report2.py (98%)</th><th><img align="left" border="0" src="http://moss.stanford.edu/bitmaps/tm_0_98.gif"/></th><th>
+</th></tr><tr><td><a href="match2-0.html#0" name="0" target="0">1-65</a>
+</td><td><a href="match2-0.html#0" name="0" target="0"><img align="left" alt="link" border="0" src="http://moss.stanford.edu/bitmaps/tm_0_98.gif"/></a>
+</td><td><a href="match2-1.html#0" name="0" target="1">1-65</a>
+</td><td><a href="match2-1.html#0" name="0" target="1"><img align="left" alt="link" border="0" src="http://moss.stanford.edu/bitmaps/tm_0_98.gif"/></a>
+</td></tr></table></center></body></html>
\ No newline at end of file
diff --git a/examples/example_moss/report/match2.html b/examples/example_moss/report/match2.html
index e19d766..7d6527d 100644
--- a/examples/example_moss/report/match2.html
+++ b/examples/example_moss/report/match2.html
@@ -1,3 +1,3 @@
 <html>
-<head><title>Matches for C:/Users/tuhe/Documents/unitgrade_private/examples/example_moss/tmp/submissions/s1001/0_homework1.py and C:/Users/tuhe/Documents/unitgrade_private/examples/example_moss/tmp/submissions/s1002/0_homework1.py</title>
+<head><title>Matches for C:/Users/tuhe/Documents/unitgrade_private/examples/example_moss/tmp/submissions/s1001/2_report2.py and C:/Users/tuhe/Documents/unitgrade_private/examples/example_moss/tmp/submissions/s1002/2_report2.py</title>
 </head><frameset rows="150,*"><frameset cols="1000,*"><frame frameborder="0" name="top" src="match2-top.html"/></frameset><frameset cols="50%,50%"><frame name="0" src="match2-0.html"/><frame name="1" src="match2-1.html"/></frameset></frameset></html>
\ No newline at end of file
diff --git a/examples/example_moss/report/match3-0.html b/examples/example_moss/report/match3-0.html
new file mode 100644
index 0000000..c459ff6
--- /dev/null
+++ b/examples/example_moss/report/match3-0.html
@@ -0,0 +1,28 @@
+<html>
+<head>
+<title>C:/Users/tuhe/Documents/unitgrade_private/examples/example_moss/tmp/submissions/s1002/1_homework1.py</title>
+</head>
+<body bgcolor="white">
+<hr/>
+C:/Users/tuhe/Documents/unitgrade_private/examples/example_moss/tmp/submissions/s1002/1_homework1.py<p></p><pre>
+<a name="0"></a><font color="#FF0000"><a href="match3-1.html#0" target="1"><img align="left" alt="other" border="0" src="http://moss.stanford.edu/bitmaps/tm_0_95.gif"/></a>
+
+def reverse_list(mylist): #!f #!s;keeptags
+    """
+    Given a list 'mylist' returns a list consisting of the same elements in reverse order. E.g.
+    reverse_list([1,2,3]) should return [3,2,1] (as a list).
+    """
+    return list(reversed(mylist))
+
+def add(a,b): #!f
+    """ Given two numbers `a` and `b` this function should simply return their sum:
+    &gt; add(a,b) = a+b """
+    return a+b
+
+if __name__ == "__main__":
+    # Example usage:
+    print(f"Your result of 2 + 2 = {add(2,2)}")
+    print(f"Reversing a small list", reverse_list([2,3,5,7])) #!s
+</font></pre>
+</body>
+</html>
diff --git a/examples/example_moss/report/match3-1.html b/examples/example_moss/report/match3-1.html
new file mode 100644
index 0000000..d5c65a4
--- /dev/null
+++ b/examples/example_moss/report/match3-1.html
@@ -0,0 +1,28 @@
+<html>
+<head>
+<title>C:/Users/tuhe/Documents/unitgrade_private/examples/example_moss/tmp/submissions/s1002/1_homework1.py</title>
+</head>
+<body bgcolor="white">
+<hr/>
+C:/Users/tuhe/Documents/unitgrade_private/examples/example_moss/tmp/submissions/s1003/1_homework1.py<p></p><pre>
+<a name="0"></a><font color="#FF0000"><a href="match3-0.html#0" target="0"><img align="left" alt="other" border="0" src="http://moss.stanford.edu/bitmaps/tm_0_95.gif"/></a>
+
+def reverse_list(mylist): #!f #!s;keeptags
+    """
+    Given a list 'mylist' returns a list consisting of the same elements in reverse order. E.g.
+    reverse_list([1,2,3]) should return [3,2,1] (as a list).
+    """
+    return list(reversed(mylist))
+
+def add(a,b): #!f
+    """ Given two numbers `a` and `b` this function should simply return their sum:
+    &gt; add(a,b) = a+b """
+    return a+b
+
+if __name__ == "__main__":
+    # Example usage:
+    print(f"Your result of 2 + 2 = {add(2,2)}")
+    print(f"Reversing a small list", reverse_list([2,3,5,7])) #!s
+</font></pre>
+</body>
+</html>
diff --git a/examples/example_moss/report/match3-top.html b/examples/example_moss/report/match3-top.html
new file mode 100644
index 0000000..e85f409
--- /dev/null
+++ b/examples/example_moss/report/match3-top.html
@@ -0,0 +1,9 @@
+<html>
+<head>
+<title>Top</title>
+</head><body bgcolor="white"><center><table bgcolor="#d0d0d0" border="1" cellspacing="0"><tr><th>C:/Users/tuhe/Documents/unitgrade_private/examples/example_moss/tmp/submissions/s1002/1_homework1.py (95%)</th><th><img align="left" border="0" src="http://moss.stanford.edu/bitmaps/tm_0_95.gif"/></th><th>C:/Users/tuhe/Documents/unitgrade_private/examples/example_moss/tmp/submissions/s1003/1_homework1.py (95%)</th><th><img align="left" border="0" src="http://moss.stanford.edu/bitmaps/tm_0_95.gif"/></th><th>
+</th></tr><tr><td><a href="match3-0.html#0" name="0" target="0">1-16</a>
+</td><td><a href="match3-0.html#0" name="0" target="0"><img align="left" alt="link" border="0" src="http://moss.stanford.edu/bitmaps/tm_0_95.gif"/></a>
+</td><td><a href="match3-1.html#0" name="0" target="1">1-16</a>
+</td><td><a href="match3-1.html#0" name="0" target="1"><img align="left" alt="link" border="0" src="http://moss.stanford.edu/bitmaps/tm_0_95.gif"/></a>
+</td></tr></table></center></body></html>
\ No newline at end of file
diff --git a/examples/example_moss/report/match3.html b/examples/example_moss/report/match3.html
new file mode 100644
index 0000000..2ef4aa8
--- /dev/null
+++ b/examples/example_moss/report/match3.html
@@ -0,0 +1,3 @@
+<html>
+<head><title>Matches for C:/Users/tuhe/Documents/unitgrade_private/examples/example_moss/tmp/submissions/s1002/1_homework1.py and C:/Users/tuhe/Documents/unitgrade_private/examples/example_moss/tmp/submissions/s1003/1_homework1.py</title>
+</head><frameset rows="150,*"><frameset cols="1000,*"><frame frameborder="0" name="top" src="match3-top.html"/></frameset><frameset cols="50%,50%"><frame name="0" src="match3-0.html"/><frame name="1" src="match3-1.html"/></frameset></frameset></html>
\ No newline at end of file
diff --git a/examples/example_moss/report/match4-0.html b/examples/example_moss/report/match4-0.html
new file mode 100644
index 0000000..f9a035a
--- /dev/null
+++ b/examples/example_moss/report/match4-0.html
@@ -0,0 +1,28 @@
+<html>
+<head>
+<title>C:/Users/tuhe/Documents/unitgrade_private/examples/example_moss/tmp/submissions/s1001/1_homework1.py</title>
+</head>
+<body bgcolor="white">
+<hr/>
+C:/Users/tuhe/Documents/unitgrade_private/examples/example_moss/tmp/submissions/s1001/1_homework1.py<p></p><pre>
+<a name="0"></a><font color="#FF0000"><a href="match4-1.html#0" target="1"><img align="left" alt="other" border="0" src="http://moss.stanford.edu/bitmaps/tm_0_95.gif"/></a>
+
+def reverse_list(mylist): #!f #!s;keeptags
+    """
+    Given a list 'mylist' returns a list consisting of the same elements in reverse order. E.g.
+    reverse_list([1,2,3]) should return [3,2,1] (as a list).
+    """
+    return list(reversed(mylist))
+
+def add(a,b): #!f
+    """ Given two numbers `a` and `b` this function should simply return their sum:
+    &gt; add(a,b) = a+b """
+    return a+b
+
+if __name__ == "__main__":
+    # Example usage:
+    print(f"Your result of 2 + 2 = {add(2,2)}")
+    print(f"Reversing a small list", reverse_list([2,3,5,7])) #!s
+</font></pre>
+</body>
+</html>
diff --git a/examples/example_moss/report/match4-1.html b/examples/example_moss/report/match4-1.html
new file mode 100644
index 0000000..355938e
--- /dev/null
+++ b/examples/example_moss/report/match4-1.html
@@ -0,0 +1,28 @@
+<html>
+<head>
+<title>C:/Users/tuhe/Documents/unitgrade_private/examples/example_moss/tmp/submissions/s1001/1_homework1.py</title>
+</head>
+<body bgcolor="white">
+<hr/>
+C:/Users/tuhe/Documents/unitgrade_private/examples/example_moss/tmp/submissions/s1003/1_homework1.py<p></p><pre>
+<a name="0"></a><font color="#FF0000"><a href="match4-0.html#0" target="0"><img align="left" alt="other" border="0" src="http://moss.stanford.edu/bitmaps/tm_0_95.gif"/></a>
+
+def reverse_list(mylist): #!f #!s;keeptags
+    """
+    Given a list 'mylist' returns a list consisting of the same elements in reverse order. E.g.
+    reverse_list([1,2,3]) should return [3,2,1] (as a list).
+    """
+    return list(reversed(mylist))
+
+def add(a,b): #!f
+    """ Given two numbers `a` and `b` this function should simply return their sum:
+    &gt; add(a,b) = a+b """
+    return a+b
+
+if __name__ == "__main__":
+    # Example usage:
+    print(f"Your result of 2 + 2 = {add(2,2)}")
+    print(f"Reversing a small list", reverse_list([2,3,5,7])) #!s
+</font></pre>
+</body>
+</html>
diff --git a/examples/example_moss/report/match4-top.html b/examples/example_moss/report/match4-top.html
new file mode 100644
index 0000000..b525445
--- /dev/null
+++ b/examples/example_moss/report/match4-top.html
@@ -0,0 +1,9 @@
+<html>
+<head>
+<title>Top</title>
+</head><body bgcolor="white"><center><table bgcolor="#d0d0d0" border="1" cellspacing="0"><tr><th>C:/Users/tuhe/Documents/unitgrade_private/examples/example_moss/tmp/submissions/s1001/1_homework1.py (95%)</th><th><img align="left" border="0" src="http://moss.stanford.edu/bitmaps/tm_0_95.gif"/></th><th>C:/Users/tuhe/Documents/unitgrade_private/examples/example_moss/tmp/submissions/s1003/1_homework1.py (95%)</th><th><img align="left" border="0" src="http://moss.stanford.edu/bitmaps/tm_0_95.gif"/></th><th>
+</th></tr><tr><td><a href="match4-0.html#0" name="0" target="0">1-16</a>
+</td><td><a href="match4-0.html#0" name="0" target="0"><img align="left" alt="link" border="0" src="http://moss.stanford.edu/bitmaps/tm_0_95.gif"/></a>
+</td><td><a href="match4-1.html#0" name="0" target="1">1-16</a>
+</td><td><a href="match4-1.html#0" name="0" target="1"><img align="left" alt="link" border="0" src="http://moss.stanford.edu/bitmaps/tm_0_95.gif"/></a>
+</td></tr></table></center></body></html>
\ No newline at end of file
diff --git a/examples/example_moss/report/match4.html b/examples/example_moss/report/match4.html
new file mode 100644
index 0000000..089ffd5
--- /dev/null
+++ b/examples/example_moss/report/match4.html
@@ -0,0 +1,3 @@
+<html>
+<head><title>Matches for C:/Users/tuhe/Documents/unitgrade_private/examples/example_moss/tmp/submissions/s1001/1_homework1.py and C:/Users/tuhe/Documents/unitgrade_private/examples/example_moss/tmp/submissions/s1003/1_homework1.py</title>
+</head><frameset rows="150,*"><frameset cols="1000,*"><frame frameborder="0" name="top" src="match4-top.html"/></frameset><frameset cols="50%,50%"><frame name="0" src="match4-0.html"/><frame name="1" src="match4-1.html"/></frameset></frameset></html>
\ No newline at end of file
diff --git a/examples/example_moss/report/match5-0.html b/examples/example_moss/report/match5-0.html
new file mode 100644
index 0000000..a045ff8
--- /dev/null
+++ b/examples/example_moss/report/match5-0.html
@@ -0,0 +1,28 @@
+<html>
+<head>
+<title>C:/Users/tuhe/Documents/unitgrade_private/examples/example_moss/tmp/submissions/s1001/1_homework1.py</title>
+</head>
+<body bgcolor="white">
+<hr/>
+C:/Users/tuhe/Documents/unitgrade_private/examples/example_moss/tmp/submissions/s1001/1_homework1.py<p></p><pre>
+<a name="0"></a><font color="#FF0000"><a href="match5-1.html#0" target="1"><img align="left" alt="other" border="0" src="http://moss.stanford.edu/bitmaps/tm_0_95.gif"/></a>
+
+def reverse_list(mylist): #!f #!s;keeptags
+    """
+    Given a list 'mylist' returns a list consisting of the same elements in reverse order. E.g.
+    reverse_list([1,2,3]) should return [3,2,1] (as a list).
+    """
+    return list(reversed(mylist))
+
+def add(a,b): #!f
+    """ Given two numbers `a` and `b` this function should simply return their sum:
+    &gt; add(a,b) = a+b """
+    return a+b
+
+if __name__ == "__main__":
+    # Example usage:
+    print(f"Your result of 2 + 2 = {add(2,2)}")
+    print(f"Reversing a small list", reverse_list([2,3,5,7])) #!s
+</font></pre>
+</body>
+</html>
diff --git a/examples/example_moss/report/match5-1.html b/examples/example_moss/report/match5-1.html
new file mode 100644
index 0000000..c68fadb
--- /dev/null
+++ b/examples/example_moss/report/match5-1.html
@@ -0,0 +1,28 @@
+<html>
+<head>
+<title>C:/Users/tuhe/Documents/unitgrade_private/examples/example_moss/tmp/submissions/s1001/1_homework1.py</title>
+</head>
+<body bgcolor="white">
+<hr/>
+C:/Users/tuhe/Documents/unitgrade_private/examples/example_moss/tmp/submissions/s1002/1_homework1.py<p></p><pre>
+<a name="0"></a><font color="#FF0000"><a href="match5-0.html#0" target="0"><img align="left" alt="other" border="0" src="http://moss.stanford.edu/bitmaps/tm_0_95.gif"/></a>
+
+def reverse_list(mylist): #!f #!s;keeptags
+    """
+    Given a list 'mylist' returns a list consisting of the same elements in reverse order. E.g.
+    reverse_list([1,2,3]) should return [3,2,1] (as a list).
+    """
+    return list(reversed(mylist))
+
+def add(a,b): #!f
+    """ Given two numbers `a` and `b` this function should simply return their sum:
+    &gt; add(a,b) = a+b """
+    return a+b
+
+if __name__ == "__main__":
+    # Example usage:
+    print(f"Your result of 2 + 2 = {add(2,2)}")
+    print(f"Reversing a small list", reverse_list([2,3,5,7])) #!s
+</font></pre>
+</body>
+</html>
diff --git a/examples/example_moss/report/match5-top.html b/examples/example_moss/report/match5-top.html
new file mode 100644
index 0000000..8d63e32
--- /dev/null
+++ b/examples/example_moss/report/match5-top.html
@@ -0,0 +1,9 @@
+<html>
+<head>
+<title>Top</title>
+</head><body bgcolor="white"><center><table bgcolor="#d0d0d0" border="1" cellspacing="0"><tr><th>C:/Users/tuhe/Documents/unitgrade_private/examples/example_moss/tmp/submissions/s1001/1_homework1.py (95%)</th><th><img align="left" border="0" src="http://moss.stanford.edu/bitmaps/tm_0_95.gif"/></th><th>C:/Users/tuhe/Documents/unitgrade_private/examples/example_moss/tmp/submissions/s1002/1_homework1.py (95%)</th><th><img align="left" border="0" src="http://moss.stanford.edu/bitmaps/tm_0_95.gif"/></th><th>
+</th></tr><tr><td><a href="match5-0.html#0" name="0" target="0">1-16</a>
+</td><td><a href="match5-0.html#0" name="0" target="0"><img align="left" alt="link" border="0" src="http://moss.stanford.edu/bitmaps/tm_0_95.gif"/></a>
+</td><td><a href="match5-1.html#0" name="0" target="1">1-16</a>
+</td><td><a href="match5-1.html#0" name="0" target="1"><img align="left" alt="link" border="0" src="http://moss.stanford.edu/bitmaps/tm_0_95.gif"/></a>
+</td></tr></table></center></body></html>
\ No newline at end of file
diff --git a/examples/example_moss/report/match5.html b/examples/example_moss/report/match5.html
new file mode 100644
index 0000000..891b75e
--- /dev/null
+++ b/examples/example_moss/report/match5.html
@@ -0,0 +1,3 @@
+<html>
+<head><title>Matches for C:/Users/tuhe/Documents/unitgrade_private/examples/example_moss/tmp/submissions/s1001/1_homework1.py and C:/Users/tuhe/Documents/unitgrade_private/examples/example_moss/tmp/submissions/s1002/1_homework1.py</title>
+</head><frameset rows="150,*"><frameset cols="1000,*"><frame frameborder="0" name="top" src="match5-top.html"/></frameset><frameset cols="50%,50%"><frame name="0" src="match5-0.html"/><frame name="1" src="match5-1.html"/></frameset></frameset></html>
\ No newline at end of file
diff --git a/examples/example_moss/report/match6-0.html b/examples/example_moss/report/match6-0.html
new file mode 100644
index 0000000..7ac28ab
--- /dev/null
+++ b/examples/example_moss/report/match6-0.html
@@ -0,0 +1,19 @@
+<html>
+<head>
+<title>C:/Users/tuhe/Documents/unitgrade_private/examples/example_moss/tmp/submissions/s1002/0_deploy.py</title>
+</head>
+<body bgcolor="white">
+<hr/>
+C:/Users/tuhe/Documents/unitgrade_private/examples/example_moss/tmp/submissions/s1002/0_deploy.py<p></p><pre>
+<a name="0"></a><font color="#FF0000"><a href="match6-1.html#0" target="1"><img align="left" alt="other" border="0" src="http://moss.stanford.edu/bitmaps/tm_0_94.gif"/></a>
+
+from cs102.report2 import Report2
+from unitgrade_private.hidden_create_files import setup_grade_file_report
+from snipper.snip_dir import snip_dir
+
+if __name__ == "__main__":
+    setup_grade_file_report(Report2)
+    snip_dir("./", "../../students/cs102", clean_destination_dir=True, exclude=['*.token', 'deploy.py'])
+</font></pre>
+</body>
+</html>
diff --git a/examples/example_moss/report/match6-1.html b/examples/example_moss/report/match6-1.html
new file mode 100644
index 0000000..5047b39
--- /dev/null
+++ b/examples/example_moss/report/match6-1.html
@@ -0,0 +1,19 @@
+<html>
+<head>
+<title>C:/Users/tuhe/Documents/unitgrade_private/examples/example_moss/tmp/submissions/s1002/0_deploy.py</title>
+</head>
+<body bgcolor="white">
+<hr/>
+C:/Users/tuhe/Documents/unitgrade_private/examples/example_moss/tmp/submissions/s1003/0_deploy.py<p></p><pre>
+<a name="0"></a><font color="#FF0000"><a href="match6-0.html#0" target="0"><img align="left" alt="other" border="0" src="http://moss.stanford.edu/bitmaps/tm_0_94.gif"/></a>
+
+from cs102.report2 import Report2
+from unitgrade_private.hidden_create_files import setup_grade_file_report
+from snipper.snip_dir import snip_dir
+
+if __name__ == "__main__":
+    setup_grade_file_report(Report2)
+    snip_dir("./", "../../students/cs102", clean_destination_dir=True, exclude=['*.token', 'deploy.py'])
+</font></pre>
+</body>
+</html>
diff --git a/examples/example_moss/report/match6-top.html b/examples/example_moss/report/match6-top.html
new file mode 100644
index 0000000..5620239
--- /dev/null
+++ b/examples/example_moss/report/match6-top.html
@@ -0,0 +1,9 @@
+<html>
+<head>
+<title>Top</title>
+</head><body bgcolor="white"><center><table bgcolor="#d0d0d0" border="1" cellspacing="0"><tr><th>C:/Users/tuhe/Documents/unitgrade_private/examples/example_moss/tmp/submissions/s1002/0_deploy.py (94%)</th><th><img align="left" border="0" src="http://moss.stanford.edu/bitmaps/tm_0_94.gif"/></th><th>C:/Users/tuhe/Documents/unitgrade_private/examples/example_moss/tmp/submissions/s1003/0_deploy.py (94%)</th><th><img align="left" border="0" src="http://moss.stanford.edu/bitmaps/tm_0_94.gif"/></th><th>
+</th></tr><tr><td><a href="match6-0.html#0" name="0" target="0">1-7</a>
+</td><td><a href="match6-0.html#0" name="0" target="0"><img align="left" alt="link" border="0" src="http://moss.stanford.edu/bitmaps/tm_0_94.gif"/></a>
+</td><td><a href="match6-1.html#0" name="0" target="1">1-7</a>
+</td><td><a href="match6-1.html#0" name="0" target="1"><img align="left" alt="link" border="0" src="http://moss.stanford.edu/bitmaps/tm_0_94.gif"/></a>
+</td></tr></table></center></body></html>
\ No newline at end of file
diff --git a/examples/example_moss/report/match6.html b/examples/example_moss/report/match6.html
new file mode 100644
index 0000000..2dc88aa
--- /dev/null
+++ b/examples/example_moss/report/match6.html
@@ -0,0 +1,3 @@
+<html>
+<head><title>Matches for C:/Users/tuhe/Documents/unitgrade_private/examples/example_moss/tmp/submissions/s1002/0_deploy.py and C:/Users/tuhe/Documents/unitgrade_private/examples/example_moss/tmp/submissions/s1003/0_deploy.py</title>
+</head><frameset rows="150,*"><frameset cols="1000,*"><frame frameborder="0" name="top" src="match6-top.html"/></frameset><frameset cols="50%,50%"><frame name="0" src="match6-0.html"/><frame name="1" src="match6-1.html"/></frameset></frameset></html>
\ No newline at end of file
diff --git a/examples/example_moss/report/match7-0.html b/examples/example_moss/report/match7-0.html
new file mode 100644
index 0000000..cd2fbc1
--- /dev/null
+++ b/examples/example_moss/report/match7-0.html
@@ -0,0 +1,19 @@
+<html>
+<head>
+<title>C:/Users/tuhe/Documents/unitgrade_private/examples/example_moss/tmp/submissions/s1001/0_deploy.py</title>
+</head>
+<body bgcolor="white">
+<hr/>
+C:/Users/tuhe/Documents/unitgrade_private/examples/example_moss/tmp/submissions/s1001/0_deploy.py<p></p><pre>
+<a name="0"></a><font color="#FF0000"><a href="match7-1.html#0" target="1"><img align="left" alt="other" border="0" src="http://moss.stanford.edu/bitmaps/tm_0_94.gif"/></a>
+
+from cs102.report2 import Report2
+from unitgrade_private.hidden_create_files import setup_grade_file_report
+from snipper.snip_dir import snip_dir
+
+if __name__ == "__main__":
+    setup_grade_file_report(Report2)
+    snip_dir("./", "../../students/cs102", clean_destination_dir=True, exclude=['*.token', 'deploy.py'])
+</font></pre>
+</body>
+</html>
diff --git a/examples/example_moss/report/match7-1.html b/examples/example_moss/report/match7-1.html
new file mode 100644
index 0000000..ed3773b
--- /dev/null
+++ b/examples/example_moss/report/match7-1.html
@@ -0,0 +1,19 @@
+<html>
+<head>
+<title>C:/Users/tuhe/Documents/unitgrade_private/examples/example_moss/tmp/submissions/s1001/0_deploy.py</title>
+</head>
+<body bgcolor="white">
+<hr/>
+C:/Users/tuhe/Documents/unitgrade_private/examples/example_moss/tmp/submissions/s1003/0_deploy.py<p></p><pre>
+<a name="0"></a><font color="#FF0000"><a href="match7-0.html#0" target="0"><img align="left" alt="other" border="0" src="http://moss.stanford.edu/bitmaps/tm_0_94.gif"/></a>
+
+from cs102.report2 import Report2
+from unitgrade_private.hidden_create_files import setup_grade_file_report
+from snipper.snip_dir import snip_dir
+
+if __name__ == "__main__":
+    setup_grade_file_report(Report2)
+    snip_dir("./", "../../students/cs102", clean_destination_dir=True, exclude=['*.token', 'deploy.py'])
+</font></pre>
+</body>
+</html>
diff --git a/examples/example_moss/report/match7-top.html b/examples/example_moss/report/match7-top.html
new file mode 100644
index 0000000..b3eb820
--- /dev/null
+++ b/examples/example_moss/report/match7-top.html
@@ -0,0 +1,9 @@
+<html>
+<head>
+<title>Top</title>
+</head><body bgcolor="white"><center><table bgcolor="#d0d0d0" border="1" cellspacing="0"><tr><th>C:/Users/tuhe/Documents/unitgrade_private/examples/example_moss/tmp/submissions/s1001/0_deploy.py (94%)</th><th><img align="left" border="0" src="http://moss.stanford.edu/bitmaps/tm_0_94.gif"/></th><th>C:/Users/tuhe/Documents/unitgrade_private/examples/example_moss/tmp/submissions/s1003/0_deploy.py (94%)</th><th><img align="left" border="0" src="http://moss.stanford.edu/bitmaps/tm_0_94.gif"/></th><th>
+</th></tr><tr><td><a href="match7-0.html#0" name="0" target="0">1-7</a>
+</td><td><a href="match7-0.html#0" name="0" target="0"><img align="left" alt="link" border="0" src="http://moss.stanford.edu/bitmaps/tm_0_94.gif"/></a>
+</td><td><a href="match7-1.html#0" name="0" target="1">1-7</a>
+</td><td><a href="match7-1.html#0" name="0" target="1"><img align="left" alt="link" border="0" src="http://moss.stanford.edu/bitmaps/tm_0_94.gif"/></a>
+</td></tr></table></center></body></html>
\ No newline at end of file
diff --git a/examples/example_moss/report/match7.html b/examples/example_moss/report/match7.html
new file mode 100644
index 0000000..36f7b7b
--- /dev/null
+++ b/examples/example_moss/report/match7.html
@@ -0,0 +1,3 @@
+<html>
+<head><title>Matches for C:/Users/tuhe/Documents/unitgrade_private/examples/example_moss/tmp/submissions/s1001/0_deploy.py and C:/Users/tuhe/Documents/unitgrade_private/examples/example_moss/tmp/submissions/s1003/0_deploy.py</title>
+</head><frameset rows="150,*"><frameset cols="1000,*"><frame frameborder="0" name="top" src="match7-top.html"/></frameset><frameset cols="50%,50%"><frame name="0" src="match7-0.html"/><frame name="1" src="match7-1.html"/></frameset></frameset></html>
\ No newline at end of file
diff --git a/examples/example_moss/report/match8-0.html b/examples/example_moss/report/match8-0.html
new file mode 100644
index 0000000..f0feebd
--- /dev/null
+++ b/examples/example_moss/report/match8-0.html
@@ -0,0 +1,19 @@
+<html>
+<head>
+<title>C:/Users/tuhe/Documents/unitgrade_private/examples/example_moss/tmp/submissions/s1001/0_deploy.py</title>
+</head>
+<body bgcolor="white">
+<hr/>
+C:/Users/tuhe/Documents/unitgrade_private/examples/example_moss/tmp/submissions/s1001/0_deploy.py<p></p><pre>
+<a name="0"></a><font color="#FF0000"><a href="match8-1.html#0" target="1"><img align="left" alt="other" border="0" src="http://moss.stanford.edu/bitmaps/tm_0_94.gif"/></a>
+
+from cs102.report2 import Report2
+from unitgrade_private.hidden_create_files import setup_grade_file_report
+from snipper.snip_dir import snip_dir
+
+if __name__ == "__main__":
+    setup_grade_file_report(Report2)
+    snip_dir("./", "../../students/cs102", clean_destination_dir=True, exclude=['*.token', 'deploy.py'])
+</font></pre>
+</body>
+</html>
diff --git a/examples/example_moss/report/match8-1.html b/examples/example_moss/report/match8-1.html
new file mode 100644
index 0000000..69f3920
--- /dev/null
+++ b/examples/example_moss/report/match8-1.html
@@ -0,0 +1,19 @@
+<html>
+<head>
+<title>C:/Users/tuhe/Documents/unitgrade_private/examples/example_moss/tmp/submissions/s1001/0_deploy.py</title>
+</head>
+<body bgcolor="white">
+<hr/>
+C:/Users/tuhe/Documents/unitgrade_private/examples/example_moss/tmp/submissions/s1002/0_deploy.py<p></p><pre>
+<a name="0"></a><font color="#FF0000"><a href="match8-0.html#0" target="0"><img align="left" alt="other" border="0" src="http://moss.stanford.edu/bitmaps/tm_0_94.gif"/></a>
+
+from cs102.report2 import Report2
+from unitgrade_private.hidden_create_files import setup_grade_file_report
+from snipper.snip_dir import snip_dir
+
+if __name__ == "__main__":
+    setup_grade_file_report(Report2)
+    snip_dir("./", "../../students/cs102", clean_destination_dir=True, exclude=['*.token', 'deploy.py'])
+</font></pre>
+</body>
+</html>
diff --git a/examples/example_moss/report/match8-top.html b/examples/example_moss/report/match8-top.html
new file mode 100644
index 0000000..d45f7bf
--- /dev/null
+++ b/examples/example_moss/report/match8-top.html
@@ -0,0 +1,9 @@
+<html>
+<head>
+<title>Top</title>
+</head><body bgcolor="white"><center><table bgcolor="#d0d0d0" border="1" cellspacing="0"><tr><th>C:/Users/tuhe/Documents/unitgrade_private/examples/example_moss/tmp/submissions/s1001/0_deploy.py (94%)</th><th><img align="left" border="0" src="http://moss.stanford.edu/bitmaps/tm_0_94.gif"/></th><th>C:/Users/tuhe/Documents/unitgrade_private/examples/example_moss/tmp/submissions/s1002/0_deploy.py (94%)</th><th><img align="left" border="0" src="http://moss.stanford.edu/bitmaps/tm_0_94.gif"/></th><th>
+</th></tr><tr><td><a href="match8-0.html#0" name="0" target="0">1-7</a>
+</td><td><a href="match8-0.html#0" name="0" target="0"><img align="left" alt="link" border="0" src="http://moss.stanford.edu/bitmaps/tm_0_94.gif"/></a>
+</td><td><a href="match8-1.html#0" name="0" target="1">1-7</a>
+</td><td><a href="match8-1.html#0" name="0" target="1"><img align="left" alt="link" border="0" src="http://moss.stanford.edu/bitmaps/tm_0_94.gif"/></a>
+</td></tr></table></center></body></html>
\ No newline at end of file
diff --git a/examples/example_moss/report/match8.html b/examples/example_moss/report/match8.html
new file mode 100644
index 0000000..15985ac
--- /dev/null
+++ b/examples/example_moss/report/match8.html
@@ -0,0 +1,3 @@
+<html>
+<head><title>Matches for C:/Users/tuhe/Documents/unitgrade_private/examples/example_moss/tmp/submissions/s1001/0_deploy.py and C:/Users/tuhe/Documents/unitgrade_private/examples/example_moss/tmp/submissions/s1002/0_deploy.py</title>
+</head><frameset rows="150,*"><frameset cols="1000,*"><frame frameborder="0" name="top" src="match8-top.html"/></frameset><frameset cols="50%,50%"><frame name="0" src="match8-0.html"/><frame name="1" src="match8-1.html"/></frameset></frameset></html>
\ No newline at end of file
diff --git a/examples/example_moss/report/match9-0.html b/examples/example_moss/report/match9-0.html
new file mode 100644
index 0000000..54d2ce5
--- /dev/null
+++ b/examples/example_moss/report/match9-0.html
@@ -0,0 +1,14 @@
+<html>
+<head>
+<title>C:/Users/tuhe/Documents/unitgrade_private/examples/example_moss/tmp/submissions/s1002/3_report2_grade.py</title>
+</head>
+<body bgcolor="white">
+<hr/>
+C:/Users/tuhe/Documents/unitgrade_private/examples/example_moss/tmp/submissions/s1002/3_report2_grade.py<p></p><pre>
+<a name="0"></a><font color="#FF0000"><a href="match9-1.html#0" target="1"><img align="left" alt="other" border="0" src="http://moss.stanford.edu/bitmaps/tm_0_91.gif"/></a>
+
+''' WARNING: Modifying, decompiling or otherwise tampering with this script, it's data or the resulting .token file will be investigated as a cheating attempt. '''
+import bz2, base64
+exec(bz2.decompress(base64.b64decode('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')))</font></pre>
+</body>
+</html>
diff --git a/examples/example_moss/report/match9-1.html b/examples/example_moss/report/match9-1.html
new file mode 100644
index 0000000..74ecdc4
--- /dev/null
+++ b/examples/example_moss/report/match9-1.html
@@ -0,0 +1,14 @@
+<html>
+<head>
+<title>C:/Users/tuhe/Documents/unitgrade_private/examples/example_moss/tmp/submissions/s1002/3_report2_grade.py</title>
+</head>
+<body bgcolor="white">
+<hr/>
+C:/Users/tuhe/Documents/unitgrade_private/examples/example_moss/tmp/submissions/s1003/3_report2_grade.py<p></p><pre>
+<a name="0"></a><font color="#FF0000"><a href="match9-0.html#0" target="0"><img align="left" alt="other" border="0" src="http://moss.stanford.edu/bitmaps/tm_0_91.gif"/></a>
+
+''' WARNING: Modifying, decompiling or otherwise tampering with this script, it's data or the resulting .token file will be investigated as a cheating attempt. '''
+import bz2, base64
+exec(bz2.decompress(base64.b64decode('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')))</font></pre>
+</body>
+</html>
diff --git a/examples/example_moss/report/match9-top.html b/examples/example_moss/report/match9-top.html
new file mode 100644
index 0000000..49cc1bd
--- /dev/null
+++ b/examples/example_moss/report/match9-top.html
@@ -0,0 +1,9 @@
+<html>
+<head>
+<title>Top</title>
+</head><body bgcolor="white"><center><table bgcolor="#d0d0d0" border="1" cellspacing="0"><tr><th>C:/Users/tuhe/Documents/unitgrade_private/examples/example_moss/tmp/submissions/s1002/3_report2_grade.py (91%)</th><th><img align="left" border="0" src="http://moss.stanford.edu/bitmaps/tm_0_91.gif"/></th><th>C:/Users/tuhe/Documents/unitgrade_private/examples/example_moss/tmp/submissions/s1003/3_report2_grade.py (91%)</th><th><img align="left" border="0" src="http://moss.stanford.edu/bitmaps/tm_0_91.gif"/></th><th>
+</th></tr><tr><td><a href="match9-0.html#0" name="0" target="0">1-3</a>
+</td><td><a href="match9-0.html#0" name="0" target="0"><img align="left" alt="link" border="0" src="http://moss.stanford.edu/bitmaps/tm_0_91.gif"/></a>
+</td><td><a href="match9-1.html#0" name="0" target="1">1-3</a>
+</td><td><a href="match9-1.html#0" name="0" target="1"><img align="left" alt="link" border="0" src="http://moss.stanford.edu/bitmaps/tm_0_91.gif"/></a>
+</td></tr></table></center></body></html>
\ No newline at end of file
diff --git a/examples/example_moss/report/match9.html b/examples/example_moss/report/match9.html
new file mode 100644
index 0000000..c65e968
--- /dev/null
+++ b/examples/example_moss/report/match9.html
@@ -0,0 +1,3 @@
+<html>
+<head><title>Matches for C:/Users/tuhe/Documents/unitgrade_private/examples/example_moss/tmp/submissions/s1002/3_report2_grade.py and C:/Users/tuhe/Documents/unitgrade_private/examples/example_moss/tmp/submissions/s1003/3_report2_grade.py</title>
+</head><frameset rows="150,*"><frameset cols="1000,*"><frame frameborder="0" name="top" src="match9-top.html"/></frameset><frameset cols="50%,50%"><frame name="0" src="match9-0.html"/><frame name="1" src="match9-1.html"/></frameset></frameset></html>
\ No newline at end of file
diff --git a/examples/example_moss/report/report.html b/examples/example_moss/report/report.html
index 5aef6a9..d9dd569 100644
--- a/examples/example_moss/report/report.html
+++ b/examples/example_moss/report/report.html
@@ -4,7 +4,7 @@
 </HEAD>
 <BODY>
 Moss Results<p>
-Thu Sep  9 08:01:09 PDT 2021
+Sat Sep 18 04:12:08 PDT 2021
 <p>
 Options -l python -m 10
 <HR>
@@ -12,15 +12,9 @@ Options -l python -m 10
 <HR>
 <TABLE>
 <TR><TH>File 1<TH>File 2<TH>Lines Matched
-<TR><TD><A HREF="http://moss.stanford.edu/results/3/6009475496570/match0.html">C:/Users/tuhe/Documents/unitgrade_private/examples/example_moss/tmp/submissions/s1002/0_homework1.py (85%)</A>
-    <TD><A HREF="http://moss.stanford.edu/results/3/6009475496570/match0.html">C:/Users/tuhe/Documents/unitgrade_private/examples/example_moss/tmp/submissions/s1003/0_homework1.py (83%)</A>
-<TD ALIGN=right>20
-<TR><TD><A HREF="http://moss.stanford.edu/results/3/6009475496570/match1.html">C:/Users/tuhe/Documents/unitgrade_private/examples/example_moss/tmp/submissions/s1001/0_homework1.py (34%)</A>
-    <TD><A HREF="http://moss.stanford.edu/results/3/6009475496570/match1.html">C:/Users/tuhe/Documents/unitgrade_private/examples/example_moss/tmp/submissions/s1003/0_homework1.py (30%)</A>
-<TD ALIGN=right>6
-<TR><TD><A HREF="http://moss.stanford.edu/results/3/6009475496570/match2.html">C:/Users/tuhe/Documents/unitgrade_private/examples/example_moss/tmp/submissions/s1001/0_homework1.py (34%)</A>
-    <TD><A HREF="http://moss.stanford.edu/results/3/6009475496570/match2.html">C:/Users/tuhe/Documents/unitgrade_private/examples/example_moss/tmp/submissions/s1002/0_homework1.py (31%)</A>
-<TD ALIGN=right>6
+<TR><TD><A HREF="http://moss.stanford.edu/results/3/3990071304525/match0.html">C:/Users/tuhe/Documents/unitgrade_private/examples/example_moss/tmp/submissions/s1002/0_homework1.py (82%)</A>
+    <TD><A HREF="http://moss.stanford.edu/results/3/3990071304525/match0.html">C:/Users/tuhe/Documents/unitgrade_private/examples/example_moss/tmp/submissions/s1003/0_homework1.py (82%)</A>
+<TD ALIGN=right>19
 </TABLE>
 <HR>
 Any errors encountered during this query are listed below.<p></BODY>
diff --git a/examples/example_moss/student_submissions/s1001/Report1Flat_handin_0_of_10.token b/examples/example_moss/student_submissions/s1001/Report1Flat_handin_0_of_10.token
deleted file mode 100644
index 32a005b0e96614fe211503853ab9365d425e9386..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 65457
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
FJpf0*mCyhH

diff --git a/examples/example_moss/student_submissions/s1001/Report1Flat_handin_0_of_10_0/report1flat_grade.py b/examples/example_moss/student_submissions/s1001/Report1Flat_handin_0_of_10_0/report1flat_grade.py
deleted file mode 100644
index 7d2b47d..0000000
--- a/examples/example_moss/student_submissions/s1001/Report1Flat_handin_0_of_10_0/report1flat_grade.py
+++ /dev/null
@@ -1,351 +0,0 @@
-"""
-Example student code. This file is automatically generated from the files in the instructor-directory
-"""
-import numpy as np
-from tabulate import tabulate
-from datetime import datetime
-import pyfiglet
-import unittest
-# from unitgrade.unitgrade import MySuite
-
-import inspect
-import os
-import argparse
-import sys
-import time
-import threading # don't import Thread bc. of minify issue.
-import tqdm # don't do from tqdm import tqdm because of minify-issue
-
-parser = argparse.ArgumentParser(description='Evaluate your report.', epilog="""Example: 
-To run all tests in a report: 
-
-> python assignment1_dp.py
-
-To run only question 2 or question 2.1
-
-> python assignment1_dp.py -q 2
-> python assignment1_dp.py -q 2.1
-
-Note this scripts does not grade your report. To grade your report, use:
-
-> python report1_grade.py
-
-Finally, note that if your report is part of a module (package), and the report script requires part of that package, the -m option for python may be useful.
-For instance, if the report file is in Documents/course_package/report3_complete.py, and `course_package` is a python package, then change directory to 'Documents/` and run:
-
-> python -m course_package.report1
-
-see https://docs.python.org/3.9/using/cmdline.html
-""", formatter_class=argparse.RawTextHelpFormatter)
-parser.add_argument('-q', nargs='?', type=str, default=None, help='Only evaluate this question (e.g.: -q 2)')
-parser.add_argument('--showexpected',  action="store_true",  help='Show the expected/desired result')
-parser.add_argument('--showcomputed',  action="store_true",  help='Show the answer your code computes')
-parser.add_argument('--unmute',  action="store_true",  help='Show result of print(...) commands in code')
-parser.add_argument('--passall',  action="store_true",  help='Automatically pass all tests. Useful when debugging.')
-
-def evaluate_report_student(report, question=None, qitem=None, unmute=None, passall=None, ignore_missing_file=False, show_tol_err=False):
-    args = parser.parse_args()
-    if question is None and args.q is not None:
-        question = args.q
-        if "." in question:
-            question, qitem = [int(v) for v in question.split(".")]
-        else:
-            question = int(question)
-
-    if hasattr(report, "computed_answer_file") and not os.path.isfile(report.computed_answers_file) and not ignore_missing_file:
-        raise Exception("> Error: The pre-computed answer file", os.path.abspath(report.computed_answers_file), "does not exist. Check your package installation")
-
-    if unmute is None:
-        unmute = args.unmute
-    if passall is None:
-        passall = args.passall
-
-    results, table_data = evaluate_report(report, question=question, show_progress_bar=not unmute, qitem=qitem, verbose=False, passall=passall, show_expected=args.showexpected, show_computed=args.showcomputed,unmute=unmute,
-                                          show_tol_err=show_tol_err)
-
-
-    if question is None:
-        print("Provisional evaluation")
-        tabulate(table_data)
-        table = table_data
-        print(tabulate(table))
-        print(" ")
-
-    fr = inspect.getouterframes(inspect.currentframe())[1].filename
-    gfile = os.path.basename(fr)[:-3] + "_grade.py"
-    if os.path.exists(gfile):
-        print("Note your results have not yet been registered. \nTo register your results, please run the file:")
-        print(">>>", gfile)
-        print("In the same manner as you ran this file.")
-
-
-    return results
-
-
-def upack(q):
-    # h = zip([(i['w'], i['possible'], i['obtained']) for i in q.values()])
-    h =[(i['w'], i['possible'], i['obtained']) for i in q.values()]
-    h = np.asarray(h)
-    return h[:,0], h[:,1], h[:,2],
-
-class UnitgradeTextRunner(unittest.TextTestRunner):
-    def __init__(self, *args, **kwargs):
-        super().__init__(*args, **kwargs)
-
-class SequentialTestLoader(unittest.TestLoader):
-    def getTestCaseNames(self, testCaseClass):
-        test_names = super().getTestCaseNames(testCaseClass)
-        # testcase_methods = list(testCaseClass.__dict__.keys())
-        ls = []
-        for C in testCaseClass.mro():
-            if issubclass(C, unittest.TestCase):
-                ls = list(C.__dict__.keys()) + ls
-        testcase_methods = ls
-        test_names.sort(key=testcase_methods.index)
-        return test_names
-
-def evaluate_report(report, question=None, qitem=None, passall=False, verbose=False,  show_expected=False, show_computed=False,unmute=False, show_help_flag=True, silent=False,
-                    show_progress_bar=True,
-                    show_tol_err=False,
-                    big_header=True):
-
-    now = datetime.now()
-    if big_header:
-        ascii_banner = pyfiglet.figlet_format("UnitGrade", font="doom")
-        b = "\n".join( [l for l in ascii_banner.splitlines() if len(l.strip()) > 0] )
-    else:
-        b = "Unitgrade"
-    print(b + " v" + __version__)
-    dt_string = now.strftime("%d/%m/%Y %H:%M:%S")
-    print("Started: " + dt_string)
-    s = report.title
-    if hasattr(report, "version") and report.version is not None:
-        s += " version " + report.version
-    print("Evaluating " + s, "(use --help for options)" if show_help_flag else "")
-    # print(f"Loaded answers from: ", report.computed_answers_file, "\n")
-    table_data = []
-    nL = 80
-    t_start = time.time()
-    score = {}
-    loader = SequentialTestLoader()
-
-    for n, (q, w) in enumerate(report.questions):
-        # q = q()
-        # q_hidden = False
-        # q_hidden = issubclass(q.__class__, Hidden)
-        if question is not None and n+1 != question:
-            continue
-        suite = loader.loadTestsFromTestCase(q)
-        qtitle = q.question_title() if hasattr(q, 'question_title') else q.__qualname__
-        q_title_print = "Question %i: %s"%(n+1, qtitle)
-        print(q_title_print, end="")
-        q.possible = 0
-        q.obtained = 0
-        q_ = {} # Gather score in this class.
-        # unittest.Te
-        # q_with_outstanding_init = [item.question for item in q.items if not item.question.has_called_init_]
-        UTextResult.q_title_print = q_title_print # Hacky
-        UTextResult.show_progress_bar = show_progress_bar # Hacky.
-        UTextResult.number = n
-
-        res = UTextTestRunner(verbosity=2, resultclass=UTextResult).run(suite)
-
-        possible = res.testsRun
-        obtained = len(res.successes)
-
-        assert len(res.successes) +  len(res.errors) + len(res.failures) == res.testsRun
-
-        # possible = int(ws @ possible)
-        # obtained = int(ws @ obtained)
-        # obtained = int(myround(int((w * obtained) / possible ))) if possible > 0 else 0
-
-        obtained = int(w * obtained * 1.0 / possible ) if possible > 0 else 0
-        score[n] = {'w': w, 'possible': w, 'obtained': obtained, 'items': q_, 'title': qtitle}
-        q.obtained = obtained
-        q.possible = possible
-
-        s1 = f"*** Question q{n+1}"
-        s2 = f" {q.obtained}/{w}"
-        print(s1 + ("."* (nL-len(s1)-len(s2) )) + s2 )
-        print(" ")
-        table_data.append([f"Question q{n+1}", f"{q.obtained}/{w}"])
-
-    ws, possible, obtained = upack(score)
-    possible = int( msum(possible) )
-    obtained = int( msum(obtained) ) # Cast to python int
-    report.possible = possible
-    report.obtained = obtained
-    now = datetime.now()
-    dt_string = now.strftime("%H:%M:%S")
-
-    dt = int(time.time()-t_start)
-    minutes = dt//60
-    seconds = dt - minutes*60
-    plrl = lambda i, s: str(i) + " " + s + ("s" if i != 1 else "")
-
-    print(f"Completed: "+ dt_string + " (" + plrl(minutes, "minute") + ", "+ plrl(seconds, "second") +")")
-
-    table_data.append(["Total", ""+str(report.obtained)+"/"+str(report.possible) ])
-    results = {'total': (obtained, possible), 'details': score}
-    return results, table_data
-
-
-
-
-from tabulate import tabulate
-from datetime import datetime
-import inspect
-import json
-import os
-import bz2
-import pickle
-import os
-
-def bzwrite(json_str, token): # to get around obfuscation issues
-    with getattr(bz2, 'open')(token, "wt") as f:
-        f.write(json_str)
-
-def gather_imports(imp):
-    resources = {}
-    m = imp
-    # for m in pack_imports:
-    # print(f"*** {m.__name__}")
-    f = m.__file__
-    # dn = os.path.dirname(f)
-    # top_package = os.path.dirname(__import__(m.__name__.split('.')[0]).__file__)
-    # top_package = str(__import__(m.__name__.split('.')[0]).__path__)
-
-    if hasattr(m, '__file__') and not hasattr(m, '__path__'):  # Importing a simple file: m.__class__.__name__ == 'module' and False:
-        top_package = os.path.dirname(m.__file__)
-        module_import = True
-    else:
-        top_package = __import__(m.__name__.split('.')[0]).__path__._path[0]
-        module_import = False
-
-    # top_package = os.path.dirname(__import__(m.__name__.split('.')[0]).__file__)
-    # top_package = os.path.dirname(top_package)
-    import zipfile
-    # import strea
-    # zipfile.ZipFile
-    import io
-    # file_like_object = io.BytesIO(my_zip_data)
-    zip_buffer = io.BytesIO()
-    with zipfile.ZipFile(zip_buffer, 'w') as zip:
-        # zip.write()
-        for root, dirs, files in os.walk(top_package):
-            for file in files:
-                if file.endswith(".py"):
-                    fpath = os.path.join(root, file)
-                    v = os.path.relpath(os.path.join(root, file), os.path.dirname(top_package) if not module_import else top_package)
-                    zip.write(fpath, v)
-
-    resources['zipfile'] = zip_buffer.getvalue()
-    resources['top_package'] = top_package
-    resources['module_import'] = module_import
-    return resources, top_package
-
-    if f.endswith("__init__.py"):
-        for root, dirs, files in os.walk(os.path.dirname(f)):
-            for file in files:
-                if file.endswith(".py"):
-                    # print(file)
-                    # print()
-                    v = os.path.relpath(os.path.join(root, file), top_package)
-                    with open(os.path.join(root, file), 'r') as ff:
-                        resources[v] = ff.read()
-    else:
-        v = os.path.relpath(f, top_package)
-        with open(f, 'r') as ff:
-            resources[v] = ff.read()
-    return resources
-
-import argparse
-parser = argparse.ArgumentParser(description='Evaluate your report.', epilog="""Use this script to get the score of your report. Example:
-
-> python report1_grade.py
-
-Finally, note that if your report is part of a module (package), and the report script requires part of that package, the -m option for python may be useful.
-For instance, if the report file is in Documents/course_package/report3_complete.py, and `course_package` is a python package, then change directory to 'Documents/` and run:
-
-> python -m course_package.report1
-
-see https://docs.python.org/3.9/using/cmdline.html
-""", formatter_class=argparse.RawTextHelpFormatter)
-parser.add_argument('--noprogress',  action="store_true",  help='Disable progress bars')
-parser.add_argument('--autolab',  action="store_true",  help='Show Autolab results')
-
-def gather_upload_to_campusnet(report, output_dir=None):
-    n = report.nL
-    args = parser.parse_args()
-    results, table_data = evaluate_report(report, show_help_flag=False, show_expected=False, show_computed=False, silent=True,
-                                          show_progress_bar=not args.noprogress,
-                                          big_header=not args.autolab)
-    print(" ")
-    print("="*n)
-    print("Final evaluation")
-    print(tabulate(table_data))
-    # also load the source code of missing files...
-
-    sources = {}
-
-    if not args.autolab:
-        if len(report.individual_imports) > 0:
-            print("By uploading the .token file, you verify the files:")
-            for m in report.individual_imports:
-                print(">", m.__file__)
-            print("Are created/modified individually by you in agreement with DTUs exam rules")
-            report.pack_imports += report.individual_imports
-
-        if len(report.pack_imports) > 0:
-            print("Including files in upload...")
-            for k, m in enumerate(report.pack_imports):
-                nimp, top_package = gather_imports(m)
-                _, report_relative_location, module_import = report._import_base_relative()
-
-                # report_relative_location = os.path.relpath(inspect.getfile(report.__class__), top_package)
-                nimp['report_relative_location'] = report_relative_location
-                nimp['report_module_specification'] = module_import
-                nimp['name'] = m.__name__
-                sources[k] = nimp
-                # if len([k for k in nimp if k not in sources]) > 0:
-                print(f"*** {m.__name__}")
-                # sources = {**sources, **nimp}
-    results['sources'] = sources
-
-    if output_dir is None:
-        output_dir = os.getcwd()
-
-    payload_out_base = report.__class__.__name__ + "_handin"
-
-    obtain, possible = results['total']
-    vstring = "_v"+report.version if report.version is not None else ""
-
-    token = "%s_%i_of_%i%s.token"%(payload_out_base, obtain, possible,vstring)
-    token = os.path.join(output_dir, token)
-    with open(token, 'wb') as f:
-        pickle.dump(results, f)
-
-    if not args.autolab:
-        print(" ")
-        print("To get credit for your results, please upload the single file: ")
-        print(">", token)
-        print("To campusnet without any modifications.")
-
-        # print("Now time for some autolab fun")
-
-def source_instantiate(name, report1_source, payload):
-    eval("exec")(report1_source, globals())
-    pl = pickle.loads(bytes.fromhex(payload))
-    report = eval(name)(payload=pl, strict=True)
-    # report.set_payload(pl)
-    return report
-
-
-
-report1_source = 'import os\n\n# DONT\'t import stuff here since install script requires __version__\n\ndef cache_write(object, file_name, verbose=True):\n    import compress_pickle\n    dn = os.path.dirname(file_name)\n    if not os.path.exists(dn):\n        os.mkdir(dn)\n    if verbose: print("Writing cache...", file_name)\n    with open(file_name, \'wb\', ) as f:\n        compress_pickle.dump(object, f, compression="lzma")\n    if verbose: print("Done!")\n\n\ndef cache_exists(file_name):\n    # file_name = cn_(file_name) if cache_prefix else file_name\n    return os.path.exists(file_name)\n\n\ndef cache_read(file_name):\n    import compress_pickle # Import here because if you import in top the __version__ tag will fail.\n    # file_name = cn_(file_name) if cache_prefix else file_name\n    if os.path.exists(file_name):\n        try:\n            with open(file_name, \'rb\') as f:\n                return compress_pickle.load(f, compression="lzma")\n        except Exception as e:\n            print("Tried to load a bad pickle file at", file_name)\n            print("If the file appears to be automatically generated, you can try to delete it, otherwise download a new version")\n            print(e)\n            # return pickle.load(f)\n    else:\n        return None\n\n\n\n"""\ngit add . && git commit -m "Options" && git push &&  pip install git+ssh://git@gitlab.compute.dtu.dk/tuhe/unitgrade_v1.git --upgrade\n\n"""\n# from . import cache_read\nimport unittest\nimport numpy as np\nimport sys\nimport collections\nimport re\nimport threading\nimport tqdm\nimport time\nimport pickle\nimport os\nfrom io import StringIO\nfrom unittest.runner import _WritelnDecorator\nimport inspect\n\nmyround = lambda x: np.round(x)  # required.\nmsum = lambda x: sum(x)\nmfloor = lambda x: np.floor(x)\n\ndef setup_dir_by_class(C,base_dir):\n    name = C.__class__.__name__\n    # base_dir = os.path.join(base_dir, name)\n    # if not os.path.isdir(base_dir):\n    #     os.makedirs(base_dir)\n    return base_dir, name\n\nclass Hidden:\n    def hide(self):\n        return True\n\nclass Logger(object):\n    def __init__(self, buffer):\n        self.terminal = sys.stdout\n        self.log = buffer\n\n    def write(self, message):\n        self.terminal.write(message)\n        self.log.write(message)\n\n    def flush(self):\n        # this flush method is needed for python 3 compatibility.\n        pass\n\nclass Capturing(list):\n    def __init__(self, *args, stdout=None, unmute=False, **kwargs):\n        self._stdout = stdout\n        self.unmute = unmute\n        super().__init__(*args, **kwargs)\n\n    def __enter__(self, capture_errors=True): # don\'t put arguments here.\n        self._stdout = sys.stdout if self._stdout == None else self._stdout\n        self._stringio = StringIO()\n        if self.unmute:\n            sys.stdout = Logger(self._stringio)\n        else:\n            sys.stdout = self._stringio\n\n        if capture_errors:\n            self._sterr = sys.stderr\n            sys.sterr = StringIO() # memory hole it\n        self.capture_errors = capture_errors\n        return self\n\n    def __exit__(self, *args):\n        self.extend(self._stringio.getvalue().splitlines())\n        del self._stringio    # free up some memory\n        sys.stdout = self._stdout\n        if self.capture_errors:\n            sys.sterr = self._sterr\n\nclass Capturing2(Capturing):\n    def __exit__(self, *args):\n        lines = self._stringio.getvalue().splitlines()\n        txt = "\\n".join(lines)\n        numbers = extract_numbers(txt)\n        self.extend(lines)\n        del self._stringio    # free up some memory\n        sys.stdout = self._stdout\n        if self.capture_errors:\n            sys.sterr = self._sterr\n\n        self.output = txt\n        self.numbers = numbers\n\n\nclass QItem(unittest.TestCase):\n    title = None\n    testfun = None\n    tol = 0\n    estimated_time = 0.42\n    _precomputed_payload = None\n    _computed_answer = None # Internal helper to later get results.\n    weight = 1 # the weight of the question.\n\n    def __init__(self, question=None, *args, **kwargs):\n        if self.tol > 0 and self.testfun is None:\n            self.testfun = self.assertL2Relative\n        elif self.testfun is None:\n            self.testfun = self.assertEqual\n\n        self.name = self.__class__.__name__\n        # self._correct_answer_payload = correct_answer_payload\n        self.question = question\n\n        super().__init__(*args, **kwargs)\n        if self.title is None:\n            self.title = self.name\n\n    def _safe_get_title(self):\n        if self._precomputed_title is not None:\n            return self._precomputed_title\n        return self.title\n\n    def assertNorm(self, computed, expected, tol=None):\n        if tol == None:\n            tol = self.tol\n        diff = np.abs( (np.asarray(computed).flat- np.asarray(expected)).flat )\n        nrm = np.sqrt(np.sum( diff ** 2))\n\n        self.error_computed = nrm\n\n        if nrm > tol:\n            print(f"Not equal within tolerance {tol}; norm of difference was {nrm}")\n            print(f"Element-wise differences {diff.tolist()}")\n            self.assertEqual(computed, expected, msg=f"Not equal within tolerance {tol}")\n\n    def assertL2(self, computed, expected, tol=None):\n        if tol == None:\n            tol = self.tol\n        diff = np.abs( (np.asarray(computed) - np.asarray(expected)) )\n        self.error_computed = np.max(diff)\n\n        if np.max(diff) > tol:\n            print(f"Not equal within tolerance {tol=}; deviation was {np.max(diff)=}")\n            print(f"Element-wise differences {diff.tolist()}")\n            self.assertEqual(computed, expected, msg=f"Not equal within tolerance {tol=}, {np.max(diff)=}")\n\n    def assertL2Relative(self, computed, expected, tol=None):\n        if tol == None:\n            tol = self.tol\n        diff = np.abs( (np.asarray(computed) - np.asarray(expected)) )\n        diff = diff / (1e-8 + np.abs( (np.asarray(computed) + np.asarray(expected)) ) )\n        self.error_computed = np.max(np.abs(diff))\n        if np.sum(diff > tol) > 0:\n            print(f"Not equal within tolerance {tol}")\n            print(f"Element-wise differences {diff.tolist()}")\n            self.assertEqual(computed, expected, msg=f"Not equal within tolerance {tol}")\n\n    def precomputed_payload(self):\n        return self._precomputed_payload\n\n    def precompute_payload(self):\n        # Pre-compute resources to include in tests (useful for getting around rng).\n        pass\n\n    def compute_answer(self, unmute=False):\n        raise NotImplementedError("test code here")\n\n    def test(self, computed, expected):\n        self.testfun(computed, expected)\n\n    def get_points(self, verbose=False, show_expected=False, show_computed=False,unmute=False, passall=False, silent=False, **kwargs):\n        possible = 1\n        computed = None\n        def show_computed_(computed):\n            print(">>> Your output:")\n            print(computed)\n\n        def show_expected_(expected):\n            print(">>> Expected output (note: may have been processed; read text script):")\n            print(expected)\n\n        correct = self._correct_answer_payload\n        try:\n            if unmute: # Required to not mix together print stuff.\n                print("")\n            computed = self.compute_answer(unmute=unmute)\n        except Exception as e:\n            if not passall:\n                if not silent:\n                    print("\\n=================================================================================")\n                    print(f"When trying to run test class \'{self.name}\' your code threw an error:", e)\n                    show_expected_(correct)\n                    import traceback\n                    print(traceback.format_exc())\n                    print("=================================================================================")\n                return (0, possible)\n\n        if self._computed_answer is None:\n            self._computed_answer = computed\n\n        if show_expected or show_computed:\n            print("\\n")\n        if show_expected:\n            show_expected_(correct)\n        if show_computed:\n            show_computed_(computed)\n        try:\n            if not passall:\n                self.test(computed=computed, expected=correct)\n        except Exception as e:\n            if not silent:\n                print("\\n=================================================================================")\n                print(f"Test output from test class \'{self.name}\' does not match expected result. Test error:")\n                print(e)\n                show_computed_(computed)\n                show_expected_(correct)\n            return (0, possible)\n        return (1, possible)\n\n    def score(self):\n        try:\n            self.test()\n        except Exception as e:\n            return 0\n        return 1\n\nclass QPrintItem(QItem):\n    def compute_answer_print(self):\n        """\n        Generate output which is to be tested. By default, both text written to the terminal using print(...) as well as return values\n        are send to process_output (see compute_answer below). In other words, the text generated is:\n\n        res = compute_Answer_print()\n        txt = (any terminal output generated above)\n        numbers = (any numbers found in terminal-output txt)\n\n        self.test(process_output(res, txt, numbers), <expected result>)\n\n        :return: Optional values for comparison\n        """\n        raise Exception("Generate output here. The output is passed to self.process_output")\n\n    def process_output(self, res, txt, numbers):\n        return res\n\n    def compute_answer(self, unmute=False):\n        with Capturing(unmute=unmute) as output:\n            res = self.compute_answer_print()\n        s = "\\n".join(output)\n        s = rm_progress_bar(s) # Remove progress bar.\n        numbers = extract_numbers(s)\n        self._computed_answer = (res, s, numbers)\n        return self.process_output(res, s, numbers)\n\nclass OrderedClassMembers(type):\n    @classmethod\n    def __prepare__(self, name, bases):\n        return collections.OrderedDict()\n    def __new__(self, name, bases, classdict):\n        ks = list(classdict.keys())\n        for b in bases:\n            ks += b.__ordered__\n        classdict[\'__ordered__\'] = [key for key in ks if key not in (\'__module__\', \'__qualname__\')]\n        return type.__new__(self, name, bases, classdict)\n\nclass QuestionGroup(metaclass=OrderedClassMembers):\n    title = "Untitled question"\n    partially_scored = False\n    t_init = 0  # Time spend on initialization (placeholder; set this externally).\n    estimated_time = 0.42\n    has_called_init_ = False\n    _name = None\n    _items = None\n\n    @property\n    def items(self):\n        if self._items == None:\n            self._items = []\n            members = [gt for gt in [getattr(self, gt) for gt in self.__ordered__ if gt not in ["__classcell__", "__init__"]] if inspect.isclass(gt) and issubclass(gt, QItem)]\n            for I in members:\n                self._items.append( I(question=self))\n        return self._items\n\n    @items.setter\n    def items(self, value):\n        self._items = value\n\n    @property\n    def name(self):\n        if self._name == None:\n            self._name = self.__class__.__name__\n        return self._name #\n\n    @name.setter\n    def name(self, val):\n        self._name = val\n\n    def init(self):\n        # Can be used to set resources relevant for this question instance.\n        pass\n\n    def init_all_item_questions(self):\n        for item in self.items:\n            if not item.question.has_called_init_:\n                item.question.init()\n                item.question.has_called_init_ = True\n\n\nclass Report:\n    title = "report title"\n    version = None\n    questions = []\n    pack_imports = []\n    individual_imports = []\n    nL = 80 # Maximum line width\n\n    @classmethod\n    def reset(cls):\n        for (q,_) in cls.questions:\n            if hasattr(q, \'reset\'):\n                q.reset()\n\n    @classmethod\n    def mfile(clc):\n        return inspect.getfile(clc)\n\n    def _file(self):\n        return inspect.getfile(type(self))\n\n    def _import_base_relative(self):\n        if hasattr(self.pack_imports[0], \'__path__\'):\n            root_dir = self.pack_imports[0].__path__._path[0]\n        else:\n            root_dir = self.pack_imports[0].__file__\n\n        root_dir = os.path.dirname(root_dir)\n        relative_path = os.path.relpath(self._file(), root_dir)\n        modules = os.path.normpath(relative_path[:-3]).split(os.sep)\n        return root_dir, relative_path, modules\n\n    def __init__(self, strict=False, payload=None):\n        working_directory = os.path.abspath(os.path.dirname(self._file()))\n\n        self.wdir, self.name = setup_dir_by_class(self, working_directory)\n        # self.computed_answers_file = os.path.join(self.wdir, self.name + "_resources_do_not_hand_in.dat")\n        for (q,_) in self.questions:\n            q.nL = self.nL # Set maximum line length.\n\n        if payload is not None:\n            self.set_payload(payload, strict=strict)\n        # else:\n        #     if os.path.isfile(self.computed_answers_file):\n        #         self.set_payload(cache_read(self.computed_answers_file), strict=strict)\n        #     else:\n        #         s = f"> Warning: The pre-computed answer file, {os.path.abspath(self.computed_answers_file)} is missing. The framework will NOT work as intended. Reasons may be a broken local installation."\n        #         if strict:\n        #             raise Exception(s)\n        #         else:\n        #             print(s)\n\n    def main(self, verbosity=1):\n        # Run all tests using standard unittest (nothing fancy).\n        import unittest\n        loader = unittest.TestLoader()\n        for q,_ in self.questions:\n            import time\n            start = time.time() # A good proxy for setup time is to\n            suite = loader.loadTestsFromTestCase(q)\n            unittest.TextTestRunner(verbosity=verbosity).run(suite)\n            total = time.time()              - start\n            q.time = total\n\n    def _setup_answers(self):\n        self.main()  # Run all tests in class just to get that out of the way...\n        report_cache = {}\n        for q, _ in self.questions:\n            if hasattr(q, \'_save_cache\'):\n                q()._save_cache()\n                q._cache[\'time\'] = q.time\n                report_cache[q.__qualname__] = q._cache\n            else:\n                report_cache[q.__qualname__] = {\'no cache see _setup_answers in framework.py\':True}\n        return report_cache\n\n    def set_payload(self, payloads, strict=False):\n        for q, _ in self.questions:\n            q._cache = payloads[q.__qualname__]\n\ndef rm_progress_bar(txt):\n    # More robust version. Apparently length of bar can depend on various factors, so check for order of symbols.\n    nlines = []\n    for l in txt.splitlines():\n        pct = l.find("%")\n        ql = False\n        if pct > 0:\n            i = l.find("|", pct+1)\n            if i > 0 and l.find("|", i+1) > 0:\n                ql = True\n        if not ql:\n            nlines.append(l)\n    return "\\n".join(nlines)\n\ndef extract_numbers(txt):\n    # txt = rm_progress_bar(txt)\n    numeric_const_pattern = \'[-+]? (?: (?: \\d* \\. \\d+ ) | (?: \\d+ \\.? ) )(?: [Ee] [+-]? \\d+ ) ?\'\n    rx = re.compile(numeric_const_pattern, re.VERBOSE)\n    all = rx.findall(txt)\n    all = [float(a) if (\'.\' in a or "e" in a) else int(a) for a in all]\n    if len(all) > 500:\n        print(txt)\n        raise Exception("unitgrade_v1.unitgrade_v1.py: Warning, too many numbers!", len(all))\n    return all\n\nclass ActiveProgress():\n    def __init__(self, t, start=True, title="my progress bar",show_progress_bar=True):\n        self.t = t\n        self._running = False\n        self.title = title\n        self.dt = 0.1\n        self.n = int(np.round(self.t / self.dt))\n        self.show_progress_bar = show_progress_bar\n\n        # self.pbar = tqdm.tqdm(total=self.n)\n        if start:\n            self.start()\n\n    def start(self):\n        self._running = True\n        if self.show_progress_bar:\n            self.thread = threading.Thread(target=self.run)\n            self.thread.start()\n        self.time_started = time.time()\n\n    def terminate(self):\n        if not self._running:\n            raise Exception("Stopping a stopped progress bar. ")\n        self._running = False\n        if self.show_progress_bar:\n            self.thread.join()\n        if hasattr(self, \'pbar\') and self.pbar is not None:\n            self.pbar.update(1)\n            self.pbar.close()\n            self.pbar=None\n\n        sys.stdout.flush()\n        return time.time() - self.time_started\n\n    def run(self):\n        self.pbar = tqdm.tqdm(total=self.n, file=sys.stdout, position=0, leave=False, desc=self.title, ncols=100,\n                              bar_format=\'{l_bar}{bar}| [{elapsed}<{remaining}]\')  # , unit_scale=dt, unit=\'seconds\'):\n\n        for _ in range(self.n-1): # Don\'t terminate completely; leave bar at 99% done until terminate.\n            if not self._running:\n                self.pbar.close()\n                self.pbar = None\n                break\n\n            time.sleep(self.dt)\n            self.pbar.update(1)\n\n\n# class MySuite(unittest.suite.TestSuite): # Not sure we need this one anymore.\n#     raise Exception("no suite")\n#     pass\n\ndef instance_call_stack(instance):\n    s = "-".join(map(lambda x: x.__name__, instance.__class__.mro()))\n    return s\n\ndef get_class_that_defined_method(meth):\n    for cls in inspect.getmro(meth.im_class):\n        if meth.__name__ in cls.__dict__:\n            return cls\n    return None\n\ndef caller_name(skip=2):\n    """Get a name of a caller in the format module.class.method\n\n       `skip` specifies how many levels of stack to skip while getting caller\n       name. skip=1 means "who calls me", skip=2 "who calls my caller" etc.\n\n       An empty string is returned if skipped levels exceed stack height\n    """\n    stack = inspect.stack()\n    start = 0 + skip\n    if len(stack) < start + 1:\n      return \'\'\n    parentframe = stack[start][0]\n\n    name = []\n    module = inspect.getmodule(parentframe)\n    # `modname` can be None when frame is executed directly in console\n    # TODO(techtonik): consider using __main__\n    if module:\n        name.append(module.__name__)\n    # detect classname\n    if \'self\' in parentframe.f_locals:\n        # I don\'t know any way to detect call from the object method\n        # XXX: there seems to be no way to detect static method call - it will\n        #      be just a function call\n        name.append(parentframe.f_locals[\'self\'].__class__.__name__)\n    codename = parentframe.f_code.co_name\n    if codename != \'<module>\':  # top level usually\n        name.append( codename ) # function or a method\n\n    ## Avoid circular refs and frame leaks\n    #  https://docs.python.org/2.7/library/inspect.html#the-interpreter-stack\n    del parentframe, stack\n\n    return ".".join(name)\n\ndef get_class_from_frame(fr):\n\n      args, _, _, value_dict = inspect.getargvalues(fr)\n      # we check the first parameter for the frame function is\n      # named \'self\'\n      if len(args) and args[0] == \'self\':\n            # in that case, \'self\' will be referenced in value_dict\n            instance = value_dict.get(\'self\', None)\n            if instance:\n                  # return its class\n                  # isinstance(instance, Testing) # is the actual class instance.\n\n                  return getattr(instance, \'__class__\', None)\n      # return None otherwise\n      return None\n\nfrom typing import Any\nimport inspect, gc\n\ndef giveupthefunc():\n    frame = inspect.currentframe()\n    code  = frame.f_code\n    globs = frame.f_globals\n    functype = type(lambda: 0)\n    funcs = []\n    for func in gc.get_referrers(code):\n        if type(func) is functype:\n            if getattr(func, "__code__", None) is code:\n                if getattr(func, "__globals__", None) is globs:\n                    funcs.append(func)\n                    if len(funcs) > 1:\n                        return None\n    return funcs[0] if funcs else None\n\n\nfrom collections import defaultdict\n\nclass UTextResult(unittest.TextTestResult):\n    nL = 80\n    number = -1 # HAcky way to set question number.\n    show_progress_bar = True\n    def __init__(self, stream, descriptions, verbosity):\n        super().__init__(stream, descriptions, verbosity)\n        self.successes = []\n\n    def printErrors(self) -> None:\n        # if self.dots or self.showAll:\n        #     self.stream.writeln()\n        # if hasattr(self, \'cc\'):\n        #     self.cc.terminate()\n        # self.cc_terminate(success=False)\n        self.printErrorList(\'ERROR\', self.errors)\n        self.printErrorList(\'FAIL\', self.failures)\n\n    def addError(self, test, err):\n        super(unittest.TextTestResult, self).addFailure(test, err)\n        self.cc_terminate(success=False)\n\n    def addFailure(self, test, err):\n        super(unittest.TextTestResult, self).addFailure(test, err)\n        self.cc_terminate(success=False)\n        # if self.showAll:\n        #     self.stream.writeln("FAIL")\n        # elif self.dots:\n        #     self.stream.write(\'F\')\n        #     self.stream.flush()\n\n    def addSuccess(self, test: unittest.case.TestCase) -> None:\n        # super().addSuccess(test)\n        self.successes.append(test)\n        # super().addSuccess(test)\n        #     hidden = issubclass(item.__class__, Hidden)\n        #     # if not hidden:\n        #     #     print(ss, end="")\n        #     # sys.stdout.flush()\n        #     start = time.time()\n        #\n        #     (current, possible) = item.get_points(show_expected=show_expected, show_computed=show_computed,unmute=unmute, passall=passall, silent=silent)\n        #     q_[j] = {\'w\': item.weight, \'possible\': possible, \'obtained\': current, \'hidden\': hidden, \'computed\': str(item._computed_answer), \'title\': item.title}\n        #     tsecs = np.round(time.time()-start, 2)\n        self.cc_terminate()\n\n\n\n    def cc_terminate(self, success=True):\n        if self.show_progress_bar or True:\n            tsecs = np.round(self.cc.terminate(), 2)\n            sys.stdout.flush()\n            ss = self.item_title_print\n\n            state = "PASS" if success else "FAILED"\n\n            dot_parts = (\'.\' * max(0, self.nL - len(state) - len(ss)))\n            if self.show_progress_bar or True:\n                print(self.item_title_print + dot_parts, end="")\n            else:\n                print( dot_parts, end="")\n\n            if tsecs >= 0.1:\n                state += " (" + str(tsecs) + " seconds)"\n            print(state)\n\n\n    def startTest(self, test):\n        # super().startTest(test)\n        j =self.testsRun\n        self.testsRun += 1\n        # print("Starting the test...")\n        # show_progress_bar = True\n        n = UTextResult.number\n\n        item_title = self.getDescription(test)\n        # item_title = item_title.split("\\n")[0]\n        item_title = test.shortDescription() # Better for printing (get from cache).\n        if item_title == None:\n            # For unittest framework where getDescription may return None.\n            item_title = self.getDescription(test)\n        # test.countTestCases()\n        self.item_title_print = "*** q%i.%i) %s" % (n + 1, j + 1, item_title)\n        estimated_time = 10\n        nL = 80\n        #\n        if self.show_progress_bar or True:\n            self.cc = ActiveProgress(t=estimated_time, title=self.item_title_print, show_progress_bar=self.show_progress_bar)\n        else:\n            print(self.item_title_print + (\'.\' * max(0, nL - 4 - len(self.item_title_print))), end="")\n\n        self._test = test\n\n    def _setupStdout(self):\n        if self._previousTestClass == None:\n            total_estimated_time = 1\n            if hasattr(self.__class__, \'q_title_print\'):\n                q_title_print = self.__class__.q_title_print\n            else:\n                q_title_print = "<unnamed test. See unitgrade_v1.py>"\n\n            # q_title_print = "some printed title..."\n            cc = ActiveProgress(t=total_estimated_time, title=q_title_print, show_progress_bar=self.show_progress_bar)\n            self.cc = cc\n\n    def _restoreStdout(self): # Used when setting up the test.\n        if self._previousTestClass == None:\n            q_time = self.cc.terminate()\n            q_time = np.round(q_time, 2)\n            sys.stdout.flush()\n            if self.show_progress_bar:\n                print(self.cc.title, end="")\n            # start = 10\n            # q_time = np.round(time.time() - start, 2)\n            nL = 80\n            print(" " * max(0, nL - len(self.cc.title)) + (\n                " (" + str(q_time) + " seconds)" if q_time >= 0.1 else ""))  # if q.name in report.payloads else "")\n            # print("=" * nL)\n\n\n\nclass UTextTestRunner(unittest.TextTestRunner):\n    def __init__(self, *args, **kwargs):\n        from io import StringIO\n        stream = StringIO()\n        super().__init__(*args, stream=stream, **kwargs)\n\n    def _makeResult(self):\n        # stream = self.stream # not you!\n        stream = sys.stdout\n        stream = _WritelnDecorator(stream)\n        return self.resultclass(stream, self.descriptions, self.verbosity)\n\n# def wrapper(foo):\n#     def magic(self):\n#         # s = "-".join(map(lambda x: x.__name__, self.__class__.mro()))\n#         foo(self)\n#     magic.__doc__ = foo.__doc__\n#     return magic\n\nfrom functools import update_wrapper, _make_key, RLock\nfrom collections import namedtuple\n_CacheInfo = namedtuple("CacheInfo", ["hits", "misses", "maxsize", "currsize"])\n\ndef cache(foo, typed=False):\n    """ Magic cache wrapper\n    https://github.com/python/cpython/blob/main/Lib/functools.py\n    """\n    maxsize = None\n    def wrapper(self, *args, **kwargs):\n        key = (self.cache_id(), ("@cache", foo.__name__, _make_key(args, kwargs, typed)) )\n        if not self._cache_contains(key):\n            value = foo(self, *args, **kwargs)\n            self._cache_put(key, value)\n        else:\n            value = self._cache_get(key)\n        return value\n    return wrapper\n\n\nclass UTestCase(unittest.TestCase):\n    _outcome = None # A dictionary which stores the user-computed outcomes of all the tests. This differs from the cache.\n    _cache = None  # Read-only cache. Ensures method always produce same result.\n    _cache2 = None  # User-written cache.\n\n    def capture(self):\n        return Capturing2(stdout=self._stdout)\n\n    @classmethod\n    def question_title(cls):\n        """ Return the question title """\n        return cls.__doc__.strip().splitlines()[0].strip() if cls.__doc__ != None else cls.__qualname__\n\n    @classmethod\n    def reset(cls):\n        print("Warning, I am not sure UTestCase.reset() is needed anymore and it seems very hacky.")\n        cls._outcome = None\n        cls._cache = None\n        cls._cache2 = None\n\n    def _callSetUp(self):\n        self._stdout = sys.stdout\n        import io\n        sys.stdout = io.StringIO()\n        super().setUp()\n        # print("Setting up...")\n\n    def _callTearDown(self):\n        sys.stdout = self._stdout\n        super().tearDown()\n        # print("asdfsfd")\n\n    def shortDescriptionStandard(self):\n        sd = super().shortDescription()\n        if sd == None:\n            sd = self._testMethodName\n        return sd\n\n    def shortDescription(self):\n        # self._testMethodDoc.strip().splitlines()[0].strip()\n        sd = self.shortDescriptionStandard()\n        title = self._cache_get(  (self.cache_id(), \'title\'), sd )\n        return title if title != None else sd\n\n    @property\n    def title(self):\n        return self.shortDescription()\n\n    @title.setter\n    def title(self, value):\n        self._cache_put((self.cache_id(), \'title\'), value)\n\n    def _get_outcome(self):\n        if not (self.__class__, \'_outcome\') or self.__class__._outcome == None:\n            self.__class__._outcome = {}\n        return self.__class__._outcome\n\n    def _callTestMethod(self, testMethod):\n        t = time.time()\n        self._ensure_cache_exists() # Make sure cache is there.\n        if self._testMethodDoc != None:\n            # Ensure the cache is eventually updated with the right docstring.\n            self._cache_put((self.cache_id(), \'title\'), self.shortDescriptionStandard() )\n        # Fix temp cache here (for using the @cache decorator)\n        self._cache2[ (self.cache_id(), \'assert\') ] = {}\n\n        res = testMethod()\n        elapsed = time.time() - t\n        # self._cache_put( (self.cache_id(), \'title\'), self.shortDescription() )\n\n        self._get_outcome()[self.cache_id()] = res\n        self._cache_put( (self.cache_id(), "time"), elapsed)\n\n    # This is my base test class. So what is new about it?\n    def cache_id(self):\n        c = self.__class__.__qualname__\n        m = self._testMethodName\n        return (c,m)\n\n    def __init__(self, *args, **kwargs):\n        super().__init__(*args, **kwargs)\n        self._load_cache()\n        self._assert_cache_index = 0\n        # self.cache_indexes = defaultdict(lambda: 0)\n\n    def _ensure_cache_exists(self):\n        if not hasattr(self.__class__, \'_cache\') or self.__class__._cache == None:\n            self.__class__._cache = dict()\n        if not hasattr(self.__class__, \'_cache2\') or self.__class__._cache2 == None:\n            self.__class__._cache2 = dict()\n\n    def _cache_get(self, key, default=None):\n        self._ensure_cache_exists()\n        return self.__class__._cache.get(key, default)\n\n    def _cache_put(self, key, value):\n        self._ensure_cache_exists()\n        self.__class__._cache2[key] = value\n\n    def _cache_contains(self, key):\n        self._ensure_cache_exists()\n        return key in self.__class__._cache\n\n    def wrap_assert(self, assert_fun, first, *args, **kwargs):\n        key = (self.cache_id(), \'assert\')\n        if not self._cache_contains(key):\n            print("Warning, framework missing", key)\n        cache = self._cache_get(key, {})\n        id = self._assert_cache_index\n        if not id in cache:\n            print("Warning, framework missing cache index", key, "id =", id)\n        _expected = cache.get(id, first)\n        assert_fun(first, _expected, *args, **kwargs)\n        cache[id] = first\n        self._cache_put(key, cache)\n        self._assert_cache_index += 1\n\n    def assertEqualC(self, first: Any, msg: Any = ...) -> None:\n        self.wrap_assert(self.assertEqual, first, msg)\n\n    def _cache_file(self):\n        return os.path.dirname(inspect.getfile(self.__class__) ) + "/unitgrade_v1/" + self.__class__.__name__ + ".pkl"\n\n    def _save_cache(self):\n        # get the class name (i.e. what to save to).\n        cfile = self._cache_file()\n        if not os.path.isdir(os.path.dirname(cfile)):\n            os.makedirs(os.path.dirname(cfile))\n\n        if hasattr(self.__class__, \'_cache2\'):\n            with open(cfile, \'wb\') as f:\n                pickle.dump(self.__class__._cache2, f)\n\n    # But you can also set cache explicitly.\n    def _load_cache(self):\n        if self._cache != None: # Cache already loaded. We will not load it twice.\n            return\n            # raise Exception("Loaded cache which was already set. What is going on?!")\n        cfile = self._cache_file()\n        # print("Loading cache from", cfile)\n        if os.path.exists(cfile):\n            with open(cfile, \'rb\') as f:\n                data = pickle.load(f)\n                self.__class__._cache = data\n        else:\n            print("Warning! data file not found", cfile)\n\ndef hide(func):\n    return func\n\ndef makeRegisteringDecorator(foreignDecorator):\n    """\n        Returns a copy of foreignDecorator, which is identical in every\n        way(*), except also appends a .decorator property to the callable it\n        spits out.\n    """\n    def newDecorator(func):\n        # Call to newDecorator(method)\n        # Exactly like old decorator, but output keeps track of what decorated it\n        R = foreignDecorator(func)  # apply foreignDecorator, like call to foreignDecorator(method) would have done\n        R.decorator = newDecorator  # keep track of decorator\n        # R.original = func         # might as well keep track of everything!\n        return R\n\n    newDecorator.__name__ = foreignDecorator.__name__\n    newDecorator.__doc__ = foreignDecorator.__doc__\n    # (*)We can be somewhat "hygienic", but newDecorator still isn\'t signature-preserving, i.e. you will not be able to get a runtime list of parameters. For that, you need hackish libraries...but in this case, the only argument is func, so it\'s not a big issue\n    return newDecorator\n\nhide = makeRegisteringDecorator(hide)\n\ndef methodsWithDecorator(cls, decorator):\n    """\n        Returns all methods in CLS with DECORATOR as the\n        outermost decorator.\n\n        DECORATOR must be a "registering decorator"; one\n        can make any decorator "registering" via the\n        makeRegisteringDecorator function.\n\n        import inspect\n        ls = list(methodsWithDecorator(GeneratorQuestion, deco))\n        for f in ls:\n            print(inspect.getsourcelines(f) ) # How to get all hidden questions.\n    """\n    for maybeDecorated in cls.__dict__.values():\n        if hasattr(maybeDecorated, \'decorator\'):\n            if maybeDecorated.decorator == decorator:\n                print(maybeDecorated)\n                yield maybeDecorated\n\n\n\nimport numpy as np\nfrom tabulate import tabulate\nfrom datetime import datetime\nimport pyfiglet\nimport unittest\n# from unitgrade.unitgrade import MySuite\n\nimport inspect\nimport os\nimport argparse\nimport sys\nimport time\nimport threading # don\'t import Thread bc. of minify issue.\nimport tqdm # don\'t do from tqdm import tqdm because of minify-issue\n\nparser = argparse.ArgumentParser(description=\'Evaluate your report.\', epilog="""Example: \nTo run all tests in a report: \n\n> python assignment1_dp.py\n\nTo run only question 2 or question 2.1\n\n> python assignment1_dp.py -q 2\n> python assignment1_dp.py -q 2.1\n\nNote this scripts does not grade your report. To grade your report, use:\n\n> python report1_grade.py\n\nFinally, note that if your report is part of a module (package), and the report script requires part of that package, the -m option for python may be useful.\nFor instance, if the report file is in Documents/course_package/report3_complete.py, and `course_package` is a python package, then change directory to \'Documents/` and run:\n\n> python -m course_package.report1\n\nsee https://docs.python.org/3.9/using/cmdline.html\n""", formatter_class=argparse.RawTextHelpFormatter)\nparser.add_argument(\'-q\', nargs=\'?\', type=str, default=None, help=\'Only evaluate this question (e.g.: -q 2)\')\nparser.add_argument(\'--showexpected\',  action="store_true",  help=\'Show the expected/desired result\')\nparser.add_argument(\'--showcomputed\',  action="store_true",  help=\'Show the answer your code computes\')\nparser.add_argument(\'--unmute\',  action="store_true",  help=\'Show result of print(...) commands in code\')\nparser.add_argument(\'--passall\',  action="store_true",  help=\'Automatically pass all tests. Useful when debugging.\')\n\ndef evaluate_report_student(report, question=None, qitem=None, unmute=None, passall=None, ignore_missing_file=False, show_tol_err=False):\n    args = parser.parse_args()\n    if question is None and args.q is not None:\n        question = args.q\n        if "." in question:\n            question, qitem = [int(v) for v in question.split(".")]\n        else:\n            question = int(question)\n\n    if hasattr(report, "computed_answer_file") and not os.path.isfile(report.computed_answers_file) and not ignore_missing_file:\n        raise Exception("> Error: The pre-computed answer file", os.path.abspath(report.computed_answers_file), "does not exist. Check your package installation")\n\n    if unmute is None:\n        unmute = args.unmute\n    if passall is None:\n        passall = args.passall\n\n    results, table_data = evaluate_report(report, question=question, show_progress_bar=not unmute, qitem=qitem, verbose=False, passall=passall, show_expected=args.showexpected, show_computed=args.showcomputed,unmute=unmute,\n                                          show_tol_err=show_tol_err)\n\n\n    if question is None:\n        print("Provisional evaluation")\n        tabulate(table_data)\n        table = table_data\n        print(tabulate(table))\n        print(" ")\n\n    fr = inspect.getouterframes(inspect.currentframe())[1].filename\n    gfile = os.path.basename(fr)[:-3] + "_grade.py"\n    if os.path.exists(gfile):\n        print("Note your results have not yet been registered. \\nTo register your results, please run the file:")\n        print(">>>", gfile)\n        print("In the same manner as you ran this file.")\n\n\n    return results\n\n\ndef upack(q):\n    # h = zip([(i[\'w\'], i[\'possible\'], i[\'obtained\']) for i in q.values()])\n    h =[(i[\'w\'], i[\'possible\'], i[\'obtained\']) for i in q.values()]\n    h = np.asarray(h)\n    return h[:,0], h[:,1], h[:,2],\n\nclass UnitgradeTextRunner(unittest.TextTestRunner):\n    def __init__(self, *args, **kwargs):\n        super().__init__(*args, **kwargs)\n\nclass SequentialTestLoader(unittest.TestLoader):\n    def getTestCaseNames(self, testCaseClass):\n        test_names = super().getTestCaseNames(testCaseClass)\n        # testcase_methods = list(testCaseClass.__dict__.keys())\n        ls = []\n        for C in testCaseClass.mro():\n            if issubclass(C, unittest.TestCase):\n                ls = list(C.__dict__.keys()) + ls\n        testcase_methods = ls\n        test_names.sort(key=testcase_methods.index)\n        return test_names\n\ndef evaluate_report(report, question=None, qitem=None, passall=False, verbose=False,  show_expected=False, show_computed=False,unmute=False, show_help_flag=True, silent=False,\n                    show_progress_bar=True,\n                    show_tol_err=False,\n                    big_header=True):\n\n    now = datetime.now()\n    if big_header:\n        ascii_banner = pyfiglet.figlet_format("UnitGrade", font="doom")\n        b = "\\n".join( [l for l in ascii_banner.splitlines() if len(l.strip()) > 0] )\n    else:\n        b = "Unitgrade"\n    print(b + " v" + __version__)\n    dt_string = now.strftime("%d/%m/%Y %H:%M:%S")\n    print("Started: " + dt_string)\n    s = report.title\n    if hasattr(report, "version") and report.version is not None:\n        s += " version " + report.version\n    print("Evaluating " + s, "(use --help for options)" if show_help_flag else "")\n    # print(f"Loaded answers from: ", report.computed_answers_file, "\\n")\n    table_data = []\n    nL = 80\n    t_start = time.time()\n    score = {}\n    loader = SequentialTestLoader()\n\n    for n, (q, w) in enumerate(report.questions):\n        # q = q()\n        # q_hidden = False\n        # q_hidden = issubclass(q.__class__, Hidden)\n        if question is not None and n+1 != question:\n            continue\n        suite = loader.loadTestsFromTestCase(q)\n        qtitle = q.question_title() if hasattr(q, \'question_title\') else q.__qualname__\n        q_title_print = "Question %i: %s"%(n+1, qtitle)\n        print(q_title_print, end="")\n        q.possible = 0\n        q.obtained = 0\n        q_ = {} # Gather score in this class.\n        # unittest.Te\n        # q_with_outstanding_init = [item.question for item in q.items if not item.question.has_called_init_]\n        UTextResult.q_title_print = q_title_print # Hacky\n        UTextResult.show_progress_bar = show_progress_bar # Hacky.\n        UTextResult.number = n\n\n        res = UTextTestRunner(verbosity=2, resultclass=UTextResult).run(suite)\n\n        possible = res.testsRun\n        obtained = len(res.successes)\n\n        assert len(res.successes) +  len(res.errors) + len(res.failures) == res.testsRun\n\n        # possible = int(ws @ possible)\n        # obtained = int(ws @ obtained)\n        # obtained = int(myround(int((w * obtained) / possible ))) if possible > 0 else 0\n\n        obtained = int(w * obtained * 1.0 / possible ) if possible > 0 else 0\n        score[n] = {\'w\': w, \'possible\': w, \'obtained\': obtained, \'items\': q_, \'title\': qtitle}\n        q.obtained = obtained\n        q.possible = possible\n\n        s1 = f"*** Question q{n+1}"\n        s2 = f" {q.obtained}/{w}"\n        print(s1 + ("."* (nL-len(s1)-len(s2) )) + s2 )\n        print(" ")\n        table_data.append([f"Question q{n+1}", f"{q.obtained}/{w}"])\n\n    ws, possible, obtained = upack(score)\n    possible = int( msum(possible) )\n    obtained = int( msum(obtained) ) # Cast to python int\n    report.possible = possible\n    report.obtained = obtained\n    now = datetime.now()\n    dt_string = now.strftime("%H:%M:%S")\n\n    dt = int(time.time()-t_start)\n    minutes = dt//60\n    seconds = dt - minutes*60\n    plrl = lambda i, s: str(i) + " " + s + ("s" if i != 1 else "")\n\n    print(f"Completed: "+ dt_string + " (" + plrl(minutes, "minute") + ", "+ plrl(seconds, "second") +")")\n\n    table_data.append(["Total", ""+str(report.obtained)+"/"+str(report.possible) ])\n    results = {\'total\': (obtained, possible), \'details\': score}\n    return results, table_data\n\n\n\n\nfrom tabulate import tabulate\nfrom datetime import datetime\nimport inspect\nimport json\nimport os\nimport bz2\nimport pickle\nimport os\n\ndef bzwrite(json_str, token): # to get around obfuscation issues\n    with getattr(bz2, \'open\')(token, "wt") as f:\n        f.write(json_str)\n\ndef gather_imports(imp):\n    resources = {}\n    m = imp\n    # for m in pack_imports:\n    # print(f"*** {m.__name__}")\n    f = m.__file__\n    # dn = os.path.dirname(f)\n    # top_package = os.path.dirname(__import__(m.__name__.split(\'.\')[0]).__file__)\n    # top_package = str(__import__(m.__name__.split(\'.\')[0]).__path__)\n\n    if hasattr(m, \'__file__\') and not hasattr(m, \'__path__\'):  # Importing a simple file: m.__class__.__name__ == \'module\' and False:\n        top_package = os.path.dirname(m.__file__)\n        module_import = True\n    else:\n        top_package = __import__(m.__name__.split(\'.\')[0]).__path__._path[0]\n        module_import = False\n\n    # top_package = os.path.dirname(__import__(m.__name__.split(\'.\')[0]).__file__)\n    # top_package = os.path.dirname(top_package)\n    import zipfile\n    # import strea\n    # zipfile.ZipFile\n    import io\n    # file_like_object = io.BytesIO(my_zip_data)\n    zip_buffer = io.BytesIO()\n    with zipfile.ZipFile(zip_buffer, \'w\') as zip:\n        # zip.write()\n        for root, dirs, files in os.walk(top_package):\n            for file in files:\n                if file.endswith(".py"):\n                    fpath = os.path.join(root, file)\n                    v = os.path.relpath(os.path.join(root, file), os.path.dirname(top_package) if not module_import else top_package)\n                    zip.write(fpath, v)\n\n    resources[\'zipfile\'] = zip_buffer.getvalue()\n    resources[\'top_package\'] = top_package\n    resources[\'module_import\'] = module_import\n    return resources, top_package\n\n    if f.endswith("__init__.py"):\n        for root, dirs, files in os.walk(os.path.dirname(f)):\n            for file in files:\n                if file.endswith(".py"):\n                    # print(file)\n                    # print()\n                    v = os.path.relpath(os.path.join(root, file), top_package)\n                    with open(os.path.join(root, file), \'r\') as ff:\n                        resources[v] = ff.read()\n    else:\n        v = os.path.relpath(f, top_package)\n        with open(f, \'r\') as ff:\n            resources[v] = ff.read()\n    return resources\n\nimport argparse\nparser = argparse.ArgumentParser(description=\'Evaluate your report.\', epilog="""Use this script to get the score of your report. Example:\n\n> python report1_grade.py\n\nFinally, note that if your report is part of a module (package), and the report script requires part of that package, the -m option for python may be useful.\nFor instance, if the report file is in Documents/course_package/report3_complete.py, and `course_package` is a python package, then change directory to \'Documents/` and run:\n\n> python -m course_package.report1\n\nsee https://docs.python.org/3.9/using/cmdline.html\n""", formatter_class=argparse.RawTextHelpFormatter)\nparser.add_argument(\'--noprogress\',  action="store_true",  help=\'Disable progress bars\')\nparser.add_argument(\'--autolab\',  action="store_true",  help=\'Show Autolab results\')\n\ndef gather_upload_to_campusnet(report, output_dir=None):\n    n = report.nL\n    args = parser.parse_args()\n    results, table_data = evaluate_report(report, show_help_flag=False, show_expected=False, show_computed=False, silent=True,\n                                          show_progress_bar=not args.noprogress,\n                                          big_header=not args.autolab)\n    print(" ")\n    print("="*n)\n    print("Final evaluation")\n    print(tabulate(table_data))\n    # also load the source code of missing files...\n\n    sources = {}\n\n    if not args.autolab:\n        if len(report.individual_imports) > 0:\n            print("By uploading the .token file, you verify the files:")\n            for m in report.individual_imports:\n                print(">", m.__file__)\n            print("Are created/modified individually by you in agreement with DTUs exam rules")\n            report.pack_imports += report.individual_imports\n\n        if len(report.pack_imports) > 0:\n            print("Including files in upload...")\n            for k, m in enumerate(report.pack_imports):\n                nimp, top_package = gather_imports(m)\n                _, report_relative_location, module_import = report._import_base_relative()\n\n                # report_relative_location = os.path.relpath(inspect.getfile(report.__class__), top_package)\n                nimp[\'report_relative_location\'] = report_relative_location\n                nimp[\'report_module_specification\'] = module_import\n                nimp[\'name\'] = m.__name__\n                sources[k] = nimp\n                # if len([k for k in nimp if k not in sources]) > 0:\n                print(f"*** {m.__name__}")\n                # sources = {**sources, **nimp}\n    results[\'sources\'] = sources\n\n    if output_dir is None:\n        output_dir = os.getcwd()\n\n    payload_out_base = report.__class__.__name__ + "_handin"\n\n    obtain, possible = results[\'total\']\n    vstring = "_v"+report.version if report.version is not None else ""\n\n    token = "%s_%i_of_%i%s.token"%(payload_out_base, obtain, possible,vstring)\n    token = os.path.join(output_dir, token)\n    with open(token, \'wb\') as f:\n        pickle.dump(results, f)\n\n    if not args.autolab:\n        print(" ")\n        print("To get credit for your results, please upload the single file: ")\n        print(">", token)\n        print("To campusnet without any modifications.")\n\n        # print("Now time for some autolab fun")\n\ndef source_instantiate(name, report1_source, payload):\n    eval("exec")(report1_source, globals())\n    pl = pickle.loads(bytes.fromhex(payload))\n    report = eval(name)(payload=pl, strict=True)\n    # report.set_payload(pl)\n    return report\n\n\n__version__ = "0.9.0"\n\nfrom homework1 import reverse_list, add\nimport unittest\n\nclass Week1(unittest.TestCase):\n    def test_add(self):\n        self.assertEqual(add(2,2), 4)\n        self.assertEqual(add(-100, 5), -95)\n\n    def test_reverse(self):\n        self.assertEqual(reverse_list([1,2,3]), [3,2,1])\n\n\nimport homework1\nclass Report1Flat(Report):\n    title = "CS 101 Report 1"\n    questions = [(Week1, 10)]  # Include a single question for 10 credits.\n    pack_imports = [homework1]'
-report1_payload = '8004953f000000000000007d948c055765656b31947d948c2c6e6f20636163686520736565205f73657475705f616e737765727320696e20756e69746772616465322e7079948873732e'
-name="Report1Flat"
-
-report = source_instantiate(name, report1_source, report1_payload)
-output_dir = os.path.dirname(__file__)
-gather_upload_to_campusnet(report, output_dir)
diff --git a/examples/example_moss/student_submissions/s1001/Report2_handin_18_of_18.token b/examples/example_moss/student_submissions/s1001/Report2_handin_18_of_18.token
new file mode 100644
index 0000000..37e6a88
--- /dev/null
+++ b/examples/example_moss/student_submissions/s1001/Report2_handin_18_of_18.token
@@ -0,0 +1,246 @@
+# This file contains your results. Do not edit its content. Simply upload it as it is. 
+### Content of cs102\homework1.py ###
+
+def reverse_list(mylist): #!f #!s;keeptags
+    """
+    Given a list 'mylist' returns a list consisting of the same elements in reverse order. E.g.
+    reverse_list([1,2,3]) should return [3,2,1] (as a list).
+    """
+    return list(reversed(mylist))
+
+def add(a,b): #!f
+    """ Given two numbers `a` and `b` this function should simply return their sum:
+    > add(a,b) = a+b """
+    return a+b
+
+if __name__ == "__main__":
+    # Example usage:
+    print(f"Your result of 2 + 2 = {add(2,2)}")
+    print(f"Reversing a small list", reverse_list([2,3,5,7])) #!s
+
+
+### Content of cs102\report2.py ###
+
+from unitgrade.framework import Report
+from unitgrade.evaluate import evaluate_report_student
+from cs102.homework1 import add, reverse_list
+from unitgrade import UTestCase, cache  
+
+class Week1(UTestCase):
+    def test_add(self):
+        self.assertEqualC(add(2,2))
+        self.assertEqualC(add(-100, 5))
+
+    def test_reverse(self):
+        self.assertEqualC(reverse_list([1, 2, 3])) 
+
+    def test_output_capture(self):
+        with self.capture() as out:
+            print("hello world 42")                     # Genereate some output (i.e. in a homework script)
+        self.assertEqual(out.numbers[0], 42)            # out.numbers is a list of all numbers generated
+        self.assertEqual(out.output, "hello world 42")  # you can also access the raw output.
+
+class Week1Titles(UTestCase): 
+    """ The same problem as before with nicer titles """
+    def test_add(self):
+        """ Test the addition method add(a,b) """
+        self.assertEqualC(add(2,2))
+        self.assertEqualC(add(-100, 5))
+
+    def test_reverse(self):
+        ls = [1, 2, 3]
+        reverse = reverse_list(ls)
+        self.assertEqualC(reverse)
+        # Although the title is set after the test potentially fails, it will *always* show correctly for the student.
+        self.title = f"Checking if reverse_list({ls}) = {reverse}"  # Programmatically set the title 
+
+    def ex_test_output_capture(self):
+        with self.capture() as out:
+            print("hello world 42")                     # Genereate some output (i.e. in a homework script)
+        self.assertEqual(out.numbers[0], 42)            # out.numbers is a list of all numbers generated
+        self.assertEqual(out.output, "hello world 42")  # you can also access the raw output.
+
+
+class Question2(UTestCase): 
+    @cache
+    def my_reversal(self, ls):
+        # The '@cache' decorator ensures the function is not run on the *students* computer
+        # Instead the code is run on the teachers computer and the result is passed on with the
+        # other pre-computed results -- i.e. this function will run regardless of how the student happens to have
+        # implemented reverse_list.
+        return reverse_list(ls)
+
+    def test_reverse_tricky(self):
+        ls = (2,4,8)
+        ls2 = self.my_reversal(tuple(ls))                   # This will always produce the right result, [8, 4, 2]
+        print("The correct answer is supposed to be", ls2)  # Show students the correct answer
+        self.assertEqualC(reverse_list(ls))                 # This will actually test the students code.
+        return "Buy world!"                                 # This value will be stored in the .token file  
+
+
+import cs102
+class Report2(Report):
+    title = "CS 101 Report 2"
+    questions = [(Week1, 10), (Week1Titles, 8)]
+    pack_imports = [cs102]
+
+if __name__ == "__main__":
+    evaluate_report_student(Report2(), unmute=True)
+---------------------------------------------------------------------- ..ooO0Ooo.. ----------------------------------------------------------------------
+ef1d6aed7e0aafa4f6dd7a1775215fccca2533cd3bc7c5b4a57f6823c261a26e038937534bc38da7c59463a140ba28c8d42ad5ab4589f856e69a00ff6a9f3fca 27868
+---------------------------------------------------------------------- ..ooO0Ooo.. ----------------------------------------------------------------------
+.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.
\ No newline at end of file
diff --git a/examples/example_moss/student_submissions/s1001/Report2_handin_18_of_18_0/cs102/homework1.py b/examples/example_moss/student_submissions/s1001/Report2_handin_18_of_18_0/cs102/homework1.py
new file mode 100644
index 0000000..94004fc
--- /dev/null
+++ b/examples/example_moss/student_submissions/s1001/Report2_handin_18_of_18_0/cs102/homework1.py
@@ -0,0 +1,16 @@
+def reverse_list(mylist): #!f #!s;keeptags
+    """
+    Given a list 'mylist' returns a list consisting of the same elements in reverse order. E.g.
+    reverse_list([1,2,3]) should return [3,2,1] (as a list).
+    """
+    return list(reversed(mylist))
+
+def add(a,b): #!f
+    """ Given two numbers `a` and `b` this function should simply return their sum:
+    > add(a,b) = a+b """
+    return a+b
+
+if __name__ == "__main__":
+    # Example usage:
+    print(f"Your result of 2 + 2 = {add(2,2)}")
+    print(f"Reversing a small list", reverse_list([2,3,5,7])) #!s
diff --git a/examples/example_moss/student_submissions/s1001/Report2_handin_18_of_18_0/cs102/report2.py b/examples/example_moss/student_submissions/s1001/Report2_handin_18_of_18_0/cs102/report2.py
new file mode 100644
index 0000000..894b769
--- /dev/null
+++ b/examples/example_moss/student_submissions/s1001/Report2_handin_18_of_18_0/cs102/report2.py
@@ -0,0 +1,65 @@
+from unitgrade.framework import Report
+from unitgrade.evaluate import evaluate_report_student
+from cs102.homework1 import add, reverse_list
+from unitgrade import UTestCase, cache  
+
+class Week1(UTestCase):
+    def test_add(self):
+        self.assertEqualC(add(2,2))
+        self.assertEqualC(add(-100, 5))
+
+    def test_reverse(self):
+        self.assertEqualC(reverse_list([1, 2, 3])) 
+
+    def test_output_capture(self):
+        with self.capture() as out:
+            print("hello world 42")                     # Genereate some output (i.e. in a homework script)
+        self.assertEqual(out.numbers[0], 42)            # out.numbers is a list of all numbers generated
+        self.assertEqual(out.output, "hello world 42")  # you can also access the raw output.
+
+class Week1Titles(UTestCase): 
+    """ The same problem as before with nicer titles """
+    def test_add(self):
+        """ Test the addition method add(a,b) """
+        self.assertEqualC(add(2,2))
+        self.assertEqualC(add(-100, 5))
+
+    def test_reverse(self):
+        ls = [1, 2, 3]
+        reverse = reverse_list(ls)
+        self.assertEqualC(reverse)
+        # Although the title is set after the test potentially fails, it will *always* show correctly for the student.
+        self.title = f"Checking if reverse_list({ls}) = {reverse}"  # Programmatically set the title 
+
+    def ex_test_output_capture(self):
+        with self.capture() as out:
+            print("hello world 42")                     # Genereate some output (i.e. in a homework script)
+        self.assertEqual(out.numbers[0], 42)            # out.numbers is a list of all numbers generated
+        self.assertEqual(out.output, "hello world 42")  # you can also access the raw output.
+
+
+class Question2(UTestCase): 
+    @cache
+    def my_reversal(self, ls):
+        # The '@cache' decorator ensures the function is not run on the *students* computer
+        # Instead the code is run on the teachers computer and the result is passed on with the
+        # other pre-computed results -- i.e. this function will run regardless of how the student happens to have
+        # implemented reverse_list.
+        return reverse_list(ls)
+
+    def test_reverse_tricky(self):
+        ls = (2,4,8)
+        ls2 = self.my_reversal(tuple(ls))                   # This will always produce the right result, [8, 4, 2]
+        print("The correct answer is supposed to be", ls2)  # Show students the correct answer
+        self.assertEqualC(reverse_list(ls))                 # This will actually test the students code.
+        return "Buy world!"                                 # This value will be stored in the .token file  
+
+
+import cs102
+class Report2(Report):
+    title = "CS 101 Report 2"
+    questions = [(Week1, 10), (Week1Titles, 8)]
+    pack_imports = [cs102]
+
+if __name__ == "__main__":
+    evaluate_report_student(Report2(), unmute=True)
diff --git a/examples/example_moss/student_submissions/s1001/Report2_handin_18_of_18_0/cs102/report2_grade.py b/examples/example_moss/student_submissions/s1001/Report2_handin_18_of_18_0/cs102/report2_grade.py
new file mode 100644
index 0000000..13a61a6
--- /dev/null
+++ b/examples/example_moss/student_submissions/s1001/Report2_handin_18_of_18_0/cs102/report2_grade.py
@@ -0,0 +1,3 @@
+''' WARNING: Modifying, decompiling or otherwise tampering with this script, it's data or the resulting .token file will be investigated as a cheating attempt. '''
+import bz2, base64
+exec(bz2.decompress(base64.b64decode('QlpoOTFBWSZTWfP3C/4ATe3/gH/25FZ7/////+//vv////5gXH73vV696+z3uYvtxRbvb33j7qgBQQgDID0DpVD73OOUZ73Cbc91tlNSE9A0LLS2A+i757j3Trpr72+2F9uA56dwFX1dY+5997nt72H3vrvrJV26+277rw0Djdven2GzvLBo1baporStVzs3fezz003vTsDmtd81VZUfd99996efd99x67e28t3vfe+UIJ97j7vdNYXd2577znszrEp9Nve3e2DFb2z68e8LHq3drRCU9u2dUnWFdzS2519Z3XD5en23WkIHuhXxfO533vlPrlOweOX3zfQ5fN9zvc3d9zzvd72dm29dC1jjt1vZ6wlNEENAgAmkyEwCaNTNE9IjE1PZKeoaMh6Q0aA0DaQNMgQhBDRBHommqeU/UQ9RhBkyGmg02oAeoGgAAAlMSIQTTVPVGmynpPyamobTUD9SaHqGQaGj1AA0ADT1GgaAk0kUEAmIGhJmk9AVN5I9JH+pT0NQemU0bSNPUGQYgGgAiSIEE0yaAJk00JgUyZGVP2o1E2k9TeqbSY9KfpTEyA9RkeoyCQkEIJoT1DIymmyTVHjVP0npR6mnqND1NpAPUDQNNAaAAc6J8x7mFCCBTET+w9pSQgfPBVU9okYgCgSBYHzioqKqKn9Hz/K5pKv/Kvf964HnR+pXu3o9y9Ej3+P6yxCsXD+72xify88EAxuCBGYZyxILEdfyZ2j+/orB8kEeMoY4iW54Vsry3WkGWhqiLM6oa21eZSW5Xpw3WOO7l3BuCtfz4D8Vlwx2SI66Qns+I37kzQXMEUeCMIczRZDkMnKXk5lc+UH+B8yU4/P/5tmgS/7c36d093lLvX+MzUwkT0P3ztGfPDASFHf1HLqGHMFgzIAf5Z5ZcTAEAEOoRX4MRZAkEkZFkIsikAQQk+JCxFkV/WkySKpb98Gk3EBUKSKgVUpFIQFdGjOWDsZpoSc2foew+h8b7OvBzDhOs5UFuiHsTqI+UlCgqggKssjYgip+hhQYisBSCwFUJlsI/9fH/zz7ug5c4fw1EsdD1xw/9vWqZXq7uh8ZPDWQKGHo8WuCWrwbJIHMUE7xxPFYGqWjYSBskWnpMFCYmJJSldTI8OmkV6qlIN/Boeu1e2Tzu2nHNWSGyNHS8sY7W6PzHIrBgPMcfwvq1Q+VKeM+7X/77c5px8X0EdPp4G+TPjAcWtP8YskV/vm0/35RPk23W2LyY+lHtT8fgjt7XX+Dt3osDfUhjHAwOR7IPhd1g+MJ6Vi6Xqrv9i7TwgRgLBSZNUQ6bP0wWmVuf+XjEJn9+eGtH0SYge/Tcd3MZc3BYPk8RrpPmsvPvmvvGDQIGhrs9RHi6BHnxLdewuRuhgI0h7sXIjZeoCIRZFPTedb9DfIj7PL5ZYiaGo93hP2O0wXq8OjHm+nXydjt/18vucH3BckhXRHISK5IeFISOGmt3HD0+bfTCSw7FhVfCYrw7xL2JvlF63rlLfYPwG66fasb9c8unUV4504B2P+npD7xMZHAJ8Nb9cP4XE048j9bearCxi1MB+PXSW6sNben5Fdctm+2RoYdZZKKuRTXnODKnKma7SNY6OT8U7+upMeuS9ySNqiOz9KYf0x6vERTchlenJnuM9uWBd4uBXGfRoWc2+G56dnbthYgjC1h35EHm9jNCogWdoKEGPAjR+B2dpJcpLJ5vgjvutS5NV7TsgmP3PBVNmsUKRdAcWfwH8vy8SDIxyQoaDZk8Y+SQoWCa2GM6KOAEm1FopRpXfhjFG2dqVnzxj3ZFDZMYm5NS+69gYvTwuA1zMxsRsrRlDSKReYmdGHEwGY0dkOMMmtkiRDXGmxnKPILDJCkgEcHqFu2g1bcuSVBlJzrSIOChAKM2R4lUlfqj9WvtLYqEIgaoD8Pfp+XZUIbzE3xDfq4+tRgbceHOwGjSeYrtd4TEfsd8m6jIWxewM7C0+bbrOKWe7XTZcL0thyxQQkLVCzuY/vvnJsDH2WCve16yQ5X/LzLDX/QPyUbBnYnE5XHHS22c31okcRMwioj5kGPq4MOMQZg55/qlLUTQ9HPW5fxbuoNzo5261paGgWhpCR+E7ZDV13Cw+M5bjR+jhGEoRNjAgvzzfGj1xqOXGhKN9sc/UsdttrwdDgi3LDSb/xuEukjWMF3ZwMIITaPNVVxHrwKazqjPBS4ETp8puiPO8GeTtM3udOTtpkEsznxfhuzvEXKgv6ttwvTgX0uHHKFH5/fjK067ebFqNvsO24r9DmwgluwI/tuMELa923LjAWfZaI47XpDj1/B/SV/34Swz1FUEV77McOJpPg1vhl/FQQr/SOeP2idIsXhmWZtYWnIJFCQ4QaOFZd5ucTfQXl0GhF2Biye6imyaN4gcMi5mbGeRSpPHKxLx3aGZoXlAkVCdukq3VIxYReXFxUmwayOhDSEXn8oa9CRICt90pPJ7jabijjsjYy3ZfMy0jMFSi3D37TPpPWDUJlYcfrIi2wfaOKVZ7Zadp2EhIV+NB8mLIvqVFxMc73XknW4wOVs8DQsZl6JJAYklu8tFcyrCoQxFchxxXe2SBer8U5MvC2Rl0fZqi7UFmsGUj3/TMMlprz3bnZIQo+InhoE3CDOAec4HWp2tcUKFHwsGE5yioSRPddp889uHjQsb17ImimLzaWjuxU4D7t56YK2NOpj0E1Hvcglj3k/zykUyu8jYkaTb5NeTPn5vvxzHMw7xfAzMpkk2Rd8zXZibZ0P1PSjrdB3+MZX08uBDlXaTdggI+0tLiR4QwTakDw31ri9RERESEPtOPsgT2eQCXXaxsxlFtvuu7u9+XF+Txg0WGnFpMeWZGR4IjDh/ZYfB8KdyLixqy3t2mbkXmWHv0KsSPCawwlN2wXcU/zQgI+b7mbKS+tPBvAfGUwReZJDs1aEyVAy7lc+zDuI1LqYrzkNsXqyoaXzNcsC1J6vfHcOUMRSL3tepatl9kJlIvoxfG+ON5gRpE5ZVO7k5f6uWzymPEMjHU3m0gxQNOPifK+me03l7XUd7OR7EUl9OZXDnyqly2BSheYy2SMWBsE7CcR6JSJSMCGRyacSFsk5MQhSQ3ajUwDE4lXOCb7EKG2YnfPYHdPTljj2fGN5gU22Az2cH6mrtImVTCnDTnoaGuHkiRZmE0jgFj8Ojt6j05oIfU2HBFkPaSkh2kBA4dJxslvHmI4E9mBW31HDIxxmUC8LLIcCdxcXEKW2UGSqKL8pYCIZSKbnKywLlI9YTtK/qeWrYrJr0nLouGMtPqCJdsUGxociCxaFmk44OsZydXTQWlttHufiGGLvcOYQE95iP37MLmNmZmVNQVVg1xhE5hmr40NTEuGrjSzYLAgVIyJzxPKTa4upfEtjjuItapSsGVLgqCYQxOYisxw24qCJmpwkFdxWCK6ZMSKpJmiRgsDOZeNdlzMoxJQ9H79D60Ei8cWWU575jaUdhUnphbGE7osKfU1KaboOikX4A9txpkZozzKEqKWjpKZN7gtYi+Q9eWWgaHgIvywMMpEgPpMZ5YTNNMMEknMKCcZUdxQI1nOVuVchFoRo/AQeiVngRCIdCL3ASQBS9ESe0KKNR9hpiuJS5aGcXo07r+2GIclURUVyBJqtzI0lL4iKmdEcTB5l0plLnol3UJk0bndi9OdpvdlPv25c+3U6YDdLxzfc2eeVKV0toRW+tibBILtYW7CQ7qUTyJv7sOqItt4SnNy8Nd8Yl+jio6Lx3UiMROE4iwVRhU+hzumD3htN8r8QXJud1DdXphParTepPA3FCIHHCrFZFSCuUSc26XPp1peD9ADGrI8Pg7AeGqO8Xzig5YBMoNJ0Z2adI1DG+cPprnZq1pSV2LyvqpDzMGNxU1yD9nNnKckbAd62HSDQwlBUJCSmUJQtVTaZl2EaesN4jauvSYq/VjAkShoW3KJbaQ/cIGghx5a0K5mzHSlmFejG+Z4DzQYZXKpJjyFTlhK8l88pbjr3cD1HurXyQh26XfrBvGcxj07R03Ck95+/IR6IsYXMY5i5hn6Jl1z3397OaCwneZt7JE+puKhiIQEBVuqFjXcKGwOOnnnn5oOpdkJgN3LnL9K1S8jN9vykV8dOjF27t5Ltd2+Ib2r8LvSevaOwIcxchQuYjvBH3IJib2uPRsGLj4v1b0U0tXaSa9dudByMGZOv2/kL7z0Gw7d8GCC92i0YrQbFp8LZzCkIBGNgO2+Q4mpArGZnj8r8K896dbTZ11yO9+h4HpGCD2HuEo+ZUDXUfbCziuP6kbnzbJWjnnyeOvXqOh0ajMF/vc3c5u/OYypzs7/YXnrvztj4zfS1XyX0sliuFM4L/KjzA4ONskO3ZECyDzBgzZyOcZcB173OAnjui7zvfYM9kiA5/r8bv04Y93T0X2VPfFrtuvt12XUnwt2xzWzOaZpO+D06NdfuTogIeO3BITJMxmzQU55b2X5FNErIKLVtDiWyGCIlR5VQbQP1fyUzX8ZkucTIPG4RWKijNYI+hDr0u4abtY37o+WO7TP1vfgrkcP7v6MzTzY4mTo6nIzrcZmXBwFjPOJUNOjK+csLE06JEyOW3UMP9PbBZP7nylxUJeNQrprp0zHH+Z/aJNJw3KYqox/Jx46F/o/b/q/18jg5Bso40WcP8gkIfal6BaQ7KR7pt4wIyy+qkY+oVUFxSVEUDMU0zLh9Yf6jBksiS0JJm8wcAf74Uxd8DuGfaPV82SGB17RkYfH8nb7nwVXbw8g7+/57YEHU0Ev0UIy0lK2/ExyyA35P3LfSanX+H080RVVVWHcwOjo5cyvTw4ConeMogqqqkN8bJOKHHjvEM7fNblDQs+tUUJ9kZK9CtcVtstsq2xiFWMCqlQqxkrBQr/+tMMzAFnVyPw6DMYg0iN5SaNgqkP3faslhFmK/KIuDFdpDTEHG8diFnjkOA2PS2C2o0F2pwNlVEMfenP0Y+OcvOJf+Lm/Kv23LDRCE882TV4jdKs9GiYyM6YYrC7bY7/hSK6ujhl5dVMwYh53Wxc5mnEildmu5QLFVED92FdpibdCraMGZQtZpNFGySbhLj1gWKH3mFguO8fGRe1D8Mbh5L8acVeZX5kCHAkya9JEr+f9IVNaD4NDsCXuOrfocjUehoLLukYvEYlcPaMAizaSlS5MicoZoWcIbkYSVJJUcN5WSspBUWZXQSQltGnSTahFYGKyFOOvqpxAw0s+ByI07GD0lJgblpiyCTZVpqqs5YtGQ2CHQSiBD5tc5+4gyKJE8KQV2P3E/VPHa115YEVY1NeZoXmV4rjIqR/lEZBZkebZC8cCdzhrcEiKEIpwW8182QliYM5EAejO/SJtywmzZj9DdxFRImI1OvBr8CtXfSIaSJcqwF9JqIZHM1TdyejmuPfrlQlfaC4hOXxQnKLSabbFnSmkrpNXYj4ki0alji3fz2BTO5x4w/S+V5FNpw4Fh8zisyVoHqTKZuSIOJBdwF0v2rB6PNpEIPWOJiOFciP4/hf7UjprDzspmHI4L9V3Qg/SnJ/KPt96B155858vfTg9x+N14wuRMQc+J5mjb71AkSUfjVSNyibr/W/owlfj84ye84R3SdMLkTLH6h7iES/HWOczZun4Cv+p8+M8bGCp2tfDzMDkQ5BwncCtrKXdcxy3dItn3XmyxnnxTuleh0xNZi+oWiUbOp4SwJ+K/rVpWft7+LD0lky611aJ9XIeWBIqcIuufF4O5/JxfEz3c9TyPr6ZG5jRwMO7SYXLiFC/LIvIhu6IgZ7kuXH4B3d2M56LqNecjuAfmMWJI14IkCAmTICBPzXE00bGYh3liuu3fmXR1DXUeUgMOkzV2q6IjbXw04MCCUTwR7LJ9+YHvK8UevR87y4GhtjUNG3qUjhTOpwZK4+W4B2ngzyWIbRfbALsMxAdiEyDxEYlg/UhQQSEEHfAxE7yFk5ESe2V0p3q4dvRE13Vjkm457uN/N2vW3AIDjI9Affhtfv+U41XhA6+W7oh+myWZWswLk/G6J+RXXX0U5KQjyqH4Bkxzxc4Z5p4wH5epTNIIZwh4ShJop/p9nE4rutCnO+EjtnhHKxxXqXpW/baEjW8saEOTecqO8co3d14cDc5fb0OXjMOvihUtiZW89euZye8x5qfBLfO8QK36RDn5e5/YZnW66TvvY3Xve8mB7QcTCfvl8x4uPUXNd655LpEOCj8+yPo2p9iudbVXmoBq3lBQhQXlQjZbgioKx4LWtVYKd5dUl19E6n1Yzws47bSoYX8zBFyBSv3yHuRJd7yJO6QkEsOXSCh6NqrTYOrjAG1RboKBeGLqMMDCwGG227AtKBGjSyMG1gYGjCDEdlX7bb/XmsN+qpEBXWfHT28wMAaOiR/DEawmJCdAYcWZ2bhZ3otOPrX3VAes+2A/xdgrBoIJCeaB3kZIb3EebVQXrTJYcFfB/sjQ79p0P7s+m7X/4nW0u6t6EST7sw3pbe/Yq1lyp64JTcuZtbeaRE9as0qSfqFLgnnb1dK0+jF8SvBh8XCHW6F8uw+HTEXxBd2OwgNJn4desz4pEZpCOPjwhY3W7+kNHgXYWmvYV1VawOI79tnrMQ84Ol+PaRt0cvVPB/XdPDG2M6pe8em8sZ5zz41NoIwxoQxnKZkEs8oed7zJbL2lSyp0scLTSzn73wGFd12aCbEnnpa4xW2zktYIakohyNUKlZkEmQOmTMYGFS6QjlzuzXXuqWuH4xxMZFxKXfGcjShpMwvcfZvMJ3XeHNTzldzutbOf2HgjERV/P5dlrGLdzubfGvNm9/XLTnfht3EXl2hIo5PEu7SaSCQ/CPKuNzBnjVp1sQFjpdeSE/ko0m4cl4WkXo1q4YIaEanu3Z8xM8Obf5tHYcOqz3b/WHriP93IvstsIQH6afgI4T8whCTYnEmfLEk3FObb/Ycy4DnWoVR3zG1ICojDA6fFYKSjuxIJjiS9eMSR+Z84MayIko+6CIPem5tbGLJ4EPIZ2XjhlswKHuE0kxiXms6yX4nke30kqij6PoDWcdYbSIESciN6dwdHUBwYJB5P5eDv6KHlaQnueDCkvRb1YeWUZv365D7qqCfBoKKqMlOZxR+BPq5wvwNP0eDDRrRZvg708Wc5cMUxqNyyVz7So0hXa3A1dopqllqZwKGGLDLNJGpDFFOBR7ORyMgDcOR7wjRiOSB0XX4BofAcNkAJEebWX1azDFKKSjHYXPx9HjuM9ikdQeSbii5ReJQwojIGwr1MJxOt5D6sHXqzhoJglQ+ycxMbuopkIX0XBW+4mNu0aw2Z6m3IaaBHkXyOl7LGIcjpF6BlDpQfJkpgdAUCTSQTSQISDwKnMOdKAJs2sFgGIYMsKJAhQWM2FNCTHp+ougm4FTW8cvSk1GI/pOkLaIxfQOammJG3jdzti6jSHgMM4m0fJCq5w2KLkSk5x3WgshUBicS+IXV2YdcOptmJ1GdZ6zTS+3ZEkcKG5zXLMI8dqsKNUKCfs1Dy8XlME924c2YNSgEhywmEI2ePuyN3cGhtLHwYuD9B0zBQDg9CQeZKUHvv3hb9IT0DAvguT/IfVY+OezB/E7/fO6IwzX6UTHFmtAZYxkAj3X6dMpYk94fnucIAegNqCCRaR9lJs7CVYFUVKUPWzt/cdFohoVNLEVuNWBvZBDg8V2bXiWAKOyJowwPDwTzToZPzjuw41/zHq7H6RAUNxjqII8vz3nmH/Dwvo6Z9m3T66mnsGcL4pMqK5icWT9zj6ODDQcjdw+7HoOw9JYEGKiiqfxuY2vmOr14aFERQRAZCcHBNvQION8gntM5Y723ilJlicCsIwEOJKBg2GO4vN4ahb/9nPzs9UOTvdzDwB/VHq+cXUE1FsE3RRZD4uZY4ZR3M8w5X+bp1IJAbhEB52c9PY3DmheR56FDzU9peXQXFhOXCMTGYUOZQ4BkOifqoUWItfaBqaMDg1iHaJSQ8aC6S1FRdgvLqDSdPIxJCBw2c/f4Wh3CidBtRDX6Q6Y7Byc3+QKBcd6SWK9odLi1rsV2B3Q7RcTd3Xb3tQ8JJQrGDi7fy0jJU2BQwNSinCxrNTT1qWFscBIEnKAgTmQStaEPlXTEmYKfURFmQQRVxHoudsTWKyDWVWqUIK7zkRcYwIrWVRClU+MzMZygDdP6YyaQV7XjEkCECxTZJ1b5lCgILBIgzLjBMs+2LgNmwmeGWUdJVWTmMYNnEU61MXNlxLzLwnhpzFXEVbyevj5IhLwA6jkLYcMM0PBAeqYEyG+ANhQ7AqKMViKezhmRGC6gYJtQ1pVRRgsRnZk1o1e5IgwaVWUTDrkKx0aSkIgUCxpe06CdJzNg3nIw2aOIe/jzO8eyb6uglFVRVFERRV4HLnhoYiCrBTYgkROy2MkXTucJOEhpE4Ytkp5KCekGFkTwHLxuXKhQqEQhphU4FkgyNHVGxUyG5Vxvr0ULzcQm5h2E7ze2fIxBCRioQ4nVeINs8Ii8xEw+85eVTkEkQeUJsLFRBuTb4kL1C0QCUzZ4GGEYt98PzUk1tNp4gSYYORoXvgPzA4jD4QztltgUNbxR3OzzSsOMGRkO0gi8CmFZjlYBZLMYZoO+htAhjc24gyorW0CgRbAhrDxKO1wTAnK45bDQci7x+TG37e7xDNZAJDEgxT/jtWDuURJtByMrhgFiUmbHbAoXQ2pdqUMr6knkaXG+BABQhi1CAMB4kZGmdsuHEvXg2hmfHvFT3ldcS/JsHQmazZkx2HXR5QK1QVhRVBImEHdDI2zi+V0Wvi5UHZjNLfYbiHE4GqzfnwqzYFXsUkXG4EOaYJCSRmX3wUD8kB1O3H07F/s2A3NsTYjH3iRiW8S9PlEQp8YiUa9pM7p500qM8AfBxXOUnPmXXpToe4rYKecdnp3hnRbHAAh6ALJM3lt9WSNJEb7xWEXWq3UxervQL2EVkTAhAmYMAtsVDb5w2/1/e7fF/8nztHL6Xb+/D+aPqtjOsP+h7yvzUMW9aIwkSo6+mZCSAMBz3ohug4vnDH7D9/p85qYfbL91GtjL9ooE3G17G6+BeiSq7LV/iH/sMvgPtImKQ8DPmROmMOhhwGexPU9aeNu9GZPYyTTMQYvs5pnsdYmnAePfhDmJpnnYFVjOb6XGKc9ZPdc9PGOCFjoyy+RIhG3DqlZFRhGVxI6QrTaPALtsYmBycBwXgFGUERuNfM8z7XuIz3qZ6U8ZzX5Uu3/TSi1nKJXJiUOKcRuJG7p+5BZG2d61P2fwfUiSC/nZWRYFV/QWk/2uh0whoDVkFgSVhNIBWChBYONkAKkyDaIqUSrVKuWQC/abtYd/tkbkd304549OWiHa/GCXG4Znta9pCYmY7Ote+9XW2VtM2QasMY/E+4jedPFPcIHDnOtThMK7MMlu6xnAryZWYHr679BImDKmQsTBCsYIMPHe74qXLlPTbcI4LCt7xg1hMYUo5Ni1MQnLgj8TXOC7hYzO74ULTV6jlgTbZdqtLtaRPtfpdO162d+YcGLOhnNLiLkoz/owMW5zuNbi+toJLYWOtJKfd7yLt1B6Oxm5Y8Uzz5c6mc8INhD7rEbNCea1Ho2Umor4wU3aSI8G7ITD74yH85zGmmMr1NNm2u3qWiHgwWvt73rv8v1BNelfatn/H/I+P8P2H1YjocgUajAuWI3PhY3gdcqZ+3A2fecdmv5cpxTzSEQy/cp5wWZZJd00r8P4DTkn0eXuJ12qqgSSSbENfMGb4tBQ0N6yx/yR/ae/m4fNJbf5WqHf+GWgBo45ooIqCLEAJwPHaKAVV6R8k6iMYz3VYetXE297wZ70ZZn8QgHCB0IoUdByDkW7kmatBMd478oByayUfv/zD0VY/rxPAzKXQ3h3n4lnDAWjQSHAoo71xm/tA3hgA9okgEikEXUQ7tYLsGD7TaeP6xzn76d5+ow3hmNq0HkhJhzm/q4idzw2+fYaxOnQFhizmMOb5IzBiPhmdQgkOyZ5/H194cnNuNDuge+dQSBDeHcxOHpouZpK8PJaxmeBBjSt+1fc3+JiISSmphHAudMhQzEzJvcGSBuyaY4a4sILX3FixvPTJNjcuSSD4kJZD9nulmD7HLVVVmbCnaE+UwwnV4BAQxckjA+BKOxU+VSR7rjiuf4js4oQQv2GTp1UnXzDu93ibFKE8e7XBa+mhOqmStTDVTU5LNaaA7OKEEC7U1BDGQhH5z1EPN57aoSRLGAt5wJg3Qm0J++PJlMlUSuwsn9nxw/f4/IfwBCd10LrRxpBFro3Hqb1xk0E753IvhQ4T1Dolzf2T+Hv/fyBuOPkyyvHXCnJMi5xO7HDUl444z8tgtu51yzsE7DKcr8nbJPiDIi/G0RggcJSwYeOyoOTC2HCQh1R9P5CwoANwP3e19p5oNb0l8VdbifZCtsni56w1H4PW1vXA6z2MxaSQhsFZoCPs1hE0GbQOHpmHo/QyZds9ns34yfbIuMAHSz76qsTFHvhVKCRVCDQ6evAmJwM469VxKsGwVgyURJ/DMcQetFbxRJA3IohSutU59ysuDtfKYHBpwUZEbnVBVWoYOCeoKEys2pBIySSRqhDqHkwec8q3D5bv8M5JnvTmhqoxFRbLihCFpYSCGjk2nmHizwzTWMT2Q5/FT0RGirh3IGwSkIKB4PXddbmOORds/Is4QWxra04WVQKDvZAflLOWJBakgePF+XKe/dCQW22qH4X4eQtwSVKRox2TDlmGflw4dop9rl2dAoaT4I4BClHxmnG8qNOj+JPciQHVFPcU8rTkunXKUZVmSPIGADwFh2Rgt+cdZVUhk5TsXVHvIePTzi3+D0OyRJJIPxrs69BQL4teulK9XDNB06LjDaT3J1pw1ZNsKin7KeZmLB9bef5ryTXqpfu67jxpWC/NZU6Gz0bzFfXTM1n0MMUQ4MilijEQT13zGOZm+9nkpe/aJG/EgqSEqS7zhKdsOHo3EipE3OmFNmnHhVm+We7q0uFt046Rtp8IDDvOr8cFAUR69nBONFFLBFTkcH/mO+k9sipM70NeL02TzYl18sN/D5Txym1yfe7HbV9qGoyqRHhvkwGks/kmCIcg2vo7ZcTqrmQS0EcHn5qCieq/p2vPLTvljCchDT6V0O3Fz6CFlrf6EYJWfdo+yb6rbutAXION/aJWUsKVp6NIZoTXZOF8nZJmpHCHPHqtXqmvmKe6J5ovqiJ5o499U357bpx9222J7Pi6lz92XE7qcIfPK+a96W9dvHQy4ATHb5/n4+Xv7GbuMQMd1z8Qzmtmyh6/SmHzfj97+91k2Zw7xtv9O56xzpz7MDpVBSK5Kb5nF3GANpAh3cJkECLfcbS0umF80S3I/T9KGuiH1+w686fjSEkX28f6J7tXfh6e1U/L2ctKbVZOpbJcs88GDmdj4P7kNI9xtHG5CYCRlQNT/n+NNoiGFGjZA3t4T31K99tEfZApLzWsWAODdqxjarkbQcI+QCambofnhU/LqggMIYxGS8H3vE6J0kPgfSJNAgEDRfWF0hdmQLi5Fj8OQuw4a7Drc0YYi6YsEWJQXpEIwdKJQPlVHabB5AA5VgdO4LIKPWToD5Q+JOzrh5zYZkPQYsZAki6QHYFLUJF0PgcMA2CeI6Bwvo8QIMg0fdfcONGnAsZF5dNYfHQT2j8HkI7h5TZDUmxNnVvPYEMaNYmvpJDRhTTLG4d45OAuwhAiu42u3m+JJiFUyEIzENfNQRSOaMTYF9UkhIdZAuuvXQ6ymkLjANARBdrGHmD0Fw2Ds2WRc3GeUFgBjApIWZqGwdBynOGBiRQ4g/PBCgM1nkJA0HZlz3GuYKerjzmbiNt/IJTYnKOAZkGF1xgGIWGFwkGNlp7goH67gnj4e9ay18ZoF0WIKLB1OYiIntA5wKVxA3u8sc6cdpwhe594UFw3m2jSy0oh1mqQPU5NBfnLFDYjERn8/vNe995cnzFz3xaI3s2bHY7kKPzohxYg6m0wNi/hIaHaJ/FAFhFV5izdRYeP++QozX3r+L58Pp5nwP5PpoNzDKBYopFGCCgHkGPeR5iQAmwBwVxJEhAiwscDmgew4AxgiHotakVVgUQEBjLSsP58QxNzEkCEQ/qaUmZ2FwhUgpSoVBzA1Fs8AaXD0kh1fvsQiHzFJCJyE0wi9AekIES9pj5G+UGr7RJ99vZ5iILJlyYnTWo11UZsSLiUdRxUSwcqIR/t3pXcUPQ86aAbg++i5EaIEgJCMYAFFBQUuWSbQKfPcsQ3gdeAj9JAhJEDmEzcGdgwyuqhrXo0FoNgaBim8iWiJ3ICVZrldFOoNaloC6yHgdYRtkPoXbssfQQQT2ncHuPUrASHuS7k4MVYwfSJwAJ2bJ/Slu1L7w3CH4BBTlSARAIkTVjAcDLZB60gDJvTqAfbZ+OW1OpGgnXKYhEsEnECTs9YAjBRGBEQgMAz6YSfhrrnDarRJPoJZvdc02RE2tgmsUYj0TuPkwSwkGa8pzIangdtoDWTxXqCgyGZVYoXDVA0I045GYHE7ZIKsg/1eKkWQ7NG929ugoqBSF07xIJgDJk7gEwPQGYZ/d1LK8uHSGlVS7T+UNonsi+i8gSk3Aw4cTDw7CqiX1t+kaj/S7A6+8VFsqNzXj9YB+z7QX2ZHQJGTGlhtjkP78TZS8Z31TOkvyIdz3OtT6ieiMdDZWNCgH9uBeD5/z011oVEO8roOtKB/Qkzi8xdAo2kOX4z+HHBTWP5BshpIMSSQTZRQyDADD5a+pXYH98xTFRNYTC+gUgJOxINR0Jvh7PWXIrl54nBUmUFVfLeiX+9oH7Aw/rAPA9YQhENHsHR7IRcMfKzr4vlIHIsOr10HUmueqkp0fA6aFGnVMEiAq7Q0g6pDTAfdCNiICcksSBFAw1YdEjGPmjbfmKSHAL+v2z7GBr/3Ups9XpGAa9JBhTO+MIDB74gp4+tILWS5JCRU4gckU4He7GGvN4XDQEAn5aPP77mYSTWc4aVkxiKyhWj91U+zgv7YGcE2HTzi0khwYOwZnE+hwoG9lhyTAe71BI3W99hjYxC9ELl2kWgvJr2i2DWd1YiQwoKzLFHUH5HAZwMBwT85kLRFxH32ohAZjBPWwwJB6EiAcg/5DFMPCH5f85uQm3uIUhsK0galHW+kLHxpW30yEPGEGQhIJAJIwPEpXqaFsjb0MtclDDED1aG006lLrm8ASTOmtm04EokEFqKYSHdKSgkkgdCcxLwgzCVhiErdZy6qpFaxYMEDWscglDX0amTdm2uAyGetNvEI8WRl/VDIJSlYNgmNCI8O84ppaS3E2wuRJ2Z2htol+JKmOlMImtvVFNsEJNhkTP9xgFv5n8p9An+BRGRkTB1rjQkopCx5TpoxoFyZDAYdCvUgbANnAkwZChYyfXDIeHsPkZ9vzZ6jR8IqFhbWKt9pk/IM6ZNAkh2PcfdlRmYlyNASFZhLZQMgLYZaRNh1HxEoisPe68yujrh+xJNoB5vvcxEzIraW5cUczJjiMtra2ittRthG2fLqfH7y+nuOLOoaGrtMyPETAeaNwauek4c4Nj/GNeD/6FQmUia1YP1eSG/OCCy7wwfQd3QJYZIggbsH2DYm9t/AhUNY/fuofaQDrmsJ0qWt20PbsU16z5Bf9j59pgY9X8FAd4O4kAggQyOPOCojyMwCzXEm6dvqFR7goLRZSh4advkYGCfxCePATBezDVC8gkx5/d2O7pGyXSPs2TeP+irclOjEry2gEpciwqPbd2SqVFxF09R4NW4bLGZEhDUqRVPBFEOcEEs9qCSAQRplgX2ziTbGwto0AJv4FDh0Mi20KQ2BEj27X7Vn9XI1guWNztS2BfgWoFij32ChfFWCYSTQTvhvyR9p1G/JhnPMTwDAF8ZX2eBmhgZtwKKBJyVF3cmFsypmi/cXvdkZmTObMKXiFULiG2ZjjE1dNim6EOTXKYGMBCS2sqSOhFAZGNWrkSCHVGnkOSkavUygkYhS9XyHpu2U1tasBIbIubcSr2UFuitmbvfUDY4fk72zLqHQx875xOnTGwpZwdkPQ2wVvM4UHmQwIS3Cg9pqjPNluSrzDpq9hF1vemuhDKYYJmy6Ho7NKQWQInmMb6iozhjQgF51AaA4gSWl3mBmtxQuVWkIWh0CYPeqWu2cY6axsGKcaUE6btxSmLwcCSVWnm8DXsnDQNQ93buQLNHQshCJEu59e6aDJBpMWJXI6g41w5AMCjNKApLuLLhpKzM5AFISBq3oBCRpVkiHlwoQNFJXHiS+uaKcPuHxTduPPF69CJZ8bXDqK0iUAhPMnZOossbZk5gToA+wwJsVBTZtAoOgQ2BswwjFc7hkv0n0rQHWDRmkP9ZVHpE8eHLcOwnU1tayj3OYk87jMR2nhhlQ0USEg5qkN4d6ZUtBg0RaI4869N9S9EavbySlBIAiHXg6gIoojBElmsEFpacxvRm5sYjhZtwVxmDibJF6yZ7IxiUqwSRMUgoII9bbXx0xeXxMZTRxiRAaMk85g6qUkK0s3FcXguNpUDD2KInBGcyPEiHOAW+qMFwSxDBIRZEuG1xSBrCwGCmyJRtcRwFuMFhIIbgpjymK5jExDEEoGziUkDQUHBBRsbCwFi+RKxniFy1SCPxMgSZncCaZi6f8RZWY/GZRiCo/wFwDZcYsUk7IQ/prBBRIIigxLNfz8gZQGNAbiVWocVRltGolfiE8XM4Ja0wM4q+zLL2NQywlpBjGNTW5QFrwFBZUIHNwFcasYK59sGtxkNkv7C4V9KZ7Aov3eQ2OlnccECSyXWRYpB2LkQDkDMNZGI+np+2kPPhrFAT5zLJ5+U1dYbSCH7Qg7AyUP6Yp7zYRuR+jzzseRpBOsldq53Re4YGcEolXWys0z2XmFiYNKJKjJJRAYBUJL4kzPefIxAMoT7OA/VKlcKMMg9Sf0Ot2qHghi5kbu75MW3mpMXZwCBoE41gudiAVYPAKXbsqtGpCpDkHj6IhHfjpeGPpZCLBBhBkFMNqhga30BgPeZ9us+zyw58e7fYnRzjkmC8EfKeOyzGSoKhm8O9FBm1GTuuLg7GaHDPoQAs11qBqOhl6QvOui3aSUQ4BYi7AXqOkNEwJG6uCWMjNhibMSwDx1gydWGfvfmN57hiiFincdfV3YLFObKTpjAYjDGgqwMs92zjRT2yl7caypQuunJD0UFCRbWgyYn1I09tguMxg3PTZbZDvTu1E49hZjRtlkUXBZlzYkZd5nWy8Ixkqsmo6KyYwGaodiijpXT2mTiXDUQ2TgmhRctq+NTo+n7SIMZy4gUYBzQNpxssikRFgBkNA3X4wO0aaRSKxYLJAYpETo83ptcnICumoGy3Ytk8UIkJEYAGufen6y0X5rQUEGHhG7GyOmQzERKJygkCyw37xPyEkIpEdgFzLor9vdcTkBXdAI4BewHu85xgwh7I8MFad9FhPwjuQu7yOIadJ+v/rfEfWZNjtD1EgSEfTIWKGq6RTuVZgWShOoT/OCB7jm7uyV4fMeR9El9DOUkmaCxBjSwRitKVhUsEKkLCGWmM6jTcYQ0DBFGQlUSFECllkVEEVYwIgiKokWW1JQv/EQomDIjKljCnt39hvM8dSqo/wDf3B5T3aO0gCaVoBjAngIKhtYomowMQsIPhRPtPl+l/WWhUoZUofuxAMjVwLO6fxw3k8PpqQPNIs6A6PO6xekOwQIBA5/OON0ZvgGB9lh/dh9vxPb2RUGJiNqraB5OzxEE/S4Xv7EyDnhnKFpbxYsWS8YGYlETpEwzeAxWcWG19ZoAw2CJEYzm04mprUKKMH++aJs0IoxggvrNk1OPZdsfEjzZye8Yiv5k/N+nRl89W7p/L+ThRhlP8/MvREiK5IypAmYuSZsw5Ji8/lzFv4PjcM5nSCOZ7hw3JpLc34ptpulKTslQ/aXBtHLhjOmtbE/2fWeJ4bUiRqivZC1qU2kSmxUkxCZIxASHYM32BQCg7NyhSwoXFqpAKHk466YdMkDfHNHIIJGKjrLPgaDSboF3fIyclrQjGy1RFOfuxLmp6GvMcXxIZtGDddBMbCM4YBxwbg3XdKFzEEeAEDdbkCgR2mhsgQICyKkIELYQvnh7vDmZzcyfMw1oMwqAXvtGQyIRfGDUFkIM2xtYWd42YMkQpeycA1DUCZt5Mwxx9LoUXLKQEwRZT8OQf4WBdQoHMg/lSsCsKqVi0iUxSQJCoURSEKRWMUHPMwzG5+NfGH3G8DAGBahuDSCVqcdTgIHw8TuFlV3LYr2YkXMRz6PRlpw6+qRq1Gf/TVww5JCBJAkUZeo13m0Bkga0ndgENSKfxKIxWgAFZYdhhDuHZbBR4tH8C4EJCDh5yWCHnC5+rv0AqfSh/fCtYkijDbMSJ9Bw7v0ufziuX0gSJEiB3dXDsVJzfDUcqRvt4IfQdIce5Z4+m+Z3md9GD40ccTitLuLIWWhj7e2OYQSuoQUXVRBJPutimeIdnH59SBFmHYUTHLwVcLXe+WaRXd5uM1oHdMQLSlSmryeWqmnbBc6K5dOzZYbH1BPxiHYcq/QNh9dy4+9eoc306BqfieME7QPnjqACEAPGD/xIKLrCCnL3rpiGgtRWICPw+Pv8CAdLfznsRBfAsNtkPTIWHYohO2ijHK2xLZbSpZ81KZYsUUtu4TEkP0l60CHvYAKKCwD8iHoE0z5D96WiJIGbRIyIPv852BMSAdmIB2D8+oLEorhz3v5RKO9A2qhER+Jh14Hkd0eljy+az9Jh27U335rxShkF7FWTjNFANAD+VYScCWb8w4kFMdZgFlhjS4b+HOjusMXiw3yoOgQNzl2pERwskgLIThaUtC2klt/cLmaFGfrLSaRHMngJCjDrPXIcDvi8qC2M8/WXh1xAWQRkQSCqoEUFJIkSDBCQQ47OJBT+dP9CDQweKc5ZR6FX16iJQvcqbAXgJCRPy0FLARYKxRUQ+iHl5AewpoO4npAs90PMRfQQ3daFgd2JtlEYRMRuR5o2vYpgXIhvOAMDKj+gT1+OZyj+iEy0Q4Ih9hFNLZZ6o7MwB95tYPfoeQzwbNhjAHKuD3gGOtCwdpljCEAPp+PHbR65Ei84L6Avq316yxZhJB5TDAu/OGIngagzVHvt9hATMKxQxkIGzXt7D8DA+zrqRVEVEvSaQ7Q5Zn1nWBma5vZZwyA/sBnmzRru2i3SbzED78/jTOkzBqylQ+lPeOosyj85lJqhkGZaD2FhYhN8FLsBuxDFiyulonyMKEhKD9JFcSkX2D1wgua8UvfpG/nQj8yhIm9rjc7NiECfVzOUmM0oGhBwG1zxLrT4nmP5muX48gOIHKyGzwy1niMQfAHDnjsej5dSsIEIkCQIMBAAgQc+ZT/HpLy+T7af9UE5RDamIGwzYaMiPIPLh504prUh4fU38TjbsNUU1WJUpVZaVahhrWSCvHeII/UNgalL6coKNsKJHCpbWIowqsJVSsUbQrVm2g8AoMmpTYixLrJFSiUK0sGpUtOOzeqITYAgaJECbUKP7sQ5DY+z16YYHZEfTOyK/yXp6ggchGBym6t0WEKkiFe7eDwHjyDiUKAnvUtQ6n5iOZQQIFQfP+ju+cORDPmAxkxpcwkIzv5hRxOmEOv8cWIO05uIoskzKQOBSSlaIvWF9f3ZlodbYCiBTqKCzd5Z4vnDSKhRvDu4mA0zUJmoeDYTNLbAA2DgZ93Je58N+uhTPIcODIWjWIk3m5T67gQeeAhtWCBAGKfNydyoRYGmX42BcRDWoJmC9mbaxjAW5eY1HZdc3HJuSESEHZTnnwW4QWNuj5dbn3rbvvgnVvAE21eijPcVoEOJmIY5rotJCpGxyey2Ix8jX65uNaOWWbrqZ44KPLRAkC7qdv1qkbUQ0/cQF7dwYtKAJAeC4+hxvATsh6IB3+oM6hEeoSxErFpQSkVEgiUQWJSChVQikRiEFqLLBStBJInDrMlmdxyAPaRCnaRpgNIYsGjEfVobyWpBR5vaHWW5xXrRZIytlFcVJwebttmy8dA4dyaGuAGs2GQaodp1FO+HdVGwvXV0PDbQ9J0EBuG5wS1DFA++IqUOBdpRpOBkWjOQPfsfXt5Z0UlGJCmCcZeTaUWFeitluvZpyFfigirDgaqC+kQVyitb4rY3XyUwYMGxECTqWiIMVLguAghWVPqSm+G4aD4JvzpKcgdwZZRJGw45JmrriG5swTQWgybQ3TMDQUpBAQRUjDWrgrqlGujeuBjF1cRkui0EukzgYLHbdJqnQEt0FFwyMBvPMeVDUiiklYSqoxWCAIQIktSxUh1clNUNLe7HcN5zOQVWb8dCUPc8VioNbJogxNowXhCqpAnDWs855RJYNTpDvKoJHnhfJgZ0lICLJNpDoYHUhpOlgTTAkLfvL7zW4KI4i1EoDFcEREAhBsGGkK123+knb3HIOIybPAQEUU/wbN6Ob3oAignlhQ81bUeRTmTfWnSJLI2AOosFssUxkFnEsgXdCGTDCcYgIlYzJLIiGiGEaGqHCBKSU2WA6wpKGUiwBEWLAUFkUFIsQYEFFknCxQjENQtwKBT0NwOYgWMV1VI6ARBLQBDRc6QIS+Pb30EZZENYcyQx/PtCv+xEdxRJAHWoVu59nVyn+BDuHdqJBWTgwCMGazpi9nZxPIlidULFtQWoIi9IwRJIJ6KHrQ7/A+/iHHazAGFYbfFnmIejwPXE83hoohkKxSGzCZjQlEk8sT90xQLg0SDFUIBCARUkEISCwRCFsChsoVYgxaSwpQrGTIno1ozjrWMUS2sERBEBiIIYm5norLgnELYOPUJ6QxVmLmQeo3OvebZHcxvK7aT5EYQynCen+MlGBIEcoHiGvV1GkH4Y3crKJNmTByZLG5ZwDW+BuQI/XGmkmAvODFmTZbpeC7C5S5jkeJeQH6JR81KGRfRoLBq3dMYQOQcKULAfnA4wUv0iB84WQzKQchwADgaDzGKI/uBfT9R1AI7FJGIiMYxkDn1FMPJDs/ut92zpkDRqhjQXCCe7NwLIPygIeYC4QJAIMWITpoUECyqsIFBEQArDv8SyXE0ChHFU/rRygmWTQqFWpS66W90MhS7uIOsi7bPvJ1HNc2HQZGwAuKdexcxCsNG9z3gGiZlE6A8aUMjC/psCsKCQOKGJDQyME1aVDWlAXaQozaEGw66WgkGhgnoa/HnVUbOmTcFJKyiaOuHwAN7nAEKGw6zirAUJ5AEnYRFXqWAjfZEhyHpnr/Cjxlz0FFQqWiFEtGRkqDxfBdRAIiGm454g/jBe8iBYiARGdabvYhFwLhAz1lsT7BZweqHP0yECDyYqPQIPSD4Br6j+T3bZFLwkOk+kuf5nBwTQMqyRyAPifbT8SiGjKe7iSj83IIb0i+qJILXE6ToWRPvoSgV8FAtfWSdMypKpL4fVI+s8qIOoMR8nahdCmIQNj0SsN0bCpFGAstQGwMrVpWKCtTUDOjZYgYBQwLAg9KoPN2jA86OY15gYUBBCVPPd9wMDadQEA9ZiWIBmkftXq7tHY92hO9tjq9eGvX5WdcTJazRgAYxIcEYwQjXSa1KkOpkDKB731ngC8wwGufEX9YtXOlXssiZKSESy9Y6ck938e4s9EkwTQH9QSht+IWC2ht3XF1eWMJuHArIzF+E1fATR1nQhwIlz4oRZI4YwfYxu4HToUMwNttZIIMAQYQQQBSKDAkiKsUjIDJDM5j3ck7MP3Tt05e1P0Zg4o1wY/xdnPFDrJIQrbRbhfF5ycow5N1BdTzU3iaZ82W6zBR8v1Zis/7pVVF1x+64Gl3xRDsPpdBwZIFkWXa1OWQon52WpKi0Mm4WJrg2ubemTzmrFBnYJEkshL/S+XcffDwbDxQiZhVAQGiJZXHFxa9laAQQuo6lgZ0gY9Qw7phAG4fk7sPMYJUw9Aw9lUznhBENA3+tDxXmhZ6uYVvKWP2ghFi96QzsvMGAci1eLUyZjoe5nkEe5icYdOhyPoH65DE2g8qXiUFhZ4wDiTdTY2jYafHiVO4qYwOZKeJ5esFhosfutD7XS+4uymyuaIIWj+MpcpFBiRENmZkgIljdDZJSQSVhWqiMUQZidMwAvoGhwoZImZkgVxCtQ3kDM4u9Sui0isWpcLMuYrLt4ojtxMtXQigYgpCYmDFgMF1KtmUECxusCMVNAe5Sl1vMo0eAhU1yJYRPiMRPmA+IkmgXjqOXr42vrdwmdzMj9aBQ4BJCMiDJEUTDth2HcaknmIEwOAILbl+subjN5Zd20Cn1y3lsd60FcyQpA/D0AeyzaYfWcTizGtj6D3X7G6JDZrND1ETqby8NhJm6ivXf7bUkh6oSCdVvDiFerz0HKdTzFUGN9O+UD2Nk6JCiAwOaK5cByllGiboXpoOMGhFr5VKjUEHh7sxQnqhdNbdo+s3J6W9UiT18Tyog+hDqN9iFLQoIdAmor07ijLXXLB+uFPdDk7EdAioQrBNkZDVy08UNIUaydfdY6a/P+7dGmiUtKNi/XmP9rpytFbJwHMtZ53PUb7AOw2nVOUL7dnidp4hQdyinqCFy6/bTpjdC0wqg7JIkIrTAHMUQvQL5KPzA/sYTsPvyDUp7AImsmyKbAYFioIBJPFTaln5zPKGkBjEQ9gJ+lhydmJ1x6ZOrrLWmh8yAfZu9AdhvvkDUPAO8yffBFWAI3KIwWOq+OZECrcMkKW2BRBJGTQRoSMIdG5IbIamrCsKMIsCJEKggJAEZBFQGg0FJIRRYslCFiWUZUBlARCgDBESRiRhTyPIkQIpDrJOoEH3Sps+TOXI0VQ5YowphSHRRD39peeF1WCTJD5/K7G2mtHyPL9dXBkcjSxz9iPdv2342NDt1vwnHdGjfSEcGG1GjD+HmJESOjG+SwurfbBXl3ZRxIXF22MYla4tmFN3hhGf1CJLOEXyRjImTjtW9hrhUY2L9ZAwrGlymbEhccYJRsNiWCi22wWVwuDzvIowNXYxJoPNX0h2u+Z4O+SHCEMM22Xm7Bs3NGW9iRZuVu4Q6KROZpKxyE4XmWozBhQVk/hDoLHIZdpM5IsUb8GhHmKhKRLs4ge1OkO0JpY4wDwMQJNEu9JzinIjLIgTStC4dom4i3mxaEmLeWMLhx9HhDjCQ2FhgsQNLZ22eazIHvvGKGabDyM6mahToabaAbW1WTqIstM03bZMuJcPdv+C2yGiXAiVRMHkNCw4igzjMFtgQDylAUIseCLwYkw3IoOVMQHx702LXkYz3vSEmJoDahXbZSgl8OjE4Xkt6wiQsNDLwurWacw1VaxFyj/Bu+P9sK4sQIJ1KATEYTN6hqDgW7cjWAkaCZCaQoxQSIJZAxhAtFu49VZaAIIPankXLZ8l7cTGm921tMmo65mAAghpCZfAvi4jPYwmrIexIOJACwd6VAGvJhlNN5gF7uAui+9DFQBHskONXHdkJmLCYlEgLkSJpZuJT3ymGHfLOIk0iNSgqwiwjQECk1opAthgTCLomgMLIwQZArjzNk4GaHZbW7XbbYkpKn2neOTJhe0CaEBPP4UXPDMWUTLYD8NUXepQ2JYxBHTIoXClYOhDGRCYFTR80dRF04hYZEISwngakgiOQpkZcwo8TDWpN46yYzBhjg1oJZamNDVKHA6X5oPnvXOOzbQpfgG6Ih1QGyUEmldH5g6buEwqqDWw06z1+CIcqm5IrmZtAtPJGTuVURWKsfC9Wgl/y7/qcU08B3qb+WJCEzOCIcyQc8pJWxhAgUbg5QSDjvJ3IfcYbMw0dA8GSJ/tDTE7A4j0wMTj56OJrREE0Ow3Z5KBHRriwNHbFhjCMEliSOOHF6qHDRA1IoggkYxgiPAVHMDJ9gmGQpFrKW1gAwkQSIApCCehgeiEDCZIgzDz408TdNjpHW8qBqAxM0XAqoZaJUhhgApAwykkjlDABA7BjIcWdPaYdcaItSb4n5ouLLMd0d+cl+sWyMGWhobdm71TTbKcZtvERUre/KQBamyd4lF4P5QHbLT5ttLPQXe+9QdgqHJmA9zXz1qFrNqBZUwsDFyFMDEhiHIDEaMWP3w7yayZqS2zmwb5qAeWUC2J9sd1igjxTpYofA8EhCy+h8DIyaSJNMP0/DuPHq+Lz9d+g5J3MeorNS0Z1HbGK1SCs3UnJl1QzUBXE7KQHIHbDjqbka+SizfQUgS6EmKWd7AYoM5s9lYDcOzax5eiOCsVo5GuSCDDiDUsJdytEDKWmgQ+PoiLtoNi+/Om7AaQ0qF6MsshtbQgxBUQWLhwqiYIKwgcJ2cnc8ZMWypMN8FJqXqzFnWLWPAyOiMHqO1I0aynaSVvCxudy9/hmpL8MaIy20DGhIuNEYkPZajZqozflVL07MwRMCQxWbRGTJARGNXbyUGU21jBBYvGQcZpEZjotKLEiWLAIFrBggPAPLIuY6vYdXb6iYkSHmBErgGt7V3bZp3BmKCgmYcCGqIEPaDbYBAMkweTFywa64d7Ce7BReMhtwtQ0JmmzhwaJoSIMYxhwOBqgZJwQUZgUiISiG6KcphRA5CHIiScQScMGxfAOFIh0hFBDAoxGSpE8d8PORsbnOcPZxx1IuNwkULOswCwYIlws1IRGMiVcKUGKAtBbTF7MtUzWWaOcCWZq41nJJG7YsZjevVz22DUaRkMlaA0hjiaY2DOWdsYxJTDLKGiIk2ZJTUEpoZ2Qejh6zB9gxNtozBntMq8/C0Ex3oiQjJNMl4WBPmUTiNuVA5Qf5nkp0iWIoyI4hmWLDfjSbuh5Rci6uRFC2EIQ5yBQJvpMEERImBoyCAxYLIqNHQQRTTaoFvMdc58cGmSHGS8bbcJBl1CEJhCUEKAE0i8ogYhB3hyJlkY3fdQWB0TDCEFRxOKO1qleDbJUN4iu4SFwyfn588ZPGIglhFpT7HzsM0UvqtEOEg6GepUxhfIp3MjJ2AbD1d9klabnNU3HOXOVDMin5oI0CVEEogd0WkMlROm2UUtaXKvxurhZULAJs2uBlqQyOF8pSBcM0FqaDYKCGPaeXoFACgUDlvuYyEzX0RmjLhv6N/oZ5qkscqEepBILEp4sWoVkTJUUZjZKSYawKIM1LDDUJR0WlSKNNTrOqfk7/IiyC5KmYuMYvsXzURjIZhZQnIG1iHIKhW6V6UwTVADpiGbDjFVV7jpoIOgOHumLURm37jq0YbOV/LTvyW2Bwyqoqw5kLKHamAdUhT6Sych81ndtZ9U4Jt2dMx4m8EEEG0NkvLk1ZodZ1pmKcbljURSQIBEIgeRZhSu+IJtAgKULc59h7Pb6/HpqoUwkqg7Tt7y811RNje/M1qFVhxBtEQSOXeTJDEsogpg2VQhlJlNyRI6Ddw8mmUeBsvNYgSDSJRtSwj0m1S6+nSblbAIYgRixkB1qxBlizC3/5xIQiY5PueQoNRm5+LCbkONrLziHHmMp1kFzJggZIQz5CmCoMBGKoQrTmRJv/wYQFIoAa4HtE1S44j6h9lwME1gOZMRemIkYgHwIO1AzROwChxCJ/ydc0IRCVVQKKoIUpqV4P6vH3WerrpieEKXD1V5d9ywfHAs2zJIVRerf6btywbX5KetYaS5zo3bD3sLYpICfPuHuhkKR9KYIgYGCBAZuE4cXkwhNxNx1KCEb+D6JmLMJuQZt1/zfd36TEAKqi3/hkmCgIrEZCLBCcKSMTexQsA2ZaQZ3Grd/KQSExFM718qCp0nm42lwufV9AWH3C/aEB6TPsCD5hh7sh3SeECwSMCwUhQZ2BcH5biu6Gk5WGStqO6C503OpELtm2+qiDuhYoLabibXDDb4DIwH9AQL4xD6ywsCyGUUAlvPchZPa+AYMB4GS4Hka8VdjGCYQFhlmBT5sNy2L8ur/d07Ukkl+b8X2iktGDqw4k3ENGG1dgrJbcCLVMYP4EMrez4VrnMfWGs5+8rtQj5pC+Uw+ZGKkSRkNiQKySjO1IixBioSCG/1NQImR5u+4SsgvSeuP5o2fPmEN7PqrhKqPajBUq/0lGJ5yPaZz+64yxGv1UIK1jSzSCCGhLQI6W8EMVDM4NJJnFF5uoyr0QrC7ZuBoHIZpdeBA8rAng8MEE1imWGUNAmSjocprxASwdC5EV1ej00dvWe2y9rG/Ig2LHdZMZ+Z/OwzpFPD6QoyfCaM8Q2AoQtgeR8YnNH0FfWfor2E5nt/tMGFQ775p/ZqHVUv9Mry9f5l/8XckU4UJDz9wv+')))
\ No newline at end of file
diff --git a/examples/example_moss/student_submissions/s1002/Report1Flat_handin_5_of_10.token b/examples/example_moss/student_submissions/s1002/Report1Flat_handin_5_of_10.token
deleted file mode 100644
index 5f90d999ed74c0ece8a336e25e1c66bfa99ef72d..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 65552
zcmZo*naaw*$N&PhQ#5*5OY%z+bEbH+dULf+>0wVvElJGGDV|b0#hU>n%~(Fgo2!ST
zAiuacGbtw(%*jtGNzBYkO_}1&+QXVzl9~%r-osjwS(1}FrH3^<H8tCCN@;NqdvShg
zQF1Cs7GfBCRc1k2W=`r9rz!s!7y`VRSwuk2U|3eH5&WR@-><363=AO5!@$6hk)NAd
zo?n!0s8>*_q@={l<yw)LTac5gP+U@)lA2edker{As;3Z=ky)$&GE*V5SRt{rBtJK?
zBr`cNC#O;&JvA@2D6u3pMIo&yKUbk7BNeQ$SRpeH%*o6vE-5NaF3B&_P01`u1u-gl
zxxjX%q^2nprIw`@6{p7MWEPib<W_<xO)CXnE(HYz1+XFz!#%SsHBTW?0VJ!S4pF79
zP?TCyT9j7|6Hm_1E6yw~$;?Yv$WH@XU7VPks*swKnwy$e0(KA7GKKu2l++?U1y{Xv
zJ%~+E35YAA4RwrkjAJzwiZk*{b5fx8C`23U80i?sDrh9atki_+hPxBuG6h=&C__uZ
z&;Z2(m=9rsAP+zl>p|V1VQioYkycg+@ptjJQZQ7=$;?YFR>;jPF3!w@J2^44I90(f
zzr+(1Um!20rnnXr<rirv!9^6(O7oISGV}8klJZk3l{9&|c)37<o|uxNk*JfTX$7$e
z5|9ds+DQ<;l9G}FB*;t3^A+++bCXhwiWL$P6BH8jQWO%B5)?|n=>cXqG@Obva|?1R
zVZl|Bk(ybgP+Xb|wZu*VW~+iN$SOqa;`gVrLJ^rh%}i5>kIzfYO^uINu(efCijU7t
z%*>0ASAx1oSs|b(KPe|QSHaLqA-pKFBvm015n|;TnaLR-H!C0o0wjD2iZb&`G}4qJ
z^Gk~qic*V9b4ox-&PYL9!AQYYp&H~-BON2nT2P3C(l1Oy5IC`eQfQ(=ac*Kx4md?C
z>7eF<Xd@kC9aA0iSWQh{E=2ZCO;ifL{4t|8f|-E<g!vd47>ZI0@{39g({d6^1|kE4
zb9`}8vR-LkW=VQcVoItJ5>p{F7vwsHAh08Oxv;2)DM>9$%qdMQNsWhiC>~n+K=r^2
zDVTC-Rsm;M9Z($cazX6^Iiw`DxCE5alXDV_ixt4-qy|h}FC?|N#5u7z6_)lv*#V>>
z9u#TCsX1vd2~fO&_<D)O#i>Olu7#zEIT|2EpqSNBFo9-LoXT_!4GeS?Of_{BbS+K6
zIS-^1ZXMJM8Xzn1S_xGM_NxZ0Xwrd|Mqq>CzJ~`CFBin~kf1ko%SkNJfUse9fvXV(
zTLmTOU<E@1Lue!^7%D-McwuR3F{t1uR<Kow)&Pg0j)I|qW~_pOvVvz`a!zRqD7S#h
zqnuO)m}-Tz{2~QI1BK+G)RfGUVrcPLkeHku4~ZYJad210f?|nqE)C5~&d&uEa0(^)
z3a~<^G*1DPnJP;%z}X2@B*Wqup1olLdZ2u-QI=YilwX`#QfX@hjXNBv4jNLBP(#gw
zXS3vk7nw253H-*u0K%Y(6_RAZc`zQF2L>W1LV_1mRu@z%Bo-^=6+rV&Nn%oIPGU(a
zEbGAdQ0bJ!lGKvST(~rh4^L7Bm1&vjIjJRZ0a&2&aw$V<e2@Ux-`MiLZ)I?4W=SeI
zq9LV0W?peYYBIvS{9?G#iACuJiABY!aDn1Vge1t7aEX$PqSV9`P|PbUq~zzRm%zLi
z0+vunO4b9F$hnz$nQ4^@nZ?DWsd@;_g(<lTFnuZc5MPvl1fih_W+$a4CzckcB8<@m
z8w2tQ*pWq`Y7FXNJ;$Q-QcwyF06D)%BPF#sxhS&$l!0v3U7=;0LM5cS0F{Y)>N*Ok
z1(`Yd>9$HrO3*eJsM!;euTWH)rvR!NK&2A6)sm<HNn#**UM@R@g36MN{5*xk;^NHo
zJdmx1@hJs*1(hJDLG|b7<y0barIA8@5fV?&5Tp{fISRUk3P$)W0xN)+;+J2N3TX{M
zd|a%MlAl_vke6Sg08SGqo>mCS#}w63C@oI4LU9qqyN2-G1d?>i%mXzybwEagY)mXs
z$V@{v9n>-{NGt-^#EA;I`6;D2sR|mPvL`V;RZ|DtbOAL^A%-hJoU2fjT3DJ{lv=C+
z(^`^|SfT*cr2}q7>gFosgQF5$x<La!H?dM7DHY`Ow9*_sUM{!%A_Y)OH!&|cRR`oU
zB&%TU=FB_=m;7XKIw{sq&MyTud!aVzLtJGXpPUbB&6T9;6;wi;oPeq@0p!g@SQ3Eh
z2D>v)Avq&4FFjQO-pU3Qm+A-`A+5Kf(md3_*3DHwwL%Z#7H}ddPEA$FC@Co@w$j&6
z$xklUgLq#rzbIYbSkF?w6jTA|C+DVsTBv#%CAm4^ro9d*sB#laN>YpB!4;7$ENklp
zC6<SzR+M<8<`lT)7eUl$@^V44lwM*=N_-+TFKMXj7OLwg<RuoR7u%}atLrF~R2HP#
z7MB$1D5RvOC6?xt*!tz?rRpeTq~;XZs{4b|Jgi8Eq)B+aq>-wZu4e^Kx0>oWt<x>e
z$S+T=02NQEDe5{33W?yxv#nBbNq$jkd`VGhs*;WZ)Vkn|{Bm&mfN9WANiEJSN(J>7
zKrKQ7)_@|qw1fm}67!17Q;Q%e9@HsQfSOQ@$D-1_+|rU%qI`mA#zGpadU|@AAS-ec
z^HRX25XeqERuv=`7boWA5VFe=rSAyRgedFu6hezr(@Jv`$}>{)6jD-?O4HLp{T-04
zkbVm+cF~%N8b#n1rVhM}gQkl@P_G%vh6Dwa1F|<UCkM*QOwR*FFSL6V56Z5#ZizX?
zsXCw@V0nB=eolO9Q4vH8)_ww|N(Ea`u~D2_qz6vEpp;vz0c~4kromkU%Cew@3NC^`
z`t%AxLZC7dBn)k?fLe#}^lGaBQ3q*^fuu6i6qNLoK%HusA|!nv1u$V91+ce4?KV&^
zrA!l)7Zu8ob?Oxt<Ybm;DCsF_#v*J;%>kFgAhTc?W~PFz0>~^F7u@IssmV-J$Ve<s
zEGa31M}ZPFS*FB85-d14l{CSA2l+U^Sg#<lBttK=7!=M>ZF*>$iov=Nny|zWlJ6n?
zL)VJrRB$n^p=753?g(2cgk+>D6cnZE!i-mdxCuN!p`@b#b4y}UG008$9iyY51h3js
zD>92q^c0*kQj@bGITBhDL+XH>oJ3I759<9vf;Tfw0h0be@s1YfPzh*^LwImq(1eOb
z8%zeO56T7Al%R-#<mO@>g_6XioYeS~#F9h>TLrZ21NARbwt+=3G~pK%<);^=78l1S
zB^KF&A`jv^XbQ6hr!yS|NV_@}l09@3pf0h6(omydg(RpVDAq$RXQ2vUQG`$c6VZX#
zY73!sAYlXYBw-A)2cCVAIp7owF$qgXMM_(c!cZxoD8DSTI5R&lF$WfknfZC32!=TV
z)~?n-ggCS$0I2{AD%c`L2gGua9K;G#{h(e4NDhP{@=6LI+aS8qKy6QGJ6bP2wIsi^
zB(*55C^0v+SOX@UTv}9=npXlA)zH+8HjLE+WjN4q2*i+d5Ldw#o(Yl?i&H_e8fitE
z(N?;~u?pG>O7JEav|E^&23HTx1H~F(V_=0Ml5@cgLuiW^R2>#8WF(fQf?971m8m5P
zNvWxM3Pq{unZ+fkMX4!z3Nd-0rYlqclBeK_xF9Dru{agnFa|ZNKn}M8g$Bqv5Qc`3
zot>SMjsnC%5I-VGdO}7c!9#+%iFtXcMWAj{WqzqbQ6fkRI=-m~G8d7Hz~ggJcYs78
z)lexYw`&x_e66gIp<t^}m06$>t&th6UalUiqmUV`4jasca$&={>ama#ITKtW>w!84
zsl^(avC!0#p<qjiDG+~y+>=+Jmsp%wRFqh$kpVRuI?k67ZKY!ntD^v-4WYDAtPaS3
z;KrIlC~Pzb)KUv71qBxJ07^v(Xb=S=4hsX&xJG<@W?p7Vd^~teLq|aiRE6m%XlZ4a
zgIF+?pg1WmEl4fW(A0zLKv#=!OK@soX=+|cW?~M=QlI?9l++?*#}t=9#9+pQ9Fm?2
zb|Gk(#}Aw-K!Yqg3ZM=ZNX!{DE(B8#at=rWJWvQ4o`AUx!w`@vgmy?kgLEr{4Nguh
zPL0n^Ey>7F0ht0Csn$Tzp%)*Yl9^l*AFr34T3M`toWpZKI--%PV$d*(Gbnwanvh$R
zuYv4tknNdi;O=b_IOa5*bre9|aga8QkuH#G7zW!2cB3<fyA-q)a*7e&1DS>HIW%cV
z*y$DL7nNvar&ijcYthThOG&MOCPI)Cpa~JA4x$$n-=LTySVMs-Pgwl}VMFT~SoMQe
z8$nud@Y)BtSqH0MpgJMd3zP%V2I^PDr{yH3+lCaCf?9)_IjMOiP$h^E0{IAr!Icb3
zy$RNeM=?t45=ZTpl$jo%kqS!sV3&Z>0K~++{Bi|b1=ygCUS57VQu`C33#md&EKbhM
zj8B4;fVK*-;T=85C{KJExKE~`1S$gDK?Ax<puSvQiLFvfets^faD@3Z2{d>Zlc%JY
zm7kfXp%9$|ZfE9zQZ2F_khUhMdswWY3F;W<q~>Yl=oOa~Wfo{?YAV<%7{n?-lLlG~
z6l?>?A>fe&Xbl7@>ytp0lR}x2g0@0@JZJ(bGe0jr9%@WVNj%8-ymSRyg}nT7kX>n@
z(IX8d)f9czTz%C@1yv6#RbMOBV3>y>rYZ%OBo>vVrdTO}42By6H5QafAsr1p@Zc#V
z2Cy}Op$>w!dZButf}o}xs3`?Xyhzbfte|bHpag15fm#`0`%(2lY=gQJI-~>|{{p$R
zSVuug12k5ps|!l9;D~?>Srlt3fx;Y|DnU}<)T{ssX9Xpg-<1_0rlu)@OVSi*Be@tn
zE@q_wo}B=XS-~<4v}F%zr0Xas#lRav;ARf2wFxWG@_ZC*6)d3hV4$c04bs>ufMP@s
zM8HyPadLi9Drowo7UI_&a9OWltAMo%0Jq>kX%SRb=IJPC6zV9HYl2c=YF=qBct#T1
zzSV=ZYKuYn2BZaql@$sVY!wP&mP3W&Gcr?BQu7pS6~HA0#32}Rpn*VWfm^5-4;kTz
zkJnM~0BeRO7mzNrwk0gyA)O&@Lj^@!cqb7lEr4_;=jWAV=9Q)*Tu=-eM^&&@fCP&k
zhyvA!#coCUxgZ9pYSJh~vb+$SN<p54hd?}72$BzB9k)Uq1$9^mLFCmnAt?mpH_)sH
zs8tvrk8nvLL|HsI*?>xcK<H$Ff@-Fff@-mnsz#o+p^gH?0Z1+aYtTT^uA`8emtqS~
ziy*HT>cLu03bqQ+WCIb0HKEYN<H3nWL0Q2)u_Pn4NCA?Nz|+r}#R}kx5jqnAGDaD>
zhD3NuS)nk#JhLPtKEJf2xFj(TG`I|I&wxA9C8@daKm=zm(8vNPu@&lpSjC`B28vw}
z2d+>rBe6IhG)bPC0yZfgsfG^)H?6=^hk7Uh0*Wt`@KsjuNKDSIM7R`LD>!2#S2qf_
zkg5ws3~B^YARwConcoGKm7rP}6ht5l8WXiu0ILI~E=X$+c@70MX$flBgTvPrtS|`d
zA5FcY(mV}ta)oD7kcmjKT9jI>2deywgG%!d9z%*=P$dCUR9u>zoLXF*T8v^6WJXQ_
zQ;~wU0$el|G#6g132M!x=4pToOH0hmDJ@DZ)&$K4g9H#xKsZ8K0m+@9L67oc1qZko
zQeswCKyoi!AxsRP!raQD{L;J>4Ui^{as@58L7EEsaGMk~HNn*-+%<Lz29RuNfE-OQ
z`=BE<$fhZ1DH!S*pcn~CrdSOG#SaLBvrcqgEGS2*m#bSTl<O!UIx-M0%u01DxWjc6
z)Ilk~SlvpYFkVMN9bC+SIA8{}JO`Oys0Y&x>UlyJxF7-_CF{c+itOEDLj_xfG$k!9
zEd_X?Q&^p+ZCDF!9)K(<22H}JDJfJVY^&9;E=N`ZDT#^=6|@yV!(dtp8hJjtp!8I1
zs0pEsG!-;KiKo~I);a+h4bcbbi-Y(ejHvYV5(^4a^HMaT)0EI%r=yUjgy9}gpAX{s
z@?sr$%<I5|Rl!yP($xe<3p7c=f(07m3c1Clxf(D*O_*bmf*F*|AgW-3nhKf<$_mbj
z#U-FA0?3d)Xn+sm7HGQzW+Z5k6S^!3MIL4tMnvLnlfqk6puz^VVTRNmgV>T%0`(xM
zi2!XU=t5f$(2&T@%quNP1vSf3O7!*3pjAb2YH~hk$l6vRr9?qj0jfv~CS8zIlmn_o
z6LXVN5*0Fa6pF1Bic5+#GC`581a5d0gHuH@xaE`ys-q1d84p}bL0kt(2Wd*q(CHdb
zlTlj%;XiE!B?S#o(+p&t2Gk8Y3Q7=`64)*s1to0-usqbsItoe<7D!%66VyI~*oGyA
zDTRR6lPT#aC@E=!oDYpOSfprbE9s+1z+zKV0hH)K$rd`Q0nX_qAj8zH6f|J^5vfsA
zM?oFBT20*wQnf<!Gqe*2H3xa9k(Ubw!Am}1LtC&pS{R?$DQM`B7JU9Tt2jRo&Ow?!
zPO3733m0T2XXhX$l0m8<V>d}v<)D>58X!YJ-2@$llKkw{JWVSFWl&~FPc2bM1Q*W=
z`AKP|#mV52TyPgV724|swGtH4Q%k_Z-bqzPItuFf1*v)Jni^n}bQF}zOF&KkVuduM
zMqQd7s=eR}4b<gL2RB+^>mxKWa|>Y2)S^`A%05sWK?6M(lq+%zAn8IG+!V<LwL?H7
zQZO^1wj$c~pyIMRR}Z!r3cf5U4YX2CFCIMD4r|~kE2My$zp$b4l*}Sf^G_oUn&&`)
zR1gocEioO`SVvbE4|PO*yavKTNFPu`T~A#z+8`D*>;oFYgZJ0a%><=qBFzB}+k?%4
z1PD@RELTTC9p*E2#7qLL)eDh^Xjj*?0<UTTuTKE=sS+WpOdtyxtrS2W0k?AE<KbZl
zYC@>zf+v~P!OeMae*qfupzKwWk1v=&MxulPNDIU`XaFkMDufil+W(*q8&0!H3M##L
zke{OskeZ_C)`EQk%D^Bup~np^;v3yeq@aVQI_SC#=(<)&Tr0zhlj4%1)I^vVREb_x
zW`SEKr~m+Y0;)YTAEpW%^f{T?sqy(qS*gk3swQ90sj?)s*wbGlw=%vevjE(Uh1w6|
zCY7e8rGf|E5h|h5;1U7NW(|ZM9R>ArP!cQ#jS(Y7qcVsOEf%0Afm{pf&=%$Am*{|I
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
Bwrl_Z

diff --git a/examples/example_moss/student_submissions/s1002/Report1Flat_handin_5_of_10_0/report1flat.py b/examples/example_moss/student_submissions/s1002/Report1Flat_handin_5_of_10_0/report1flat.py
deleted file mode 100644
index e80df4b..0000000
--- a/examples/example_moss/student_submissions/s1002/Report1Flat_handin_5_of_10_0/report1flat.py
+++ /dev/null
@@ -1,27 +0,0 @@
-"""
-Example student code. This file is automatically generated from the files in the instructor-directory
-"""
-from src.unitgrade.framework import Report
-from src.unitgrade import evaluate_report_student
-from homework1 import reverse_list, add
-import unittest
-
-class Week1(unittest.TestCase):
-    def test_add(self):
-        self.assertEqual(add(2,2), 4)
-        self.assertEqual(add(-100, 5), -95)
-
-    def test_reverse(self):
-        self.assertEqual(reverse_list([1,2,3]), [3,2,1])
-
-
-import homework1
-class Report1Flat(Report):
-    title = "CS 101 Report 1"
-    questions = [(Week1, 10)]  # Include a single question for 10 credits.
-    pack_imports = [homework1]
-
-if __name__ == "__main__":
-    # Uncomment to simply run everything as a unittest:
-    # unittest.main(verbosity=2)
-    evaluate_report_student(Report1Flat())
diff --git a/examples/example_moss/student_submissions/s1002/Report1Flat_handin_5_of_10_0/report1flat_grade.py b/examples/example_moss/student_submissions/s1002/Report1Flat_handin_5_of_10_0/report1flat_grade.py
deleted file mode 100644
index 7d2b47d..0000000
--- a/examples/example_moss/student_submissions/s1002/Report1Flat_handin_5_of_10_0/report1flat_grade.py
+++ /dev/null
@@ -1,351 +0,0 @@
-"""
-Example student code. This file is automatically generated from the files in the instructor-directory
-"""
-import numpy as np
-from tabulate import tabulate
-from datetime import datetime
-import pyfiglet
-import unittest
-# from unitgrade.unitgrade import MySuite
-
-import inspect
-import os
-import argparse
-import sys
-import time
-import threading # don't import Thread bc. of minify issue.
-import tqdm # don't do from tqdm import tqdm because of minify-issue
-
-parser = argparse.ArgumentParser(description='Evaluate your report.', epilog="""Example: 
-To run all tests in a report: 
-
-> python assignment1_dp.py
-
-To run only question 2 or question 2.1
-
-> python assignment1_dp.py -q 2
-> python assignment1_dp.py -q 2.1
-
-Note this scripts does not grade your report. To grade your report, use:
-
-> python report1_grade.py
-
-Finally, note that if your report is part of a module (package), and the report script requires part of that package, the -m option for python may be useful.
-For instance, if the report file is in Documents/course_package/report3_complete.py, and `course_package` is a python package, then change directory to 'Documents/` and run:
-
-> python -m course_package.report1
-
-see https://docs.python.org/3.9/using/cmdline.html
-""", formatter_class=argparse.RawTextHelpFormatter)
-parser.add_argument('-q', nargs='?', type=str, default=None, help='Only evaluate this question (e.g.: -q 2)')
-parser.add_argument('--showexpected',  action="store_true",  help='Show the expected/desired result')
-parser.add_argument('--showcomputed',  action="store_true",  help='Show the answer your code computes')
-parser.add_argument('--unmute',  action="store_true",  help='Show result of print(...) commands in code')
-parser.add_argument('--passall',  action="store_true",  help='Automatically pass all tests. Useful when debugging.')
-
-def evaluate_report_student(report, question=None, qitem=None, unmute=None, passall=None, ignore_missing_file=False, show_tol_err=False):
-    args = parser.parse_args()
-    if question is None and args.q is not None:
-        question = args.q
-        if "." in question:
-            question, qitem = [int(v) for v in question.split(".")]
-        else:
-            question = int(question)
-
-    if hasattr(report, "computed_answer_file") and not os.path.isfile(report.computed_answers_file) and not ignore_missing_file:
-        raise Exception("> Error: The pre-computed answer file", os.path.abspath(report.computed_answers_file), "does not exist. Check your package installation")
-
-    if unmute is None:
-        unmute = args.unmute
-    if passall is None:
-        passall = args.passall
-
-    results, table_data = evaluate_report(report, question=question, show_progress_bar=not unmute, qitem=qitem, verbose=False, passall=passall, show_expected=args.showexpected, show_computed=args.showcomputed,unmute=unmute,
-                                          show_tol_err=show_tol_err)
-
-
-    if question is None:
-        print("Provisional evaluation")
-        tabulate(table_data)
-        table = table_data
-        print(tabulate(table))
-        print(" ")
-
-    fr = inspect.getouterframes(inspect.currentframe())[1].filename
-    gfile = os.path.basename(fr)[:-3] + "_grade.py"
-    if os.path.exists(gfile):
-        print("Note your results have not yet been registered. \nTo register your results, please run the file:")
-        print(">>>", gfile)
-        print("In the same manner as you ran this file.")
-
-
-    return results
-
-
-def upack(q):
-    # h = zip([(i['w'], i['possible'], i['obtained']) for i in q.values()])
-    h =[(i['w'], i['possible'], i['obtained']) for i in q.values()]
-    h = np.asarray(h)
-    return h[:,0], h[:,1], h[:,2],
-
-class UnitgradeTextRunner(unittest.TextTestRunner):
-    def __init__(self, *args, **kwargs):
-        super().__init__(*args, **kwargs)
-
-class SequentialTestLoader(unittest.TestLoader):
-    def getTestCaseNames(self, testCaseClass):
-        test_names = super().getTestCaseNames(testCaseClass)
-        # testcase_methods = list(testCaseClass.__dict__.keys())
-        ls = []
-        for C in testCaseClass.mro():
-            if issubclass(C, unittest.TestCase):
-                ls = list(C.__dict__.keys()) + ls
-        testcase_methods = ls
-        test_names.sort(key=testcase_methods.index)
-        return test_names
-
-def evaluate_report(report, question=None, qitem=None, passall=False, verbose=False,  show_expected=False, show_computed=False,unmute=False, show_help_flag=True, silent=False,
-                    show_progress_bar=True,
-                    show_tol_err=False,
-                    big_header=True):
-
-    now = datetime.now()
-    if big_header:
-        ascii_banner = pyfiglet.figlet_format("UnitGrade", font="doom")
-        b = "\n".join( [l for l in ascii_banner.splitlines() if len(l.strip()) > 0] )
-    else:
-        b = "Unitgrade"
-    print(b + " v" + __version__)
-    dt_string = now.strftime("%d/%m/%Y %H:%M:%S")
-    print("Started: " + dt_string)
-    s = report.title
-    if hasattr(report, "version") and report.version is not None:
-        s += " version " + report.version
-    print("Evaluating " + s, "(use --help for options)" if show_help_flag else "")
-    # print(f"Loaded answers from: ", report.computed_answers_file, "\n")
-    table_data = []
-    nL = 80
-    t_start = time.time()
-    score = {}
-    loader = SequentialTestLoader()
-
-    for n, (q, w) in enumerate(report.questions):
-        # q = q()
-        # q_hidden = False
-        # q_hidden = issubclass(q.__class__, Hidden)
-        if question is not None and n+1 != question:
-            continue
-        suite = loader.loadTestsFromTestCase(q)
-        qtitle = q.question_title() if hasattr(q, 'question_title') else q.__qualname__
-        q_title_print = "Question %i: %s"%(n+1, qtitle)
-        print(q_title_print, end="")
-        q.possible = 0
-        q.obtained = 0
-        q_ = {} # Gather score in this class.
-        # unittest.Te
-        # q_with_outstanding_init = [item.question for item in q.items if not item.question.has_called_init_]
-        UTextResult.q_title_print = q_title_print # Hacky
-        UTextResult.show_progress_bar = show_progress_bar # Hacky.
-        UTextResult.number = n
-
-        res = UTextTestRunner(verbosity=2, resultclass=UTextResult).run(suite)
-
-        possible = res.testsRun
-        obtained = len(res.successes)
-
-        assert len(res.successes) +  len(res.errors) + len(res.failures) == res.testsRun
-
-        # possible = int(ws @ possible)
-        # obtained = int(ws @ obtained)
-        # obtained = int(myround(int((w * obtained) / possible ))) if possible > 0 else 0
-
-        obtained = int(w * obtained * 1.0 / possible ) if possible > 0 else 0
-        score[n] = {'w': w, 'possible': w, 'obtained': obtained, 'items': q_, 'title': qtitle}
-        q.obtained = obtained
-        q.possible = possible
-
-        s1 = f"*** Question q{n+1}"
-        s2 = f" {q.obtained}/{w}"
-        print(s1 + ("."* (nL-len(s1)-len(s2) )) + s2 )
-        print(" ")
-        table_data.append([f"Question q{n+1}", f"{q.obtained}/{w}"])
-
-    ws, possible, obtained = upack(score)
-    possible = int( msum(possible) )
-    obtained = int( msum(obtained) ) # Cast to python int
-    report.possible = possible
-    report.obtained = obtained
-    now = datetime.now()
-    dt_string = now.strftime("%H:%M:%S")
-
-    dt = int(time.time()-t_start)
-    minutes = dt//60
-    seconds = dt - minutes*60
-    plrl = lambda i, s: str(i) + " " + s + ("s" if i != 1 else "")
-
-    print(f"Completed: "+ dt_string + " (" + plrl(minutes, "minute") + ", "+ plrl(seconds, "second") +")")
-
-    table_data.append(["Total", ""+str(report.obtained)+"/"+str(report.possible) ])
-    results = {'total': (obtained, possible), 'details': score}
-    return results, table_data
-
-
-
-
-from tabulate import tabulate
-from datetime import datetime
-import inspect
-import json
-import os
-import bz2
-import pickle
-import os
-
-def bzwrite(json_str, token): # to get around obfuscation issues
-    with getattr(bz2, 'open')(token, "wt") as f:
-        f.write(json_str)
-
-def gather_imports(imp):
-    resources = {}
-    m = imp
-    # for m in pack_imports:
-    # print(f"*** {m.__name__}")
-    f = m.__file__
-    # dn = os.path.dirname(f)
-    # top_package = os.path.dirname(__import__(m.__name__.split('.')[0]).__file__)
-    # top_package = str(__import__(m.__name__.split('.')[0]).__path__)
-
-    if hasattr(m, '__file__') and not hasattr(m, '__path__'):  # Importing a simple file: m.__class__.__name__ == 'module' and False:
-        top_package = os.path.dirname(m.__file__)
-        module_import = True
-    else:
-        top_package = __import__(m.__name__.split('.')[0]).__path__._path[0]
-        module_import = False
-
-    # top_package = os.path.dirname(__import__(m.__name__.split('.')[0]).__file__)
-    # top_package = os.path.dirname(top_package)
-    import zipfile
-    # import strea
-    # zipfile.ZipFile
-    import io
-    # file_like_object = io.BytesIO(my_zip_data)
-    zip_buffer = io.BytesIO()
-    with zipfile.ZipFile(zip_buffer, 'w') as zip:
-        # zip.write()
-        for root, dirs, files in os.walk(top_package):
-            for file in files:
-                if file.endswith(".py"):
-                    fpath = os.path.join(root, file)
-                    v = os.path.relpath(os.path.join(root, file), os.path.dirname(top_package) if not module_import else top_package)
-                    zip.write(fpath, v)
-
-    resources['zipfile'] = zip_buffer.getvalue()
-    resources['top_package'] = top_package
-    resources['module_import'] = module_import
-    return resources, top_package
-
-    if f.endswith("__init__.py"):
-        for root, dirs, files in os.walk(os.path.dirname(f)):
-            for file in files:
-                if file.endswith(".py"):
-                    # print(file)
-                    # print()
-                    v = os.path.relpath(os.path.join(root, file), top_package)
-                    with open(os.path.join(root, file), 'r') as ff:
-                        resources[v] = ff.read()
-    else:
-        v = os.path.relpath(f, top_package)
-        with open(f, 'r') as ff:
-            resources[v] = ff.read()
-    return resources
-
-import argparse
-parser = argparse.ArgumentParser(description='Evaluate your report.', epilog="""Use this script to get the score of your report. Example:
-
-> python report1_grade.py
-
-Finally, note that if your report is part of a module (package), and the report script requires part of that package, the -m option for python may be useful.
-For instance, if the report file is in Documents/course_package/report3_complete.py, and `course_package` is a python package, then change directory to 'Documents/` and run:
-
-> python -m course_package.report1
-
-see https://docs.python.org/3.9/using/cmdline.html
-""", formatter_class=argparse.RawTextHelpFormatter)
-parser.add_argument('--noprogress',  action="store_true",  help='Disable progress bars')
-parser.add_argument('--autolab',  action="store_true",  help='Show Autolab results')
-
-def gather_upload_to_campusnet(report, output_dir=None):
-    n = report.nL
-    args = parser.parse_args()
-    results, table_data = evaluate_report(report, show_help_flag=False, show_expected=False, show_computed=False, silent=True,
-                                          show_progress_bar=not args.noprogress,
-                                          big_header=not args.autolab)
-    print(" ")
-    print("="*n)
-    print("Final evaluation")
-    print(tabulate(table_data))
-    # also load the source code of missing files...
-
-    sources = {}
-
-    if not args.autolab:
-        if len(report.individual_imports) > 0:
-            print("By uploading the .token file, you verify the files:")
-            for m in report.individual_imports:
-                print(">", m.__file__)
-            print("Are created/modified individually by you in agreement with DTUs exam rules")
-            report.pack_imports += report.individual_imports
-
-        if len(report.pack_imports) > 0:
-            print("Including files in upload...")
-            for k, m in enumerate(report.pack_imports):
-                nimp, top_package = gather_imports(m)
-                _, report_relative_location, module_import = report._import_base_relative()
-
-                # report_relative_location = os.path.relpath(inspect.getfile(report.__class__), top_package)
-                nimp['report_relative_location'] = report_relative_location
-                nimp['report_module_specification'] = module_import
-                nimp['name'] = m.__name__
-                sources[k] = nimp
-                # if len([k for k in nimp if k not in sources]) > 0:
-                print(f"*** {m.__name__}")
-                # sources = {**sources, **nimp}
-    results['sources'] = sources
-
-    if output_dir is None:
-        output_dir = os.getcwd()
-
-    payload_out_base = report.__class__.__name__ + "_handin"
-
-    obtain, possible = results['total']
-    vstring = "_v"+report.version if report.version is not None else ""
-
-    token = "%s_%i_of_%i%s.token"%(payload_out_base, obtain, possible,vstring)
-    token = os.path.join(output_dir, token)
-    with open(token, 'wb') as f:
-        pickle.dump(results, f)
-
-    if not args.autolab:
-        print(" ")
-        print("To get credit for your results, please upload the single file: ")
-        print(">", token)
-        print("To campusnet without any modifications.")
-
-        # print("Now time for some autolab fun")
-
-def source_instantiate(name, report1_source, payload):
-    eval("exec")(report1_source, globals())
-    pl = pickle.loads(bytes.fromhex(payload))
-    report = eval(name)(payload=pl, strict=True)
-    # report.set_payload(pl)
-    return report
-
-
-
-report1_source = 'import os\n\n# DONT\'t import stuff here since install script requires __version__\n\ndef cache_write(object, file_name, verbose=True):\n    import compress_pickle\n    dn = os.path.dirname(file_name)\n    if not os.path.exists(dn):\n        os.mkdir(dn)\n    if verbose: print("Writing cache...", file_name)\n    with open(file_name, \'wb\', ) as f:\n        compress_pickle.dump(object, f, compression="lzma")\n    if verbose: print("Done!")\n\n\ndef cache_exists(file_name):\n    # file_name = cn_(file_name) if cache_prefix else file_name\n    return os.path.exists(file_name)\n\n\ndef cache_read(file_name):\n    import compress_pickle # Import here because if you import in top the __version__ tag will fail.\n    # file_name = cn_(file_name) if cache_prefix else file_name\n    if os.path.exists(file_name):\n        try:\n            with open(file_name, \'rb\') as f:\n                return compress_pickle.load(f, compression="lzma")\n        except Exception as e:\n            print("Tried to load a bad pickle file at", file_name)\n            print("If the file appears to be automatically generated, you can try to delete it, otherwise download a new version")\n            print(e)\n            # return pickle.load(f)\n    else:\n        return None\n\n\n\n"""\ngit add . && git commit -m "Options" && git push &&  pip install git+ssh://git@gitlab.compute.dtu.dk/tuhe/unitgrade_v1.git --upgrade\n\n"""\n# from . import cache_read\nimport unittest\nimport numpy as np\nimport sys\nimport collections\nimport re\nimport threading\nimport tqdm\nimport time\nimport pickle\nimport os\nfrom io import StringIO\nfrom unittest.runner import _WritelnDecorator\nimport inspect\n\nmyround = lambda x: np.round(x)  # required.\nmsum = lambda x: sum(x)\nmfloor = lambda x: np.floor(x)\n\ndef setup_dir_by_class(C,base_dir):\n    name = C.__class__.__name__\n    # base_dir = os.path.join(base_dir, name)\n    # if not os.path.isdir(base_dir):\n    #     os.makedirs(base_dir)\n    return base_dir, name\n\nclass Hidden:\n    def hide(self):\n        return True\n\nclass Logger(object):\n    def __init__(self, buffer):\n        self.terminal = sys.stdout\n        self.log = buffer\n\n    def write(self, message):\n        self.terminal.write(message)\n        self.log.write(message)\n\n    def flush(self):\n        # this flush method is needed for python 3 compatibility.\n        pass\n\nclass Capturing(list):\n    def __init__(self, *args, stdout=None, unmute=False, **kwargs):\n        self._stdout = stdout\n        self.unmute = unmute\n        super().__init__(*args, **kwargs)\n\n    def __enter__(self, capture_errors=True): # don\'t put arguments here.\n        self._stdout = sys.stdout if self._stdout == None else self._stdout\n        self._stringio = StringIO()\n        if self.unmute:\n            sys.stdout = Logger(self._stringio)\n        else:\n            sys.stdout = self._stringio\n\n        if capture_errors:\n            self._sterr = sys.stderr\n            sys.sterr = StringIO() # memory hole it\n        self.capture_errors = capture_errors\n        return self\n\n    def __exit__(self, *args):\n        self.extend(self._stringio.getvalue().splitlines())\n        del self._stringio    # free up some memory\n        sys.stdout = self._stdout\n        if self.capture_errors:\n            sys.sterr = self._sterr\n\nclass Capturing2(Capturing):\n    def __exit__(self, *args):\n        lines = self._stringio.getvalue().splitlines()\n        txt = "\\n".join(lines)\n        numbers = extract_numbers(txt)\n        self.extend(lines)\n        del self._stringio    # free up some memory\n        sys.stdout = self._stdout\n        if self.capture_errors:\n            sys.sterr = self._sterr\n\n        self.output = txt\n        self.numbers = numbers\n\n\nclass QItem(unittest.TestCase):\n    title = None\n    testfun = None\n    tol = 0\n    estimated_time = 0.42\n    _precomputed_payload = None\n    _computed_answer = None # Internal helper to later get results.\n    weight = 1 # the weight of the question.\n\n    def __init__(self, question=None, *args, **kwargs):\n        if self.tol > 0 and self.testfun is None:\n            self.testfun = self.assertL2Relative\n        elif self.testfun is None:\n            self.testfun = self.assertEqual\n\n        self.name = self.__class__.__name__\n        # self._correct_answer_payload = correct_answer_payload\n        self.question = question\n\n        super().__init__(*args, **kwargs)\n        if self.title is None:\n            self.title = self.name\n\n    def _safe_get_title(self):\n        if self._precomputed_title is not None:\n            return self._precomputed_title\n        return self.title\n\n    def assertNorm(self, computed, expected, tol=None):\n        if tol == None:\n            tol = self.tol\n        diff = np.abs( (np.asarray(computed).flat- np.asarray(expected)).flat )\n        nrm = np.sqrt(np.sum( diff ** 2))\n\n        self.error_computed = nrm\n\n        if nrm > tol:\n            print(f"Not equal within tolerance {tol}; norm of difference was {nrm}")\n            print(f"Element-wise differences {diff.tolist()}")\n            self.assertEqual(computed, expected, msg=f"Not equal within tolerance {tol}")\n\n    def assertL2(self, computed, expected, tol=None):\n        if tol == None:\n            tol = self.tol\n        diff = np.abs( (np.asarray(computed) - np.asarray(expected)) )\n        self.error_computed = np.max(diff)\n\n        if np.max(diff) > tol:\n            print(f"Not equal within tolerance {tol=}; deviation was {np.max(diff)=}")\n            print(f"Element-wise differences {diff.tolist()}")\n            self.assertEqual(computed, expected, msg=f"Not equal within tolerance {tol=}, {np.max(diff)=}")\n\n    def assertL2Relative(self, computed, expected, tol=None):\n        if tol == None:\n            tol = self.tol\n        diff = np.abs( (np.asarray(computed) - np.asarray(expected)) )\n        diff = diff / (1e-8 + np.abs( (np.asarray(computed) + np.asarray(expected)) ) )\n        self.error_computed = np.max(np.abs(diff))\n        if np.sum(diff > tol) > 0:\n            print(f"Not equal within tolerance {tol}")\n            print(f"Element-wise differences {diff.tolist()}")\n            self.assertEqual(computed, expected, msg=f"Not equal within tolerance {tol}")\n\n    def precomputed_payload(self):\n        return self._precomputed_payload\n\n    def precompute_payload(self):\n        # Pre-compute resources to include in tests (useful for getting around rng).\n        pass\n\n    def compute_answer(self, unmute=False):\n        raise NotImplementedError("test code here")\n\n    def test(self, computed, expected):\n        self.testfun(computed, expected)\n\n    def get_points(self, verbose=False, show_expected=False, show_computed=False,unmute=False, passall=False, silent=False, **kwargs):\n        possible = 1\n        computed = None\n        def show_computed_(computed):\n            print(">>> Your output:")\n            print(computed)\n\n        def show_expected_(expected):\n            print(">>> Expected output (note: may have been processed; read text script):")\n            print(expected)\n\n        correct = self._correct_answer_payload\n        try:\n            if unmute: # Required to not mix together print stuff.\n                print("")\n            computed = self.compute_answer(unmute=unmute)\n        except Exception as e:\n            if not passall:\n                if not silent:\n                    print("\\n=================================================================================")\n                    print(f"When trying to run test class \'{self.name}\' your code threw an error:", e)\n                    show_expected_(correct)\n                    import traceback\n                    print(traceback.format_exc())\n                    print("=================================================================================")\n                return (0, possible)\n\n        if self._computed_answer is None:\n            self._computed_answer = computed\n\n        if show_expected or show_computed:\n            print("\\n")\n        if show_expected:\n            show_expected_(correct)\n        if show_computed:\n            show_computed_(computed)\n        try:\n            if not passall:\n                self.test(computed=computed, expected=correct)\n        except Exception as e:\n            if not silent:\n                print("\\n=================================================================================")\n                print(f"Test output from test class \'{self.name}\' does not match expected result. Test error:")\n                print(e)\n                show_computed_(computed)\n                show_expected_(correct)\n            return (0, possible)\n        return (1, possible)\n\n    def score(self):\n        try:\n            self.test()\n        except Exception as e:\n            return 0\n        return 1\n\nclass QPrintItem(QItem):\n    def compute_answer_print(self):\n        """\n        Generate output which is to be tested. By default, both text written to the terminal using print(...) as well as return values\n        are send to process_output (see compute_answer below). In other words, the text generated is:\n\n        res = compute_Answer_print()\n        txt = (any terminal output generated above)\n        numbers = (any numbers found in terminal-output txt)\n\n        self.test(process_output(res, txt, numbers), <expected result>)\n\n        :return: Optional values for comparison\n        """\n        raise Exception("Generate output here. The output is passed to self.process_output")\n\n    def process_output(self, res, txt, numbers):\n        return res\n\n    def compute_answer(self, unmute=False):\n        with Capturing(unmute=unmute) as output:\n            res = self.compute_answer_print()\n        s = "\\n".join(output)\n        s = rm_progress_bar(s) # Remove progress bar.\n        numbers = extract_numbers(s)\n        self._computed_answer = (res, s, numbers)\n        return self.process_output(res, s, numbers)\n\nclass OrderedClassMembers(type):\n    @classmethod\n    def __prepare__(self, name, bases):\n        return collections.OrderedDict()\n    def __new__(self, name, bases, classdict):\n        ks = list(classdict.keys())\n        for b in bases:\n            ks += b.__ordered__\n        classdict[\'__ordered__\'] = [key for key in ks if key not in (\'__module__\', \'__qualname__\')]\n        return type.__new__(self, name, bases, classdict)\n\nclass QuestionGroup(metaclass=OrderedClassMembers):\n    title = "Untitled question"\n    partially_scored = False\n    t_init = 0  # Time spend on initialization (placeholder; set this externally).\n    estimated_time = 0.42\n    has_called_init_ = False\n    _name = None\n    _items = None\n\n    @property\n    def items(self):\n        if self._items == None:\n            self._items = []\n            members = [gt for gt in [getattr(self, gt) for gt in self.__ordered__ if gt not in ["__classcell__", "__init__"]] if inspect.isclass(gt) and issubclass(gt, QItem)]\n            for I in members:\n                self._items.append( I(question=self))\n        return self._items\n\n    @items.setter\n    def items(self, value):\n        self._items = value\n\n    @property\n    def name(self):\n        if self._name == None:\n            self._name = self.__class__.__name__\n        return self._name #\n\n    @name.setter\n    def name(self, val):\n        self._name = val\n\n    def init(self):\n        # Can be used to set resources relevant for this question instance.\n        pass\n\n    def init_all_item_questions(self):\n        for item in self.items:\n            if not item.question.has_called_init_:\n                item.question.init()\n                item.question.has_called_init_ = True\n\n\nclass Report:\n    title = "report title"\n    version = None\n    questions = []\n    pack_imports = []\n    individual_imports = []\n    nL = 80 # Maximum line width\n\n    @classmethod\n    def reset(cls):\n        for (q,_) in cls.questions:\n            if hasattr(q, \'reset\'):\n                q.reset()\n\n    @classmethod\n    def mfile(clc):\n        return inspect.getfile(clc)\n\n    def _file(self):\n        return inspect.getfile(type(self))\n\n    def _import_base_relative(self):\n        if hasattr(self.pack_imports[0], \'__path__\'):\n            root_dir = self.pack_imports[0].__path__._path[0]\n        else:\n            root_dir = self.pack_imports[0].__file__\n\n        root_dir = os.path.dirname(root_dir)\n        relative_path = os.path.relpath(self._file(), root_dir)\n        modules = os.path.normpath(relative_path[:-3]).split(os.sep)\n        return root_dir, relative_path, modules\n\n    def __init__(self, strict=False, payload=None):\n        working_directory = os.path.abspath(os.path.dirname(self._file()))\n\n        self.wdir, self.name = setup_dir_by_class(self, working_directory)\n        # self.computed_answers_file = os.path.join(self.wdir, self.name + "_resources_do_not_hand_in.dat")\n        for (q,_) in self.questions:\n            q.nL = self.nL # Set maximum line length.\n\n        if payload is not None:\n            self.set_payload(payload, strict=strict)\n        # else:\n        #     if os.path.isfile(self.computed_answers_file):\n        #         self.set_payload(cache_read(self.computed_answers_file), strict=strict)\n        #     else:\n        #         s = f"> Warning: The pre-computed answer file, {os.path.abspath(self.computed_answers_file)} is missing. The framework will NOT work as intended. Reasons may be a broken local installation."\n        #         if strict:\n        #             raise Exception(s)\n        #         else:\n        #             print(s)\n\n    def main(self, verbosity=1):\n        # Run all tests using standard unittest (nothing fancy).\n        import unittest\n        loader = unittest.TestLoader()\n        for q,_ in self.questions:\n            import time\n            start = time.time() # A good proxy for setup time is to\n            suite = loader.loadTestsFromTestCase(q)\n            unittest.TextTestRunner(verbosity=verbosity).run(suite)\n            total = time.time()              - start\n            q.time = total\n\n    def _setup_answers(self):\n        self.main()  # Run all tests in class just to get that out of the way...\n        report_cache = {}\n        for q, _ in self.questions:\n            if hasattr(q, \'_save_cache\'):\n                q()._save_cache()\n                q._cache[\'time\'] = q.time\n                report_cache[q.__qualname__] = q._cache\n            else:\n                report_cache[q.__qualname__] = {\'no cache see _setup_answers in framework.py\':True}\n        return report_cache\n\n    def set_payload(self, payloads, strict=False):\n        for q, _ in self.questions:\n            q._cache = payloads[q.__qualname__]\n\ndef rm_progress_bar(txt):\n    # More robust version. Apparently length of bar can depend on various factors, so check for order of symbols.\n    nlines = []\n    for l in txt.splitlines():\n        pct = l.find("%")\n        ql = False\n        if pct > 0:\n            i = l.find("|", pct+1)\n            if i > 0 and l.find("|", i+1) > 0:\n                ql = True\n        if not ql:\n            nlines.append(l)\n    return "\\n".join(nlines)\n\ndef extract_numbers(txt):\n    # txt = rm_progress_bar(txt)\n    numeric_const_pattern = \'[-+]? (?: (?: \\d* \\. \\d+ ) | (?: \\d+ \\.? ) )(?: [Ee] [+-]? \\d+ ) ?\'\n    rx = re.compile(numeric_const_pattern, re.VERBOSE)\n    all = rx.findall(txt)\n    all = [float(a) if (\'.\' in a or "e" in a) else int(a) for a in all]\n    if len(all) > 500:\n        print(txt)\n        raise Exception("unitgrade_v1.unitgrade_v1.py: Warning, too many numbers!", len(all))\n    return all\n\nclass ActiveProgress():\n    def __init__(self, t, start=True, title="my progress bar",show_progress_bar=True):\n        self.t = t\n        self._running = False\n        self.title = title\n        self.dt = 0.1\n        self.n = int(np.round(self.t / self.dt))\n        self.show_progress_bar = show_progress_bar\n\n        # self.pbar = tqdm.tqdm(total=self.n)\n        if start:\n            self.start()\n\n    def start(self):\n        self._running = True\n        if self.show_progress_bar:\n            self.thread = threading.Thread(target=self.run)\n            self.thread.start()\n        self.time_started = time.time()\n\n    def terminate(self):\n        if not self._running:\n            raise Exception("Stopping a stopped progress bar. ")\n        self._running = False\n        if self.show_progress_bar:\n            self.thread.join()\n        if hasattr(self, \'pbar\') and self.pbar is not None:\n            self.pbar.update(1)\n            self.pbar.close()\n            self.pbar=None\n\n        sys.stdout.flush()\n        return time.time() - self.time_started\n\n    def run(self):\n        self.pbar = tqdm.tqdm(total=self.n, file=sys.stdout, position=0, leave=False, desc=self.title, ncols=100,\n                              bar_format=\'{l_bar}{bar}| [{elapsed}<{remaining}]\')  # , unit_scale=dt, unit=\'seconds\'):\n\n        for _ in range(self.n-1): # Don\'t terminate completely; leave bar at 99% done until terminate.\n            if not self._running:\n                self.pbar.close()\n                self.pbar = None\n                break\n\n            time.sleep(self.dt)\n            self.pbar.update(1)\n\n\n# class MySuite(unittest.suite.TestSuite): # Not sure we need this one anymore.\n#     raise Exception("no suite")\n#     pass\n\ndef instance_call_stack(instance):\n    s = "-".join(map(lambda x: x.__name__, instance.__class__.mro()))\n    return s\n\ndef get_class_that_defined_method(meth):\n    for cls in inspect.getmro(meth.im_class):\n        if meth.__name__ in cls.__dict__:\n            return cls\n    return None\n\ndef caller_name(skip=2):\n    """Get a name of a caller in the format module.class.method\n\n       `skip` specifies how many levels of stack to skip while getting caller\n       name. skip=1 means "who calls me", skip=2 "who calls my caller" etc.\n\n       An empty string is returned if skipped levels exceed stack height\n    """\n    stack = inspect.stack()\n    start = 0 + skip\n    if len(stack) < start + 1:\n      return \'\'\n    parentframe = stack[start][0]\n\n    name = []\n    module = inspect.getmodule(parentframe)\n    # `modname` can be None when frame is executed directly in console\n    # TODO(techtonik): consider using __main__\n    if module:\n        name.append(module.__name__)\n    # detect classname\n    if \'self\' in parentframe.f_locals:\n        # I don\'t know any way to detect call from the object method\n        # XXX: there seems to be no way to detect static method call - it will\n        #      be just a function call\n        name.append(parentframe.f_locals[\'self\'].__class__.__name__)\n    codename = parentframe.f_code.co_name\n    if codename != \'<module>\':  # top level usually\n        name.append( codename ) # function or a method\n\n    ## Avoid circular refs and frame leaks\n    #  https://docs.python.org/2.7/library/inspect.html#the-interpreter-stack\n    del parentframe, stack\n\n    return ".".join(name)\n\ndef get_class_from_frame(fr):\n\n      args, _, _, value_dict = inspect.getargvalues(fr)\n      # we check the first parameter for the frame function is\n      # named \'self\'\n      if len(args) and args[0] == \'self\':\n            # in that case, \'self\' will be referenced in value_dict\n            instance = value_dict.get(\'self\', None)\n            if instance:\n                  # return its class\n                  # isinstance(instance, Testing) # is the actual class instance.\n\n                  return getattr(instance, \'__class__\', None)\n      # return None otherwise\n      return None\n\nfrom typing import Any\nimport inspect, gc\n\ndef giveupthefunc():\n    frame = inspect.currentframe()\n    code  = frame.f_code\n    globs = frame.f_globals\n    functype = type(lambda: 0)\n    funcs = []\n    for func in gc.get_referrers(code):\n        if type(func) is functype:\n            if getattr(func, "__code__", None) is code:\n                if getattr(func, "__globals__", None) is globs:\n                    funcs.append(func)\n                    if len(funcs) > 1:\n                        return None\n    return funcs[0] if funcs else None\n\n\nfrom collections import defaultdict\n\nclass UTextResult(unittest.TextTestResult):\n    nL = 80\n    number = -1 # HAcky way to set question number.\n    show_progress_bar = True\n    def __init__(self, stream, descriptions, verbosity):\n        super().__init__(stream, descriptions, verbosity)\n        self.successes = []\n\n    def printErrors(self) -> None:\n        # if self.dots or self.showAll:\n        #     self.stream.writeln()\n        # if hasattr(self, \'cc\'):\n        #     self.cc.terminate()\n        # self.cc_terminate(success=False)\n        self.printErrorList(\'ERROR\', self.errors)\n        self.printErrorList(\'FAIL\', self.failures)\n\n    def addError(self, test, err):\n        super(unittest.TextTestResult, self).addFailure(test, err)\n        self.cc_terminate(success=False)\n\n    def addFailure(self, test, err):\n        super(unittest.TextTestResult, self).addFailure(test, err)\n        self.cc_terminate(success=False)\n        # if self.showAll:\n        #     self.stream.writeln("FAIL")\n        # elif self.dots:\n        #     self.stream.write(\'F\')\n        #     self.stream.flush()\n\n    def addSuccess(self, test: unittest.case.TestCase) -> None:\n        # super().addSuccess(test)\n        self.successes.append(test)\n        # super().addSuccess(test)\n        #     hidden = issubclass(item.__class__, Hidden)\n        #     # if not hidden:\n        #     #     print(ss, end="")\n        #     # sys.stdout.flush()\n        #     start = time.time()\n        #\n        #     (current, possible) = item.get_points(show_expected=show_expected, show_computed=show_computed,unmute=unmute, passall=passall, silent=silent)\n        #     q_[j] = {\'w\': item.weight, \'possible\': possible, \'obtained\': current, \'hidden\': hidden, \'computed\': str(item._computed_answer), \'title\': item.title}\n        #     tsecs = np.round(time.time()-start, 2)\n        self.cc_terminate()\n\n\n\n    def cc_terminate(self, success=True):\n        if self.show_progress_bar or True:\n            tsecs = np.round(self.cc.terminate(), 2)\n            sys.stdout.flush()\n            ss = self.item_title_print\n\n            state = "PASS" if success else "FAILED"\n\n            dot_parts = (\'.\' * max(0, self.nL - len(state) - len(ss)))\n            if self.show_progress_bar or True:\n                print(self.item_title_print + dot_parts, end="")\n            else:\n                print( dot_parts, end="")\n\n            if tsecs >= 0.1:\n                state += " (" + str(tsecs) + " seconds)"\n            print(state)\n\n\n    def startTest(self, test):\n        # super().startTest(test)\n        j =self.testsRun\n        self.testsRun += 1\n        # print("Starting the test...")\n        # show_progress_bar = True\n        n = UTextResult.number\n\n        item_title = self.getDescription(test)\n        # item_title = item_title.split("\\n")[0]\n        item_title = test.shortDescription() # Better for printing (get from cache).\n        if item_title == None:\n            # For unittest framework where getDescription may return None.\n            item_title = self.getDescription(test)\n        # test.countTestCases()\n        self.item_title_print = "*** q%i.%i) %s" % (n + 1, j + 1, item_title)\n        estimated_time = 10\n        nL = 80\n        #\n        if self.show_progress_bar or True:\n            self.cc = ActiveProgress(t=estimated_time, title=self.item_title_print, show_progress_bar=self.show_progress_bar)\n        else:\n            print(self.item_title_print + (\'.\' * max(0, nL - 4 - len(self.item_title_print))), end="")\n\n        self._test = test\n\n    def _setupStdout(self):\n        if self._previousTestClass == None:\n            total_estimated_time = 1\n            if hasattr(self.__class__, \'q_title_print\'):\n                q_title_print = self.__class__.q_title_print\n            else:\n                q_title_print = "<unnamed test. See unitgrade_v1.py>"\n\n            # q_title_print = "some printed title..."\n            cc = ActiveProgress(t=total_estimated_time, title=q_title_print, show_progress_bar=self.show_progress_bar)\n            self.cc = cc\n\n    def _restoreStdout(self): # Used when setting up the test.\n        if self._previousTestClass == None:\n            q_time = self.cc.terminate()\n            q_time = np.round(q_time, 2)\n            sys.stdout.flush()\n            if self.show_progress_bar:\n                print(self.cc.title, end="")\n            # start = 10\n            # q_time = np.round(time.time() - start, 2)\n            nL = 80\n            print(" " * max(0, nL - len(self.cc.title)) + (\n                " (" + str(q_time) + " seconds)" if q_time >= 0.1 else ""))  # if q.name in report.payloads else "")\n            # print("=" * nL)\n\n\n\nclass UTextTestRunner(unittest.TextTestRunner):\n    def __init__(self, *args, **kwargs):\n        from io import StringIO\n        stream = StringIO()\n        super().__init__(*args, stream=stream, **kwargs)\n\n    def _makeResult(self):\n        # stream = self.stream # not you!\n        stream = sys.stdout\n        stream = _WritelnDecorator(stream)\n        return self.resultclass(stream, self.descriptions, self.verbosity)\n\n# def wrapper(foo):\n#     def magic(self):\n#         # s = "-".join(map(lambda x: x.__name__, self.__class__.mro()))\n#         foo(self)\n#     magic.__doc__ = foo.__doc__\n#     return magic\n\nfrom functools import update_wrapper, _make_key, RLock\nfrom collections import namedtuple\n_CacheInfo = namedtuple("CacheInfo", ["hits", "misses", "maxsize", "currsize"])\n\ndef cache(foo, typed=False):\n    """ Magic cache wrapper\n    https://github.com/python/cpython/blob/main/Lib/functools.py\n    """\n    maxsize = None\n    def wrapper(self, *args, **kwargs):\n        key = (self.cache_id(), ("@cache", foo.__name__, _make_key(args, kwargs, typed)) )\n        if not self._cache_contains(key):\n            value = foo(self, *args, **kwargs)\n            self._cache_put(key, value)\n        else:\n            value = self._cache_get(key)\n        return value\n    return wrapper\n\n\nclass UTestCase(unittest.TestCase):\n    _outcome = None # A dictionary which stores the user-computed outcomes of all the tests. This differs from the cache.\n    _cache = None  # Read-only cache. Ensures method always produce same result.\n    _cache2 = None  # User-written cache.\n\n    def capture(self):\n        return Capturing2(stdout=self._stdout)\n\n    @classmethod\n    def question_title(cls):\n        """ Return the question title """\n        return cls.__doc__.strip().splitlines()[0].strip() if cls.__doc__ != None else cls.__qualname__\n\n    @classmethod\n    def reset(cls):\n        print("Warning, I am not sure UTestCase.reset() is needed anymore and it seems very hacky.")\n        cls._outcome = None\n        cls._cache = None\n        cls._cache2 = None\n\n    def _callSetUp(self):\n        self._stdout = sys.stdout\n        import io\n        sys.stdout = io.StringIO()\n        super().setUp()\n        # print("Setting up...")\n\n    def _callTearDown(self):\n        sys.stdout = self._stdout\n        super().tearDown()\n        # print("asdfsfd")\n\n    def shortDescriptionStandard(self):\n        sd = super().shortDescription()\n        if sd == None:\n            sd = self._testMethodName\n        return sd\n\n    def shortDescription(self):\n        # self._testMethodDoc.strip().splitlines()[0].strip()\n        sd = self.shortDescriptionStandard()\n        title = self._cache_get(  (self.cache_id(), \'title\'), sd )\n        return title if title != None else sd\n\n    @property\n    def title(self):\n        return self.shortDescription()\n\n    @title.setter\n    def title(self, value):\n        self._cache_put((self.cache_id(), \'title\'), value)\n\n    def _get_outcome(self):\n        if not (self.__class__, \'_outcome\') or self.__class__._outcome == None:\n            self.__class__._outcome = {}\n        return self.__class__._outcome\n\n    def _callTestMethod(self, testMethod):\n        t = time.time()\n        self._ensure_cache_exists() # Make sure cache is there.\n        if self._testMethodDoc != None:\n            # Ensure the cache is eventually updated with the right docstring.\n            self._cache_put((self.cache_id(), \'title\'), self.shortDescriptionStandard() )\n        # Fix temp cache here (for using the @cache decorator)\n        self._cache2[ (self.cache_id(), \'assert\') ] = {}\n\n        res = testMethod()\n        elapsed = time.time() - t\n        # self._cache_put( (self.cache_id(), \'title\'), self.shortDescription() )\n\n        self._get_outcome()[self.cache_id()] = res\n        self._cache_put( (self.cache_id(), "time"), elapsed)\n\n    # This is my base test class. So what is new about it?\n    def cache_id(self):\n        c = self.__class__.__qualname__\n        m = self._testMethodName\n        return (c,m)\n\n    def __init__(self, *args, **kwargs):\n        super().__init__(*args, **kwargs)\n        self._load_cache()\n        self._assert_cache_index = 0\n        # self.cache_indexes = defaultdict(lambda: 0)\n\n    def _ensure_cache_exists(self):\n        if not hasattr(self.__class__, \'_cache\') or self.__class__._cache == None:\n            self.__class__._cache = dict()\n        if not hasattr(self.__class__, \'_cache2\') or self.__class__._cache2 == None:\n            self.__class__._cache2 = dict()\n\n    def _cache_get(self, key, default=None):\n        self._ensure_cache_exists()\n        return self.__class__._cache.get(key, default)\n\n    def _cache_put(self, key, value):\n        self._ensure_cache_exists()\n        self.__class__._cache2[key] = value\n\n    def _cache_contains(self, key):\n        self._ensure_cache_exists()\n        return key in self.__class__._cache\n\n    def wrap_assert(self, assert_fun, first, *args, **kwargs):\n        key = (self.cache_id(), \'assert\')\n        if not self._cache_contains(key):\n            print("Warning, framework missing", key)\n        cache = self._cache_get(key, {})\n        id = self._assert_cache_index\n        if not id in cache:\n            print("Warning, framework missing cache index", key, "id =", id)\n        _expected = cache.get(id, first)\n        assert_fun(first, _expected, *args, **kwargs)\n        cache[id] = first\n        self._cache_put(key, cache)\n        self._assert_cache_index += 1\n\n    def assertEqualC(self, first: Any, msg: Any = ...) -> None:\n        self.wrap_assert(self.assertEqual, first, msg)\n\n    def _cache_file(self):\n        return os.path.dirname(inspect.getfile(self.__class__) ) + "/unitgrade_v1/" + self.__class__.__name__ + ".pkl"\n\n    def _save_cache(self):\n        # get the class name (i.e. what to save to).\n        cfile = self._cache_file()\n        if not os.path.isdir(os.path.dirname(cfile)):\n            os.makedirs(os.path.dirname(cfile))\n\n        if hasattr(self.__class__, \'_cache2\'):\n            with open(cfile, \'wb\') as f:\n                pickle.dump(self.__class__._cache2, f)\n\n    # But you can also set cache explicitly.\n    def _load_cache(self):\n        if self._cache != None: # Cache already loaded. We will not load it twice.\n            return\n            # raise Exception("Loaded cache which was already set. What is going on?!")\n        cfile = self._cache_file()\n        # print("Loading cache from", cfile)\n        if os.path.exists(cfile):\n            with open(cfile, \'rb\') as f:\n                data = pickle.load(f)\n                self.__class__._cache = data\n        else:\n            print("Warning! data file not found", cfile)\n\ndef hide(func):\n    return func\n\ndef makeRegisteringDecorator(foreignDecorator):\n    """\n        Returns a copy of foreignDecorator, which is identical in every\n        way(*), except also appends a .decorator property to the callable it\n        spits out.\n    """\n    def newDecorator(func):\n        # Call to newDecorator(method)\n        # Exactly like old decorator, but output keeps track of what decorated it\n        R = foreignDecorator(func)  # apply foreignDecorator, like call to foreignDecorator(method) would have done\n        R.decorator = newDecorator  # keep track of decorator\n        # R.original = func         # might as well keep track of everything!\n        return R\n\n    newDecorator.__name__ = foreignDecorator.__name__\n    newDecorator.__doc__ = foreignDecorator.__doc__\n    # (*)We can be somewhat "hygienic", but newDecorator still isn\'t signature-preserving, i.e. you will not be able to get a runtime list of parameters. For that, you need hackish libraries...but in this case, the only argument is func, so it\'s not a big issue\n    return newDecorator\n\nhide = makeRegisteringDecorator(hide)\n\ndef methodsWithDecorator(cls, decorator):\n    """\n        Returns all methods in CLS with DECORATOR as the\n        outermost decorator.\n\n        DECORATOR must be a "registering decorator"; one\n        can make any decorator "registering" via the\n        makeRegisteringDecorator function.\n\n        import inspect\n        ls = list(methodsWithDecorator(GeneratorQuestion, deco))\n        for f in ls:\n            print(inspect.getsourcelines(f) ) # How to get all hidden questions.\n    """\n    for maybeDecorated in cls.__dict__.values():\n        if hasattr(maybeDecorated, \'decorator\'):\n            if maybeDecorated.decorator == decorator:\n                print(maybeDecorated)\n                yield maybeDecorated\n\n\n\nimport numpy as np\nfrom tabulate import tabulate\nfrom datetime import datetime\nimport pyfiglet\nimport unittest\n# from unitgrade.unitgrade import MySuite\n\nimport inspect\nimport os\nimport argparse\nimport sys\nimport time\nimport threading # don\'t import Thread bc. of minify issue.\nimport tqdm # don\'t do from tqdm import tqdm because of minify-issue\n\nparser = argparse.ArgumentParser(description=\'Evaluate your report.\', epilog="""Example: \nTo run all tests in a report: \n\n> python assignment1_dp.py\n\nTo run only question 2 or question 2.1\n\n> python assignment1_dp.py -q 2\n> python assignment1_dp.py -q 2.1\n\nNote this scripts does not grade your report. To grade your report, use:\n\n> python report1_grade.py\n\nFinally, note that if your report is part of a module (package), and the report script requires part of that package, the -m option for python may be useful.\nFor instance, if the report file is in Documents/course_package/report3_complete.py, and `course_package` is a python package, then change directory to \'Documents/` and run:\n\n> python -m course_package.report1\n\nsee https://docs.python.org/3.9/using/cmdline.html\n""", formatter_class=argparse.RawTextHelpFormatter)\nparser.add_argument(\'-q\', nargs=\'?\', type=str, default=None, help=\'Only evaluate this question (e.g.: -q 2)\')\nparser.add_argument(\'--showexpected\',  action="store_true",  help=\'Show the expected/desired result\')\nparser.add_argument(\'--showcomputed\',  action="store_true",  help=\'Show the answer your code computes\')\nparser.add_argument(\'--unmute\',  action="store_true",  help=\'Show result of print(...) commands in code\')\nparser.add_argument(\'--passall\',  action="store_true",  help=\'Automatically pass all tests. Useful when debugging.\')\n\ndef evaluate_report_student(report, question=None, qitem=None, unmute=None, passall=None, ignore_missing_file=False, show_tol_err=False):\n    args = parser.parse_args()\n    if question is None and args.q is not None:\n        question = args.q\n        if "." in question:\n            question, qitem = [int(v) for v in question.split(".")]\n        else:\n            question = int(question)\n\n    if hasattr(report, "computed_answer_file") and not os.path.isfile(report.computed_answers_file) and not ignore_missing_file:\n        raise Exception("> Error: The pre-computed answer file", os.path.abspath(report.computed_answers_file), "does not exist. Check your package installation")\n\n    if unmute is None:\n        unmute = args.unmute\n    if passall is None:\n        passall = args.passall\n\n    results, table_data = evaluate_report(report, question=question, show_progress_bar=not unmute, qitem=qitem, verbose=False, passall=passall, show_expected=args.showexpected, show_computed=args.showcomputed,unmute=unmute,\n                                          show_tol_err=show_tol_err)\n\n\n    if question is None:\n        print("Provisional evaluation")\n        tabulate(table_data)\n        table = table_data\n        print(tabulate(table))\n        print(" ")\n\n    fr = inspect.getouterframes(inspect.currentframe())[1].filename\n    gfile = os.path.basename(fr)[:-3] + "_grade.py"\n    if os.path.exists(gfile):\n        print("Note your results have not yet been registered. \\nTo register your results, please run the file:")\n        print(">>>", gfile)\n        print("In the same manner as you ran this file.")\n\n\n    return results\n\n\ndef upack(q):\n    # h = zip([(i[\'w\'], i[\'possible\'], i[\'obtained\']) for i in q.values()])\n    h =[(i[\'w\'], i[\'possible\'], i[\'obtained\']) for i in q.values()]\n    h = np.asarray(h)\n    return h[:,0], h[:,1], h[:,2],\n\nclass UnitgradeTextRunner(unittest.TextTestRunner):\n    def __init__(self, *args, **kwargs):\n        super().__init__(*args, **kwargs)\n\nclass SequentialTestLoader(unittest.TestLoader):\n    def getTestCaseNames(self, testCaseClass):\n        test_names = super().getTestCaseNames(testCaseClass)\n        # testcase_methods = list(testCaseClass.__dict__.keys())\n        ls = []\n        for C in testCaseClass.mro():\n            if issubclass(C, unittest.TestCase):\n                ls = list(C.__dict__.keys()) + ls\n        testcase_methods = ls\n        test_names.sort(key=testcase_methods.index)\n        return test_names\n\ndef evaluate_report(report, question=None, qitem=None, passall=False, verbose=False,  show_expected=False, show_computed=False,unmute=False, show_help_flag=True, silent=False,\n                    show_progress_bar=True,\n                    show_tol_err=False,\n                    big_header=True):\n\n    now = datetime.now()\n    if big_header:\n        ascii_banner = pyfiglet.figlet_format("UnitGrade", font="doom")\n        b = "\\n".join( [l for l in ascii_banner.splitlines() if len(l.strip()) > 0] )\n    else:\n        b = "Unitgrade"\n    print(b + " v" + __version__)\n    dt_string = now.strftime("%d/%m/%Y %H:%M:%S")\n    print("Started: " + dt_string)\n    s = report.title\n    if hasattr(report, "version") and report.version is not None:\n        s += " version " + report.version\n    print("Evaluating " + s, "(use --help for options)" if show_help_flag else "")\n    # print(f"Loaded answers from: ", report.computed_answers_file, "\\n")\n    table_data = []\n    nL = 80\n    t_start = time.time()\n    score = {}\n    loader = SequentialTestLoader()\n\n    for n, (q, w) in enumerate(report.questions):\n        # q = q()\n        # q_hidden = False\n        # q_hidden = issubclass(q.__class__, Hidden)\n        if question is not None and n+1 != question:\n            continue\n        suite = loader.loadTestsFromTestCase(q)\n        qtitle = q.question_title() if hasattr(q, \'question_title\') else q.__qualname__\n        q_title_print = "Question %i: %s"%(n+1, qtitle)\n        print(q_title_print, end="")\n        q.possible = 0\n        q.obtained = 0\n        q_ = {} # Gather score in this class.\n        # unittest.Te\n        # q_with_outstanding_init = [item.question for item in q.items if not item.question.has_called_init_]\n        UTextResult.q_title_print = q_title_print # Hacky\n        UTextResult.show_progress_bar = show_progress_bar # Hacky.\n        UTextResult.number = n\n\n        res = UTextTestRunner(verbosity=2, resultclass=UTextResult).run(suite)\n\n        possible = res.testsRun\n        obtained = len(res.successes)\n\n        assert len(res.successes) +  len(res.errors) + len(res.failures) == res.testsRun\n\n        # possible = int(ws @ possible)\n        # obtained = int(ws @ obtained)\n        # obtained = int(myround(int((w * obtained) / possible ))) if possible > 0 else 0\n\n        obtained = int(w * obtained * 1.0 / possible ) if possible > 0 else 0\n        score[n] = {\'w\': w, \'possible\': w, \'obtained\': obtained, \'items\': q_, \'title\': qtitle}\n        q.obtained = obtained\n        q.possible = possible\n\n        s1 = f"*** Question q{n+1}"\n        s2 = f" {q.obtained}/{w}"\n        print(s1 + ("."* (nL-len(s1)-len(s2) )) + s2 )\n        print(" ")\n        table_data.append([f"Question q{n+1}", f"{q.obtained}/{w}"])\n\n    ws, possible, obtained = upack(score)\n    possible = int( msum(possible) )\n    obtained = int( msum(obtained) ) # Cast to python int\n    report.possible = possible\n    report.obtained = obtained\n    now = datetime.now()\n    dt_string = now.strftime("%H:%M:%S")\n\n    dt = int(time.time()-t_start)\n    minutes = dt//60\n    seconds = dt - minutes*60\n    plrl = lambda i, s: str(i) + " " + s + ("s" if i != 1 else "")\n\n    print(f"Completed: "+ dt_string + " (" + plrl(minutes, "minute") + ", "+ plrl(seconds, "second") +")")\n\n    table_data.append(["Total", ""+str(report.obtained)+"/"+str(report.possible) ])\n    results = {\'total\': (obtained, possible), \'details\': score}\n    return results, table_data\n\n\n\n\nfrom tabulate import tabulate\nfrom datetime import datetime\nimport inspect\nimport json\nimport os\nimport bz2\nimport pickle\nimport os\n\ndef bzwrite(json_str, token): # to get around obfuscation issues\n    with getattr(bz2, \'open\')(token, "wt") as f:\n        f.write(json_str)\n\ndef gather_imports(imp):\n    resources = {}\n    m = imp\n    # for m in pack_imports:\n    # print(f"*** {m.__name__}")\n    f = m.__file__\n    # dn = os.path.dirname(f)\n    # top_package = os.path.dirname(__import__(m.__name__.split(\'.\')[0]).__file__)\n    # top_package = str(__import__(m.__name__.split(\'.\')[0]).__path__)\n\n    if hasattr(m, \'__file__\') and not hasattr(m, \'__path__\'):  # Importing a simple file: m.__class__.__name__ == \'module\' and False:\n        top_package = os.path.dirname(m.__file__)\n        module_import = True\n    else:\n        top_package = __import__(m.__name__.split(\'.\')[0]).__path__._path[0]\n        module_import = False\n\n    # top_package = os.path.dirname(__import__(m.__name__.split(\'.\')[0]).__file__)\n    # top_package = os.path.dirname(top_package)\n    import zipfile\n    # import strea\n    # zipfile.ZipFile\n    import io\n    # file_like_object = io.BytesIO(my_zip_data)\n    zip_buffer = io.BytesIO()\n    with zipfile.ZipFile(zip_buffer, \'w\') as zip:\n        # zip.write()\n        for root, dirs, files in os.walk(top_package):\n            for file in files:\n                if file.endswith(".py"):\n                    fpath = os.path.join(root, file)\n                    v = os.path.relpath(os.path.join(root, file), os.path.dirname(top_package) if not module_import else top_package)\n                    zip.write(fpath, v)\n\n    resources[\'zipfile\'] = zip_buffer.getvalue()\n    resources[\'top_package\'] = top_package\n    resources[\'module_import\'] = module_import\n    return resources, top_package\n\n    if f.endswith("__init__.py"):\n        for root, dirs, files in os.walk(os.path.dirname(f)):\n            for file in files:\n                if file.endswith(".py"):\n                    # print(file)\n                    # print()\n                    v = os.path.relpath(os.path.join(root, file), top_package)\n                    with open(os.path.join(root, file), \'r\') as ff:\n                        resources[v] = ff.read()\n    else:\n        v = os.path.relpath(f, top_package)\n        with open(f, \'r\') as ff:\n            resources[v] = ff.read()\n    return resources\n\nimport argparse\nparser = argparse.ArgumentParser(description=\'Evaluate your report.\', epilog="""Use this script to get the score of your report. Example:\n\n> python report1_grade.py\n\nFinally, note that if your report is part of a module (package), and the report script requires part of that package, the -m option for python may be useful.\nFor instance, if the report file is in Documents/course_package/report3_complete.py, and `course_package` is a python package, then change directory to \'Documents/` and run:\n\n> python -m course_package.report1\n\nsee https://docs.python.org/3.9/using/cmdline.html\n""", formatter_class=argparse.RawTextHelpFormatter)\nparser.add_argument(\'--noprogress\',  action="store_true",  help=\'Disable progress bars\')\nparser.add_argument(\'--autolab\',  action="store_true",  help=\'Show Autolab results\')\n\ndef gather_upload_to_campusnet(report, output_dir=None):\n    n = report.nL\n    args = parser.parse_args()\n    results, table_data = evaluate_report(report, show_help_flag=False, show_expected=False, show_computed=False, silent=True,\n                                          show_progress_bar=not args.noprogress,\n                                          big_header=not args.autolab)\n    print(" ")\n    print("="*n)\n    print("Final evaluation")\n    print(tabulate(table_data))\n    # also load the source code of missing files...\n\n    sources = {}\n\n    if not args.autolab:\n        if len(report.individual_imports) > 0:\n            print("By uploading the .token file, you verify the files:")\n            for m in report.individual_imports:\n                print(">", m.__file__)\n            print("Are created/modified individually by you in agreement with DTUs exam rules")\n            report.pack_imports += report.individual_imports\n\n        if len(report.pack_imports) > 0:\n            print("Including files in upload...")\n            for k, m in enumerate(report.pack_imports):\n                nimp, top_package = gather_imports(m)\n                _, report_relative_location, module_import = report._import_base_relative()\n\n                # report_relative_location = os.path.relpath(inspect.getfile(report.__class__), top_package)\n                nimp[\'report_relative_location\'] = report_relative_location\n                nimp[\'report_module_specification\'] = module_import\n                nimp[\'name\'] = m.__name__\n                sources[k] = nimp\n                # if len([k for k in nimp if k not in sources]) > 0:\n                print(f"*** {m.__name__}")\n                # sources = {**sources, **nimp}\n    results[\'sources\'] = sources\n\n    if output_dir is None:\n        output_dir = os.getcwd()\n\n    payload_out_base = report.__class__.__name__ + "_handin"\n\n    obtain, possible = results[\'total\']\n    vstring = "_v"+report.version if report.version is not None else ""\n\n    token = "%s_%i_of_%i%s.token"%(payload_out_base, obtain, possible,vstring)\n    token = os.path.join(output_dir, token)\n    with open(token, \'wb\') as f:\n        pickle.dump(results, f)\n\n    if not args.autolab:\n        print(" ")\n        print("To get credit for your results, please upload the single file: ")\n        print(">", token)\n        print("To campusnet without any modifications.")\n\n        # print("Now time for some autolab fun")\n\ndef source_instantiate(name, report1_source, payload):\n    eval("exec")(report1_source, globals())\n    pl = pickle.loads(bytes.fromhex(payload))\n    report = eval(name)(payload=pl, strict=True)\n    # report.set_payload(pl)\n    return report\n\n\n__version__ = "0.9.0"\n\nfrom homework1 import reverse_list, add\nimport unittest\n\nclass Week1(unittest.TestCase):\n    def test_add(self):\n        self.assertEqual(add(2,2), 4)\n        self.assertEqual(add(-100, 5), -95)\n\n    def test_reverse(self):\n        self.assertEqual(reverse_list([1,2,3]), [3,2,1])\n\n\nimport homework1\nclass Report1Flat(Report):\n    title = "CS 101 Report 1"\n    questions = [(Week1, 10)]  # Include a single question for 10 credits.\n    pack_imports = [homework1]'
-report1_payload = '8004953f000000000000007d948c055765656b31947d948c2c6e6f20636163686520736565205f73657475705f616e737765727320696e20756e69746772616465322e7079948873732e'
-name="Report1Flat"
-
-report = source_instantiate(name, report1_source, report1_payload)
-output_dir = os.path.dirname(__file__)
-gather_upload_to_campusnet(report, output_dir)
diff --git a/examples/example_moss/student_submissions/s1002/Report2_handin_18_of_18.token b/examples/example_moss/student_submissions/s1002/Report2_handin_18_of_18.token
new file mode 100644
index 0000000..017f4d7
--- /dev/null
+++ b/examples/example_moss/student_submissions/s1002/Report2_handin_18_of_18.token
@@ -0,0 +1,252 @@
+# This file contains your results. Do not edit its content. Simply upload it as it is. 
+### Content of cs102\homework1.py ###
+
+def reverse_list(mylist): #!f #!s;keeptags
+    """
+    Given a list 'mylist' returns a list consisting of the same elements in reverse order. E.g.
+    reverse_list([1,2,3]) should return [3,2,1] (as a list).
+    """
+    ls = []
+    for l in mylist:
+        ls = [l] + ls
+    return ls
+    # return list(reversed(mylist))
+
+def add(a,b): #!f
+    """ Given two numbers `a` and `b` this function should simply return their sum:
+    > add(a,b) = a+b """
+    sum = a + b
+    return sum
+
+if __name__ == "__main__":
+    # Example usage:
+    print(f"Your result of 2 + 2 = {add(2,2)}")
+    print(f"Reversing a small list", reverse_list([2,3,5,7])) #!s
+
+
+### Content of cs102\report2.py ###
+
+from unitgrade.framework import Report
+from unitgrade.evaluate import evaluate_report_student
+from cs102.homework1 import add, reverse_list
+from unitgrade import UTestCase, cache  
+
+class Week1(UTestCase):
+    def test_add(self):
+        self.assertEqualC(add(2,2))
+        self.assertEqualC(add(-100, 5))
+
+    def test_reverse(self):
+        self.assertEqualC(reverse_list([1, 2, 3])) 
+
+    def test_output_capture(self):
+        with self.capture() as out:
+            print("hello world 42")                     # Genereate some output (i.e. in a homework script)
+        self.assertEqual(out.numbers[0], 42)            # out.numbers is a list of all numbers generated
+        self.assertEqual(out.output, "hello world 42")  # you can also access the raw output.
+
+class Week1Titles(UTestCase): 
+    """ The same problem as before with nicer titles """
+    def test_add(self):
+        """ Test the addition method add(a,b) """
+        self.assertEqualC(add(2,2))
+        self.assertEqualC(add(-100, 5))
+
+    def test_reverse(self):
+        ls = [1, 2, 3]
+        reverse = reverse_list(ls)
+        self.assertEqualC(reverse)
+        # Although the title is set after the test potentially fails, it will *always* show correctly for the student.
+        self.title = f"Checking if reverse_list({ls}) = {reverse}"  # Programmatically set the title 
+
+    def ex_test_output_capture(self):
+        with self.capture() as out:
+            print("hello world 42")                     # Genereate some output (i.e. in a homework script)
+        self.assertEqual(out.numbers[0], 42)            # out.numbers is a list of all numbers generated
+        self.assertEqual(out.output, "hello world 42")  # you can also access the raw output.
+
+
+class Question2(UTestCase): 
+    @cache
+    def my_reversal(self, ls):
+        # The '@cache' decorator ensures the function is not run on the *students* computer
+        # Instead the code is run on the teachers computer and the result is passed on with the
+        # other pre-computed results -- i.e. this function will run regardless of how the student happens to have
+        # implemented reverse_list.
+        return reverse_list(ls)
+
+    def test_reverse_tricky(self):
+        ls = (2,4,8)
+        ls2 = self.my_reversal(tuple(ls))                   # This will always produce the right result, [8, 4, 2]
+        print("The correct answer is supposed to be", ls2)  # Show students the correct answer
+        self.assertEqualC(reverse_list(ls))                 # This will actually test the students code.
+        return "Buy world!"                                 # This value will be stored in the .token file  
+
+
+import cs102
+class Report2(Report):
+    title = "CS 101 Report 2"
+    questions = [(Week1, 10), (Week1Titles, 8)]
+    pack_imports = [cs102]
+
+if __name__ == "__main__":
+    evaluate_report_student(Report2(), unmute=True)
+---------------------------------------------------------------------- ..ooO0Ooo.. ----------------------------------------------------------------------
+61bd6e3a9868803e2b9f3f004af4e3271dd4a4b05cca6cb39066c3e3e3ab69ec50832a4da3d52a11a73dd1d4d798a6b183664993a9b536f1498332636d4cb683 27932
+---------------------------------------------------------------------- ..ooO0Ooo.. ----------------------------------------------------------------------
+.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
+AAa6jAYOAAt56hlmxxGf7AgAAAAAEWVo=.
\ No newline at end of file
diff --git a/examples/example_moss/student_submissions/s1002/Report2_handin_18_of_18_0/cs102/homework1.py b/examples/example_moss/student_submissions/s1002/Report2_handin_18_of_18_0/cs102/homework1.py
new file mode 100644
index 0000000..f54f487
--- /dev/null
+++ b/examples/example_moss/student_submissions/s1002/Report2_handin_18_of_18_0/cs102/homework1.py
@@ -0,0 +1,21 @@
+def reverse_list(mylist): #!f #!s;keeptags
+    """
+    Given a list 'mylist' returns a list consisting of the same elements in reverse order. E.g.
+    reverse_list([1,2,3]) should return [3,2,1] (as a list).
+    """
+    ls = []
+    for l in mylist:
+        ls = [l] + ls
+    return ls
+    # return list(reversed(mylist))
+
+def add(a,b): #!f
+    """ Given two numbers `a` and `b` this function should simply return their sum:
+    > add(a,b) = a+b """
+    sum = a + b
+    return sum
+
+if __name__ == "__main__":
+    # Example usage:
+    print(f"Your result of 2 + 2 = {add(2,2)}")
+    print(f"Reversing a small list", reverse_list([2,3,5,7])) #!s
diff --git a/examples/example_moss/student_submissions/s1002/Report2_handin_18_of_18_0/cs102/report2.py b/examples/example_moss/student_submissions/s1002/Report2_handin_18_of_18_0/cs102/report2.py
new file mode 100644
index 0000000..894b769
--- /dev/null
+++ b/examples/example_moss/student_submissions/s1002/Report2_handin_18_of_18_0/cs102/report2.py
@@ -0,0 +1,65 @@
+from unitgrade.framework import Report
+from unitgrade.evaluate import evaluate_report_student
+from cs102.homework1 import add, reverse_list
+from unitgrade import UTestCase, cache  
+
+class Week1(UTestCase):
+    def test_add(self):
+        self.assertEqualC(add(2,2))
+        self.assertEqualC(add(-100, 5))
+
+    def test_reverse(self):
+        self.assertEqualC(reverse_list([1, 2, 3])) 
+
+    def test_output_capture(self):
+        with self.capture() as out:
+            print("hello world 42")                     # Genereate some output (i.e. in a homework script)
+        self.assertEqual(out.numbers[0], 42)            # out.numbers is a list of all numbers generated
+        self.assertEqual(out.output, "hello world 42")  # you can also access the raw output.
+
+class Week1Titles(UTestCase): 
+    """ The same problem as before with nicer titles """
+    def test_add(self):
+        """ Test the addition method add(a,b) """
+        self.assertEqualC(add(2,2))
+        self.assertEqualC(add(-100, 5))
+
+    def test_reverse(self):
+        ls = [1, 2, 3]
+        reverse = reverse_list(ls)
+        self.assertEqualC(reverse)
+        # Although the title is set after the test potentially fails, it will *always* show correctly for the student.
+        self.title = f"Checking if reverse_list({ls}) = {reverse}"  # Programmatically set the title 
+
+    def ex_test_output_capture(self):
+        with self.capture() as out:
+            print("hello world 42")                     # Genereate some output (i.e. in a homework script)
+        self.assertEqual(out.numbers[0], 42)            # out.numbers is a list of all numbers generated
+        self.assertEqual(out.output, "hello world 42")  # you can also access the raw output.
+
+
+class Question2(UTestCase): 
+    @cache
+    def my_reversal(self, ls):
+        # The '@cache' decorator ensures the function is not run on the *students* computer
+        # Instead the code is run on the teachers computer and the result is passed on with the
+        # other pre-computed results -- i.e. this function will run regardless of how the student happens to have
+        # implemented reverse_list.
+        return reverse_list(ls)
+
+    def test_reverse_tricky(self):
+        ls = (2,4,8)
+        ls2 = self.my_reversal(tuple(ls))                   # This will always produce the right result, [8, 4, 2]
+        print("The correct answer is supposed to be", ls2)  # Show students the correct answer
+        self.assertEqualC(reverse_list(ls))                 # This will actually test the students code.
+        return "Buy world!"                                 # This value will be stored in the .token file  
+
+
+import cs102
+class Report2(Report):
+    title = "CS 101 Report 2"
+    questions = [(Week1, 10), (Week1Titles, 8)]
+    pack_imports = [cs102]
+
+if __name__ == "__main__":
+    evaluate_report_student(Report2(), unmute=True)
diff --git a/examples/example_moss/student_submissions/s1002/Report2_handin_18_of_18_0/cs102/report2_grade.py b/examples/example_moss/student_submissions/s1002/Report2_handin_18_of_18_0/cs102/report2_grade.py
new file mode 100644
index 0000000..13a61a6
--- /dev/null
+++ b/examples/example_moss/student_submissions/s1002/Report2_handin_18_of_18_0/cs102/report2_grade.py
@@ -0,0 +1,3 @@
+''' WARNING: Modifying, decompiling or otherwise tampering with this script, it's data or the resulting .token file will be investigated as a cheating attempt. '''
+import bz2, base64
+exec(bz2.decompress(base64.b64decode('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')))
\ No newline at end of file
diff --git a/examples/example_moss/student_submissions/s1003/Report1Flat_handin_5_of_10.token b/examples/example_moss/student_submissions/s1003/Report1Flat_handin_5_of_10.token
deleted file mode 100644
index 4610d87eaa7e3d39606c46924e4252f79b515507..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 65475
zcmZo*nY!aY0~pj!(dc0<$uCLFnc~gr&DA!ghdm{=Br!9mcuMUQZw8PwWBC+st{#qp
z{Nm!wq?}YRCqJnqF*7eUWr{az4{K&gYA#554{J$gNlxmN9@g;G)NI2krNuq$#rdU0
z$*CY&h+*tinFVQ?IjK{e-2X8!1b8#Eh=ARp+o%!jW7hb^gPDN=gn1Yk7&7v6Q_J&<
zvJLeLDwUL!c)46F5_1c3QWc6zN>ftvN)(dwQ&RO5LNYRo6+mVxWELwVmX_q_CYEF-
zC+6f-Dx|08r4}WYq^2mO73JqDlw_oW6&5RG=7BkxdBr6~rO74vMY<`OMX4Z0B`+7)
zu9Va?g`(85)S}|l_?*n*5{=wS5T$9Qz{{nepr8O&1Y)>nmZjz?Br1Sp71SZB)D?<S
zOG=CKieci(`FX{e#U+_}=?eL2V5^H0b5j*kb5e6t^Gd+(fm)`JUzCzsq^IDjm#zn~
z2`T|`MYN%gk&bb!rb2N>erZk$)E<RsV;v(M!&n84M3|MDP~C8M7Nr)K=9DPdDn!RZ
z%uUNLQpf>?1jNl&5K)kq;7XwkZH4F@s3wTN6d)43T)bSMa7s)`(MZ%u(u5iTRg<Wl
z1Tj)cNl5_`N+sp_3VEfuNvTD}3JHk`3W<3s3JFOG3MJquEX_+U$;{7#d964zw;-ny
z=EIVV)XXA<;?i8GC3XrhTNP{-619^M5u&UR;_u>brC_L#lbM%VtdN^oT%4H)3r%H(
zqQuPNR0Y5M5>HTK0)>BSifd6(evyU}Ttp!a=9r}Xlu9K{kWVwy6yoFa5_41I;}vXe
z6_n!Ra}zW3;^UQ|E>czqD9TUDNzGL-v{DE!$}CA$NJN-Zo{^cH0dlhfQXoLWr=Tb^
zuS6qFDKfvb2pY1WRAQu{tze{Jt56N{sF9A5W-Z7ap!k7l2m+^1P@+myD9%mH$pI%q
zB^}g+8*QXxtYfNU9;>Oz%Z12ssfkL#mp^9IMldrlfG{5e14B`2L4Hw*VOmaN$w1^e
za3(D-O4cjQ%PdJRN=!*LLSiap=7L<O5CnE4FBcZoFeRyFi8-Z-C8_Zc55+?Z45%J>
zxdKy;oWpcLam337wF~5slGNf7Q2Zz7Bo-GdfQvQ_n7Cd@YH^8kVsR=g?SrxdNJBg*
z(uz}a(qIyxcmwhE5{rvdi%MJzOA~W6K#D*ytD|6|2}uh$mFXH980aXNYU(KHTAG5>
zBS<OSI;a;kKvv+j5~>ijG|_<-AYg;xzJ~`CFBin~kf1ko%SkNJfUse9flGb`TLmTO
zU<E@1Lue!^7%D-$Ralx@49eTZpz=op9ELgyh6b9k3JS^!o_WbRr757?0?Ma3sR}UF
z3ZNp&&_E%%C^aRsq!?PF6(lBS$3x-=Y#iK`v7lHYoJ&LVlJj#x*<PU}UjbIgl;$ab
zGE-$q1~@x`N>NxG!?QO`Ko6AfHOf+plJbi)ODb)RpmB#I)j>lF5^AV<@NAZR@FFv&
zIf3687(f_Q7ebOOI1k2y^T0slL`d+0%Ibnjg~VcoyaH(6DM?H!%}Fdtg=HNWA1a-a
zSdv<jnG2VO@!?6TpfW8pJtwsUE&vNuUM^)wB@Ge)`x{%{_pJ;r%`8a;M>M1~$jmD)
zNKHnVmtPDwI<Y9dAhD=86)sR*iI4=j5-w4aQIwjP0*ZNMg_Qg}^%9u(LckIVNy&Pk
z5;-?BFEg!DA+xx+G*u6wxiBSH0j4h{AL5G=kRUV^!R(~e<iyhARD?0QU}Hc&0Xwn?
zRE<F$tmjyiUJ6Q~0U+lWX{4kUCl_TFfHIJ+x+}D7Q>cVg7oajxPhCeLwIDMmKiyVI
zNeS9a0<}~^@)e3o^Atc;1E^F2H#8CzAV~})&&y?}P*7Qtk)NlKSX`W$o(HnkFg~R~
zub>j-G^qakyqrozt~64}FGAw!8G=;eHb+6XP{9bFMPLOGQ~dHvQX#DYh>wdEQu0%a
z74q^+6u@Z$#nTEQ`Iw?Q3Z=!VRwyolc-Ih~n?RConR%cVq7KMtkd28Y3Ylrhrh^)j
z1&Ku^pa@G;$jwhF%}G_z0F^z7>8YAJ;HC?xJqa;f0peVRqSV6D%%ap{1(?>7jKmTJ
zs4g9F!%sI?As-x-;L;5m__>Ld3Q4ITr>B+X=<#y7<rgV{8mEbQ$*DRZmmygNYwBj^
zDY)b(gVRZ|esX>(sHF<ENgv`W<M`x!P#dQtRj;5D;^YKWg$W>UCc=^cR5#e2c?!uH
ziFxU%3h;(8sJK)|*a&I86_w_p2DWal0;&~y5VwF6NpWhbLPkkRL9vy-eoB6Fu^z<x
zdih1^`o?;e`lX->KtDM*1=MoW%P7gs0k_6=KtYw8SW=Q&6c4V5Y++ejFDS7*B(<W%
zBQ>YMEx!n&Mw6EdlBM(#Q&Qp+p?OI|UAItOM<Fk<D81NL-CkWsp`@}P)wZ~#NJk+h
zH7&6;r^MDTKQC2BAtN=Xz*gNKl;&YYIwVcP>m`j;y>vY*aJto0$7!8zaYlZ5Y6Ylx
zN=;GMQBX((w{LBgic9i~QsYaCN>i0|6rk1xXXKZI(+5n0eoAU_W>G4ri4SVH6R-vp
z(WNCMSd*AnT%KA4N%5e5lmgU*Vmua==H-@_q!Q&5NCyFwc_58dJv}{5kQKR!c`4vh
z2xKQ7s|pf}ixYEl2-)R`(%l1TLX>rS3ZccRX{9*|<r%4Y3Mr{crRnLQegMc;NWTRZ
zyJ*csjUsRhQwLtgLDNMcsG|#ILxKXz0oj|FlLO^trssj87uxNJ2W3}Vx5S*{R2@*y
zraZnRKPNu5s0bnkYd?WfrGhP}*eFgd(gP=7P|7XVfVM3%)8MWFWm!-{1s6deeR_o;
zAy63!5{5QcK&?Y~dbL%6sDm`dKvJ1$3QBrPpxz%$5t2TT0+_Il0@&N2b{nXdQl<&Y
ziwb4PI`xVRaxzOal=PG|p}j<q0jW9Qau~#fVVIc;whAD#U|evc6Qm|HO(7$(II*Op
z2p$DW&}5ks4@t1#;8fBC`yJ%t{9?U=#F7lX%wkYDL$&FlX(|TmLTJJgLrA`d^bcJt
zl2gIOw1$$M0=Ro<r4W*ls!&jrstYq-0pcd`n1Ygy0?aLmNyQ*H;dhLVf)c!HORdN(
zF40qP&PYwphU7?SNern2a&i(uRX?cr2Z_MUGzCcd1I0U9oI@p`F%IFubwLv<7Hu#Y
zs6HqcR8xW?29leLbrebxlX6nyQxZ!O6>JsIvJce1NZAG!!O(<XP?Voulv-RIpOjc+
z3yM65>!2yj7M#v>6d>*DR7m#FQGmL{7D_{nf)$dWilA5zxtxV6fJG5P0Zc>(Vyi8L
z(t(5x$diOI$R2q1MdpB0FvKJ*85JpQK?*~qfTH}e%;L=ayu=(>C}!s8fg%{@2w1yX
z0}<lTk^rOvET~|M6de%DL2?i)Q1yd)9UwUnhR7=^fNX>4N&~e$q3vkB^wg64(vsAo
zw4%h^)M5>oaB^u;QEFZZSX4t(Gukj#50v3R!yynu(m`AWTX-f&N-RzV$!eq(X+~S=
z8pkSVD=5L6V9;)1W*S^QI1dzSfQ^9_ib&1{Hw>XIUQl&dtdNmdmI`XUDO9GGC?ut(
z<|!1Vre_wHq!y*7=qbeHfts#R0Z5*LC*p#f)WqUcaKjkXtO7aQ3KSY3>p&P9LUwj`
zN;(P<2SNOZB<TqmKm?EC<tFCkr51s@NtOAf3Pp(^Dd>=-9>`ooE&`1SLPvOtL86dq
zs1%gjH40(AR#wPRuvMtaEYOJ7$c$DmSC7?E$c$EpjlV*<un}1GSV)PS2`-WKK%Ils
zVhzn$Xllt&u%*Nlh`&MZ$t%!HEKV#cO03k#fSL^*=gWw;(lLnDQ2^0~P}(R~2jo9+
zV@)9xHkt!!sRfmS0t<NnrJ@8hhyoFZg#l<>BR)PeFS8^*9z3R@qo4(<!gLh0w6e=V
zESO4AoD`Q9q!wvt>cMrOt3|jaIJK}eHLoNyF$ZL+Pkv%bY7w$yic273FylcENlyj4
z5H!r=2hJ3rK^7eaP=^X6<_sDaf~f~N2P6R=C<F~pz}$vm2uKw|J0ze%x|P8OCnpxC
z#^<J%WaOuSOaTopYoO@Ri;qvqOfHF!*UL_=EY?8I;W;23(MVM>Xc)yAls-^R$Sum(
zKz29C_RKVJ_cjR}a~jS%3ZU*dNE^mT7f3Y>gKY%6(HX;C3fc-e#R%_#%tH4ZnlvQr
z^osL~N;I-lD{axW=w;@mq*g!^A;<~Pga}dx(F=-iP|Ojmp+J=<tp0(pq4f-``a!FW
zAT2m}?StH`gVirkosjAU%7JJD^(*4jauU;RLyAg4t-;Kk)Vva?5=01rd<4VbN(QCg
z1Z%~k7^QWIqjpQmOpnh<1top3OF(G=Vq#u?xq__%Y|ut8FTWhA{fW?pRG}pnCue5H
zCqYU;TLswgjvi!`Cq50_C(}>@6#?#`0bM0fUoNl2Rw*SvKNnOu!hD(p8a#~2Q_{=I
z&&<<Mh|U4GGr{u{$aX;5nxO7sv4$q7W1N$kr;(#qTvC)-prNU$V5eXZs{l<JXf05%
z4IqbrM-rel5TvY60#!~5Wl9R#3i0uvIiJk@y!d#iF)1bSAmj7W6>Jsq^2<SXrGZ9|
zG?Y|R^i^~9RU;KtJ*-rHtyF_y9)g&v6kL*6RFaxvr2sM*ZVc2|P$q?RH1xoOr;r%H
z)&zz+2-@m}>VXP^nsT6~6e#f`MN6@QwylB^s4WF*Wq|ER)d#T+>Q3m85@`Gj<kDgt
z1tks8Se33WD9M5&0y1P#tf>SFb8xBzNr6+d0w|mnlwf{WR)CnArUWiYQ=pCHV(_?_
zl>&Hn0z75~%P`QEJ*1JYqo5Q6ZwP^#Ik46ytU$~2QLt68Fo1Xf6g8kh8e0WWjOc*~
zSc)x9&M!&@O`p_4l;(iTdIehrtW^NG1qVutpt3SgM?s@dN1<F3RA#2;mF9vc5uxo{
zJy@%@7?f{7T0mG?p-{nAp%7*{R46_pGbJT8Pr+6JTv9+Bf*}VQ2!s~6g?jOj5svtH
z9R&}tW@vH&=|XE;!r~p$8PYaXP_%`25|PpZNM~|>UP)$NX)3}6#h`Ii1zQD3u;_s(
zP>opZR+OI$Vt}e9jY1^L3&E)r<Vko4#Dj$(`4HA|E7Va?hlLPCUR@KCLO^~4&3b@Z
zh4JwSmlQ&j#e<U#s1yi<P8KMrW?Ctz7AvW0<Y^n~C_o&5<RY*J4HWG<3aNQ1w(ztF
z@_L~jtmUL&s{l<l5OG)&3Qas7oM;r372Fd`GE$2aAPEUPW1Ly60InFJGZ7$Tl#y#l
zgr}4h3ggQ&OETi~OG}DN67xWV%i#75xFcPXnhOs^aP|U?EPxVQp&p1;49aAn*adOm
z3iUD)i{nA_+NmjElj4zT_)u`u3OvKBhY}#5_(BO^Wd)DK<m^g>OOdsLGd6N{qhJfE
zx=_TRMj!<OvKf&1T~JvGs)a#81j3*(QCkJDI#B9@wDyqaP(YKGpoTp-d~LxBgTVgL
z)GI2@(*P$|cqRpzh!m?usl|Gr%D*_MG!Nl1r04}z5+FszrOC;u#l@+`C?-K><P<O!
zDQGLeMN>gD#KoGR)=X-i2FS3q#LS%1qSRtd&}=YB0O16LBa{`8+zA@=C@)rUfQum|
zW@QB=_revz#PBK1tt`qf%}db$Y0@ZH(1IJJsh|(HNkLN+TwTIlW2ayM$(9Dl(FC&(
zIzoeNnu3;sp`HPXk)ULX)j&}EfG{}gMCZkVa+G?xx|Kq?jsl`11L4A~RJVdVTt`72
zl=6$!trQC5brjUW#SDl8W<bkxkokprFx{Y@Cv;5;BJfeNKFp!W-Yqs%uvJJ?($dmW
zfEPN2)p^>6wb14P$dY2vBz&5ZLN&s+TK(#BWF?T2sMt_JTLCl-rlp{f=c5ZsPsN6s
z5ZXvnK@*gCij82c6OhpmeUQF5h!4VuN>4Abpdd9bMI$;*3Eg!%3Ta9h?g91rAf7KT
z)`7>o4m?;DY!x6~O>ne8lN2mipfRqHTU?r}0Ta}OITk6HLCFlF3MQzjpsAp&;G9@o
z0-7R#4C#Xg_#ke9wmV=(f(ALED~V9#VTNHuB<?mTyhQ~nY)~6!NbNC*Eh(UtFCeFb
znh4N#f-bc601b)U%)HW)R8X@lr9@xf3|dtbrzYovhOBKBQc4tb6`+c=VA2ISMLD2a
zG%+_RB~c+$N1@nCp}3?-BNG(aO5lc9F*sEegIi9SpgP(RlJUT`6vTCqbdaXx44tk4
zH5s)P5dPCvP*TtUHO)ZQX+Yheqo4#~DS_?MQBcxW0Lw$2tfQa=VS(h8G(qh%h;3L>
zm{JI637C?Of|8Op$obGngGGv_wvs-I1S~c+6+np&lx(4+E8v`70y0e9N<jmrACVe0
zbrjU03(VB5AXO_gKSMilP;-!n8hN>35WM6AHnatsqlNK_oq~oAX~E}jvx@Wc;2fms
z<D@DhxNt#ca&``4A{nF#GIo<xRSsI|qX9Am)J@P)D9O)G&C|3}PzGg&^wbiCL~!w}
zke`%RTAU0X$pv?@Q=z?HP%A+pJ+%Zp?449)q@$poUyz!ouBibwNk>7cyad$rFIGrH
zYSg9aq1p?s&_G?@ba0~uwmw25Gq(WNOf5=<F2)1J5j4<qLD@dH0Fo}0!A+4|P&))P
zA_X%8YAd2$4=OIJbM;`0q2SAs(iChJK*FE_HCO{rSs?|~{DlpTr(_m^ntvK;&^!kU
zq=I;mZHeii#yYyXc&H=d<267ggY?G7L;8Rk>U!#$(FU=gVIPQ%ILrj4XClo34cmkJ
zeUJb_>Wt;;D5%GSrxD`g)e$oZuvRZb8lqiY(+a$*1-w21)Tc^>tTKVDJ+uM`5xA8T
z9}f>hP!mEu7d*+V4sOna`wP&J2W794e0;$K3LBI#0BM032Ms_4TZND!So<H;VZ&)Q
zNkOF-5At)g0a8;G-CD3uKp7b1CVIp-dKy9sI%o=kuFHTfMTNw*GORc$E-6Y)go#0w
z=tX4~xMhM00FWo3+B5TEs=z^?lbM|wpP!VKnhdUL^7Wi5OHzwH{WWqc<Et_Yz};A=
z{UB~qX<Aw;c;FqO5-JTY5zuVbK<Lp?P%j51!D7%DF;X-tgZR*50csM+wV)1dQGR}j
z4rnI7SO+{=1)hP;FV-th%*ob34j&}rV0uBG0~HA%x)@C!q$V>BY@}XlUP>{@<r+$$
z1xv6(2c!ZSr-9N7sE&uu+kr=WAkG6>faGpuU1dl*ic)hxW@x~o8QlcLJRGdBLG~c1
z$qMROp{7z$hEPCO28mf@CxF;hnFY}B1$#qBp$uH?f~4SuYqUBv=F~y0UPP>cCRV_M
z^ROWTBppaLgLNVCAr3)Oi{fywY7`Nede}?@Wcf9yR)Uuwu)GM0IHXvE4W6UN9>Mej
ziwIb7r)i=`KFA1A>{2fo!7HQ8oKzfX2BrjuG-*i+DMoOZ2TJ-1po$w$!c;GU<l8jl
znjDmRkTD{z%Rnh8Elm%!HVu|)Kq(a|6Jqm48cJ*<ITzu?G#v$;ZozLqqLl_oS)jxO
zEe~O9a$u`(sJEakv>3ERE3+83%BmzE)L;UymH~HVK+8;^bA#ZKMFrRjIFRe$3)3KN
z+R<fT;6?YSYqUnzGBDk|eAsvvq4h;BnZ=+L4+=2#3Q37Y_*O`Pwx8rACJ{0gyx0r0
zb}1(@2{s?B4z5d(n((Csph4OAlKlAO#N2|?;=I%n=n%AyLVjsUL1{^RN@fvw(Gje`
z1vRxH$y_hb2T~P)=1M_*ZtzM{EDMXU^tbRV?EnuD!bkq0Q&*57LSiPx6pA5JUZAEZ
zj=3r1q7cCb+Y5^X`1%o$-}DfXNs@_(*(~r<6tGdy*n<|CkWM*ba0be^Rnp2sRRLa0
zie()KL<6jQioB8os$W?lF{d~mJOmFZ%)n(Tcv};wNQ15*12?aV_4M>Wr5PwlP`h!E
zXwFOnuZ2MN22wSVnFbxl1Q(B)c`2D?nJJ}-Ind5QF?ik#Nj=CGi0hS{Dit6J5!90b
zEtk*(cT2&J(g7{308KK1Rz-v4K$Uzk%32DLNucT<+^d8pO-%dItOjX<S`S)+fwgyo
zq{gu*6|_YFw9iXFH$NpaEi*Mm0bxl_r9x6A*rl0y3W@1Oso*_V3gFt%B_y<1A+;hg
zSD~mhC$$(fMglSzhM^7y^-p0z1)5lc3L~t5Ny1_Xq#rfRk&VC;+K{afpr8f^C8)s!
z34J|1@KO?x!7vO8)@&UGaL8gzQlZ#~C3y2Pa|=+~2@19fXhR3N&{PVu4@Ad<hUr0x
zD848av?{GEH9jXFGN_>gT_g<+3k6%~GIKqsKs;zg5L_FmJp)O(AY)-z8L9`a3~oA>
z4gho<2h^|z1s1eyL`<M*qWBMsXFy>PtqzGyOdG*%Yh03;PDe2e+9U_<Ovp^jgoF>+
zJg5Yu#e~Zc&?pB)HGF&kQz^6%h|UHz5<!+@Dp3Y?c0i-h(b?dUoorBY0x1QFXM@X&
z%sd6CL9y6UB`97X84)r_j&0Njqy~nSVWxqGn6$K@MuQgZfUJd%IYDcjXmzMG*sD-B
zECYcShQX^i&>T0~{5GQggCvaf)RN@#6hxvbNUQ``p82IE;B<$S8e#LR@UR8V{l{m3
zr|6Vm_Cp3P5yO^X{h;Zo;%Ifq=q7Z;qYS<@Kq<aVNgI-0^x%{8pgp9Z?1B)1Y-Rv?
z2Q~@}vlCLT+A1ii7RRe*#^<NSt7fVeLyB7^RSk46!N&Cwj?{rV2Ab4i=E3@B;EpmP
z;6S+pG*SskH{j9`+<gIS1C22xK|3o*r3YjfR4=78w*WK+R+>`+8c+Z?TtG<xe<cJ-
zNQn9rqys7j+Q^Yw0xHB)GE2Z|722E!2f2;{bj2Q|D1=m%nR)3sun{%nVjF5AsNMkk
z1R5BqmcbiT;94NRv_v5>uM$*#!E<XdxVVLc4M;DnH>u<YTBZ-$;RGsvi}Q0+!CQ_&
z?YOj3@WKVixG*F=$3ymTlw>BBq-ub&HLUnFjE5)yt#1XVR9FiRv|>p^DYYUsSxFOG
zq9N3#=j10P<{%b(6@aE5pm739?!_8OpfM*s&@g#MY6UFGz}ALA5+}5E2X>AoOo?ql
zjt*$vA~U%JvLp!Nb69z-SDacB4^4m?1v$_#h4%$PDIAoFK^S5Q%*_h63hI!;P9eWI
zCNCyWS;58MFC+%B!>YKXG%ZabBef`1p*S-yITg0#8P?Z>@2Ejqm;*8h)KE@NOwLG+
zhYW;6M&2O9Ti``th?T^k)~2RaOdcp6p^gEqJpnI8hJ+qO4*N)TW=<;DJWYrqXc~uQ
zs#MU@?P86TJeUO_OY)2La<fx1i$KC~UC@<eR?y`!N}wIWpo$*s2~hQp<aVfCh)fBp
z;J~iXQHW75Pl{33QP2b}I8B3k3uG&rpCGvu9xOVb-4_KQKWFCW*(&8!<t8dYt;tLS
zwc(QTi&No_bIH$3RRqbS1~t^TaM!>*tqg7sf*q(}tB{-*uYphks%*f1j4vokP0Or+
z6nk)aNccdL5?ZLj6={N;5tE0AbMTM|LK+$h*drIT!xTIg4@qUPjd+mlUa(PL(DIJ_
z0&vlSl+YAP64MpRGjnnjK$HD?5Vun7Sy1H$9sa}>prH6HDXN6}3&aCq9O<DbDF#+l
zLtF?_3&YTmMNb@{;zA=0Poe<nPX+IRP=IfR0HwH8G&e!Z+mIqqqq_v!nMqVgN=#9J
z<SlU0P)IBRt^7mFOCUQy7;1(m<YWX;v?_q6z7vazL33zHkRle#sSc3-M>1%^bx|cq
zX-aBNDrj$NiH<@(XzflpXs3Tlet90qy9$X4d8y@~qz+mW2TI%^yI~mOhE!;lfQf<%
zK=4p1#4q4wQW|McMc}bGM2JH}8dSAIl50$!l9EzPUV3H;XivF<o`Ra10*C|Jew<mN
zpqs0p<PY9rQmh1%Dkv?^0I?McG7I1(VR~kXc5!irmA-y@W{E?3W=T$B5^Rf$UP?)+
zUP`upNohu^K4`5jcyXg1$QoVU(gH9K<QlL`pgU~!V2K`*EkSuH2Gl;wFDijAW`Yak
zmFB{>0K>(KD~sXm<oukRRPeqwgji83TpGT!79moYl8fME<|5QW!Wb?GsxUw`nL=hh
z%)!AWMVWc&p8hd;U<r_aL5prcD}+ER@S*uX9#piZ=H$7gCg&F=mgE<~jf8d?Kmh_>
zHG`PDudq_cE6@Ya)oN5|f@bibRZoguOde=e1d7t)(p-%S&6vF0w4D5W&@@gCWCZ}k
z6tEyz9#Uu(r<Rl!fJSTLlPV$YPYq`saDONzvj|p*g4zcPwhEvX)acWLkVK}e0Mi0#
z^n#{AAj@T8;-Kw~xv(@0ZvKPjI$))0W-+Kvf~kdBs|-%-peiddJ2fS<s8|E80%9#R
zUBg5nc7TEq>`Le=MQEu2DxotnQ&Pce_F*=FEPxsUs)`X>ee%=OQ;RepbreiB$Ozb6
z1lSlI1;|_(OaaI^&<cFLlGLJH&^BJsBDKn5z2cIT{L&JLo8fA5@<GdXAqIdf21$Ty
zfHWFF#^@;IrWO~2HuXaN08#>yfSV7U^MNVDv;ji_L<z{Aw4Bo746rwlov#epPYRY)
zfUNQdb#n4jQ&T`^)#Mk!cH|m^Ywg66%%sem%#uoI4Fqx_Xq`I9Ly$;tPAn)X1?3G5
z&?<bGRUikT1toN61SG7$V~3z6{-AB0u)#dU1`CKUK$d}nBOam&6x!HA8nWOWw8jX$
zOB6{nq1_oEZ-8upI5#y9w9OZ`>mwQLu~g88$^4>XNZS;&wjw1z57dY(05#pA8+?nw
z^*d4!p}QKMMnFvxR7qO}P_YeZnjp&{`64wZO%JrfBQq~OGas~!7+Mx-Kx+e#4>Hpf
zz`7w}fs~#=lEn!7Z55zNAFLW~Dw0WPbqj`mRE@9@1S!i*Q$P(gbZ0<4l3D~RwxEtm
zEh<8I6=VuT9HItR>S}<NdF7_&<`-2eWaQ_hDrBPPHdKp2O+l3CLs$VV4nV$uxg8q&
z73f=jV2K&*Dv;Y#D@s7C;y`*45ds<of=;hOmWM#M2p|P%N@@-ycHrR+G7?lLrlu;C
z7ASx_a}e(#90~~sP{9I9_aN(`*#Myg7U`&-M-O#y<U_&}=5lbL$K;{qU?UB9W`=p4
zn4kgs7s-vF!XPsrSFj*lUs3^DuAmeH-+BQy2r1Yg>v=)T;!-P0iV~Ac;-MlMB^4z|
z>cGB&#tpg|gEi<u2>^t_ZiftwfOb_@pr>o7k3s7UA*WY?5-lv|0zFGob5Zw@ffmoh
zA`iS~RRL1KK!P3AWJxOp&DDSk9jI77s4s5-;egJ{$psB($AeZYf|jT2nHWK&K%FR1
zTOPF6AJ!vBF&up416UTiIT>Ozs1pP#SV22ZLGw4MMWFUF=p>gS@LVc%P!3vpmZxT>
zXMoa$A!r#}Mydi-0D5*=A#{Ph9w-<<;Ri{eDBJa5YM^xtwBEs1xxn&INq!D!`wn>d
z6F5R(;gnenE}hYH6eu&ol-NRYHe@BYk5LeGa2gV3AQz_Qz^zFwE&+u;siuNYY=U_h
zWF**)&_)}W4d1!}A6i7%uMBZud~$vf=$tv|o)@GT#4dp_0Bi#+P(iEup>crXBEmH-
z$l)Li4-L?XeW11nC@EqMVXy*d_=0>3vk)BT#ffRD@#(20kSzun?HrgbD5(~bAu<sI
zp=j13)eU->8WACatPX4@vdbVT!7slk7wjlVM;DYWbQE9{m7oDo$e9hWtO^YnP(rkY
zWE(W6fn^{uS(2ZFa7s#M8fft&Xpd}Cv4(;MhymR!3(KsUdZ1I)bU}R#*gjgALo^|B
z3P^=%UJ+<zW?q3_abZyj$T(1cLji1!mX?B%CU`&u<XjL2Ck^oa1bF5Ll~hH!umAxm
z0*zZ0<to@Il;r22`3lnYO;hsAFHuMZ?a%>_ih@T(a#D*xN6;u#m*nTvS}Ww`7v+Lx
zCP5BKElLFq*Oez0D^%wd<<?^FP^T%mLe4nUh4jTUL95<C8jBUGL8j=H<bztQ8lc1N
z5a9`OFxXd+Xar|H4OmDb$6#)8x-DUcgPaC29F%AwX8ITnmV}{zBT*oy2XJ6uMsa~&
zZeoQ7C>&7|1SqbNq$r7W+gfXdl+?0J$hu`nWFr}EJBXv*wpK@>IuFCKm<a(^TMVTH
z0g7|bR$WlRqpzT0n5t``pbaiua27yNd1$$WD0~z&iB4&taxJMClHia^D@b|+6;WVk
zfy)@kbRs0MLD?CEi7jYA`4yxdhGF^!T~Sg{lnN`AU{yId5g}J7$kh}|bq1YJffdrA
zq6uLhPUAqQjKWW#0j(VZuNeUklx9NDQ3RFTsl_G53ZPBApaYOVQ&s7yCE(*{p}P@^
z^3pY-jXh8(!$uQ8Y>-2szJfMWz<xp<CqVHb?gLdp?K8-F7SIe2C|)5c0%QkB4r(&g
zx)emwj%+@-@B^t%E6u}F3&4v$kfETqNI`yPUP&?3Xy~*HY;*&>kO-FcQ3PRbfC@so
z@K6r?6dLeib{*I<CMXYEqqYFL$4S9f!4TqQP|(8cKxwgqBtT9FI}N5H9_~@(kN_!#
zWCkTWJ39sNfw7QoixntrLDDb`Q3f*(9!4N(xMi?#h}VFz@L1*wJ;)5Y_Dn$|FTW(!
zN&$3o9r!2~@DVHpMfu<jmMPW>pkZZ&lGKV4=uDm_4kyB`hGhhh6QQkPcz+hkho(nZ
z=0F52=3EK<j3m%#Q4r)<z7$ZO2Q(s@n^~bylAoRmnj?VB$AQk2PD?||5g=E9FeDt6
z(1RBiurL=w`A`RHKvNHdLMkbVnNb0irum>l1HmVtp|#aOPJ$|ctfj*u4^jhlc1%p3
zEwur9P=KrhVThG!O5vd6)=G*hL6e&$kn<-&nHREiS|LWg8l0a&U5VNlb<n!3B1j1V
znkpz)NX%0Jw{xtNbQEAC*&x%AF*v8d(hVr5fcsQP!HldJIw=4ex=2k*OwL9m8e~-v
z$HNurK@P5nPpwGS05!IemBQE%ElSi5UR!M83#~*n3=pe5P_i_<qXkWeu;bG3_3YrC
z1!$rL4cF!87JxcQ$XO9&bVh!8JS@CHhkt@20A>|h3WNp=Xg~=mM$k<`(*!mUW&^eu
zh3Us(DOf*D4x}IA4<rX*Eg?W<0jTOr%t7xHfg%~4PC-c*UKZQJtUy#$w$P#p$tn^u
zInF$c2t~T2FNk$%N}#>@umT=D#Rl>|j+~nUJDD{%u_QSI-mM0;NlJ4{^c28mLGv<F
z=zu~NgdtX9%i@G16Qm!6!7A}38;~OGc?To|!Z2AwEIA8YQG$*U0k<WP>qgAfgh(t%
zekCR)Kpg-b`a^P(At)C@28RO!Ku5%b#~Hz+jWDNx90*O4&`b<DMFYdV;OSqG*&yr=
zy%hl#(U7C*Gr?`hq*U<nQ=lW%oGM}GqUtCl<(FhYDs#}pSxIUhs3rxi_=V5Gfsby5
z)TJ8W!#)#>70Od{azJYapk4%z&le-g-$c-wpVT~Xtqg5AfR4)m&FN@>PKrhKnL<)(
zPJX$jo`Po{WO84jJijOfbS7a2$juccNVh#?7F&S=59C=8h8#WtGtLow@+mZ+kRl5*
z60QMS2?qBSq;Z90a$-_`8FHFMj0}S{!nkRm6B$6uEnz0<LQR5<nIpmgk!(;y0JOYL
zN1>#mL<e*TH|W9yO&tXrSW<`PF*}qxzzPz~Rtk_s1&KKdkN^j-rvrIDu_&`RKM!Fy
zN}|9x^%6amfEw_i%QjMB$tDwY%5iaVDmebY{y_Bts2+n@21=%=a^M6CS_}t@KV(lL
z)e8{sfV>KeOOQDrkCc|ALX$hx97sD0(pZP(4N$~`7tFw?Q_xyvpp*%T6(mbRx**8~
z>?2g$Fw+cZS_EnC1Y#UgngYoe<;ElLT+k>6O``>+=H{1yP7}=sABhRtSAx{|ge4<e
z1@t+WVr0WXBj8wSaY))JMx-1_EI_;lUd;mb8(NGMr55WbplE_kaQK66BuPyHpL6G%
z3ckHV19WyWETkR4g%o5O8)6kGqT)fF-GaoTRQL&gpeCOVcnw1_Oe>O`kQS2YL2Y!&
zOfG><uR@H>OD)G{oDQUl0v(8lY;raz_`$=AU>Aa<VW;Im+zGNC)HzN9WmV7u2T-{I
z5`^Jw@IhKhdhzk#YgtlL;^PrI;f6-Xs3R)?FKCX=POSvzJP@6kr;rUk)Ca@?H99i$
z6f{7Za=}}^<KsaK`apcp=qo6gKq8v42&<rZ0Tk+>$pylp0Ln68_rVV~aWBd*EzrnK
zElC86+d{(_IaXm|2Odoaox~KH2WF<gkCjq_I0<yRc_!%m^my?8yA;>~R}k3}@bN^T
zX)Dkwnh?-p*<#Q^CJOm^3ZOZn%*33`D#(DMMnO(ua%x6?PD*N#wL)=f31ndeXd1By
zd_X&FkOI$?82YhDsE&axN(9YsK%5s3K3fLf1&0Va6cptbq!yJ_Lb#yR237_xU|`__
zN)@1nC^+ANr9u1lK_;V>AmIE3w<j7YB0)yvLh=ykB&c-AYUlJ4Py&pGodN;UuA`7%
z0y)_eA_)>hPKKa04Cy7XMf}l9(8;Id)SR67c+f!}u!SE=v9Tbv(4|j$nZ@Af*8rIg
z+6jns_*i<0jsm24f#zUP7V!kR5bAO?--7%EaUM8KV8_-dcxu4rt878i$o(j2dIkyW
zLBa`?U_k~sK+Gsk1)cVeEi!Z<)f#e~AQ_`z3z3E!hZ(P+{DnJOL9%#b6`}w#2?Pyv
zq=OtFE(Uo7#fxA~%5X=4xS%!FC8^M57ohY85(K*o>_bfdf#f0HgP8-;1<FuhUC0_h
zr}5-LFBE`Q&n2LW6gpN|l$w)TmY4@gd*Hj5U=ambbC{Q$ic}eaI!Nd?#wX_Ffa5J5
zrV}#WhU^GXssTkNDB*x(2*g1zV4-6fASpeVQ5XlEVM%YO8o+^oR5OCYAB0g=VJRqJ
z>(O9U9pq9QsD0qF4^#|7*0d{t`Op#&w!;H5O$do~nEOGs4lK_j@52IRcxcYT+&YFN
z2|eLZL0Q2!u_80KG#7l4l|p%DN=XJRBCyxFMXAN9B^t>&DD^8S9yAJd;=!jGCg&8x
z!x>9lz|J!%1g$d%n--&v9H*c_1>r(Huq3E*hWH)3dvZZ*c{P%Al9A1TW(-(?l%84w
zR|WGOC}D#STfs=#I5dMQMu=K?lNf9UWbg;P1qi;w3!)Ah#~{xj9rFTCr^s;@4LaEv
zR5ODXTY_t4B#j`=ptCDLD?4EWfoPib;=w1RfJz9E3DE}71OU>CWsMhM(?DSbYJ@<7
z9b^oW9@t7x*ij5HDWt3c-?s;H4$?YO*s&Vm5P*cerj7y@10YQnP#TBX2AUNHnWlka
zHu%tQO~_&_(3uFusRby`05?Qo=7YKd(EWrUlVE!Z!COW^egsD*xLE;j{(&}LCBsh7
zRe(;WfLEI!CpOUifth*fpcsN&?}y}N*g5?$f51WwIS4?N79yy@GUX|mMLLl3A6g`1
zS>6j$sRQbvW~11S6avr{A<!NMY`_k33M!H#!MnCVrs<*E3p!67epo|%N`8D^ehGLV
zTYP4oUP@vKsQ(2DI}k=G1Hh)i3oEqrT&M>we!yz-d=!)wf>TQra*@lSoYcJZk_`CT
zACU2xX|M<Y4LE`txVRccC>x0&oAlrtk03FM5=3ZO1hQ5cY5xTD+6S;}v4$jaT7c*V
zxfiS+*(r#X@Ziz`wz?iQRy6Us6l5$`*McNKxg|}>P9Z$8C@(WF9sf-dIttaW6bVbA
zVE1D8Uo9xap*zJP-E;66{h)LY*}3B99|BH?pzdyF9%$(#XmBSeHL*B9uNXXi1KMDr
zkW>UZw@d-Fn-_HGa&bu_^x6qMXpIN*2O<PP&ES%v%;XZJ<b#j}sYM@9K<>FBRN@RW
zkP(m}LXbvC76g?7;JepA;Q`y<1-gOF5H*^EP_Dd!j7)(KVNEPbf$wktPhf#>drM2q
zORj`<G(h%3Y7Mwbh~*#&&^8kAp-u3e2cSVt@Hxjtpt=yG282P`txzW(-txhf*`OAI
zR{0?;0U1yXIyoA&6frY56?$5sg0h06LVA9F3g|G33P|4)T=0O8J_e<Nl6*8nh&$pJ
zRTGlWkPqfZI;s^iqncS#iF`6Esv+PlvS`i+c?*tp6~I13)l~@gDM%aW{6Lhp0NA6@
zF(1s9CMY>TF69I7+dz%}%sj~8fI?O&<bX=hnS9`Dxj_3qp(`586D#%fklMVE7GFHL
zSOD#1u0^;M61NIOL@wes8*p<fzBsWg6=EcgMiuA^1B4>v1O*GYLOqB9(J|`aL<1gb
zfP@>ug)qg)o`^<0eHpZA9A*}(Mzjn`q*>K5>UsGJkl+Fh-NvIt7$_fr(p5U>1b8F8
zg31_mD^SZDDO92DI%Fp!CjjKK8Wh{`eY2o3D{wi4Irv9(M8N_Ad`t>>H*PU{aDm(c
zDt*w$@<7A6&=OEt!54Jkcu{^5D4jw32YL#Q1)wpoypo(s&=DNzB^jXgb4iIs3ZQLk
zDXFk=k+Q_1%>2?~g|x)vlKdi&uksa=!S?}yya6730%<I+%uUMADTb!hJn%Yeq@Dvv
zEvWPc4ID#SUSJg($i-s;_<Xt?y|m1{6b&U+<W@o<Xbm!WQ3E1PfU5T7641h2s6SyT
zA``S93TjG?l8!<_a*4JfQsoU&2f9rHq!qlT7iJ|$ai+E*wgo~UJzz(GQU{6~Ky8Xb
z^hr91|6$_|IZ(@?NeO9K7NQQ^GXO;*`j{$8Btm8Zu*EaPJ>b*eGn3;%H#&p%M1zJY
zKuft})T4E^W9=0*?5)5!CMHEoAtpvoAtok8TR~Hy1}3Tv614{{x&kSUc1?{{h}PDP
zwTCIRk5Px%R8#>zbpYHJ$;?UBz-lw7;j9<t8sy|3><aZi=(0y!g`x^@+$84YAg$Af
zNJXdR<R_MBB!Ulw)`(Hpi%|#V&_vM8u2L%aQm{nmneCtxa}y!MP>EnQIXTb{OeW+=
znZ%qNP(+#<7$7ANNWBdTR)|kP(Td(2P=Xf-h%0{e3M#E&Z6wg@+<b*x&}<BJG+a?h
z2b6_0KvqJ%3XST-oE%UF1rKZ~I3|~5mZb(j@0x-qeNe>1hQz>aJROA+P<t-12(sf{
z2hzQ_Rm!adRj}|;c_kh2BqQ<&K6Don!f&7wNe{GK9(~_Hd{Jp0sKJLiBnb)*h!*JD
zYVg1UnsML*iw*RU77u~7fRY+0Qs7$^!J;J!`j8GuN(rdL0<r*v!EzYR2lZ4z6Z*(r
z0tFvP2M9wuCIz5E%2ok%d8r<V&;VEJ;E_DNJZSiXl!IG>iABf_L69)SZcsA@RF6SC
z2Z{r5y$_B6<U$Fo8Y#3e@;_JshF6f%9NbROGLl5lh%|%&y73Qki>pRSVo`c(3B(6Q
zrO19j)2s(^B$6k=)`M!?c(7C|*nC9W3>JJK4?<`BN-+08LdUwmX2JZ5<^zme5?qpB
zPykv<lc-P(Vy1$dfAG|)r+{33qnM1D=0Gt88oDMS7$MtBkpcp3tOPVn1WG924d{6(
zkVFU)0JTR!Wj3yUAV`f~X#wb}84dJW1MCg3g5;e1;#5%j0YwlD!==HUeOS<gWD%RS
z^uSvyk#$0g3Q!z^o0%G#3c3*If`nkv3NsB9kwu_u2f#OYLsBo;22l8coCa#87N+E4
z<_yRw4z>uVfY%jdf-dm0H2@W0iDmG+?LhbXLXso61kh2)OU}<Jwguhvjj$4AEhbJ%
zEP`IHV;iGhodY@&t+qNTv8c92A-Xy>C$XS7HKo?3x+oRYU&_o&uZ;yok%F=UXc=c_
zNqli~Vos`UN(qE(8>0?6D!drdGDX-9YEgijx<#PNV8QuTFHhGHe7>~{WDh1h!Grgz
zf;QmiR9Y+Kq=N2e1C=3(B?^|7s-Sz7Qx!_{N-}d4;5wk~7?}5n$RHr4@C2ZTHGQBc
zflu>*M3He)QEFl~EV^M5proKzoRgYb0P$%G@&-4MB81gQX%}RQGPIKcy`UPg9SnSN
z1^DtT@XgiWfCFu`C@w8ZRVYtY0PXpOOnT+#rGk#3$;~eUjlM&=$Qb28UcLg@L{PSe
zD1i;ngOV)dxS3>7FC!-hl%|ujK{xo7fc9{}id)cFgpw}wo~7Kx0u98@^$O73Vq$J8
z=<*quQHb-j^uYIp!Ri-iegcosfvg5CyaiXl@u0p{d`fCsW?pIv^a?Z3v||R$0iYz6
zoC7|B7-<X`WH@LFSuZmevO^xG92D%CY2aPbaOZ)VBA}6M*d1u-rD!U6a4|Uty4VEj
zR!~_4iYt(F!S|>XfhPwwinB8dY>i;{DJdzrgHCN%01xivrzs>VKoo;41uc1jEDZ#m
z7F3#(st5M79?0eSDImi^&Q(xQNB|j{pa4AqEVWo6BflKdn#oBmOU)?;H|9$cle0k!
zX+UZf$}=)^QbBw1z{|8DR>Jck$SrybAa%Be3c0C?dBqA!<r$zJS58i`LN4eYVX&kT
zif|>=<w^>vCCSJGc8+-psksFumEa?P^3p+tH6)Bc2j``M?I}o2QGhxXw2CP;1=M3t
z&Q{0(Zw-Vv48DM*80-_!t*#&smw@We<ZM{!3$8K2v%%V6lOcMc?MJXqO$8f}=|v?9
z+6sp7xP-V!Ax0h6Acl0Lz{6XhHVnwlXt3e2;9+%$xuB3j>JdRkt3jvSL+*(OZHR@4
zX&@N~t>Bau5_0oXKqe%ByJtzM;Ejin3xpx|W`d3jOiczYk_4Tnotg~l*nx%^^7D%G
zb5bF0P*w=>ck$OKNlnfu$<NEo*0fRpbr&*IQi~KIqfznkpmG^Bjt@#NpyUl+2mtrH
z0yy=-dNvRT!&5)pwJE73pwq^|Nf6{}i0zqa3ZUXVCk@i9NAjj#8u&cD9OQ`~Wd%=A
z(G1#5pAEWd1JvLyPlTSP0x=%cYk({U%t%#$9M%BNj-Uh&ay|$vD?~&@Sb@&Z0Wa!G
z&4sNd%ga|lHLkcMu_QAYY5+KaD(EU?mVgH<As&F32O>dJnBZZXM1{1{Jn$(aU>yi`
zAaBEh37b!&VL=g#RFJ`LE`SCk=qhTEIpF?3{FYO_w0Mw&UUELTlz><X+FYNX0>0Q3
zbdyJnx(y_5>|)fxhyIu37eI22LTPa+Xn_Po8^|vp8(=O4FL(wCfNxHLdo906ArTrd
zu%bj+S;4U^KQl!kIkPCaG$*l0p(r)27~G$RB*>i9#B69Wr>ubUa&;p;bN!smq@u*4
zN_|+N3%Xuixg;Z17c?qdR8W*!l3Jt-&W{jBgEnm=1u3|*1X?}~k%i_?B|T_O0`d*K
zhmEKVK<OqP>{8H0ut=-&Kqr;zD8z#ic%2&fI!n}ynpl($mMRA6g;)z(QBs}?9U1|b
z#+gOMpvCf_>uO6<i@-~6z~UeQM5@Vzh7m|V$f+stJOVQpS|EYk1-ah=#ELeE1uX`E
zB_gE!35rr>NR^OSq5!(l64Vw3wGU#{!D$(kc8gNeAloEC=aE7dCV;&OvlC>90({OL
zGPz%x3RVIts5D^q>VV53XmW*UQh+Y%0N3qk?t-X*pIww$0=>2j)moUU%wkww4{s~z
zD1gSbGxO3xOVvONLo-rAm)Dmj=0KY{FdcfZbP6#HMnV$@Y&{E1H7JDOOC~@|o<KD+
z+*fe-f<z%pJVAR#VUC8H36ca^3QAZCC6(a55p)>cF|QK+q#qrH^kk4~P?evaS(aK_
zP?C`f%5U&-0dU$xN_MCh9YZV!l>-W(o1#Ez3R*5eWI!kKff`g`Q}oi}LHtBmvjb!g
zXkr@FSEwvVg*LRT6bztV2FZgo!`2Fb8b%;7P^wB#1|@)aZ~`hyEh^RkxdGNh0R?kr
z8p!vl8Xygtpb8ws0NI9?7BbU7Z3^(^G9VQ?3ZRuj`6;R3MM9v!1ZxJFj;0Z62`mob
znxS4q)ejOxu2n#qVHl*d7*_IuI8g7y<Y6>41A<h54<tsk1Yjx<G)iIs2}1?Inn9Ts
zbh$xkUUD(yNEeVlLCFAmZWPi|L)ghuDXD3Rr8y;_C4wM@;3^ezT^-~WIz)pWbkiOv
zcR<8pQ39ScwSX?-h74FK*ed9P&QI`gOwO)^Rf3=;Zm`)P=*nJbCkUfg4!yDklF&d2
z7;X3pd{IfRjsmC`S(FJmNDOIG4CXRW=oF(L3_wUP#8R+UP>&aWZyvN|1(6212|U#2
z3cec;+-1^K(6s{>R!FG{d=M3=WYkN^FDV9%GJ-iE4?Ci4ynu9QAd;Y4SaKl;E9K<D
znvx&~flY(0Qvs<3l`6@}kd7-z0SF_Rl$;DZ$f*QnC;>Xmm7E+8?~ZCf{Ry2*fcO$*
z9LO3ygjansi%T?O)Lnyu{DVNn7+4y-(*ZPB3DN+<U{MTBZjPQla6O<?1;JMcg3=sF
z4=6|zQ&PYI3Jy=mHPbqvJyDnu3K~KMZP3s|O_Pwt37UF|DJgD{I|{*9M?(xj^Auk1
zL)1du1TzZctpRlvD4akToDe{+(IX`#DS;vY)O!XQ0m8}(h_gXJ=@TX4f)qfkKuV7q
zG3stH>PV#+Qfh-_EX42=N)QG^uAfATSS$D>vmU4k0Ujp+A0C4>8^N-1VoD0kC{Xkx
zxdh@?h&8G3LKjVuvI1d)AYOuBUyHO#6uhPmUW>zTsfBnH6kZUm;Mf6;07A^b2vvwG
zaQ4tBE{5ORifIgDBn=U&AZtJvVhFeo2&!a}2V_CgAgqjTq6V~v2an4YXC~#OYJ#eN
z(3Py9W-Dy-FldAvw%x)Ol)&H{;B+AO9l(}jKqO&29q3jB2nCv^1n=Us1&z`q=70{_
z%>-Zi4cYjG6mt--6vjtq#eycBW7Nw*T?%kuLk`~o6?3p%#ULpd8zc@nt~xaZBo6mp
zj5;LfL4pt#NGZ&rAW_iGXkZ)AHxX!pRD#DOLCU~Nz&xZ0TZns0ic^z8O&Iue1b74u
zL}+M&`VvJYItoTez67UFlrjh0XFx9gP-H>sbrfL5GH6x+xfH}Xpbe^HK#Gx49Vjhe
zxE5r*9%==F>Rym8d<hUN4+;RVNuYp&oP-0}DFX8rNEHZ!y1t-W?vw%?gM-2MK|*~7
zX{CURCRZ0FbZsg5pozw!5|BO6={haYk}S|}P_VsuJ_@?vsWGqxpn+}Bsqe+bny|q-
zkmVpuYJh?CK(i>Q8G!CT1#Jbm+py$dkZv5y2_S}I)s4unApM|bE;x<Z*(w<5VQUhC
z{S3O50eVFyC{cqW8hk6J0(4wk6KNF_$Xtj6z<Qx65F`q!>cFK5sDX!6Od}^cMCpl8
ziB`a7DL_Z{L8mYTl_G7q0!J4}HR!5hkfV|2_uxm2gRhMT&G~@(u^`2u)1i?vkuszJ
zLY}`vX)A(!0-7g8x<pwI(j-MrS%}C44W@yjH$An)CAByi+Li>j8BlCR(ShJV78+=P
z=i5OSG9n@np$1esrxus!6=&oZp;!XyU^;=<`h$D!;AjDPT?4dA2i(U4FDgM<ot375
zY%pX6Hd;<sR&dKNg4eAI;O-e@NgQY!8>mNw<Wuk>IA{j~)Kh>q$U(sf!pN3EW{e00
z6gbY3^GoweK<NlnpBE#yV8Mw1VJf7o0If3zU94HCnyIInsR_FGTtQVqBM&qrs-utv
zp%9voA_ik?j3Kle0&+Y`zXT+JR3DOB8i3uMoUCArKF3~Si|Pj0Tsl|-!p#tmLaR^Y
z)C<Wi;7S%*7}<|G#n=y?#%cxV!d=L+26#CME+S1}#Uv=Tqq|E}QxmBSLnLCb4e_8T
zg(hNHCIS@}kabSM;PX(y<ppv{0SjNyMz}K2>K<@v$Vn_N28}6!QW{#S1<$a@qlP8w
z0V1FnM4N&|jBA1_ZIsL3QTs$7y&#OD1eW*V4La28;}O9C(ut!mM>kN(rZf*S#s&&C
zJ%wP<`I>o|CE(>>dIgns7&V--0)`pj(>TG!0ce9MXrTnC6hw6o_OysC6k#b6#Tv3w
zA}AcdNdjznGI(?eBnD0mMXALl`9-NH=|MqRAr!Ppwj6XU254IosCX-d95oLPAB3Ms
zPB0+v<bqlhP#0nE>4KaGR|#*aK}1Mz?!X+0kzLUeGssqO{DJcYxRnKpMWj3iQUSxt
z&<P-01?18TBnwF!U|+)B4r*W`&EkVrnP7SZqv!*f25}MSVs6x;0o-5$6$_x&AjqBI
z+uAh{aRbr}!bq(QNC=`eGeE<#5D5iHlLgwgQ_=*lP0dVGDAWUG4$vSUWVNFnbngOm
ztP10(8F;(ER!KoiA<qZeUV&{{0@w1Ok|n4#FE6zS%Rm)a99A%a(<$ms3Or|Xf@@%G
z=dXi;0)!#`T^z?D!@8O9fh(v@5KXoa3UoVAb~$LU9qciXp<p-WCT6EX#@N6K2<Co}
zJSedgr6z)oNCYQ*h(QX<;N6gw`K5}8XoE`GDj-_%SR^q{jMsqZL#lzG?E|oVki$~J
zV}wwJkRca6)S)=ATEuE;P`#lHI#NNQya;r?L6JsUem=-skggQS)47T1naObPLd2mS
z2DJ|e&)S2nM3m*ANp)~10AW;Gem=wk&|NGbv%z-i#mA@QC&$Nw2D$U|VLX@;sNcaV
zLB0T|3eZq%Nq#<PA|G<Q24qD<Jk)bK3h|&AjL%N3)KLiX$p_6Gf%Rb-d<Er)l#<c{
z(EMq<Gw4zm&%89y8QTa64JEj^l8!>OQbuM;F=&@7Xy-#Jgq2uPoLL2$30DGjfx+xp
zaFPOrEVva33UD3puz3n}h!0w3DJdx__=3V7x`Y|(2S`fEC@Co@hFrdoQ3}3zLBF7~
zBqKjhKN(6V<>V*ngC=zKeKM2u;Q<3$=nTGe20l-o3vnaLq7;zpp!R_yMn?gfORya)
z2HHPvs{mG~2li5YW{QTUj)I1g1DFfCWCI+3ppXMC<A6tk1}KN=C_r)=G!QgVPX0q#
zeFHWPw8*t2F*C1NBRjPclu|+I1%|;hbCC1`b`PezA;AYz4@sI3a|=pKKt_T$x|Sjz
zr-7w~0ka2Le|jodKW6p>D~8w$O|;OU1tnXg60^7j)G9|VD<L8<PlC=NNd{f+1nFIX
z_g;YJ1~T*W5{oK9Yc-NHKnwCfM@4{oX{E)fMY^z|70>}0AkE-K9-zr{kP1*$Ukuuy
zlUWQt$2GO6SOJ_LK$754fp$9}3;dx;1T<Y4l$w~Lo1d2hTFsH1k*cTQng?1u1X}h{
zl98XHkeE}RSXm5Ow3<?yoT^Zqn41dP>kB%A2NDtx6OE9J3<Wv2yeP8-bdn3qa)@G3
za)h2_4vtn>h=8K82(qpQexQbt2INWrNc$anFgiHPfmCDP5(=CAfQ*x%?^Ok5#2|<*
zpm2dHhOEt1fafES@leM=mjQtaFFnu(vH}h0o<r!$_h^Gym^i3vMp6!%zy~$LAr&-4
z0_pq(Xs;c+FCe>L(Kgyb+ZNDGUOEb%3W>SkDhU)_pvfdi8iQ?}1x?z4R)3|Yz?OZ1
zr}Z;S6pB+p>nF-mLFeozCTCabA&*ys9hzTS0!m@fD22ovC{VzX;0VPd1xpE_JOR=K
zit>2Sf}`Nnl2FLXH{@7{WIRYrgSrdglk7n!;v=kuPQYd&Z9qcQx1iD0d_BY^0tjue
z_CYb&UZmU%Z}J2~PpvF10JZ+%Nek}ckkrH?m;CZPjHHTUJ+colZ7+eDfz1Jl#VKjU
zX(^xxfanBSjXsJIT#}fVl30|2=?c&~VYn|b#y%h>f}#M_s7}GrD=Y>Z0&1Ird!fFm
zpj_{l2)Z~2q!omrd7&7-0u7rhF<b|o0Yfs?B|jOKSs<f2n3)LSW`w(Nh6hrJg2#_R
z$p`Eaa1sR_9Il~&r8Wa?ZYs%1jZp{fxJ*Glofhg*h+&|yK~Pg2H6tSe0n3>lV2v07
z0W}qzOwj!T8n}V@*#WE><JbnUDA-6?bp~xzfFcHLB&7U}2UU7tbtpAAvR}cq7iuC0
zO-VpAJ6JDr#)MYbU~$w@09f?}TJxJ<1R1nKv<hLexY8Rqh9HYDLHpLB)`MmxkjDR!
z!wl1CjG_h9L4l-PuyY|3h!6o}FM&5vV4KE)1Y|0>=7WZ3D&*=t&<LV$Vs@$mxReDa
zEKtb`I@%MojusRPAPmZ3V2^<+Vu-~q`N^=PgA`>T#mdk+7POuX+9U)m{3}b%D*><S
zQh>B|Q@{tMgB2BlFHA_uPX^UNdFjx)9Ap*<LtGDb8xhF>tQtKX!pj(xHk-178|Wz0
z)Z7B7Gr_}~8laUVkcEbzS`^YWR7inchlP|Y!B#=S(<mBiPK2D64oXO|&=dg44IpoU
zT0gen^Wq=@3d$=WaS(>CK?jYQA>va(R{?2@46OV?gbP*|fHN4REC59ydcbIa0|enH
zh?kJ_jb=1h3}Oway$te6Q7U{zm;y9|Koo$oDHeAqfyNw^KtqI(#r5!Ps;m%_ky#8%
za=De@!>zyp0$C@erx2X4P@a)k0+I$@K9`sT+H{&(Vh?dIsF;S>nu%F?fCgH@4oAvf
z@yHDnP%wiqydR8Il4GqOG?I04;qC_64eywP?7?inBjpNMB?i}_1?f+~J1Gzkft&*}
zOD`U@RT`48kW&Rj4w9xIvhkUDDXE~HZb*aH(1ZaE8IXJ`XzmMXjSk9MDu~r!|6nU1
zKz1URG0<WYc?k(x=?S(Nl;p9LonSd4OHQa-1yIicITVO=fe}6@7?I)zP>T=d2&B*g
zyANCogThEh0o+%IhBA0_4RWx7l<37{3t*)31V^m^wg|MK4btm_T7jAr!D_&zBgiJG
zV<0smaykSR0fbxuG5`^!&@IzOpcC0ZIUj5$S_K8VM>aV>57OBMX$RX+uJ=K`bkNP(
zV7DSFQm_w^Ee7>X;~|*=S}Q_0@oA-bpnXI|#U*$%CCDCZqX9AM5OYu#sX!AQ$aByT
z!P~t@@5~^k&_F{jnR)3-kRXC2Cs4izdk;$s51gv1Ymrh(CZa_PaVT<8fG`m1;!N=3
zS+MCy2?1myK{rAxMQ{-Vaj%Yo63BKX9fiykBp1OKcYqE-1`R-g6KiG)G!~FlLLCe`
ziargr^jJp$t`{?|5PktWKRPo7lmNl{5K_o70;+t#;RRNYWGzGy)N-&SwBXbRA21Iw
z4O9d|lz?wcafT);uzgkvj(L?j3c1DUV3vZd0{E0x%+-2eo6u9H9+I)pFaeu|EenHA
zC<5DzoPD4L1MFZE*ik#Mwdk-zpum>H>pM*a@ZdV)UQ>M~1#M_$jmTEu<@xdPpljUq
z3bJ$HlS`n`Kss{)!%51ZX<%^U4Lp(y-f^Lzk*Sxe2dT14@)babF({PeBhNl3gS>~9
z%0WU{%6FJ&A@^>=crdSn4bnsoBT$k?zK0Ws4p<2SQjT{n5R$7vwFp|i0UwK+Uyz!o
z0d@pv-Vk)BG{%k6AR9m!axp99LTS_(f|evkItrjmaUrQtS;48a1az)Dcn?itPH{f?
zU`KGG1)UO|lbM`Zk^{TT5*$lNjRlbT$bkZHw?p(RLI&hOhx&sDgcTBVKo<>EDu9dt
z9c&Yx3R!&*T6zW&18prSDbGYX(GKJ%NP>j87{mu*Wd)4=cHpyJQlRAs<e=p8#A3Lu
z#i=EF3gOTOUV1)gYA-*}9(;2)$UqPV2Qh&J10U}ISqCx%;#tu6ppuRP*aW1q0O|ZA
zXdeiof^aP3y(u~+u_O_+1tv2&J0}(OrelylU>FoZ7?msNDw@QSL_~068OTK~trZo(
z_JOhvc#I5uVlt9vAs6R@?~(-#sKb&3B-+6HIzagVlzKqZ3_+>snZ+fkpi2+oxBh~9
zL8+PPh--jhW}plsLPi^lLA(6&3o1d|^3w8)P_*elhkHSd{FKzZlFZ~p@EIGapaD9B
zkING)HMBte1IVS>;B*g~=E+L|8LkKKeSrpQ!6%J^cK(67XP}X{#3c0VGz&nxHu6hL
zpgl>rn?XL#OD#w8WoaJD@p_=MA9Hd*hNCEh>`+8XMal}U6^Y>OYdM+OsS5cyDTp2-
z=*ry^&@eXWEbi>o)PiCK(A5appx^;_XP~|TZ5Kr9&;@~~15iT`x<Nrf8FZz04*1w2
zw9o}x4+;d3o6!RwymK@^MN^?XzceRB0esU)N`4-6qa7$s1|bElE$D`Cc+h|b&q0ny
zxE<<j(2dX_tstzd5Tuu1l$j2_NEnpXK*C_GtdI-t*29i6M>Px_|0SRkq>$ztq3JUS
zlsG|VAjbiG10R-Pg3Cb?6q+`~+#G7)A|~oUb}1`pXlaJ0f{WdxRPcSK;K)+Ss7%jH
z&C5(yg2XGb;R?kipzG~3i^13F7H6jCC6<&HrRo-dM!1X0GV{`P6u?ztWqv85U<I8R
z21>Cd`QSP<QK1O5u{$?a0d&|hD3KH-g0{+(q!tzHfmdRI_5?$2YX^;ZD`X@lXJ-~?
zC_uKPWu_ME>FFhvf)Bw3A4i&;Se&W@uA0H~9*NK!enGuxPz32H6z793pH+w4A(*I;
zlnL6yT3iZE7SKpQ_9rMlK!u5dtpd*S0wfP^(17w7B)=4gXO?8Z6BKB+0<_-(daXGA
z@+2n*x|I*S)7jZ47&2Jo;_B=l<QU=~1UiqcBm?SVQ1s=Of;J-L7ndONA<FhDgw9;h
z2}7VbP*5sD6nqG6O4bS}Sp;;{5Xje{c?N_k6wOKsWtoYf5Qn5ckb6Knu$8Oe!nY(d
zKM%!quqgn@Hd}-#IiQ|9C|N*rGFpg2Pnpjz3WVNg2?<~1g{z>!tTfPa36y=SAQwVv
z6r?s}G5CO6$e?u^sP(9<;E`VrDpx?u2|-hFkcH6j^Q>VfDZz_ZkY%}vl}V}4NC%a0
zpaaB;L0K&`xg<Vb58Qt&hHoGPIRvR0hN>CVv_cd*7)PmsHvXbmhFq4}BBBbdW(Qdb
z@jI$*NToYS2?$qarskx87C0jL2$UB<7#d}HrMU%_pwyUG0No!|l9*Hqx*8U?ISR&y
zN`nsV0F8#hq+xvc=DUK*w9NFJ)DpM=Y@-TjK>?^y174X4UJho2IQ_>6W*+nm1tcdz
zqZn>peleVxSd?CnSX7(}7bvboNP=7mmw=xKqo54i@eB<C$oVh|Ny&PkvMV<;FEg!D
z0kq`-G=L0M13Cf+p)n;NI(b`|k_&S-SVdB5a$;$5D#9FHusI;VfSn1ta~tMlJx6G{
z769@<kp|N05!)DbS5P`jEJ+2mq(QrW3-XIf^gug@QVTM3^3!dVl$2a65_1c3QmqtX
z@<JdNErF6aXn-4B<|HaW78rr#WAf}^cgiOggNpgw)VvbI_>=<hA_cg9aB&Ntbu|L5
zqet*ShY{g3M?tqx!HA#&h$(*gC8>~OFCYt!ixuG4$$--Zimw$y@)a;dbred$YeJDM
zgm~959;_DXF*i`fo>Qp<YGi_J1dYX}A)5}WR6yt1gQ6@Eda8qh2Iv^y#Pn269q^ni
zsF?;a9D13VLJ{OfG0+tlMI|7upc+mAstZze>E<frgLmaYRyKo|jDT_?Xk&0`acWv=
zj$TY2Xqhr%dn{;1D<c&eZ3^JFF{ss<r{I#GTndV@V*TX&(xT$jc&JVK5LX$4H*kQC
zUePP4gg7|?Rbc|in~AU_0M!k4XP!cG2Iy=T=y3+1%iT-z6=Kv8RwjVMpr|wtynP#<
zj&ySsQ0>rzI0k%g4d@U+*uojmtcV_Dsf=EJQM$gdo~1r`c0xZnHw9E!>w&hS$K)v~
zftRlo<tBm-RfBZ!ZQ+?ED6t&0&CMe<r@$>Aszx&=50a}ud)?w;%><1Yb=^WxPRRp}
zQQO9-+k-fuy|JJrXP^oOyw?*v!l|PGx((YlM%^E@z#<iv=fJHHc*@sE)l1j20w-@x
z@R%A7OLakOB4L|`Kz4#QO=srk*(!mTg~pc@m4enM!K@4hoe2U;S}-m8DXGPoMX4#!
z<r@U8f-N{9!7Avb;FbBM&|BA_W`GX<!5Nskkljo~S_4@f2g(zWIto0_l$@WNn+WO(
zfzQfF0nP2=whp>kim-i-r6u{fpyMP!M=gLaX;grhfO?>1x1ifE!3%FwQj<#4(?N%U
zfkPG2yM#q|d{HW>bd4`ADFt=#G$33Zcq;*#QVKy!#-VITh(I||_d<D@>3R7@sqxTZ
zQt(mQkkw|;^~NRnIq|7QMG!Gq8xoXKL7i`KO`r!(U!e31-!}kSHwtYbfpRi<-3sXX
z29Q3zLXZ$>zyl<V)K-8eU|R)<Iz+Q9GfhEB4}8=gOc9bkP{RQxtfK(-HfZB7=-jz7
z$YFqGp!OI{31q2&hLWBV@|7i6MgU+MKr2G>O5nFcfZN<4JCT}EuqaT1rcc;O%;4Zu
zf*jBQ@-b|T40;eWL>u_XM9>i}uoGj!x)7SM#1NA2F~)%G6u|p&@t@kPq@w_H3+&Wp
zypGXPP=eQZ;87es1!wSipWv(sEubMsLqHE=Myx@B-)#wsceFT%BuoWpj6-;kXa}9-
znF!vEh(#MT3B&Y3xu9kXC}JR48gy3^XrLk<JaS{JfR=qQvkff1p$Q*(Z-*@?@*u8*
zrZ8J@I)iOsho6xKbqUf2N|c?M;B<{#>_Y8=B^yxvQLG12024vmp$Q2akS7UakTLPF
z?2F6+r(lRlSTZV7+JcmbN&!XrWtqjG#e_MqP|VEF14S^*5wIq=MhQH`ky`g)LD1AX
zToPhANH@d^RQ<@^DTurh_~1Z@t~5}i6xzfF&3k}5qTu<SV$g{o1*yp;dY~n>sd*(}
zQ4LMaXv0`NQ1b+|%oJisI*5yOZawHWC6FxW=oau*0HE=Cc*_jB8xM0N6Ko8uP(*kK
zbT>V`C0tyZQ&J2W3Ie5~%G44C@a40xzA$JQI0n+Bh4zkN?LDwg9fg9N)WqUc(4YmV
z#|v&}p<GT24I(=`J0%?jh>IYeL~@X49#}7UwPkK1XyrYq3k4b_DM|!MWfp_Y1uxx0
zWFzpoWYF9M5{1-5rJ(GtQ3&(4vO<P}twL31fkw1OW;A#waIB63hy~m88>0>tKy3Vt
zg%r%0;DQ<6M+Gf_201!I!IpBfAYlM<8|WTz=sn^Y&}3NzS+$uFZKVUcG6O^##_A}5
zXrovikY6FQETOQCK%mAPEw(HWu~GrH5I8usuoN_)o0tPyo&*|uN8LYBTmlh;MGR<M
zC_NRvsSmWq0&*BRWH}RPNwG6%dlyVSDC9xCG4Ko(XdDFQHVi{Rsu0>C0S(fv3|>qE
z8V-Y=qz5tuJeq={12H&}omyFpa$_xc`~`Nx49G~(2!}H$m7tmc-YS4pQh}6$j&Ck5
zE=>Z*oQ5;xtVobH#5o0MIzYO>HiF&gjNvW?ZG{}9bvGch&^?DH4GBBF;`}1;l5bmd
zEqdU|U1%Z%Sr1K!AaxMEptJ{yIfB&{s3wI~Mi4fv@&TWTjZrm0w&B7W?~wK!di4X*
z390B%RDil2@o71U>EP3Z(XJFnBmj_)U>IEEpj4uuJ?=Vq6vOH&h%2xwOv+4;&qz&7
zNi71q1eA6m3PGpA*@9+iQbEHgdU^TfusP1mG|-4ER2NbTNGwjy%#2Thl!mqnuwfuQ
z$Y>DsyiyG%P!Zq`Itm`#-ODSnRZ7Xv&qc2Nl0ds%KsN|O&Yx9?&H?wK!P73tmOxsb
zpe|&w2KY2<&^E3d*b-LI!PEw^u;rs@?NP85AeVp#3!wE8q~K2iRaFXQpt<Jwc<4dy
z@$t|kmQoTAS>mT)tB{vp4zeo^6h0bCsww)ax%#S+3aTDfs=ijL!7v{|OjQDJ>rPFv
zQUDnYHwJ1fC|^U{izT2nt&k|d)*yyD2-*gQ>VXP^8g`&65tMq7;stz(p^^ej5y*a2
zeGuEA?t~6Jfu<orDvNa#lr%s?TDrQRGz*Rh$hbzaCgcnQP=gF41y0V8)%5U9Y_OTl
zG$n9R3R>!3Tn^j&V5Oi0I=>v$_rl&}*HM7%Du=ia-0FcfK4C=~$}T@p+$0uZT|^4L
zs1Uk>5tN}obHm`PJg`;*;07H?8K|_((^1eU)KMr0U!au=K88K9Bo*4+)q^#1QSRJQ
zRwz`kRVajI7?4SzeT>l2XIlkuhJ^SELk=`x2rY6!mo|V4U(i+_kIa;mROC~u(VCjD
zhzF0><Y^m%*0#bNhm;sV_JNi<W#+-AOF$yUq}~-$2u`LTPr^e0x}^i05n-$Az&BsO
zTmex4TGa;1j0zy%VO!4#+CEv5lM2}`4k`&?a{~&hnO2~U@v0hm+J-s`5GO!05Xcjd
z1dO5`%XZU3Jy<gebSNnz5(@QTttm8d(5|@ZS_NeV_e9XDVg*Q2%7nJ^!0`i}r3E=c
z89cZRs($oBkY;y4(GOa80a|<wzKaHQFBItBI&jY#bovY|l)yO*G}Hj9qzm;xEb!f-
zp!fxG;NgvNPagDWevm7`yFww`CsB8FgJKL4576*cR`3ArF+qd_vQ~^L2egm@l;4r7
zAqA)rNP&QC2IS}oP;m*Wi9wD7VaVEHusTrV3)&Kd@0PSR0+kG)_BuFxZNUm5{z1KV
z2H|d`SS?B|)&s>rG0Nc^NYM+bCqRmz=dYxK&h0{&1X=6^K2Zf#k%G1YToiiV7pO&(
zng_aaR}X%g7ieiFNF%}t2(y(HklYCxQ7JE0aDa;;C1zy>B=^D<!o=_?%&jZ}T|cb>
z(xg$YpanNbQ$ZhYlY*uuIHST{W2ayMDZ34jqX}jobjSwTGzBdMLp=i&BSAZ?uo?)8
zaS#S)o#?z+P(cjt*jOo)gXYL!nn1@5fdydpf&^e}kU~%fC<X}@#)G)vLI}(Svyk>D
zpyXzl35aMwDFooQL-%}vU1|uLrB?zS$pJ5Z3aj(94Qruo1+XH}!rC+?g=&OtwffcN
z$Vwn(Qn4ZEObR7EB`pPwJRe<9@+&sfgwRHs3gFG=#YPH9u?o=#>869M0%1f22s=(O
zI!y`Pbvg=ZN*L||^#dWEFE2(Me5C_V849)vkWMH#f}qZT1q(Fp6>^J9b2VUs;8ph^
zN5R4tMHNgCG6(CN2)TI)G6$fLnFn1n0&RrAj0BB;<`;vH<bt>rDi1RZG`f%kTB4hp
z0+GkvLWMW4K*bJfD-Ee}1~CPE(*`K7fSPg8Qw4OPEeU8y<YwlTmO$2^m+0%8L6@pS
zj}`*0eJWAVRe&nef=L(T6y<>K$VtpiN=a16)KMt50-d+5kqKVZ2yO)ygHuH@xEYlR
zs;><pSrFWOg18Qn4$_pI^FdR6CE)g>wgSR`+6vGU2|(6qK;59Dpafwlf$h>!P|{Wa
z%R`;4qo4#~f#j7mK@C-iZCFy6QV8faF3?_UC2i2zN@$UysjZ}sA_0p{O$AV*1Emn?
zcn2iUgHPuG<yZ|^v?9_Y_}H<O)RM%^9B>{7Cq`(VhIZ?qX6Yy(TnZ|#AQ(Kg3>*1^
zPs>6lvx%L&h7N?mr;W3U^Yh>wq>1OGDkHcsWPv1{3sMCc*-5G@FUl-Q)c_d+>NkLH
zwaHG+1K$DwTRa0UtQGQ;(n^byA-7_KT7a<aDWEn3Xps&01lOc0BT%UaTDlpduBlN1
zy0TA4L8-h1)Eg*PNJDDor9sZlgxjnM3L;Q9I33)GiHA&U7i(nZ7J#~Z(0Br`p8)km
zs-eLS+FO#DTL4KN%HXC+E~s4s8nJ?z0ksv;)CU!s)w%E`O|_u(1+pMb!Bznz3>qqg
zoqevXkODfZ3O05QTOA8pP72bZtWc6)0GsUu6#&J0pbJ9vVCv$bj);%f0GSLLag2|L
zbPFLzrGZYQ($tFw&j7$Xap<Ok(lya0f$RsH1PK(RK3Xm)a$r`0nz^7E8c?$h)*6N?
zfS3R}od>i;%@cfl0;s!{s8E~<%H`mZLo0Alfm=VIU3lQJ4A21$whA%ox!}{{W7NS-
zeQ;j_8V8^t!yjOvP=bU%v}^-uftUvkN|dw2Kn-=AW|J6Xdf=;Y!Dsb@ECpe7i@|;Y
zrBsk4dMu%*5u&X}@h>4$k%A8zLXfNi8juAU1c`NJSn&crC<G=}m018%q8F7};FbwG
z%>v{NsCL-qXk~Eh#^+>ar^Z7M)3;T~%-3_OEJ-c)^w-F(jIYWp0C#ht_Jg=drD<v4
z?kbW>s5H2QK(ko`p$C*E%fX4U7~}<{$W#XLp~VE$ERcIaU0%?=ygHy20mY!z{yC}O
z^(6VldgX~Z*&4_pgk&5{FDL{+MFfb(b|!RY8aM>>Qu9)ZL2lPj(krM`f)zp_Q;=~Q
zD6=4CeDHm^5a)p`Kyo*-t}-MYu$zrx$p_s8#Kaw}P(k(}s7VXT!l)?~lr4};CLGSF
z$}E6}FW4J83T5D8801p;&Arhv>d?rG0pI3`h&j+)3}`_D{Mce-JxFeZ=tC9&pE`o9
z8pZVx^{7Hn9kBTcNId|mt>A?(ELVb}4=L_o8v@bekYFl;MF%X<(=hfzfQ$geG4&D?
zyo$=qK|XZ^6dy1QQ-UK#NlRErae~7<PzF!{)#soqvO!55GUADpz(M)92%3M>kZX9D
zi(xb(zRN)UtF$yd(9Q_h5ELlIB4t)={zyZKZzKmJ9GQmKHTYeCXu&~J7brnN%SPBD
zAJ~!*$TT!~6$HhL<U)%<%f2#;VJo+w%`VWo8*uv)v`_^+=MHVyf|kXDDq+;cP7uk_
zrDdQN%?Mvwrkj@!8~q}@Ldhkw7&J!@+Vlaxv=9GUtHjch{G7xj!bXFakAYS|<s>FS
zSBybShIBok?flXL&`5WDNq&5CVs1fcab9W(bmUqGy1^qpC9?>;bO}}kgWBVe^sblZ
z18LfTmRW$h=eU+9Vd<7B;9ejC9#w?T7@$mx5i^^n069DxJY9uj_6t@fqS9b{VQ~k#
zG7r281>`q9M4XajVp1l2@(k2S02>93Kxp|1>Axe!aiDx#B`w%cK2!v}P!-E+5QsFa
zSBtzJ1Zsn_0(h?xD4HQl62QeP_=+J=*#=#Q25xhK_E~_6T~M$<*2=^BdXQ*_?zlzv
z22z~?y`Te{G&1v2GRrbkN)vOS{RZ%*9R^71LAF3#ujEvz07;0TZVssE)dTlk!H$CL
z3n@!20<F3R$${$pVw43LAd^6?0dUt7r~PPFgET>{2d(44+VMeB<5-lckX)3SSdyBe
zpPQeOnU)D&`w#PEPNhOpC1@Q9s5O$9UX+>&T8|6e(-9I1x)v-kSD~mhC$$*X-31vA
z!cYezcbP#)KSPBv!x0ukAibzzj%);Yb`#CZQ15!?CFhi;fPxwvlpq&FLLYjF63Ac}
z1_f)jjsiGjG3K^V>_f8)WI$eKZUIW8LBUo5TJAt<_F@gtffFF5$T%J}whx;1i!Vye
zNd#Tj3%-{Ow5LP|x&j-TrocBKgH-B41>!;Lis0HnjT=bHMK&IEkq}4^Tp8SSEWHBg
za1W@h4GJu1*@)QSsEOh~XqH2^4HO2^G3t=m#IzF9*v2UfZg=B04%$cu-Kv+FmI)ai
zf|v-Efdn&V7(iVG8V`Z0hY!bKDuxyX(b=GOBS<Hv67Y2npkeFiZ15mZHYibnl!E$4
z*`USsAOWaBvDnfk$di!tnFbzJ$2LF&QUk-v3Q*HP<Az#VP!8y{P>{9I;VEdn1G?o6
zT<R4=JPTC}%SfPQW~C(sr6r)M4m3xOHb0(^khBG@;!IC1NiI)8BrfOyt)QtpaQZ_^
zm5^2H$OAOm3QF-AiFqlRdGMX+kdaQrI44*?Xl|=GIz}BjAPSwkD}ygCP>L^8(uSlP
zJ=n~BW*T&F073+^1rFpP*w8V|*N_s{RzXR%I9@d~K0hs9HB+@1Qt&FNYM^@xHW`3$
zrVi9G&_oY257u!5_oER(2g)a)p-o8IL3A0w+Cbd~tXs?>Bd3t9<<Q8~LE1}>ze0i}
zCq&%}N;*(6(2kMR5>SDjl34;yvCuX?IN0G!03pR9q}t5POV3FK*GN|2#gQP>Kp1Kw
zs15=91sWVkQX!y=IH8RzaE$;u<Og(-BBUOHWZPmrP`v;N9gtpFM^niUv_ma3Hx=wk
z@Uhp>76fRc9Yhak+!m6i;~|?xN-{w!5J0&bR+JjXLll6n9H|7g1z@c?(6T2DrPPYl
zWF<{#>4s1Xy0<Ga2eD$T05oF(jT4X|#TrSVVJSV($a+R<1uW6P){{b#C$y!f0dkHe
zOo?p)=(3ZNqReE-{p!$AgO$yoW7OiINl>F82PzBiB7%x<P&$suLt23YS_)vGXQ^iZ
z&R8HPDP-j5rh?A(H-rtx6@hl;7N^F8)}QGpB&MXm2jvla&|u5|!c$YT4RN0V3JP@4
z3~qd43g+QV;9c;Ld1CNc8yX-*Mmk2CItnIG&wwHst1?~C1<wkmnmP))mZtClA-Hu=
zFJPQkfngR@A=s}P(S|xkI>xb@IttOoIz~E%pvf0d2tq0dL_onj9|Yd=VCa^USfT-8
z!x9X5CKVLc&cO<X28Id{Sp`GryeDj#0;uH}tpN^09R))J%~<eQHn`=HssI|v24^Rj
zYH;E<G=OHvV(3x<<n{$<9Rxf&W7T=NAc@NmmP!<C71S*Z3`{IdjnfQJfO(3giAA!3
zsj0b{shO!+lChzs2}H~&*(}v8&B(ya*v!z(*v!Jr)X2cx7^KR`z%&iSGB+_dH8(I#
zGcz<xH8(alH#0RiGB-9dFtapEH8L<aHA^+KG&eCbH#agfG&3<XH8wIzH8(J~v^24>
zFgG?gHcD0J<pL#qTO~+1fkRY@mkZ{8(1HnY)kH+jMf0&HFBhVCMQXahM$BL{4Vt`M
z&_)-eI3v{A)8yp}@MdHZVGv;e0o_K8U>~!_FCNSc3?R${5`^MyjUWa*TJ#Dkk#(jf
zDg|Hum{A+S%)kJ`d?3Y8ysfc_nSlZ7qqLmF5;VPMv*d#pnK8`?{Kmil!VtGWG;eGC
z#)hI7zHU6go0ScuhM9qxVFv>PL*-u(Z%Pk0(n#Bso*-wd7|;>7#W5wN8L2Vwooq3n
zG61~Z5485BEU_dtCKa-UvKYnytzj#Pfo=pUj!7;yG%y6Yeo7B7N{eesM~?)=bMY8$
z*eN|C5Gk-uxZ9`nNJE6<p(dfU>ZZg_=@Ep;BWatG*uw%!T~m5E;gK+<w766c0Cf<U
AeE<Le

diff --git a/examples/example_moss/student_submissions/s1003/Report1Flat_handin_5_of_10_0/homework1.py b/examples/example_moss/student_submissions/s1003/Report1Flat_handin_5_of_10_0/homework1.py
deleted file mode 100644
index c219775..0000000
--- a/examples/example_moss/student_submissions/s1003/Report1Flat_handin_5_of_10_0/homework1.py
+++ /dev/null
@@ -1,24 +0,0 @@
-"""
-Example student code. This file is automatically generated from the files in the instructor-directory
-"""
-def reverse_list(mylist): 
-    """
-    Given a list 'mylist' returns a list consisting of the same elements in reverse order. E.g.
-    reverse_list([1,2,3]) should return [3,2,1] (as a list).
-    """
-    result = []
-    for l in mylist:
-        result = result + [l]
-    return result
-
-def add(a,b):
-    return a+b
-    """ Given two numbers `a` and `b` this function should simply return their sum:
-    > add(a,b) = a+b """
-    # TODO: 1 lines missing.
-    # raise NotImplementedError("Implement function body")
-
-if __name__ == "__main__":
-    # Problem 1: Write a function which add two numbers
-    print(f"Your result of 2 + 2 = {add(2,2)}")
-    print(f"Reversing a small list", reverse_list([2,3,5,7]))
diff --git a/examples/example_moss/student_submissions/s1003/Report1Flat_handin_5_of_10_0/report1flat.py b/examples/example_moss/student_submissions/s1003/Report1Flat_handin_5_of_10_0/report1flat.py
deleted file mode 100644
index e80df4b..0000000
--- a/examples/example_moss/student_submissions/s1003/Report1Flat_handin_5_of_10_0/report1flat.py
+++ /dev/null
@@ -1,27 +0,0 @@
-"""
-Example student code. This file is automatically generated from the files in the instructor-directory
-"""
-from src.unitgrade.framework import Report
-from src.unitgrade import evaluate_report_student
-from homework1 import reverse_list, add
-import unittest
-
-class Week1(unittest.TestCase):
-    def test_add(self):
-        self.assertEqual(add(2,2), 4)
-        self.assertEqual(add(-100, 5), -95)
-
-    def test_reverse(self):
-        self.assertEqual(reverse_list([1,2,3]), [3,2,1])
-
-
-import homework1
-class Report1Flat(Report):
-    title = "CS 101 Report 1"
-    questions = [(Week1, 10)]  # Include a single question for 10 credits.
-    pack_imports = [homework1]
-
-if __name__ == "__main__":
-    # Uncomment to simply run everything as a unittest:
-    # unittest.main(verbosity=2)
-    evaluate_report_student(Report1Flat())
diff --git a/examples/example_moss/student_submissions/s1003/Report1Flat_handin_5_of_10_0/report1flat_grade.py b/examples/example_moss/student_submissions/s1003/Report1Flat_handin_5_of_10_0/report1flat_grade.py
deleted file mode 100644
index 7d2b47d..0000000
--- a/examples/example_moss/student_submissions/s1003/Report1Flat_handin_5_of_10_0/report1flat_grade.py
+++ /dev/null
@@ -1,351 +0,0 @@
-"""
-Example student code. This file is automatically generated from the files in the instructor-directory
-"""
-import numpy as np
-from tabulate import tabulate
-from datetime import datetime
-import pyfiglet
-import unittest
-# from unitgrade.unitgrade import MySuite
-
-import inspect
-import os
-import argparse
-import sys
-import time
-import threading # don't import Thread bc. of minify issue.
-import tqdm # don't do from tqdm import tqdm because of minify-issue
-
-parser = argparse.ArgumentParser(description='Evaluate your report.', epilog="""Example: 
-To run all tests in a report: 
-
-> python assignment1_dp.py
-
-To run only question 2 or question 2.1
-
-> python assignment1_dp.py -q 2
-> python assignment1_dp.py -q 2.1
-
-Note this scripts does not grade your report. To grade your report, use:
-
-> python report1_grade.py
-
-Finally, note that if your report is part of a module (package), and the report script requires part of that package, the -m option for python may be useful.
-For instance, if the report file is in Documents/course_package/report3_complete.py, and `course_package` is a python package, then change directory to 'Documents/` and run:
-
-> python -m course_package.report1
-
-see https://docs.python.org/3.9/using/cmdline.html
-""", formatter_class=argparse.RawTextHelpFormatter)
-parser.add_argument('-q', nargs='?', type=str, default=None, help='Only evaluate this question (e.g.: -q 2)')
-parser.add_argument('--showexpected',  action="store_true",  help='Show the expected/desired result')
-parser.add_argument('--showcomputed',  action="store_true",  help='Show the answer your code computes')
-parser.add_argument('--unmute',  action="store_true",  help='Show result of print(...) commands in code')
-parser.add_argument('--passall',  action="store_true",  help='Automatically pass all tests. Useful when debugging.')
-
-def evaluate_report_student(report, question=None, qitem=None, unmute=None, passall=None, ignore_missing_file=False, show_tol_err=False):
-    args = parser.parse_args()
-    if question is None and args.q is not None:
-        question = args.q
-        if "." in question:
-            question, qitem = [int(v) for v in question.split(".")]
-        else:
-            question = int(question)
-
-    if hasattr(report, "computed_answer_file") and not os.path.isfile(report.computed_answers_file) and not ignore_missing_file:
-        raise Exception("> Error: The pre-computed answer file", os.path.abspath(report.computed_answers_file), "does not exist. Check your package installation")
-
-    if unmute is None:
-        unmute = args.unmute
-    if passall is None:
-        passall = args.passall
-
-    results, table_data = evaluate_report(report, question=question, show_progress_bar=not unmute, qitem=qitem, verbose=False, passall=passall, show_expected=args.showexpected, show_computed=args.showcomputed,unmute=unmute,
-                                          show_tol_err=show_tol_err)
-
-
-    if question is None:
-        print("Provisional evaluation")
-        tabulate(table_data)
-        table = table_data
-        print(tabulate(table))
-        print(" ")
-
-    fr = inspect.getouterframes(inspect.currentframe())[1].filename
-    gfile = os.path.basename(fr)[:-3] + "_grade.py"
-    if os.path.exists(gfile):
-        print("Note your results have not yet been registered. \nTo register your results, please run the file:")
-        print(">>>", gfile)
-        print("In the same manner as you ran this file.")
-
-
-    return results
-
-
-def upack(q):
-    # h = zip([(i['w'], i['possible'], i['obtained']) for i in q.values()])
-    h =[(i['w'], i['possible'], i['obtained']) for i in q.values()]
-    h = np.asarray(h)
-    return h[:,0], h[:,1], h[:,2],
-
-class UnitgradeTextRunner(unittest.TextTestRunner):
-    def __init__(self, *args, **kwargs):
-        super().__init__(*args, **kwargs)
-
-class SequentialTestLoader(unittest.TestLoader):
-    def getTestCaseNames(self, testCaseClass):
-        test_names = super().getTestCaseNames(testCaseClass)
-        # testcase_methods = list(testCaseClass.__dict__.keys())
-        ls = []
-        for C in testCaseClass.mro():
-            if issubclass(C, unittest.TestCase):
-                ls = list(C.__dict__.keys()) + ls
-        testcase_methods = ls
-        test_names.sort(key=testcase_methods.index)
-        return test_names
-
-def evaluate_report(report, question=None, qitem=None, passall=False, verbose=False,  show_expected=False, show_computed=False,unmute=False, show_help_flag=True, silent=False,
-                    show_progress_bar=True,
-                    show_tol_err=False,
-                    big_header=True):
-
-    now = datetime.now()
-    if big_header:
-        ascii_banner = pyfiglet.figlet_format("UnitGrade", font="doom")
-        b = "\n".join( [l for l in ascii_banner.splitlines() if len(l.strip()) > 0] )
-    else:
-        b = "Unitgrade"
-    print(b + " v" + __version__)
-    dt_string = now.strftime("%d/%m/%Y %H:%M:%S")
-    print("Started: " + dt_string)
-    s = report.title
-    if hasattr(report, "version") and report.version is not None:
-        s += " version " + report.version
-    print("Evaluating " + s, "(use --help for options)" if show_help_flag else "")
-    # print(f"Loaded answers from: ", report.computed_answers_file, "\n")
-    table_data = []
-    nL = 80
-    t_start = time.time()
-    score = {}
-    loader = SequentialTestLoader()
-
-    for n, (q, w) in enumerate(report.questions):
-        # q = q()
-        # q_hidden = False
-        # q_hidden = issubclass(q.__class__, Hidden)
-        if question is not None and n+1 != question:
-            continue
-        suite = loader.loadTestsFromTestCase(q)
-        qtitle = q.question_title() if hasattr(q, 'question_title') else q.__qualname__
-        q_title_print = "Question %i: %s"%(n+1, qtitle)
-        print(q_title_print, end="")
-        q.possible = 0
-        q.obtained = 0
-        q_ = {} # Gather score in this class.
-        # unittest.Te
-        # q_with_outstanding_init = [item.question for item in q.items if not item.question.has_called_init_]
-        UTextResult.q_title_print = q_title_print # Hacky
-        UTextResult.show_progress_bar = show_progress_bar # Hacky.
-        UTextResult.number = n
-
-        res = UTextTestRunner(verbosity=2, resultclass=UTextResult).run(suite)
-
-        possible = res.testsRun
-        obtained = len(res.successes)
-
-        assert len(res.successes) +  len(res.errors) + len(res.failures) == res.testsRun
-
-        # possible = int(ws @ possible)
-        # obtained = int(ws @ obtained)
-        # obtained = int(myround(int((w * obtained) / possible ))) if possible > 0 else 0
-
-        obtained = int(w * obtained * 1.0 / possible ) if possible > 0 else 0
-        score[n] = {'w': w, 'possible': w, 'obtained': obtained, 'items': q_, 'title': qtitle}
-        q.obtained = obtained
-        q.possible = possible
-
-        s1 = f"*** Question q{n+1}"
-        s2 = f" {q.obtained}/{w}"
-        print(s1 + ("."* (nL-len(s1)-len(s2) )) + s2 )
-        print(" ")
-        table_data.append([f"Question q{n+1}", f"{q.obtained}/{w}"])
-
-    ws, possible, obtained = upack(score)
-    possible = int( msum(possible) )
-    obtained = int( msum(obtained) ) # Cast to python int
-    report.possible = possible
-    report.obtained = obtained
-    now = datetime.now()
-    dt_string = now.strftime("%H:%M:%S")
-
-    dt = int(time.time()-t_start)
-    minutes = dt//60
-    seconds = dt - minutes*60
-    plrl = lambda i, s: str(i) + " " + s + ("s" if i != 1 else "")
-
-    print(f"Completed: "+ dt_string + " (" + plrl(minutes, "minute") + ", "+ plrl(seconds, "second") +")")
-
-    table_data.append(["Total", ""+str(report.obtained)+"/"+str(report.possible) ])
-    results = {'total': (obtained, possible), 'details': score}
-    return results, table_data
-
-
-
-
-from tabulate import tabulate
-from datetime import datetime
-import inspect
-import json
-import os
-import bz2
-import pickle
-import os
-
-def bzwrite(json_str, token): # to get around obfuscation issues
-    with getattr(bz2, 'open')(token, "wt") as f:
-        f.write(json_str)
-
-def gather_imports(imp):
-    resources = {}
-    m = imp
-    # for m in pack_imports:
-    # print(f"*** {m.__name__}")
-    f = m.__file__
-    # dn = os.path.dirname(f)
-    # top_package = os.path.dirname(__import__(m.__name__.split('.')[0]).__file__)
-    # top_package = str(__import__(m.__name__.split('.')[0]).__path__)
-
-    if hasattr(m, '__file__') and not hasattr(m, '__path__'):  # Importing a simple file: m.__class__.__name__ == 'module' and False:
-        top_package = os.path.dirname(m.__file__)
-        module_import = True
-    else:
-        top_package = __import__(m.__name__.split('.')[0]).__path__._path[0]
-        module_import = False
-
-    # top_package = os.path.dirname(__import__(m.__name__.split('.')[0]).__file__)
-    # top_package = os.path.dirname(top_package)
-    import zipfile
-    # import strea
-    # zipfile.ZipFile
-    import io
-    # file_like_object = io.BytesIO(my_zip_data)
-    zip_buffer = io.BytesIO()
-    with zipfile.ZipFile(zip_buffer, 'w') as zip:
-        # zip.write()
-        for root, dirs, files in os.walk(top_package):
-            for file in files:
-                if file.endswith(".py"):
-                    fpath = os.path.join(root, file)
-                    v = os.path.relpath(os.path.join(root, file), os.path.dirname(top_package) if not module_import else top_package)
-                    zip.write(fpath, v)
-
-    resources['zipfile'] = zip_buffer.getvalue()
-    resources['top_package'] = top_package
-    resources['module_import'] = module_import
-    return resources, top_package
-
-    if f.endswith("__init__.py"):
-        for root, dirs, files in os.walk(os.path.dirname(f)):
-            for file in files:
-                if file.endswith(".py"):
-                    # print(file)
-                    # print()
-                    v = os.path.relpath(os.path.join(root, file), top_package)
-                    with open(os.path.join(root, file), 'r') as ff:
-                        resources[v] = ff.read()
-    else:
-        v = os.path.relpath(f, top_package)
-        with open(f, 'r') as ff:
-            resources[v] = ff.read()
-    return resources
-
-import argparse
-parser = argparse.ArgumentParser(description='Evaluate your report.', epilog="""Use this script to get the score of your report. Example:
-
-> python report1_grade.py
-
-Finally, note that if your report is part of a module (package), and the report script requires part of that package, the -m option for python may be useful.
-For instance, if the report file is in Documents/course_package/report3_complete.py, and `course_package` is a python package, then change directory to 'Documents/` and run:
-
-> python -m course_package.report1
-
-see https://docs.python.org/3.9/using/cmdline.html
-""", formatter_class=argparse.RawTextHelpFormatter)
-parser.add_argument('--noprogress',  action="store_true",  help='Disable progress bars')
-parser.add_argument('--autolab',  action="store_true",  help='Show Autolab results')
-
-def gather_upload_to_campusnet(report, output_dir=None):
-    n = report.nL
-    args = parser.parse_args()
-    results, table_data = evaluate_report(report, show_help_flag=False, show_expected=False, show_computed=False, silent=True,
-                                          show_progress_bar=not args.noprogress,
-                                          big_header=not args.autolab)
-    print(" ")
-    print("="*n)
-    print("Final evaluation")
-    print(tabulate(table_data))
-    # also load the source code of missing files...
-
-    sources = {}
-
-    if not args.autolab:
-        if len(report.individual_imports) > 0:
-            print("By uploading the .token file, you verify the files:")
-            for m in report.individual_imports:
-                print(">", m.__file__)
-            print("Are created/modified individually by you in agreement with DTUs exam rules")
-            report.pack_imports += report.individual_imports
-
-        if len(report.pack_imports) > 0:
-            print("Including files in upload...")
-            for k, m in enumerate(report.pack_imports):
-                nimp, top_package = gather_imports(m)
-                _, report_relative_location, module_import = report._import_base_relative()
-
-                # report_relative_location = os.path.relpath(inspect.getfile(report.__class__), top_package)
-                nimp['report_relative_location'] = report_relative_location
-                nimp['report_module_specification'] = module_import
-                nimp['name'] = m.__name__
-                sources[k] = nimp
-                # if len([k for k in nimp if k not in sources]) > 0:
-                print(f"*** {m.__name__}")
-                # sources = {**sources, **nimp}
-    results['sources'] = sources
-
-    if output_dir is None:
-        output_dir = os.getcwd()
-
-    payload_out_base = report.__class__.__name__ + "_handin"
-
-    obtain, possible = results['total']
-    vstring = "_v"+report.version if report.version is not None else ""
-
-    token = "%s_%i_of_%i%s.token"%(payload_out_base, obtain, possible,vstring)
-    token = os.path.join(output_dir, token)
-    with open(token, 'wb') as f:
-        pickle.dump(results, f)
-
-    if not args.autolab:
-        print(" ")
-        print("To get credit for your results, please upload the single file: ")
-        print(">", token)
-        print("To campusnet without any modifications.")
-
-        # print("Now time for some autolab fun")
-
-def source_instantiate(name, report1_source, payload):
-    eval("exec")(report1_source, globals())
-    pl = pickle.loads(bytes.fromhex(payload))
-    report = eval(name)(payload=pl, strict=True)
-    # report.set_payload(pl)
-    return report
-
-
-
-report1_source = 'import os\n\n# DONT\'t import stuff here since install script requires __version__\n\ndef cache_write(object, file_name, verbose=True):\n    import compress_pickle\n    dn = os.path.dirname(file_name)\n    if not os.path.exists(dn):\n        os.mkdir(dn)\n    if verbose: print("Writing cache...", file_name)\n    with open(file_name, \'wb\', ) as f:\n        compress_pickle.dump(object, f, compression="lzma")\n    if verbose: print("Done!")\n\n\ndef cache_exists(file_name):\n    # file_name = cn_(file_name) if cache_prefix else file_name\n    return os.path.exists(file_name)\n\n\ndef cache_read(file_name):\n    import compress_pickle # Import here because if you import in top the __version__ tag will fail.\n    # file_name = cn_(file_name) if cache_prefix else file_name\n    if os.path.exists(file_name):\n        try:\n            with open(file_name, \'rb\') as f:\n                return compress_pickle.load(f, compression="lzma")\n        except Exception as e:\n            print("Tried to load a bad pickle file at", file_name)\n            print("If the file appears to be automatically generated, you can try to delete it, otherwise download a new version")\n            print(e)\n            # return pickle.load(f)\n    else:\n        return None\n\n\n\n"""\ngit add . && git commit -m "Options" && git push &&  pip install git+ssh://git@gitlab.compute.dtu.dk/tuhe/unitgrade_v1.git --upgrade\n\n"""\n# from . import cache_read\nimport unittest\nimport numpy as np\nimport sys\nimport collections\nimport re\nimport threading\nimport tqdm\nimport time\nimport pickle\nimport os\nfrom io import StringIO\nfrom unittest.runner import _WritelnDecorator\nimport inspect\n\nmyround = lambda x: np.round(x)  # required.\nmsum = lambda x: sum(x)\nmfloor = lambda x: np.floor(x)\n\ndef setup_dir_by_class(C,base_dir):\n    name = C.__class__.__name__\n    # base_dir = os.path.join(base_dir, name)\n    # if not os.path.isdir(base_dir):\n    #     os.makedirs(base_dir)\n    return base_dir, name\n\nclass Hidden:\n    def hide(self):\n        return True\n\nclass Logger(object):\n    def __init__(self, buffer):\n        self.terminal = sys.stdout\n        self.log = buffer\n\n    def write(self, message):\n        self.terminal.write(message)\n        self.log.write(message)\n\n    def flush(self):\n        # this flush method is needed for python 3 compatibility.\n        pass\n\nclass Capturing(list):\n    def __init__(self, *args, stdout=None, unmute=False, **kwargs):\n        self._stdout = stdout\n        self.unmute = unmute\n        super().__init__(*args, **kwargs)\n\n    def __enter__(self, capture_errors=True): # don\'t put arguments here.\n        self._stdout = sys.stdout if self._stdout == None else self._stdout\n        self._stringio = StringIO()\n        if self.unmute:\n            sys.stdout = Logger(self._stringio)\n        else:\n            sys.stdout = self._stringio\n\n        if capture_errors:\n            self._sterr = sys.stderr\n            sys.sterr = StringIO() # memory hole it\n        self.capture_errors = capture_errors\n        return self\n\n    def __exit__(self, *args):\n        self.extend(self._stringio.getvalue().splitlines())\n        del self._stringio    # free up some memory\n        sys.stdout = self._stdout\n        if self.capture_errors:\n            sys.sterr = self._sterr\n\nclass Capturing2(Capturing):\n    def __exit__(self, *args):\n        lines = self._stringio.getvalue().splitlines()\n        txt = "\\n".join(lines)\n        numbers = extract_numbers(txt)\n        self.extend(lines)\n        del self._stringio    # free up some memory\n        sys.stdout = self._stdout\n        if self.capture_errors:\n            sys.sterr = self._sterr\n\n        self.output = txt\n        self.numbers = numbers\n\n\nclass QItem(unittest.TestCase):\n    title = None\n    testfun = None\n    tol = 0\n    estimated_time = 0.42\n    _precomputed_payload = None\n    _computed_answer = None # Internal helper to later get results.\n    weight = 1 # the weight of the question.\n\n    def __init__(self, question=None, *args, **kwargs):\n        if self.tol > 0 and self.testfun is None:\n            self.testfun = self.assertL2Relative\n        elif self.testfun is None:\n            self.testfun = self.assertEqual\n\n        self.name = self.__class__.__name__\n        # self._correct_answer_payload = correct_answer_payload\n        self.question = question\n\n        super().__init__(*args, **kwargs)\n        if self.title is None:\n            self.title = self.name\n\n    def _safe_get_title(self):\n        if self._precomputed_title is not None:\n            return self._precomputed_title\n        return self.title\n\n    def assertNorm(self, computed, expected, tol=None):\n        if tol == None:\n            tol = self.tol\n        diff = np.abs( (np.asarray(computed).flat- np.asarray(expected)).flat )\n        nrm = np.sqrt(np.sum( diff ** 2))\n\n        self.error_computed = nrm\n\n        if nrm > tol:\n            print(f"Not equal within tolerance {tol}; norm of difference was {nrm}")\n            print(f"Element-wise differences {diff.tolist()}")\n            self.assertEqual(computed, expected, msg=f"Not equal within tolerance {tol}")\n\n    def assertL2(self, computed, expected, tol=None):\n        if tol == None:\n            tol = self.tol\n        diff = np.abs( (np.asarray(computed) - np.asarray(expected)) )\n        self.error_computed = np.max(diff)\n\n        if np.max(diff) > tol:\n            print(f"Not equal within tolerance {tol=}; deviation was {np.max(diff)=}")\n            print(f"Element-wise differences {diff.tolist()}")\n            self.assertEqual(computed, expected, msg=f"Not equal within tolerance {tol=}, {np.max(diff)=}")\n\n    def assertL2Relative(self, computed, expected, tol=None):\n        if tol == None:\n            tol = self.tol\n        diff = np.abs( (np.asarray(computed) - np.asarray(expected)) )\n        diff = diff / (1e-8 + np.abs( (np.asarray(computed) + np.asarray(expected)) ) )\n        self.error_computed = np.max(np.abs(diff))\n        if np.sum(diff > tol) > 0:\n            print(f"Not equal within tolerance {tol}")\n            print(f"Element-wise differences {diff.tolist()}")\n            self.assertEqual(computed, expected, msg=f"Not equal within tolerance {tol}")\n\n    def precomputed_payload(self):\n        return self._precomputed_payload\n\n    def precompute_payload(self):\n        # Pre-compute resources to include in tests (useful for getting around rng).\n        pass\n\n    def compute_answer(self, unmute=False):\n        raise NotImplementedError("test code here")\n\n    def test(self, computed, expected):\n        self.testfun(computed, expected)\n\n    def get_points(self, verbose=False, show_expected=False, show_computed=False,unmute=False, passall=False, silent=False, **kwargs):\n        possible = 1\n        computed = None\n        def show_computed_(computed):\n            print(">>> Your output:")\n            print(computed)\n\n        def show_expected_(expected):\n            print(">>> Expected output (note: may have been processed; read text script):")\n            print(expected)\n\n        correct = self._correct_answer_payload\n        try:\n            if unmute: # Required to not mix together print stuff.\n                print("")\n            computed = self.compute_answer(unmute=unmute)\n        except Exception as e:\n            if not passall:\n                if not silent:\n                    print("\\n=================================================================================")\n                    print(f"When trying to run test class \'{self.name}\' your code threw an error:", e)\n                    show_expected_(correct)\n                    import traceback\n                    print(traceback.format_exc())\n                    print("=================================================================================")\n                return (0, possible)\n\n        if self._computed_answer is None:\n            self._computed_answer = computed\n\n        if show_expected or show_computed:\n            print("\\n")\n        if show_expected:\n            show_expected_(correct)\n        if show_computed:\n            show_computed_(computed)\n        try:\n            if not passall:\n                self.test(computed=computed, expected=correct)\n        except Exception as e:\n            if not silent:\n                print("\\n=================================================================================")\n                print(f"Test output from test class \'{self.name}\' does not match expected result. Test error:")\n                print(e)\n                show_computed_(computed)\n                show_expected_(correct)\n            return (0, possible)\n        return (1, possible)\n\n    def score(self):\n        try:\n            self.test()\n        except Exception as e:\n            return 0\n        return 1\n\nclass QPrintItem(QItem):\n    def compute_answer_print(self):\n        """\n        Generate output which is to be tested. By default, both text written to the terminal using print(...) as well as return values\n        are send to process_output (see compute_answer below). In other words, the text generated is:\n\n        res = compute_Answer_print()\n        txt = (any terminal output generated above)\n        numbers = (any numbers found in terminal-output txt)\n\n        self.test(process_output(res, txt, numbers), <expected result>)\n\n        :return: Optional values for comparison\n        """\n        raise Exception("Generate output here. The output is passed to self.process_output")\n\n    def process_output(self, res, txt, numbers):\n        return res\n\n    def compute_answer(self, unmute=False):\n        with Capturing(unmute=unmute) as output:\n            res = self.compute_answer_print()\n        s = "\\n".join(output)\n        s = rm_progress_bar(s) # Remove progress bar.\n        numbers = extract_numbers(s)\n        self._computed_answer = (res, s, numbers)\n        return self.process_output(res, s, numbers)\n\nclass OrderedClassMembers(type):\n    @classmethod\n    def __prepare__(self, name, bases):\n        return collections.OrderedDict()\n    def __new__(self, name, bases, classdict):\n        ks = list(classdict.keys())\n        for b in bases:\n            ks += b.__ordered__\n        classdict[\'__ordered__\'] = [key for key in ks if key not in (\'__module__\', \'__qualname__\')]\n        return type.__new__(self, name, bases, classdict)\n\nclass QuestionGroup(metaclass=OrderedClassMembers):\n    title = "Untitled question"\n    partially_scored = False\n    t_init = 0  # Time spend on initialization (placeholder; set this externally).\n    estimated_time = 0.42\n    has_called_init_ = False\n    _name = None\n    _items = None\n\n    @property\n    def items(self):\n        if self._items == None:\n            self._items = []\n            members = [gt for gt in [getattr(self, gt) for gt in self.__ordered__ if gt not in ["__classcell__", "__init__"]] if inspect.isclass(gt) and issubclass(gt, QItem)]\n            for I in members:\n                self._items.append( I(question=self))\n        return self._items\n\n    @items.setter\n    def items(self, value):\n        self._items = value\n\n    @property\n    def name(self):\n        if self._name == None:\n            self._name = self.__class__.__name__\n        return self._name #\n\n    @name.setter\n    def name(self, val):\n        self._name = val\n\n    def init(self):\n        # Can be used to set resources relevant for this question instance.\n        pass\n\n    def init_all_item_questions(self):\n        for item in self.items:\n            if not item.question.has_called_init_:\n                item.question.init()\n                item.question.has_called_init_ = True\n\n\nclass Report:\n    title = "report title"\n    version = None\n    questions = []\n    pack_imports = []\n    individual_imports = []\n    nL = 80 # Maximum line width\n\n    @classmethod\n    def reset(cls):\n        for (q,_) in cls.questions:\n            if hasattr(q, \'reset\'):\n                q.reset()\n\n    @classmethod\n    def mfile(clc):\n        return inspect.getfile(clc)\n\n    def _file(self):\n        return inspect.getfile(type(self))\n\n    def _import_base_relative(self):\n        if hasattr(self.pack_imports[0], \'__path__\'):\n            root_dir = self.pack_imports[0].__path__._path[0]\n        else:\n            root_dir = self.pack_imports[0].__file__\n\n        root_dir = os.path.dirname(root_dir)\n        relative_path = os.path.relpath(self._file(), root_dir)\n        modules = os.path.normpath(relative_path[:-3]).split(os.sep)\n        return root_dir, relative_path, modules\n\n    def __init__(self, strict=False, payload=None):\n        working_directory = os.path.abspath(os.path.dirname(self._file()))\n\n        self.wdir, self.name = setup_dir_by_class(self, working_directory)\n        # self.computed_answers_file = os.path.join(self.wdir, self.name + "_resources_do_not_hand_in.dat")\n        for (q,_) in self.questions:\n            q.nL = self.nL # Set maximum line length.\n\n        if payload is not None:\n            self.set_payload(payload, strict=strict)\n        # else:\n        #     if os.path.isfile(self.computed_answers_file):\n        #         self.set_payload(cache_read(self.computed_answers_file), strict=strict)\n        #     else:\n        #         s = f"> Warning: The pre-computed answer file, {os.path.abspath(self.computed_answers_file)} is missing. The framework will NOT work as intended. Reasons may be a broken local installation."\n        #         if strict:\n        #             raise Exception(s)\n        #         else:\n        #             print(s)\n\n    def main(self, verbosity=1):\n        # Run all tests using standard unittest (nothing fancy).\n        import unittest\n        loader = unittest.TestLoader()\n        for q,_ in self.questions:\n            import time\n            start = time.time() # A good proxy for setup time is to\n            suite = loader.loadTestsFromTestCase(q)\n            unittest.TextTestRunner(verbosity=verbosity).run(suite)\n            total = time.time()              - start\n            q.time = total\n\n    def _setup_answers(self):\n        self.main()  # Run all tests in class just to get that out of the way...\n        report_cache = {}\n        for q, _ in self.questions:\n            if hasattr(q, \'_save_cache\'):\n                q()._save_cache()\n                q._cache[\'time\'] = q.time\n                report_cache[q.__qualname__] = q._cache\n            else:\n                report_cache[q.__qualname__] = {\'no cache see _setup_answers in framework.py\':True}\n        return report_cache\n\n    def set_payload(self, payloads, strict=False):\n        for q, _ in self.questions:\n            q._cache = payloads[q.__qualname__]\n\ndef rm_progress_bar(txt):\n    # More robust version. Apparently length of bar can depend on various factors, so check for order of symbols.\n    nlines = []\n    for l in txt.splitlines():\n        pct = l.find("%")\n        ql = False\n        if pct > 0:\n            i = l.find("|", pct+1)\n            if i > 0 and l.find("|", i+1) > 0:\n                ql = True\n        if not ql:\n            nlines.append(l)\n    return "\\n".join(nlines)\n\ndef extract_numbers(txt):\n    # txt = rm_progress_bar(txt)\n    numeric_const_pattern = \'[-+]? (?: (?: \\d* \\. \\d+ ) | (?: \\d+ \\.? ) )(?: [Ee] [+-]? \\d+ ) ?\'\n    rx = re.compile(numeric_const_pattern, re.VERBOSE)\n    all = rx.findall(txt)\n    all = [float(a) if (\'.\' in a or "e" in a) else int(a) for a in all]\n    if len(all) > 500:\n        print(txt)\n        raise Exception("unitgrade_v1.unitgrade_v1.py: Warning, too many numbers!", len(all))\n    return all\n\nclass ActiveProgress():\n    def __init__(self, t, start=True, title="my progress bar",show_progress_bar=True):\n        self.t = t\n        self._running = False\n        self.title = title\n        self.dt = 0.1\n        self.n = int(np.round(self.t / self.dt))\n        self.show_progress_bar = show_progress_bar\n\n        # self.pbar = tqdm.tqdm(total=self.n)\n        if start:\n            self.start()\n\n    def start(self):\n        self._running = True\n        if self.show_progress_bar:\n            self.thread = threading.Thread(target=self.run)\n            self.thread.start()\n        self.time_started = time.time()\n\n    def terminate(self):\n        if not self._running:\n            raise Exception("Stopping a stopped progress bar. ")\n        self._running = False\n        if self.show_progress_bar:\n            self.thread.join()\n        if hasattr(self, \'pbar\') and self.pbar is not None:\n            self.pbar.update(1)\n            self.pbar.close()\n            self.pbar=None\n\n        sys.stdout.flush()\n        return time.time() - self.time_started\n\n    def run(self):\n        self.pbar = tqdm.tqdm(total=self.n, file=sys.stdout, position=0, leave=False, desc=self.title, ncols=100,\n                              bar_format=\'{l_bar}{bar}| [{elapsed}<{remaining}]\')  # , unit_scale=dt, unit=\'seconds\'):\n\n        for _ in range(self.n-1): # Don\'t terminate completely; leave bar at 99% done until terminate.\n            if not self._running:\n                self.pbar.close()\n                self.pbar = None\n                break\n\n            time.sleep(self.dt)\n            self.pbar.update(1)\n\n\n# class MySuite(unittest.suite.TestSuite): # Not sure we need this one anymore.\n#     raise Exception("no suite")\n#     pass\n\ndef instance_call_stack(instance):\n    s = "-".join(map(lambda x: x.__name__, instance.__class__.mro()))\n    return s\n\ndef get_class_that_defined_method(meth):\n    for cls in inspect.getmro(meth.im_class):\n        if meth.__name__ in cls.__dict__:\n            return cls\n    return None\n\ndef caller_name(skip=2):\n    """Get a name of a caller in the format module.class.method\n\n       `skip` specifies how many levels of stack to skip while getting caller\n       name. skip=1 means "who calls me", skip=2 "who calls my caller" etc.\n\n       An empty string is returned if skipped levels exceed stack height\n    """\n    stack = inspect.stack()\n    start = 0 + skip\n    if len(stack) < start + 1:\n      return \'\'\n    parentframe = stack[start][0]\n\n    name = []\n    module = inspect.getmodule(parentframe)\n    # `modname` can be None when frame is executed directly in console\n    # TODO(techtonik): consider using __main__\n    if module:\n        name.append(module.__name__)\n    # detect classname\n    if \'self\' in parentframe.f_locals:\n        # I don\'t know any way to detect call from the object method\n        # XXX: there seems to be no way to detect static method call - it will\n        #      be just a function call\n        name.append(parentframe.f_locals[\'self\'].__class__.__name__)\n    codename = parentframe.f_code.co_name\n    if codename != \'<module>\':  # top level usually\n        name.append( codename ) # function or a method\n\n    ## Avoid circular refs and frame leaks\n    #  https://docs.python.org/2.7/library/inspect.html#the-interpreter-stack\n    del parentframe, stack\n\n    return ".".join(name)\n\ndef get_class_from_frame(fr):\n\n      args, _, _, value_dict = inspect.getargvalues(fr)\n      # we check the first parameter for the frame function is\n      # named \'self\'\n      if len(args) and args[0] == \'self\':\n            # in that case, \'self\' will be referenced in value_dict\n            instance = value_dict.get(\'self\', None)\n            if instance:\n                  # return its class\n                  # isinstance(instance, Testing) # is the actual class instance.\n\n                  return getattr(instance, \'__class__\', None)\n      # return None otherwise\n      return None\n\nfrom typing import Any\nimport inspect, gc\n\ndef giveupthefunc():\n    frame = inspect.currentframe()\n    code  = frame.f_code\n    globs = frame.f_globals\n    functype = type(lambda: 0)\n    funcs = []\n    for func in gc.get_referrers(code):\n        if type(func) is functype:\n            if getattr(func, "__code__", None) is code:\n                if getattr(func, "__globals__", None) is globs:\n                    funcs.append(func)\n                    if len(funcs) > 1:\n                        return None\n    return funcs[0] if funcs else None\n\n\nfrom collections import defaultdict\n\nclass UTextResult(unittest.TextTestResult):\n    nL = 80\n    number = -1 # HAcky way to set question number.\n    show_progress_bar = True\n    def __init__(self, stream, descriptions, verbosity):\n        super().__init__(stream, descriptions, verbosity)\n        self.successes = []\n\n    def printErrors(self) -> None:\n        # if self.dots or self.showAll:\n        #     self.stream.writeln()\n        # if hasattr(self, \'cc\'):\n        #     self.cc.terminate()\n        # self.cc_terminate(success=False)\n        self.printErrorList(\'ERROR\', self.errors)\n        self.printErrorList(\'FAIL\', self.failures)\n\n    def addError(self, test, err):\n        super(unittest.TextTestResult, self).addFailure(test, err)\n        self.cc_terminate(success=False)\n\n    def addFailure(self, test, err):\n        super(unittest.TextTestResult, self).addFailure(test, err)\n        self.cc_terminate(success=False)\n        # if self.showAll:\n        #     self.stream.writeln("FAIL")\n        # elif self.dots:\n        #     self.stream.write(\'F\')\n        #     self.stream.flush()\n\n    def addSuccess(self, test: unittest.case.TestCase) -> None:\n        # super().addSuccess(test)\n        self.successes.append(test)\n        # super().addSuccess(test)\n        #     hidden = issubclass(item.__class__, Hidden)\n        #     # if not hidden:\n        #     #     print(ss, end="")\n        #     # sys.stdout.flush()\n        #     start = time.time()\n        #\n        #     (current, possible) = item.get_points(show_expected=show_expected, show_computed=show_computed,unmute=unmute, passall=passall, silent=silent)\n        #     q_[j] = {\'w\': item.weight, \'possible\': possible, \'obtained\': current, \'hidden\': hidden, \'computed\': str(item._computed_answer), \'title\': item.title}\n        #     tsecs = np.round(time.time()-start, 2)\n        self.cc_terminate()\n\n\n\n    def cc_terminate(self, success=True):\n        if self.show_progress_bar or True:\n            tsecs = np.round(self.cc.terminate(), 2)\n            sys.stdout.flush()\n            ss = self.item_title_print\n\n            state = "PASS" if success else "FAILED"\n\n            dot_parts = (\'.\' * max(0, self.nL - len(state) - len(ss)))\n            if self.show_progress_bar or True:\n                print(self.item_title_print + dot_parts, end="")\n            else:\n                print( dot_parts, end="")\n\n            if tsecs >= 0.1:\n                state += " (" + str(tsecs) + " seconds)"\n            print(state)\n\n\n    def startTest(self, test):\n        # super().startTest(test)\n        j =self.testsRun\n        self.testsRun += 1\n        # print("Starting the test...")\n        # show_progress_bar = True\n        n = UTextResult.number\n\n        item_title = self.getDescription(test)\n        # item_title = item_title.split("\\n")[0]\n        item_title = test.shortDescription() # Better for printing (get from cache).\n        if item_title == None:\n            # For unittest framework where getDescription may return None.\n            item_title = self.getDescription(test)\n        # test.countTestCases()\n        self.item_title_print = "*** q%i.%i) %s" % (n + 1, j + 1, item_title)\n        estimated_time = 10\n        nL = 80\n        #\n        if self.show_progress_bar or True:\n            self.cc = ActiveProgress(t=estimated_time, title=self.item_title_print, show_progress_bar=self.show_progress_bar)\n        else:\n            print(self.item_title_print + (\'.\' * max(0, nL - 4 - len(self.item_title_print))), end="")\n\n        self._test = test\n\n    def _setupStdout(self):\n        if self._previousTestClass == None:\n            total_estimated_time = 1\n            if hasattr(self.__class__, \'q_title_print\'):\n                q_title_print = self.__class__.q_title_print\n            else:\n                q_title_print = "<unnamed test. See unitgrade_v1.py>"\n\n            # q_title_print = "some printed title..."\n            cc = ActiveProgress(t=total_estimated_time, title=q_title_print, show_progress_bar=self.show_progress_bar)\n            self.cc = cc\n\n    def _restoreStdout(self): # Used when setting up the test.\n        if self._previousTestClass == None:\n            q_time = self.cc.terminate()\n            q_time = np.round(q_time, 2)\n            sys.stdout.flush()\n            if self.show_progress_bar:\n                print(self.cc.title, end="")\n            # start = 10\n            # q_time = np.round(time.time() - start, 2)\n            nL = 80\n            print(" " * max(0, nL - len(self.cc.title)) + (\n                " (" + str(q_time) + " seconds)" if q_time >= 0.1 else ""))  # if q.name in report.payloads else "")\n            # print("=" * nL)\n\n\n\nclass UTextTestRunner(unittest.TextTestRunner):\n    def __init__(self, *args, **kwargs):\n        from io import StringIO\n        stream = StringIO()\n        super().__init__(*args, stream=stream, **kwargs)\n\n    def _makeResult(self):\n        # stream = self.stream # not you!\n        stream = sys.stdout\n        stream = _WritelnDecorator(stream)\n        return self.resultclass(stream, self.descriptions, self.verbosity)\n\n# def wrapper(foo):\n#     def magic(self):\n#         # s = "-".join(map(lambda x: x.__name__, self.__class__.mro()))\n#         foo(self)\n#     magic.__doc__ = foo.__doc__\n#     return magic\n\nfrom functools import update_wrapper, _make_key, RLock\nfrom collections import namedtuple\n_CacheInfo = namedtuple("CacheInfo", ["hits", "misses", "maxsize", "currsize"])\n\ndef cache(foo, typed=False):\n    """ Magic cache wrapper\n    https://github.com/python/cpython/blob/main/Lib/functools.py\n    """\n    maxsize = None\n    def wrapper(self, *args, **kwargs):\n        key = (self.cache_id(), ("@cache", foo.__name__, _make_key(args, kwargs, typed)) )\n        if not self._cache_contains(key):\n            value = foo(self, *args, **kwargs)\n            self._cache_put(key, value)\n        else:\n            value = self._cache_get(key)\n        return value\n    return wrapper\n\n\nclass UTestCase(unittest.TestCase):\n    _outcome = None # A dictionary which stores the user-computed outcomes of all the tests. This differs from the cache.\n    _cache = None  # Read-only cache. Ensures method always produce same result.\n    _cache2 = None  # User-written cache.\n\n    def capture(self):\n        return Capturing2(stdout=self._stdout)\n\n    @classmethod\n    def question_title(cls):\n        """ Return the question title """\n        return cls.__doc__.strip().splitlines()[0].strip() if cls.__doc__ != None else cls.__qualname__\n\n    @classmethod\n    def reset(cls):\n        print("Warning, I am not sure UTestCase.reset() is needed anymore and it seems very hacky.")\n        cls._outcome = None\n        cls._cache = None\n        cls._cache2 = None\n\n    def _callSetUp(self):\n        self._stdout = sys.stdout\n        import io\n        sys.stdout = io.StringIO()\n        super().setUp()\n        # print("Setting up...")\n\n    def _callTearDown(self):\n        sys.stdout = self._stdout\n        super().tearDown()\n        # print("asdfsfd")\n\n    def shortDescriptionStandard(self):\n        sd = super().shortDescription()\n        if sd == None:\n            sd = self._testMethodName\n        return sd\n\n    def shortDescription(self):\n        # self._testMethodDoc.strip().splitlines()[0].strip()\n        sd = self.shortDescriptionStandard()\n        title = self._cache_get(  (self.cache_id(), \'title\'), sd )\n        return title if title != None else sd\n\n    @property\n    def title(self):\n        return self.shortDescription()\n\n    @title.setter\n    def title(self, value):\n        self._cache_put((self.cache_id(), \'title\'), value)\n\n    def _get_outcome(self):\n        if not (self.__class__, \'_outcome\') or self.__class__._outcome == None:\n            self.__class__._outcome = {}\n        return self.__class__._outcome\n\n    def _callTestMethod(self, testMethod):\n        t = time.time()\n        self._ensure_cache_exists() # Make sure cache is there.\n        if self._testMethodDoc != None:\n            # Ensure the cache is eventually updated with the right docstring.\n            self._cache_put((self.cache_id(), \'title\'), self.shortDescriptionStandard() )\n        # Fix temp cache here (for using the @cache decorator)\n        self._cache2[ (self.cache_id(), \'assert\') ] = {}\n\n        res = testMethod()\n        elapsed = time.time() - t\n        # self._cache_put( (self.cache_id(), \'title\'), self.shortDescription() )\n\n        self._get_outcome()[self.cache_id()] = res\n        self._cache_put( (self.cache_id(), "time"), elapsed)\n\n    # This is my base test class. So what is new about it?\n    def cache_id(self):\n        c = self.__class__.__qualname__\n        m = self._testMethodName\n        return (c,m)\n\n    def __init__(self, *args, **kwargs):\n        super().__init__(*args, **kwargs)\n        self._load_cache()\n        self._assert_cache_index = 0\n        # self.cache_indexes = defaultdict(lambda: 0)\n\n    def _ensure_cache_exists(self):\n        if not hasattr(self.__class__, \'_cache\') or self.__class__._cache == None:\n            self.__class__._cache = dict()\n        if not hasattr(self.__class__, \'_cache2\') or self.__class__._cache2 == None:\n            self.__class__._cache2 = dict()\n\n    def _cache_get(self, key, default=None):\n        self._ensure_cache_exists()\n        return self.__class__._cache.get(key, default)\n\n    def _cache_put(self, key, value):\n        self._ensure_cache_exists()\n        self.__class__._cache2[key] = value\n\n    def _cache_contains(self, key):\n        self._ensure_cache_exists()\n        return key in self.__class__._cache\n\n    def wrap_assert(self, assert_fun, first, *args, **kwargs):\n        key = (self.cache_id(), \'assert\')\n        if not self._cache_contains(key):\n            print("Warning, framework missing", key)\n        cache = self._cache_get(key, {})\n        id = self._assert_cache_index\n        if not id in cache:\n            print("Warning, framework missing cache index", key, "id =", id)\n        _expected = cache.get(id, first)\n        assert_fun(first, _expected, *args, **kwargs)\n        cache[id] = first\n        self._cache_put(key, cache)\n        self._assert_cache_index += 1\n\n    def assertEqualC(self, first: Any, msg: Any = ...) -> None:\n        self.wrap_assert(self.assertEqual, first, msg)\n\n    def _cache_file(self):\n        return os.path.dirname(inspect.getfile(self.__class__) ) + "/unitgrade_v1/" + self.__class__.__name__ + ".pkl"\n\n    def _save_cache(self):\n        # get the class name (i.e. what to save to).\n        cfile = self._cache_file()\n        if not os.path.isdir(os.path.dirname(cfile)):\n            os.makedirs(os.path.dirname(cfile))\n\n        if hasattr(self.__class__, \'_cache2\'):\n            with open(cfile, \'wb\') as f:\n                pickle.dump(self.__class__._cache2, f)\n\n    # But you can also set cache explicitly.\n    def _load_cache(self):\n        if self._cache != None: # Cache already loaded. We will not load it twice.\n            return\n            # raise Exception("Loaded cache which was already set. What is going on?!")\n        cfile = self._cache_file()\n        # print("Loading cache from", cfile)\n        if os.path.exists(cfile):\n            with open(cfile, \'rb\') as f:\n                data = pickle.load(f)\n                self.__class__._cache = data\n        else:\n            print("Warning! data file not found", cfile)\n\ndef hide(func):\n    return func\n\ndef makeRegisteringDecorator(foreignDecorator):\n    """\n        Returns a copy of foreignDecorator, which is identical in every\n        way(*), except also appends a .decorator property to the callable it\n        spits out.\n    """\n    def newDecorator(func):\n        # Call to newDecorator(method)\n        # Exactly like old decorator, but output keeps track of what decorated it\n        R = foreignDecorator(func)  # apply foreignDecorator, like call to foreignDecorator(method) would have done\n        R.decorator = newDecorator  # keep track of decorator\n        # R.original = func         # might as well keep track of everything!\n        return R\n\n    newDecorator.__name__ = foreignDecorator.__name__\n    newDecorator.__doc__ = foreignDecorator.__doc__\n    # (*)We can be somewhat "hygienic", but newDecorator still isn\'t signature-preserving, i.e. you will not be able to get a runtime list of parameters. For that, you need hackish libraries...but in this case, the only argument is func, so it\'s not a big issue\n    return newDecorator\n\nhide = makeRegisteringDecorator(hide)\n\ndef methodsWithDecorator(cls, decorator):\n    """\n        Returns all methods in CLS with DECORATOR as the\n        outermost decorator.\n\n        DECORATOR must be a "registering decorator"; one\n        can make any decorator "registering" via the\n        makeRegisteringDecorator function.\n\n        import inspect\n        ls = list(methodsWithDecorator(GeneratorQuestion, deco))\n        for f in ls:\n            print(inspect.getsourcelines(f) ) # How to get all hidden questions.\n    """\n    for maybeDecorated in cls.__dict__.values():\n        if hasattr(maybeDecorated, \'decorator\'):\n            if maybeDecorated.decorator == decorator:\n                print(maybeDecorated)\n                yield maybeDecorated\n\n\n\nimport numpy as np\nfrom tabulate import tabulate\nfrom datetime import datetime\nimport pyfiglet\nimport unittest\n# from unitgrade.unitgrade import MySuite\n\nimport inspect\nimport os\nimport argparse\nimport sys\nimport time\nimport threading # don\'t import Thread bc. of minify issue.\nimport tqdm # don\'t do from tqdm import tqdm because of minify-issue\n\nparser = argparse.ArgumentParser(description=\'Evaluate your report.\', epilog="""Example: \nTo run all tests in a report: \n\n> python assignment1_dp.py\n\nTo run only question 2 or question 2.1\n\n> python assignment1_dp.py -q 2\n> python assignment1_dp.py -q 2.1\n\nNote this scripts does not grade your report. To grade your report, use:\n\n> python report1_grade.py\n\nFinally, note that if your report is part of a module (package), and the report script requires part of that package, the -m option for python may be useful.\nFor instance, if the report file is in Documents/course_package/report3_complete.py, and `course_package` is a python package, then change directory to \'Documents/` and run:\n\n> python -m course_package.report1\n\nsee https://docs.python.org/3.9/using/cmdline.html\n""", formatter_class=argparse.RawTextHelpFormatter)\nparser.add_argument(\'-q\', nargs=\'?\', type=str, default=None, help=\'Only evaluate this question (e.g.: -q 2)\')\nparser.add_argument(\'--showexpected\',  action="store_true",  help=\'Show the expected/desired result\')\nparser.add_argument(\'--showcomputed\',  action="store_true",  help=\'Show the answer your code computes\')\nparser.add_argument(\'--unmute\',  action="store_true",  help=\'Show result of print(...) commands in code\')\nparser.add_argument(\'--passall\',  action="store_true",  help=\'Automatically pass all tests. Useful when debugging.\')\n\ndef evaluate_report_student(report, question=None, qitem=None, unmute=None, passall=None, ignore_missing_file=False, show_tol_err=False):\n    args = parser.parse_args()\n    if question is None and args.q is not None:\n        question = args.q\n        if "." in question:\n            question, qitem = [int(v) for v in question.split(".")]\n        else:\n            question = int(question)\n\n    if hasattr(report, "computed_answer_file") and not os.path.isfile(report.computed_answers_file) and not ignore_missing_file:\n        raise Exception("> Error: The pre-computed answer file", os.path.abspath(report.computed_answers_file), "does not exist. Check your package installation")\n\n    if unmute is None:\n        unmute = args.unmute\n    if passall is None:\n        passall = args.passall\n\n    results, table_data = evaluate_report(report, question=question, show_progress_bar=not unmute, qitem=qitem, verbose=False, passall=passall, show_expected=args.showexpected, show_computed=args.showcomputed,unmute=unmute,\n                                          show_tol_err=show_tol_err)\n\n\n    if question is None:\n        print("Provisional evaluation")\n        tabulate(table_data)\n        table = table_data\n        print(tabulate(table))\n        print(" ")\n\n    fr = inspect.getouterframes(inspect.currentframe())[1].filename\n    gfile = os.path.basename(fr)[:-3] + "_grade.py"\n    if os.path.exists(gfile):\n        print("Note your results have not yet been registered. \\nTo register your results, please run the file:")\n        print(">>>", gfile)\n        print("In the same manner as you ran this file.")\n\n\n    return results\n\n\ndef upack(q):\n    # h = zip([(i[\'w\'], i[\'possible\'], i[\'obtained\']) for i in q.values()])\n    h =[(i[\'w\'], i[\'possible\'], i[\'obtained\']) for i in q.values()]\n    h = np.asarray(h)\n    return h[:,0], h[:,1], h[:,2],\n\nclass UnitgradeTextRunner(unittest.TextTestRunner):\n    def __init__(self, *args, **kwargs):\n        super().__init__(*args, **kwargs)\n\nclass SequentialTestLoader(unittest.TestLoader):\n    def getTestCaseNames(self, testCaseClass):\n        test_names = super().getTestCaseNames(testCaseClass)\n        # testcase_methods = list(testCaseClass.__dict__.keys())\n        ls = []\n        for C in testCaseClass.mro():\n            if issubclass(C, unittest.TestCase):\n                ls = list(C.__dict__.keys()) + ls\n        testcase_methods = ls\n        test_names.sort(key=testcase_methods.index)\n        return test_names\n\ndef evaluate_report(report, question=None, qitem=None, passall=False, verbose=False,  show_expected=False, show_computed=False,unmute=False, show_help_flag=True, silent=False,\n                    show_progress_bar=True,\n                    show_tol_err=False,\n                    big_header=True):\n\n    now = datetime.now()\n    if big_header:\n        ascii_banner = pyfiglet.figlet_format("UnitGrade", font="doom")\n        b = "\\n".join( [l for l in ascii_banner.splitlines() if len(l.strip()) > 0] )\n    else:\n        b = "Unitgrade"\n    print(b + " v" + __version__)\n    dt_string = now.strftime("%d/%m/%Y %H:%M:%S")\n    print("Started: " + dt_string)\n    s = report.title\n    if hasattr(report, "version") and report.version is not None:\n        s += " version " + report.version\n    print("Evaluating " + s, "(use --help for options)" if show_help_flag else "")\n    # print(f"Loaded answers from: ", report.computed_answers_file, "\\n")\n    table_data = []\n    nL = 80\n    t_start = time.time()\n    score = {}\n    loader = SequentialTestLoader()\n\n    for n, (q, w) in enumerate(report.questions):\n        # q = q()\n        # q_hidden = False\n        # q_hidden = issubclass(q.__class__, Hidden)\n        if question is not None and n+1 != question:\n            continue\n        suite = loader.loadTestsFromTestCase(q)\n        qtitle = q.question_title() if hasattr(q, \'question_title\') else q.__qualname__\n        q_title_print = "Question %i: %s"%(n+1, qtitle)\n        print(q_title_print, end="")\n        q.possible = 0\n        q.obtained = 0\n        q_ = {} # Gather score in this class.\n        # unittest.Te\n        # q_with_outstanding_init = [item.question for item in q.items if not item.question.has_called_init_]\n        UTextResult.q_title_print = q_title_print # Hacky\n        UTextResult.show_progress_bar = show_progress_bar # Hacky.\n        UTextResult.number = n\n\n        res = UTextTestRunner(verbosity=2, resultclass=UTextResult).run(suite)\n\n        possible = res.testsRun\n        obtained = len(res.successes)\n\n        assert len(res.successes) +  len(res.errors) + len(res.failures) == res.testsRun\n\n        # possible = int(ws @ possible)\n        # obtained = int(ws @ obtained)\n        # obtained = int(myround(int((w * obtained) / possible ))) if possible > 0 else 0\n\n        obtained = int(w * obtained * 1.0 / possible ) if possible > 0 else 0\n        score[n] = {\'w\': w, \'possible\': w, \'obtained\': obtained, \'items\': q_, \'title\': qtitle}\n        q.obtained = obtained\n        q.possible = possible\n\n        s1 = f"*** Question q{n+1}"\n        s2 = f" {q.obtained}/{w}"\n        print(s1 + ("."* (nL-len(s1)-len(s2) )) + s2 )\n        print(" ")\n        table_data.append([f"Question q{n+1}", f"{q.obtained}/{w}"])\n\n    ws, possible, obtained = upack(score)\n    possible = int( msum(possible) )\n    obtained = int( msum(obtained) ) # Cast to python int\n    report.possible = possible\n    report.obtained = obtained\n    now = datetime.now()\n    dt_string = now.strftime("%H:%M:%S")\n\n    dt = int(time.time()-t_start)\n    minutes = dt//60\n    seconds = dt - minutes*60\n    plrl = lambda i, s: str(i) + " " + s + ("s" if i != 1 else "")\n\n    print(f"Completed: "+ dt_string + " (" + plrl(minutes, "minute") + ", "+ plrl(seconds, "second") +")")\n\n    table_data.append(["Total", ""+str(report.obtained)+"/"+str(report.possible) ])\n    results = {\'total\': (obtained, possible), \'details\': score}\n    return results, table_data\n\n\n\n\nfrom tabulate import tabulate\nfrom datetime import datetime\nimport inspect\nimport json\nimport os\nimport bz2\nimport pickle\nimport os\n\ndef bzwrite(json_str, token): # to get around obfuscation issues\n    with getattr(bz2, \'open\')(token, "wt") as f:\n        f.write(json_str)\n\ndef gather_imports(imp):\n    resources = {}\n    m = imp\n    # for m in pack_imports:\n    # print(f"*** {m.__name__}")\n    f = m.__file__\n    # dn = os.path.dirname(f)\n    # top_package = os.path.dirname(__import__(m.__name__.split(\'.\')[0]).__file__)\n    # top_package = str(__import__(m.__name__.split(\'.\')[0]).__path__)\n\n    if hasattr(m, \'__file__\') and not hasattr(m, \'__path__\'):  # Importing a simple file: m.__class__.__name__ == \'module\' and False:\n        top_package = os.path.dirname(m.__file__)\n        module_import = True\n    else:\n        top_package = __import__(m.__name__.split(\'.\')[0]).__path__._path[0]\n        module_import = False\n\n    # top_package = os.path.dirname(__import__(m.__name__.split(\'.\')[0]).__file__)\n    # top_package = os.path.dirname(top_package)\n    import zipfile\n    # import strea\n    # zipfile.ZipFile\n    import io\n    # file_like_object = io.BytesIO(my_zip_data)\n    zip_buffer = io.BytesIO()\n    with zipfile.ZipFile(zip_buffer, \'w\') as zip:\n        # zip.write()\n        for root, dirs, files in os.walk(top_package):\n            for file in files:\n                if file.endswith(".py"):\n                    fpath = os.path.join(root, file)\n                    v = os.path.relpath(os.path.join(root, file), os.path.dirname(top_package) if not module_import else top_package)\n                    zip.write(fpath, v)\n\n    resources[\'zipfile\'] = zip_buffer.getvalue()\n    resources[\'top_package\'] = top_package\n    resources[\'module_import\'] = module_import\n    return resources, top_package\n\n    if f.endswith("__init__.py"):\n        for root, dirs, files in os.walk(os.path.dirname(f)):\n            for file in files:\n                if file.endswith(".py"):\n                    # print(file)\n                    # print()\n                    v = os.path.relpath(os.path.join(root, file), top_package)\n                    with open(os.path.join(root, file), \'r\') as ff:\n                        resources[v] = ff.read()\n    else:\n        v = os.path.relpath(f, top_package)\n        with open(f, \'r\') as ff:\n            resources[v] = ff.read()\n    return resources\n\nimport argparse\nparser = argparse.ArgumentParser(description=\'Evaluate your report.\', epilog="""Use this script to get the score of your report. Example:\n\n> python report1_grade.py\n\nFinally, note that if your report is part of a module (package), and the report script requires part of that package, the -m option for python may be useful.\nFor instance, if the report file is in Documents/course_package/report3_complete.py, and `course_package` is a python package, then change directory to \'Documents/` and run:\n\n> python -m course_package.report1\n\nsee https://docs.python.org/3.9/using/cmdline.html\n""", formatter_class=argparse.RawTextHelpFormatter)\nparser.add_argument(\'--noprogress\',  action="store_true",  help=\'Disable progress bars\')\nparser.add_argument(\'--autolab\',  action="store_true",  help=\'Show Autolab results\')\n\ndef gather_upload_to_campusnet(report, output_dir=None):\n    n = report.nL\n    args = parser.parse_args()\n    results, table_data = evaluate_report(report, show_help_flag=False, show_expected=False, show_computed=False, silent=True,\n                                          show_progress_bar=not args.noprogress,\n                                          big_header=not args.autolab)\n    print(" ")\n    print("="*n)\n    print("Final evaluation")\n    print(tabulate(table_data))\n    # also load the source code of missing files...\n\n    sources = {}\n\n    if not args.autolab:\n        if len(report.individual_imports) > 0:\n            print("By uploading the .token file, you verify the files:")\n            for m in report.individual_imports:\n                print(">", m.__file__)\n            print("Are created/modified individually by you in agreement with DTUs exam rules")\n            report.pack_imports += report.individual_imports\n\n        if len(report.pack_imports) > 0:\n            print("Including files in upload...")\n            for k, m in enumerate(report.pack_imports):\n                nimp, top_package = gather_imports(m)\n                _, report_relative_location, module_import = report._import_base_relative()\n\n                # report_relative_location = os.path.relpath(inspect.getfile(report.__class__), top_package)\n                nimp[\'report_relative_location\'] = report_relative_location\n                nimp[\'report_module_specification\'] = module_import\n                nimp[\'name\'] = m.__name__\n                sources[k] = nimp\n                # if len([k for k in nimp if k not in sources]) > 0:\n                print(f"*** {m.__name__}")\n                # sources = {**sources, **nimp}\n    results[\'sources\'] = sources\n\n    if output_dir is None:\n        output_dir = os.getcwd()\n\n    payload_out_base = report.__class__.__name__ + "_handin"\n\n    obtain, possible = results[\'total\']\n    vstring = "_v"+report.version if report.version is not None else ""\n\n    token = "%s_%i_of_%i%s.token"%(payload_out_base, obtain, possible,vstring)\n    token = os.path.join(output_dir, token)\n    with open(token, \'wb\') as f:\n        pickle.dump(results, f)\n\n    if not args.autolab:\n        print(" ")\n        print("To get credit for your results, please upload the single file: ")\n        print(">", token)\n        print("To campusnet without any modifications.")\n\n        # print("Now time for some autolab fun")\n\ndef source_instantiate(name, report1_source, payload):\n    eval("exec")(report1_source, globals())\n    pl = pickle.loads(bytes.fromhex(payload))\n    report = eval(name)(payload=pl, strict=True)\n    # report.set_payload(pl)\n    return report\n\n\n__version__ = "0.9.0"\n\nfrom homework1 import reverse_list, add\nimport unittest\n\nclass Week1(unittest.TestCase):\n    def test_add(self):\n        self.assertEqual(add(2,2), 4)\n        self.assertEqual(add(-100, 5), -95)\n\n    def test_reverse(self):\n        self.assertEqual(reverse_list([1,2,3]), [3,2,1])\n\n\nimport homework1\nclass Report1Flat(Report):\n    title = "CS 101 Report 1"\n    questions = [(Week1, 10)]  # Include a single question for 10 credits.\n    pack_imports = [homework1]'
-report1_payload = '8004953f000000000000007d948c055765656b31947d948c2c6e6f20636163686520736565205f73657475705f616e737765727320696e20756e69746772616465322e7079948873732e'
-name="Report1Flat"
-
-report = source_instantiate(name, report1_source, report1_payload)
-output_dir = os.path.dirname(__file__)
-gather_upload_to_campusnet(report, output_dir)
diff --git a/examples/example_moss/student_submissions/s1003/Report2_handin_18_of_18.token b/examples/example_moss/student_submissions/s1003/Report2_handin_18_of_18.token
new file mode 100644
index 0000000..59fb2e9
--- /dev/null
+++ b/examples/example_moss/student_submissions/s1003/Report2_handin_18_of_18.token
@@ -0,0 +1,252 @@
+# This file contains your results. Do not edit its content. Simply upload it as it is. 
+### Content of cs102\homework1.py ###
+
+def reverse_list(mylist): #!f #!s;keeptags
+    """
+    Given a list 'mylist' returns a list consisting of the same elements in reverse order. E.g.
+    reverse_list([1,2,3]) should return [3,2,1] (as a list).
+    """
+    ls = []
+    for l in mylist:
+        ls = [l] + ls
+    return ls
+    # return list(reversed(mylist))
+
+def add(a,b): #!f
+    """ Given two numbers `a` and `b` this function should simply return their sum:
+    > add(a,b) = a+b """
+    sum2 = a + b
+    return sum2
+
+if __name__ == "__main__":
+    # Example usage:
+    print(f"Your result of 2 + 2 = {add(2,2)}")
+    print(f"Reversing a small list", reverse_list([2,3,5,7])) #!s
+
+
+### Content of cs102\report2.py ###
+
+from unitgrade.framework import Report
+from unitgrade.evaluate import evaluate_report_student
+from cs102.homework1 import add, reverse_list
+from unitgrade import UTestCase, cache  
+
+class Week1(UTestCase):
+    def test_add(self):
+        self.assertEqualC(add(2,2))
+        self.assertEqualC(add(-100, 5))
+
+    def test_reverse(self):
+        self.assertEqualC(reverse_list([1, 2, 3])) 
+
+    def test_output_capture(self):
+        with self.capture() as out:
+            print("hello world 42")                     # Genereate some output (i.e. in a homework script)
+        self.assertEqual(out.numbers[0], 42)            # out.numbers is a list of all numbers generated
+        self.assertEqual(out.output, "hello world 42")  # you can also access the raw output.
+
+class Week1Titles(UTestCase): 
+    """ The same problem as before with nicer titles """
+    def test_add(self):
+        """ Test the addition method add(a,b) """
+        self.assertEqualC(add(2,2))
+        self.assertEqualC(add(-100, 5))
+
+    def test_reverse(self):
+        ls = [1, 2, 3]
+        reverse = reverse_list(ls)
+        self.assertEqualC(reverse)
+        # Although the title is set after the test potentially fails, it will *always* show correctly for the student.
+        self.title = f"Checking if reverse_list({ls}) = {reverse}"  # Programmatically set the title 
+
+    def ex_test_output_capture(self):
+        with self.capture() as out:
+            print("hello world 42")                     # Genereate some output (i.e. in a homework script)
+        self.assertEqual(out.numbers[0], 42)            # out.numbers is a list of all numbers generated
+        self.assertEqual(out.output, "hello world 42")  # you can also access the raw output.
+
+
+class Question2(UTestCase): 
+    @cache
+    def my_reversal(self, ls):
+        # The '@cache' decorator ensures the function is not run on the *students* computer
+        # Instead the code is run on the teachers computer and the result is passed on with the
+        # other pre-computed results -- i.e. this function will run regardless of how the student happens to have
+        # implemented reverse_list.
+        return reverse_list(ls)
+
+    def test_reverse_tricky(self):
+        ls = (2,4,8)
+        ls2 = self.my_reversal(tuple(ls))                   # This will always produce the right result, [8, 4, 2]
+        print("The correct answer is supposed to be", ls2)  # Show students the correct answer
+        self.assertEqualC(reverse_list(ls))                 # This will actually test the students code.
+        return "Buy world!"                                 # This value will be stored in the .token file  
+
+
+import cs102
+class Report2(Report):
+    title = "CS 101 Report 2"
+    questions = [(Week1, 10), (Week1Titles, 8)]
+    pack_imports = [cs102]
+
+if __name__ == "__main__":
+    evaluate_report_student(Report2(), unmute=True)
+---------------------------------------------------------------------- ..ooO0Ooo.. ----------------------------------------------------------------------
+4feb7306886b544a50d7c0783f0a521df06b49981bb92bbb57cf4ec9357af4b3e2d7fe806f0e3bee56e81e768363e5d79224c7a47cf9e626f04a66b2c4cba906 27932
+---------------------------------------------------------------------- ..ooO0Ooo.. ----------------------------------------------------------------------
+.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
+AAa6jAYeAAgLSj16xxGf7AgAAAAAEWVo=.
\ No newline at end of file
diff --git a/examples/example_moss/student_submissions/s1003/Report2_handin_18_of_18_0/cs102/homework1.py b/examples/example_moss/student_submissions/s1003/Report2_handin_18_of_18_0/cs102/homework1.py
new file mode 100644
index 0000000..5ca8046
--- /dev/null
+++ b/examples/example_moss/student_submissions/s1003/Report2_handin_18_of_18_0/cs102/homework1.py
@@ -0,0 +1,21 @@
+def reverse_list(mylist): #!f #!s;keeptags
+    """
+    Given a list 'mylist' returns a list consisting of the same elements in reverse order. E.g.
+    reverse_list([1,2,3]) should return [3,2,1] (as a list).
+    """
+    ls = []
+    for l in mylist:
+        ls = [l] + ls
+    return ls
+    # return list(reversed(mylist))
+
+def add(a,b): #!f
+    """ Given two numbers `a` and `b` this function should simply return their sum:
+    > add(a,b) = a+b """
+    sum2 = a + b
+    return sum2
+
+if __name__ == "__main__":
+    # Example usage:
+    print(f"Your result of 2 + 2 = {add(2,2)}")
+    print(f"Reversing a small list", reverse_list([2,3,5,7])) #!s
diff --git a/examples/example_moss/student_submissions/s1003/Report2_handin_18_of_18_0/cs102/report2.py b/examples/example_moss/student_submissions/s1003/Report2_handin_18_of_18_0/cs102/report2.py
new file mode 100644
index 0000000..894b769
--- /dev/null
+++ b/examples/example_moss/student_submissions/s1003/Report2_handin_18_of_18_0/cs102/report2.py
@@ -0,0 +1,65 @@
+from unitgrade.framework import Report
+from unitgrade.evaluate import evaluate_report_student
+from cs102.homework1 import add, reverse_list
+from unitgrade import UTestCase, cache  
+
+class Week1(UTestCase):
+    def test_add(self):
+        self.assertEqualC(add(2,2))
+        self.assertEqualC(add(-100, 5))
+
+    def test_reverse(self):
+        self.assertEqualC(reverse_list([1, 2, 3])) 
+
+    def test_output_capture(self):
+        with self.capture() as out:
+            print("hello world 42")                     # Genereate some output (i.e. in a homework script)
+        self.assertEqual(out.numbers[0], 42)            # out.numbers is a list of all numbers generated
+        self.assertEqual(out.output, "hello world 42")  # you can also access the raw output.
+
+class Week1Titles(UTestCase): 
+    """ The same problem as before with nicer titles """
+    def test_add(self):
+        """ Test the addition method add(a,b) """
+        self.assertEqualC(add(2,2))
+        self.assertEqualC(add(-100, 5))
+
+    def test_reverse(self):
+        ls = [1, 2, 3]
+        reverse = reverse_list(ls)
+        self.assertEqualC(reverse)
+        # Although the title is set after the test potentially fails, it will *always* show correctly for the student.
+        self.title = f"Checking if reverse_list({ls}) = {reverse}"  # Programmatically set the title 
+
+    def ex_test_output_capture(self):
+        with self.capture() as out:
+            print("hello world 42")                     # Genereate some output (i.e. in a homework script)
+        self.assertEqual(out.numbers[0], 42)            # out.numbers is a list of all numbers generated
+        self.assertEqual(out.output, "hello world 42")  # you can also access the raw output.
+
+
+class Question2(UTestCase): 
+    @cache
+    def my_reversal(self, ls):
+        # The '@cache' decorator ensures the function is not run on the *students* computer
+        # Instead the code is run on the teachers computer and the result is passed on with the
+        # other pre-computed results -- i.e. this function will run regardless of how the student happens to have
+        # implemented reverse_list.
+        return reverse_list(ls)
+
+    def test_reverse_tricky(self):
+        ls = (2,4,8)
+        ls2 = self.my_reversal(tuple(ls))                   # This will always produce the right result, [8, 4, 2]
+        print("The correct answer is supposed to be", ls2)  # Show students the correct answer
+        self.assertEqualC(reverse_list(ls))                 # This will actually test the students code.
+        return "Buy world!"                                 # This value will be stored in the .token file  
+
+
+import cs102
+class Report2(Report):
+    title = "CS 101 Report 2"
+    questions = [(Week1, 10), (Week1Titles, 8)]
+    pack_imports = [cs102]
+
+if __name__ == "__main__":
+    evaluate_report_student(Report2(), unmute=True)
diff --git a/examples/example_moss/student_submissions/s1003/Report2_handin_18_of_18_0/cs102/report2_grade.py b/examples/example_moss/student_submissions/s1003/Report2_handin_18_of_18_0/cs102/report2_grade.py
new file mode 100644
index 0000000..13a61a6
--- /dev/null
+++ b/examples/example_moss/student_submissions/s1003/Report2_handin_18_of_18_0/cs102/report2_grade.py
@@ -0,0 +1,3 @@
+''' WARNING: Modifying, decompiling or otherwise tampering with this script, it's data or the resulting .token file will be investigated as a cheating attempt. '''
+import bz2, base64
+exec(bz2.decompress(base64.b64decode('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')))
\ No newline at end of file
diff --git a/examples/example_moss/student_submissions/s1002/Report1Flat_handin_5_of_10_0/homework1.py b/examples/example_moss/tmp/base/0_homework1.py
similarity index 56%
rename from examples/example_moss/student_submissions/s1002/Report1Flat_handin_5_of_10_0/homework1.py
rename to examples/example_moss/tmp/base/0_homework1.py
index cea7abe..c314aab 100644
--- a/examples/example_moss/student_submissions/s1002/Report1Flat_handin_5_of_10_0/homework1.py
+++ b/examples/example_moss/tmp/base/0_homework1.py
@@ -1,25 +1,18 @@
-"""
-Example student code. This file is automatically generated from the files in the instructor-directory
-"""
 def reverse_list(mylist): 
     """
     Given a list 'mylist' returns a list consisting of the same elements in reverse order. E.g.
     reverse_list([1,2,3]) should return [3,2,1] (as a list).
     """
-    mylist = mylist * 10
-    reverse(mylist)
-    return mylist.reverse(30)
     # TODO: 1 lines missing.
     raise NotImplementedError("Implement function body")
 
-def add(a,b):
-    return a+b
+def add(a,b): 
     """ Given two numbers `a` and `b` this function should simply return their sum:
     > add(a,b) = a+b """
     # TODO: 1 lines missing.
-    # raise NotImplementedError("Implement function body")
+    raise NotImplementedError("Implement function body")
 
 if __name__ == "__main__":
-    # Problem 1: Write a function which add two numbers
+    # Example usage:
     print(f"Your result of 2 + 2 = {add(2,2)}")
-    print(f"Reversing a small list", reverse_list([2,3,5,7]))
+    print(f"Reversing a small list", reverse_list([2,3,5,7])) 
diff --git a/examples/example_moss/tmp/base/0_report1flat.py b/examples/example_moss/tmp/base/0_report1flat.py
deleted file mode 100644
index e80df4b..0000000
--- a/examples/example_moss/tmp/base/0_report1flat.py
+++ /dev/null
@@ -1,27 +0,0 @@
-"""
-Example student code. This file is automatically generated from the files in the instructor-directory
-"""
-from src.unitgrade.framework import Report
-from src.unitgrade import evaluate_report_student
-from homework1 import reverse_list, add
-import unittest
-
-class Week1(unittest.TestCase):
-    def test_add(self):
-        self.assertEqual(add(2,2), 4)
-        self.assertEqual(add(-100, 5), -95)
-
-    def test_reverse(self):
-        self.assertEqual(reverse_list([1,2,3]), [3,2,1])
-
-
-import homework1
-class Report1Flat(Report):
-    title = "CS 101 Report 1"
-    questions = [(Week1, 10)]  # Include a single question for 10 credits.
-    pack_imports = [homework1]
-
-if __name__ == "__main__":
-    # Uncomment to simply run everything as a unittest:
-    # unittest.main(verbosity=2)
-    evaluate_report_student(Report1Flat())
diff --git a/examples/example_moss/tmp/base/1_report2.py b/examples/example_moss/tmp/base/1_report2.py
new file mode 100644
index 0000000..894b769
--- /dev/null
+++ b/examples/example_moss/tmp/base/1_report2.py
@@ -0,0 +1,65 @@
+from unitgrade.framework import Report
+from unitgrade.evaluate import evaluate_report_student
+from cs102.homework1 import add, reverse_list
+from unitgrade import UTestCase, cache  
+
+class Week1(UTestCase):
+    def test_add(self):
+        self.assertEqualC(add(2,2))
+        self.assertEqualC(add(-100, 5))
+
+    def test_reverse(self):
+        self.assertEqualC(reverse_list([1, 2, 3])) 
+
+    def test_output_capture(self):
+        with self.capture() as out:
+            print("hello world 42")                     # Genereate some output (i.e. in a homework script)
+        self.assertEqual(out.numbers[0], 42)            # out.numbers is a list of all numbers generated
+        self.assertEqual(out.output, "hello world 42")  # you can also access the raw output.
+
+class Week1Titles(UTestCase): 
+    """ The same problem as before with nicer titles """
+    def test_add(self):
+        """ Test the addition method add(a,b) """
+        self.assertEqualC(add(2,2))
+        self.assertEqualC(add(-100, 5))
+
+    def test_reverse(self):
+        ls = [1, 2, 3]
+        reverse = reverse_list(ls)
+        self.assertEqualC(reverse)
+        # Although the title is set after the test potentially fails, it will *always* show correctly for the student.
+        self.title = f"Checking if reverse_list({ls}) = {reverse}"  # Programmatically set the title 
+
+    def ex_test_output_capture(self):
+        with self.capture() as out:
+            print("hello world 42")                     # Genereate some output (i.e. in a homework script)
+        self.assertEqual(out.numbers[0], 42)            # out.numbers is a list of all numbers generated
+        self.assertEqual(out.output, "hello world 42")  # you can also access the raw output.
+
+
+class Question2(UTestCase): 
+    @cache
+    def my_reversal(self, ls):
+        # The '@cache' decorator ensures the function is not run on the *students* computer
+        # Instead the code is run on the teachers computer and the result is passed on with the
+        # other pre-computed results -- i.e. this function will run regardless of how the student happens to have
+        # implemented reverse_list.
+        return reverse_list(ls)
+
+    def test_reverse_tricky(self):
+        ls = (2,4,8)
+        ls2 = self.my_reversal(tuple(ls))                   # This will always produce the right result, [8, 4, 2]
+        print("The correct answer is supposed to be", ls2)  # Show students the correct answer
+        self.assertEqualC(reverse_list(ls))                 # This will actually test the students code.
+        return "Buy world!"                                 # This value will be stored in the .token file  
+
+
+import cs102
+class Report2(Report):
+    title = "CS 101 Report 2"
+    questions = [(Week1, 10), (Week1Titles, 8)]
+    pack_imports = [cs102]
+
+if __name__ == "__main__":
+    evaluate_report_student(Report2(), unmute=True)
diff --git a/examples/example_moss/tmp/base/2_deploy.py b/examples/example_moss/tmp/base/2_deploy.py
deleted file mode 100644
index b110ad5..0000000
--- a/examples/example_moss/tmp/base/2_deploy.py
+++ /dev/null
@@ -1,8 +0,0 @@
-from report1flat import Report1Flat
-from unitgrade_private.hidden_create_files import setup_grade_file_report
-from snipper import snip_dir
-
-if __name__ == "__main__":
-    setup_grade_file_report(Report1Flat)
-    # Deploy the files using snipper: https://gitlab.compute.dtu.dk/tuhe/snipper
-    snip_dir.snip_dir("./", "../../students/cs101flat", clean_destination_dir=True, exclude=['__pycache__', '*.token', 'deploy.py'])
diff --git a/examples/example_moss/tmp/base/2_report2_grade.py b/examples/example_moss/tmp/base/2_report2_grade.py
new file mode 100644
index 0000000..13a61a6
--- /dev/null
+++ b/examples/example_moss/tmp/base/2_report2_grade.py
@@ -0,0 +1,3 @@
+''' WARNING: Modifying, decompiling or otherwise tampering with this script, it's data or the resulting .token file will be investigated as a cheating attempt. '''
+import bz2, base64
+exec(bz2.decompress(base64.b64decode('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')))
\ No newline at end of file
diff --git a/examples/example_moss/tmp/base/4_report1flat.py b/examples/example_moss/tmp/base/4_report1flat.py
deleted file mode 100644
index f944f97..0000000
--- a/examples/example_moss/tmp/base/4_report1flat.py
+++ /dev/null
@@ -1,21 +0,0 @@
-from unitgrade.framework import Report
-from unitgrade.evaluate import evaluate_report_student
-from homework1 import reverse_list, add
-import homework1
-import unittest
-
-class Week1(unittest.TestCase):
-    def test_add(self):
-        self.assertEqual(add(2,2), 4)
-        self.assertEqual(add(-100, 5), -95)
-
-    def test_reverse(self):
-        self.assertEqual(reverse_list([1,2,3]), [3,2,1])
-
-class Report1Flat(Report):
-    title = "CS 101 Report 1"
-    questions = [(Week1, 10)]  # Include a single question for 10 credits.
-    pack_imports = [homework1] # Unitgrade will recursively include all .py files from "cs101flat"
-
-if __name__ == "__main__":
-    evaluate_report_student(Report1Flat())
diff --git a/examples/example_moss/tmp/base/5_report1flat_grade.py b/examples/example_moss/tmp/base/5_report1flat_grade.py
deleted file mode 100644
index 96e8e37..0000000
--- a/examples/example_moss/tmp/base/5_report1flat_grade.py
+++ /dev/null
@@ -1,349 +0,0 @@
-
-import numpy as np
-from tabulate import tabulate
-from datetime import datetime
-import pyfiglet
-import unittest
-# from unitgrade.unitgrade import MySuite
-
-import inspect
-import os
-import argparse
-import sys
-import time
-import threading # don't import Thread bc. of minify issue.
-import tqdm # don't do from tqdm import tqdm because of minify-issue
-
-parser = argparse.ArgumentParser(description='Evaluate your report.', epilog="""Example: 
-To run all tests in a report: 
-
-> python assignment1_dp.py
-
-To run only question 2 or question 2.1
-
-> python assignment1_dp.py -q 2
-> python assignment1_dp.py -q 2.1
-
-Note this scripts does not grade your report. To grade your report, use:
-
-> python report1_grade.py
-
-Finally, note that if your report is part of a module (package), and the report script requires part of that package, the -m option for python may be useful.
-For instance, if the report file is in Documents/course_package/report3_complete.py, and `course_package` is a python package, then change directory to 'Documents/` and run:
-
-> python -m course_package.report1
-
-see https://docs.python.org/3.9/using/cmdline.html
-""", formatter_class=argparse.RawTextHelpFormatter)
-parser.add_argument('-q', nargs='?', type=str, default=None, help='Only evaluate this question (e.g.: -q 2)')
-parser.add_argument('--showexpected',  action="store_true",  help='Show the expected/desired result')
-parser.add_argument('--showcomputed',  action="store_true",  help='Show the answer your code computes')
-parser.add_argument('--unmute',  action="store_true",  help='Show result of print(...) commands in code')
-parser.add_argument('--passall',  action="store_true",  help='Automatically pass all tests. Useful when debugging.')
-
-def evaluate_report_student(report, question=None, qitem=None, unmute=None, passall=None, ignore_missing_file=False, show_tol_err=False):
-    args = parser.parse_args()
-    if question is None and args.q is not None:
-        question = args.q
-        if "." in question:
-            question, qitem = [int(v) for v in question.split(".")]
-        else:
-            question = int(question)
-
-    if hasattr(report, "computed_answer_file") and not os.path.isfile(report.computed_answers_file) and not ignore_missing_file:
-        raise Exception("> Error: The pre-computed answer file", os.path.abspath(report.computed_answers_file), "does not exist. Check your package installation")
-
-    if unmute is None:
-        unmute = args.unmute
-    if passall is None:
-        passall = args.passall
-
-    results, table_data = evaluate_report(report, question=question, show_progress_bar=not unmute, qitem=qitem, verbose=False, passall=passall, show_expected=args.showexpected, show_computed=args.showcomputed,unmute=unmute,
-                                          show_tol_err=show_tol_err)
-
-
-    if question is None:
-        print("Provisional evaluation")
-        tabulate(table_data)
-        table = table_data
-        print(tabulate(table))
-        print(" ")
-
-    fr = inspect.getouterframes(inspect.currentframe())[1].filename
-    gfile = os.path.basename(fr)[:-3] + "_grade.py"
-    if os.path.exists(gfile):
-        print("Note your results have not yet been registered. \nTo register your results, please run the file:")
-        print(">>>", gfile)
-        print("In the same manner as you ran this file.")
-
-
-    return results
-
-
-def upack(q):
-    # h = zip([(i['w'], i['possible'], i['obtained']) for i in q.values()])
-    h =[(i['w'], i['possible'], i['obtained']) for i in q.values()]
-    h = np.asarray(h)
-    return h[:,0], h[:,1], h[:,2],
-
-class UnitgradeTextRunner(unittest.TextTestRunner):
-    def __init__(self, *args, **kwargs):
-        super().__init__(*args, **kwargs)
-
-class SequentialTestLoader(unittest.TestLoader):
-    def getTestCaseNames(self, testCaseClass):
-        test_names = super().getTestCaseNames(testCaseClass)
-        # testcase_methods = list(testCaseClass.__dict__.keys())
-        ls = []
-        for C in testCaseClass.mro():
-            if issubclass(C, unittest.TestCase):
-                ls = list(C.__dict__.keys()) + ls
-        testcase_methods = ls
-        test_names.sort(key=testcase_methods.index)
-        return test_names
-
-def evaluate_report(report, question=None, qitem=None, passall=False, verbose=False,  show_expected=False, show_computed=False,unmute=False, show_help_flag=True, silent=False,
-                    show_progress_bar=True,
-                    show_tol_err=False,
-                    big_header=True):
-
-    now = datetime.now()
-    if big_header:
-        ascii_banner = pyfiglet.figlet_format("UnitGrade", font="doom")
-        b = "\n".join( [l for l in ascii_banner.splitlines() if len(l.strip()) > 0] )
-    else:
-        b = "Unitgrade"
-    print(b + " v" + __version__)
-    dt_string = now.strftime("%d/%m/%Y %H:%M:%S")
-    print("Started: " + dt_string)
-    s = report.title
-    if hasattr(report, "version") and report.version is not None:
-        s += " version " + report.version
-    print("Evaluating " + s, "(use --help for options)" if show_help_flag else "")
-    # print(f"Loaded answers from: ", report.computed_answers_file, "\n")
-    table_data = []
-    nL = 80
-    t_start = time.time()
-    score = {}
-    loader = SequentialTestLoader()
-
-    for n, (q, w) in enumerate(report.questions):
-        # q = q()
-        # q_hidden = False
-        # q_hidden = issubclass(q.__class__, Hidden)
-        if question is not None and n+1 != question:
-            continue
-        suite = loader.loadTestsFromTestCase(q)
-        qtitle = q.question_title() if hasattr(q, 'question_title') else q.__qualname__
-        q_title_print = "Question %i: %s"%(n+1, qtitle)
-        print(q_title_print, end="")
-        q.possible = 0
-        q.obtained = 0
-        q_ = {} # Gather score in this class.
-        # unittest.Te
-        # q_with_outstanding_init = [item.question for item in q.items if not item.question.has_called_init_]
-        UTextResult.q_title_print = q_title_print # Hacky
-        UTextResult.show_progress_bar = show_progress_bar # Hacky.
-        UTextResult.number = n
-
-        res = UTextTestRunner(verbosity=2, resultclass=UTextResult).run(suite)
-
-        possible = res.testsRun
-        obtained = len(res.successes)
-
-        assert len(res.successes) +  len(res.errors) + len(res.failures) == res.testsRun
-
-        # possible = int(ws @ possible)
-        # obtained = int(ws @ obtained)
-        # obtained = int(myround(int((w * obtained) / possible ))) if possible > 0 else 0
-
-        obtained = int(w * obtained * 1.0 / possible ) if possible > 0 else 0
-        score[n] = {'w': w, 'possible': w, 'obtained': obtained, 'items': q_, 'title': qtitle}
-        q.obtained = obtained
-        q.possible = possible
-
-        s1 = f"*** Question q{n+1}"
-        s2 = f" {q.obtained}/{w}"
-        print(s1 + ("."* (nL-len(s1)-len(s2) )) + s2 )
-        print(" ")
-        table_data.append([f"Question q{n+1}", f"{q.obtained}/{w}"])
-
-    ws, possible, obtained = upack(score)
-    possible = int( msum(possible) )
-    obtained = int( msum(obtained) ) # Cast to python int
-    report.possible = possible
-    report.obtained = obtained
-    now = datetime.now()
-    dt_string = now.strftime("%H:%M:%S")
-
-    dt = int(time.time()-t_start)
-    minutes = dt//60
-    seconds = dt - minutes*60
-    plrl = lambda i, s: str(i) + " " + s + ("s" if i != 1 else "")
-
-    print(f"Completed: "+ dt_string + " (" + plrl(minutes, "minute") + ", "+ plrl(seconds, "second") +")")
-
-    table_data.append(["Total", ""+str(report.obtained)+"/"+str(report.possible) ])
-    results = {'total': (obtained, possible), 'details': score}
-    return results, table_data
-
-
-
-
-from tabulate import tabulate
-from datetime import datetime
-import inspect
-import json
-import os
-import bz2
-import pickle
-import os
-
-def bzwrite(json_str, token): # to get around obfuscation issues
-    with getattr(bz2, 'open')(token, "wt") as f:
-        f.write(json_str)
-
-def gather_imports(imp):
-    resources = {}
-    m = imp
-    # for m in pack_imports:
-    # print(f"*** {m.__name__}")
-    f = m.__file__
-    # dn = os.path.dirname(f)
-    # top_package = os.path.dirname(__import__(m.__name__.split('.')[0]).__file__)
-    # top_package = str(__import__(m.__name__.split('.')[0]).__path__)
-
-    if hasattr(m, '__file__') and not hasattr(m, '__path__'):  # Importing a simple file: m.__class__.__name__ == 'module' and False:
-        top_package = os.path.dirname(m.__file__)
-        module_import = True
-    else:
-        top_package = __import__(m.__name__.split('.')[0]).__path__._path[0]
-        module_import = False
-
-    # top_package = os.path.dirname(__import__(m.__name__.split('.')[0]).__file__)
-    # top_package = os.path.dirname(top_package)
-    import zipfile
-    # import strea
-    # zipfile.ZipFile
-    import io
-    # file_like_object = io.BytesIO(my_zip_data)
-    zip_buffer = io.BytesIO()
-    with zipfile.ZipFile(zip_buffer, 'w') as zip:
-        # zip.write()
-        for root, dirs, files in os.walk(top_package):
-            for file in files:
-                if file.endswith(".py"):
-                    fpath = os.path.join(root, file)
-                    v = os.path.relpath(os.path.join(root, file), os.path.dirname(top_package) if not module_import else top_package)
-                    zip.write(fpath, v)
-
-    resources['zipfile'] = zip_buffer.getvalue()
-    resources['top_package'] = top_package
-    resources['module_import'] = module_import
-    return resources, top_package
-
-    if f.endswith("__init__.py"):
-        for root, dirs, files in os.walk(os.path.dirname(f)):
-            for file in files:
-                if file.endswith(".py"):
-                    # print(file)
-                    # print()
-                    v = os.path.relpath(os.path.join(root, file), top_package)
-                    with open(os.path.join(root, file), 'r') as ff:
-                        resources[v] = ff.read()
-    else:
-        v = os.path.relpath(f, top_package)
-        with open(f, 'r') as ff:
-            resources[v] = ff.read()
-    return resources
-
-import argparse
-parser = argparse.ArgumentParser(description='Evaluate your report.', epilog="""Use this script to get the score of your report. Example:
-
-> python report1_grade.py
-
-Finally, note that if your report is part of a module (package), and the report script requires part of that package, the -m option for python may be useful.
-For instance, if the report file is in Documents/course_package/report3_complete.py, and `course_package` is a python package, then change directory to 'Documents/` and run:
-
-> python -m course_package.report1
-
-see https://docs.python.org/3.9/using/cmdline.html
-""", formatter_class=argparse.RawTextHelpFormatter)
-parser.add_argument('--noprogress',  action="store_true",  help='Disable progress bars')
-parser.add_argument('--autolab',  action="store_true",  help='Show Autolab results')
-
-def gather_upload_to_campusnet(report, output_dir=None):
-    n = report.nL
-    args = parser.parse_args()
-    results, table_data = evaluate_report(report, show_help_flag=False, show_expected=False, show_computed=False, silent=True,
-                                          show_progress_bar=not args.noprogress,
-                                          big_header=not args.autolab)
-    print(" ")
-    print("="*n)
-    print("Final evaluation")
-    print(tabulate(table_data))
-    # also load the source code of missing files...
-
-    sources = {}
-
-    if not args.autolab:
-        if len(report.individual_imports) > 0:
-            print("By uploading the .token file, you verify the files:")
-            for m in report.individual_imports:
-                print(">", m.__file__)
-            print("Are created/modified individually by you in agreement with DTUs exam rules")
-            report.pack_imports += report.individual_imports
-
-        if len(report.pack_imports) > 0:
-            print("Including files in upload...")
-            for k, m in enumerate(report.pack_imports):
-                nimp, top_package = gather_imports(m)
-                _, report_relative_location, module_import = report._import_base_relative()
-
-                # report_relative_location = os.path.relpath(inspect.getfile(report.__class__), top_package)
-                nimp['report_relative_location'] = report_relative_location
-                nimp['report_module_specification'] = module_import
-                nimp['name'] = m.__name__
-                sources[k] = nimp
-                # if len([k for k in nimp if k not in sources]) > 0:
-                print(f"*** {m.__name__}")
-                # sources = {**sources, **nimp}
-    results['sources'] = sources
-
-    if output_dir is None:
-        output_dir = os.getcwd()
-
-    payload_out_base = report.__class__.__name__ + "_handin"
-
-    obtain, possible = results['total']
-    vstring = "_v"+report.version if report.version is not None else ""
-
-    token = "%s_%i_of_%i%s.token"%(payload_out_base, obtain, possible,vstring)
-    token = os.path.join(output_dir, token)
-    with open(token, 'wb') as f:
-        pickle.dump(results, f)
-
-    if not args.autolab:
-        print(" ")
-        print("To get credit for your results, please upload the single file: ")
-        print(">", token)
-        print("To campusnet without any modifications.")
-
-        # print("Now time for some autolab fun")
-
-def source_instantiate(name, report1_source, payload):
-    eval("exec")(report1_source, globals())
-    pl = pickle.loads(bytes.fromhex(payload))
-    report = eval(name)(payload=pl, strict=True)
-    # report.set_payload(pl)
-    return report
-
-
-
-report1_source = 'import os\n\n# DONT\'t import stuff here since install script requires __version__\n\ndef cache_write(object, file_name, verbose=True):\n    import compress_pickle\n    dn = os.path.dirname(file_name)\n    if not os.path.exists(dn):\n        os.mkdir(dn)\n    if verbose: print("Writing cache...", file_name)\n    with open(file_name, \'wb\', ) as f:\n        compress_pickle.dump(object, f, compression="lzma")\n    if verbose: print("Done!")\n\n\ndef cache_exists(file_name):\n    # file_name = cn_(file_name) if cache_prefix else file_name\n    return os.path.exists(file_name)\n\n\ndef cache_read(file_name):\n    import compress_pickle # Import here because if you import in top the __version__ tag will fail.\n    # file_name = cn_(file_name) if cache_prefix else file_name\n    if os.path.exists(file_name):\n        try:\n            with open(file_name, \'rb\') as f:\n                return compress_pickle.load(f, compression="lzma")\n        except Exception as e:\n            print("Tried to load a bad pickle file at", file_name)\n            print("If the file appears to be automatically generated, you can try to delete it, otherwise download a new version")\n            print(e)\n            # return pickle.load(f)\n    else:\n        return None\n\n\n\n"""\ngit add . && git commit -m "Options" && git push &&  pip install git+ssh://git@gitlab.compute.dtu.dk/tuhe/unitgrade_v1.git --upgrade\n\n"""\n# from . import cache_read\nimport unittest\nimport numpy as np\nimport sys\nimport collections\nimport re\nimport threading\nimport tqdm\nimport time\nimport pickle\nimport os\nfrom io import StringIO\nfrom unittest.runner import _WritelnDecorator\nimport inspect\n\nmyround = lambda x: np.round(x)  # required.\nmsum = lambda x: sum(x)\nmfloor = lambda x: np.floor(x)\n\ndef setup_dir_by_class(C,base_dir):\n    name = C.__class__.__name__\n    # base_dir = os.path.join(base_dir, name)\n    # if not os.path.isdir(base_dir):\n    #     os.makedirs(base_dir)\n    return base_dir, name\n\nclass Hidden:\n    def hide(self):\n        return True\n\nclass Logger(object):\n    def __init__(self, buffer):\n        self.terminal = sys.stdout\n        self.log = buffer\n\n    def write(self, message):\n        self.terminal.write(message)\n        self.log.write(message)\n\n    def flush(self):\n        # this flush method is needed for python 3 compatibility.\n        pass\n\nclass Capturing(list):\n    def __init__(self, *args, stdout=None, unmute=False, **kwargs):\n        self._stdout = stdout\n        self.unmute = unmute\n        super().__init__(*args, **kwargs)\n\n    def __enter__(self, capture_errors=True): # don\'t put arguments here.\n        self._stdout = sys.stdout if self._stdout == None else self._stdout\n        self._stringio = StringIO()\n        if self.unmute:\n            sys.stdout = Logger(self._stringio)\n        else:\n            sys.stdout = self._stringio\n\n        if capture_errors:\n            self._sterr = sys.stderr\n            sys.sterr = StringIO() # memory hole it\n        self.capture_errors = capture_errors\n        return self\n\n    def __exit__(self, *args):\n        self.extend(self._stringio.getvalue().splitlines())\n        del self._stringio    # free up some memory\n        sys.stdout = self._stdout\n        if self.capture_errors:\n            sys.sterr = self._sterr\n\nclass Capturing2(Capturing):\n    def __exit__(self, *args):\n        lines = self._stringio.getvalue().splitlines()\n        txt = "\\n".join(lines)\n        numbers = extract_numbers(txt)\n        self.extend(lines)\n        del self._stringio    # free up some memory\n        sys.stdout = self._stdout\n        if self.capture_errors:\n            sys.sterr = self._sterr\n\n        self.output = txt\n        self.numbers = numbers\n\n\nclass QItem(unittest.TestCase):\n    title = None\n    testfun = None\n    tol = 0\n    estimated_time = 0.42\n    _precomputed_payload = None\n    _computed_answer = None # Internal helper to later get results.\n    weight = 1 # the weight of the question.\n\n    def __init__(self, question=None, *args, **kwargs):\n        if self.tol > 0 and self.testfun is None:\n            self.testfun = self.assertL2Relative\n        elif self.testfun is None:\n            self.testfun = self.assertEqual\n\n        self.name = self.__class__.__name__\n        # self._correct_answer_payload = correct_answer_payload\n        self.question = question\n\n        super().__init__(*args, **kwargs)\n        if self.title is None:\n            self.title = self.name\n\n    def _safe_get_title(self):\n        if self._precomputed_title is not None:\n            return self._precomputed_title\n        return self.title\n\n    def assertNorm(self, computed, expected, tol=None):\n        if tol == None:\n            tol = self.tol\n        diff = np.abs( (np.asarray(computed).flat- np.asarray(expected)).flat )\n        nrm = np.sqrt(np.sum( diff ** 2))\n\n        self.error_computed = nrm\n\n        if nrm > tol:\n            print(f"Not equal within tolerance {tol}; norm of difference was {nrm}")\n            print(f"Element-wise differences {diff.tolist()}")\n            self.assertEqual(computed, expected, msg=f"Not equal within tolerance {tol}")\n\n    def assertL2(self, computed, expected, tol=None):\n        if tol == None:\n            tol = self.tol\n        diff = np.abs( (np.asarray(computed) - np.asarray(expected)) )\n        self.error_computed = np.max(diff)\n\n        if np.max(diff) > tol:\n            print(f"Not equal within tolerance {tol=}; deviation was {np.max(diff)=}")\n            print(f"Element-wise differences {diff.tolist()}")\n            self.assertEqual(computed, expected, msg=f"Not equal within tolerance {tol=}, {np.max(diff)=}")\n\n    def assertL2Relative(self, computed, expected, tol=None):\n        if tol == None:\n            tol = self.tol\n        diff = np.abs( (np.asarray(computed) - np.asarray(expected)) )\n        diff = diff / (1e-8 + np.abs( (np.asarray(computed) + np.asarray(expected)) ) )\n        self.error_computed = np.max(np.abs(diff))\n        if np.sum(diff > tol) > 0:\n            print(f"Not equal within tolerance {tol}")\n            print(f"Element-wise differences {diff.tolist()}")\n            self.assertEqual(computed, expected, msg=f"Not equal within tolerance {tol}")\n\n    def precomputed_payload(self):\n        return self._precomputed_payload\n\n    def precompute_payload(self):\n        # Pre-compute resources to include in tests (useful for getting around rng).\n        pass\n\n    def compute_answer(self, unmute=False):\n        raise NotImplementedError("test code here")\n\n    def test(self, computed, expected):\n        self.testfun(computed, expected)\n\n    def get_points(self, verbose=False, show_expected=False, show_computed=False,unmute=False, passall=False, silent=False, **kwargs):\n        possible = 1\n        computed = None\n        def show_computed_(computed):\n            print(">>> Your output:")\n            print(computed)\n\n        def show_expected_(expected):\n            print(">>> Expected output (note: may have been processed; read text script):")\n            print(expected)\n\n        correct = self._correct_answer_payload\n        try:\n            if unmute: # Required to not mix together print stuff.\n                print("")\n            computed = self.compute_answer(unmute=unmute)\n        except Exception as e:\n            if not passall:\n                if not silent:\n                    print("\\n=================================================================================")\n                    print(f"When trying to run test class \'{self.name}\' your code threw an error:", e)\n                    show_expected_(correct)\n                    import traceback\n                    print(traceback.format_exc())\n                    print("=================================================================================")\n                return (0, possible)\n\n        if self._computed_answer is None:\n            self._computed_answer = computed\n\n        if show_expected or show_computed:\n            print("\\n")\n        if show_expected:\n            show_expected_(correct)\n        if show_computed:\n            show_computed_(computed)\n        try:\n            if not passall:\n                self.test(computed=computed, expected=correct)\n        except Exception as e:\n            if not silent:\n                print("\\n=================================================================================")\n                print(f"Test output from test class \'{self.name}\' does not match expected result. Test error:")\n                print(e)\n                show_computed_(computed)\n                show_expected_(correct)\n            return (0, possible)\n        return (1, possible)\n\n    def score(self):\n        try:\n            self.test()\n        except Exception as e:\n            return 0\n        return 1\n\nclass QPrintItem(QItem):\n    def compute_answer_print(self):\n        """\n        Generate output which is to be tested. By default, both text written to the terminal using print(...) as well as return values\n        are send to process_output (see compute_answer below). In other words, the text generated is:\n\n        res = compute_Answer_print()\n        txt = (any terminal output generated above)\n        numbers = (any numbers found in terminal-output txt)\n\n        self.test(process_output(res, txt, numbers), <expected result>)\n\n        :return: Optional values for comparison\n        """\n        raise Exception("Generate output here. The output is passed to self.process_output")\n\n    def process_output(self, res, txt, numbers):\n        return res\n\n    def compute_answer(self, unmute=False):\n        with Capturing(unmute=unmute) as output:\n            res = self.compute_answer_print()\n        s = "\\n".join(output)\n        s = rm_progress_bar(s) # Remove progress bar.\n        numbers = extract_numbers(s)\n        self._computed_answer = (res, s, numbers)\n        return self.process_output(res, s, numbers)\n\nclass OrderedClassMembers(type):\n    @classmethod\n    def __prepare__(self, name, bases):\n        return collections.OrderedDict()\n    def __new__(self, name, bases, classdict):\n        ks = list(classdict.keys())\n        for b in bases:\n            ks += b.__ordered__\n        classdict[\'__ordered__\'] = [key for key in ks if key not in (\'__module__\', \'__qualname__\')]\n        return type.__new__(self, name, bases, classdict)\n\nclass QuestionGroup(metaclass=OrderedClassMembers):\n    title = "Untitled question"\n    partially_scored = False\n    t_init = 0  # Time spend on initialization (placeholder; set this externally).\n    estimated_time = 0.42\n    has_called_init_ = False\n    _name = None\n    _items = None\n\n    @property\n    def items(self):\n        if self._items == None:\n            self._items = []\n            members = [gt for gt in [getattr(self, gt) for gt in self.__ordered__ if gt not in ["__classcell__", "__init__"]] if inspect.isclass(gt) and issubclass(gt, QItem)]\n            for I in members:\n                self._items.append( I(question=self))\n        return self._items\n\n    @items.setter\n    def items(self, value):\n        self._items = value\n\n    @property\n    def name(self):\n        if self._name == None:\n            self._name = self.__class__.__name__\n        return self._name #\n\n    @name.setter\n    def name(self, val):\n        self._name = val\n\n    def init(self):\n        # Can be used to set resources relevant for this question instance.\n        pass\n\n    def init_all_item_questions(self):\n        for item in self.items:\n            if not item.question.has_called_init_:\n                item.question.init()\n                item.question.has_called_init_ = True\n\n\nclass Report:\n    title = "report title"\n    version = None\n    questions = []\n    pack_imports = []\n    individual_imports = []\n    nL = 80 # Maximum line width\n\n    @classmethod\n    def reset(cls):\n        for (q,_) in cls.questions:\n            if hasattr(q, \'reset\'):\n                q.reset()\n\n    @classmethod\n    def mfile(clc):\n        return inspect.getfile(clc)\n\n    def _file(self):\n        return inspect.getfile(type(self))\n\n    def _import_base_relative(self):\n        if hasattr(self.pack_imports[0], \'__path__\'):\n            root_dir = self.pack_imports[0].__path__._path[0]\n        else:\n            root_dir = self.pack_imports[0].__file__\n\n        root_dir = os.path.dirname(root_dir)\n        relative_path = os.path.relpath(self._file(), root_dir)\n        modules = os.path.normpath(relative_path[:-3]).split(os.sep)\n        return root_dir, relative_path, modules\n\n    def __init__(self, strict=False, payload=None):\n        working_directory = os.path.abspath(os.path.dirname(self._file()))\n\n        self.wdir, self.name = setup_dir_by_class(self, working_directory)\n        # self.computed_answers_file = os.path.join(self.wdir, self.name + "_resources_do_not_hand_in.dat")\n        for (q,_) in self.questions:\n            q.nL = self.nL # Set maximum line length.\n\n        if payload is not None:\n            self.set_payload(payload, strict=strict)\n        # else:\n        #     if os.path.isfile(self.computed_answers_file):\n        #         self.set_payload(cache_read(self.computed_answers_file), strict=strict)\n        #     else:\n        #         s = f"> Warning: The pre-computed answer file, {os.path.abspath(self.computed_answers_file)} is missing. The framework will NOT work as intended. Reasons may be a broken local installation."\n        #         if strict:\n        #             raise Exception(s)\n        #         else:\n        #             print(s)\n\n    def main(self, verbosity=1):\n        # Run all tests using standard unittest (nothing fancy).\n        import unittest\n        loader = unittest.TestLoader()\n        for q,_ in self.questions:\n            import time\n            start = time.time() # A good proxy for setup time is to\n            suite = loader.loadTestsFromTestCase(q)\n            unittest.TextTestRunner(verbosity=verbosity).run(suite)\n            total = time.time()              - start\n            q.time = total\n\n    def _setup_answers(self):\n        self.main()  # Run all tests in class just to get that out of the way...\n        report_cache = {}\n        for q, _ in self.questions:\n            if hasattr(q, \'_save_cache\'):\n                q()._save_cache()\n                q._cache[\'time\'] = q.time\n                report_cache[q.__qualname__] = q._cache\n            else:\n                report_cache[q.__qualname__] = {\'no cache see _setup_answers in framework.py\':True}\n        return report_cache\n\n    def set_payload(self, payloads, strict=False):\n        for q, _ in self.questions:\n            q._cache = payloads[q.__qualname__]\n\ndef rm_progress_bar(txt):\n    # More robust version. Apparently length of bar can depend on various factors, so check for order of symbols.\n    nlines = []\n    for l in txt.splitlines():\n        pct = l.find("%")\n        ql = False\n        if pct > 0:\n            i = l.find("|", pct+1)\n            if i > 0 and l.find("|", i+1) > 0:\n                ql = True\n        if not ql:\n            nlines.append(l)\n    return "\\n".join(nlines)\n\ndef extract_numbers(txt):\n    # txt = rm_progress_bar(txt)\n    numeric_const_pattern = \'[-+]? (?: (?: \\d* \\. \\d+ ) | (?: \\d+ \\.? ) )(?: [Ee] [+-]? \\d+ ) ?\'\n    rx = re.compile(numeric_const_pattern, re.VERBOSE)\n    all = rx.findall(txt)\n    all = [float(a) if (\'.\' in a or "e" in a) else int(a) for a in all]\n    if len(all) > 500:\n        print(txt)\n        raise Exception("unitgrade_v1.unitgrade_v1.py: Warning, too many numbers!", len(all))\n    return all\n\nclass ActiveProgress():\n    def __init__(self, t, start=True, title="my progress bar",show_progress_bar=True):\n        self.t = t\n        self._running = False\n        self.title = title\n        self.dt = 0.1\n        self.n = int(np.round(self.t / self.dt))\n        self.show_progress_bar = show_progress_bar\n\n        # self.pbar = tqdm.tqdm(total=self.n)\n        if start:\n            self.start()\n\n    def start(self):\n        self._running = True\n        if self.show_progress_bar:\n            self.thread = threading.Thread(target=self.run)\n            self.thread.start()\n        self.time_started = time.time()\n\n    def terminate(self):\n        if not self._running:\n            raise Exception("Stopping a stopped progress bar. ")\n        self._running = False\n        if self.show_progress_bar:\n            self.thread.join()\n        if hasattr(self, \'pbar\') and self.pbar is not None:\n            self.pbar.update(1)\n            self.pbar.close()\n            self.pbar=None\n\n        sys.stdout.flush()\n        return time.time() - self.time_started\n\n    def run(self):\n        self.pbar = tqdm.tqdm(total=self.n, file=sys.stdout, position=0, leave=False, desc=self.title, ncols=100,\n                              bar_format=\'{l_bar}{bar}| [{elapsed}<{remaining}]\')  # , unit_scale=dt, unit=\'seconds\'):\n\n        for _ in range(self.n-1): # Don\'t terminate completely; leave bar at 99% done until terminate.\n            if not self._running:\n                self.pbar.close()\n                self.pbar = None\n                break\n\n            time.sleep(self.dt)\n            self.pbar.update(1)\n\n\n# class MySuite(unittest.suite.TestSuite): # Not sure we need this one anymore.\n#     raise Exception("no suite")\n#     pass\n\ndef instance_call_stack(instance):\n    s = "-".join(map(lambda x: x.__name__, instance.__class__.mro()))\n    return s\n\ndef get_class_that_defined_method(meth):\n    for cls in inspect.getmro(meth.im_class):\n        if meth.__name__ in cls.__dict__:\n            return cls\n    return None\n\ndef caller_name(skip=2):\n    """Get a name of a caller in the format module.class.method\n\n       `skip` specifies how many levels of stack to skip while getting caller\n       name. skip=1 means "who calls me", skip=2 "who calls my caller" etc.\n\n       An empty string is returned if skipped levels exceed stack height\n    """\n    stack = inspect.stack()\n    start = 0 + skip\n    if len(stack) < start + 1:\n      return \'\'\n    parentframe = stack[start][0]\n\n    name = []\n    module = inspect.getmodule(parentframe)\n    # `modname` can be None when frame is executed directly in console\n    # TODO(techtonik): consider using __main__\n    if module:\n        name.append(module.__name__)\n    # detect classname\n    if \'self\' in parentframe.f_locals:\n        # I don\'t know any way to detect call from the object method\n        # XXX: there seems to be no way to detect static method call - it will\n        #      be just a function call\n        name.append(parentframe.f_locals[\'self\'].__class__.__name__)\n    codename = parentframe.f_code.co_name\n    if codename != \'<module>\':  # top level usually\n        name.append( codename ) # function or a method\n\n    ## Avoid circular refs and frame leaks\n    #  https://docs.python.org/2.7/library/inspect.html#the-interpreter-stack\n    del parentframe, stack\n\n    return ".".join(name)\n\ndef get_class_from_frame(fr):\n\n      args, _, _, value_dict = inspect.getargvalues(fr)\n      # we check the first parameter for the frame function is\n      # named \'self\'\n      if len(args) and args[0] == \'self\':\n            # in that case, \'self\' will be referenced in value_dict\n            instance = value_dict.get(\'self\', None)\n            if instance:\n                  # return its class\n                  # isinstance(instance, Testing) # is the actual class instance.\n\n                  return getattr(instance, \'__class__\', None)\n      # return None otherwise\n      return None\n\nfrom typing import Any\nimport inspect, gc\n\ndef giveupthefunc():\n    frame = inspect.currentframe()\n    code  = frame.f_code\n    globs = frame.f_globals\n    functype = type(lambda: 0)\n    funcs = []\n    for func in gc.get_referrers(code):\n        if type(func) is functype:\n            if getattr(func, "__code__", None) is code:\n                if getattr(func, "__globals__", None) is globs:\n                    funcs.append(func)\n                    if len(funcs) > 1:\n                        return None\n    return funcs[0] if funcs else None\n\n\nfrom collections import defaultdict\n\nclass UTextResult(unittest.TextTestResult):\n    nL = 80\n    number = -1 # HAcky way to set question number.\n    show_progress_bar = True\n    def __init__(self, stream, descriptions, verbosity):\n        super().__init__(stream, descriptions, verbosity)\n        self.successes = []\n\n    def printErrors(self) -> None:\n        # if self.dots or self.showAll:\n        #     self.stream.writeln()\n        # if hasattr(self, \'cc\'):\n        #     self.cc.terminate()\n        # self.cc_terminate(success=False)\n        self.printErrorList(\'ERROR\', self.errors)\n        self.printErrorList(\'FAIL\', self.failures)\n\n    def addError(self, test, err):\n        super(unittest.TextTestResult, self).addFailure(test, err)\n        self.cc_terminate(success=False)\n\n    def addFailure(self, test, err):\n        super(unittest.TextTestResult, self).addFailure(test, err)\n        self.cc_terminate(success=False)\n        # if self.showAll:\n        #     self.stream.writeln("FAIL")\n        # elif self.dots:\n        #     self.stream.write(\'F\')\n        #     self.stream.flush()\n\n    def addSuccess(self, test: unittest.case.TestCase) -> None:\n        # super().addSuccess(test)\n        self.successes.append(test)\n        # super().addSuccess(test)\n        #     hidden = issubclass(item.__class__, Hidden)\n        #     # if not hidden:\n        #     #     print(ss, end="")\n        #     # sys.stdout.flush()\n        #     start = time.time()\n        #\n        #     (current, possible) = item.get_points(show_expected=show_expected, show_computed=show_computed,unmute=unmute, passall=passall, silent=silent)\n        #     q_[j] = {\'w\': item.weight, \'possible\': possible, \'obtained\': current, \'hidden\': hidden, \'computed\': str(item._computed_answer), \'title\': item.title}\n        #     tsecs = np.round(time.time()-start, 2)\n        self.cc_terminate()\n\n\n\n    def cc_terminate(self, success=True):\n        if self.show_progress_bar or True:\n            tsecs = np.round(self.cc.terminate(), 2)\n            sys.stdout.flush()\n            ss = self.item_title_print\n\n            state = "PASS" if success else "FAILED"\n\n            dot_parts = (\'.\' * max(0, self.nL - len(state) - len(ss)))\n            if self.show_progress_bar or True:\n                print(self.item_title_print + dot_parts, end="")\n            else:\n                print( dot_parts, end="")\n\n            if tsecs >= 0.1:\n                state += " (" + str(tsecs) + " seconds)"\n            print(state)\n\n\n    def startTest(self, test):\n        # super().startTest(test)\n        j =self.testsRun\n        self.testsRun += 1\n        # print("Starting the test...")\n        # show_progress_bar = True\n        n = UTextResult.number\n\n        item_title = self.getDescription(test)\n        # item_title = item_title.split("\\n")[0]\n        item_title = test.shortDescription() # Better for printing (get from cache).\n        if item_title == None:\n            # For unittest framework where getDescription may return None.\n            item_title = self.getDescription(test)\n        # test.countTestCases()\n        self.item_title_print = "*** q%i.%i) %s" % (n + 1, j + 1, item_title)\n        estimated_time = 10\n        nL = 80\n        #\n        if self.show_progress_bar or True:\n            self.cc = ActiveProgress(t=estimated_time, title=self.item_title_print, show_progress_bar=self.show_progress_bar)\n        else:\n            print(self.item_title_print + (\'.\' * max(0, nL - 4 - len(self.item_title_print))), end="")\n\n        self._test = test\n\n    def _setupStdout(self):\n        if self._previousTestClass == None:\n            total_estimated_time = 1\n            if hasattr(self.__class__, \'q_title_print\'):\n                q_title_print = self.__class__.q_title_print\n            else:\n                q_title_print = "<unnamed test. See unitgrade_v1.py>"\n\n            # q_title_print = "some printed title..."\n            cc = ActiveProgress(t=total_estimated_time, title=q_title_print, show_progress_bar=self.show_progress_bar)\n            self.cc = cc\n\n    def _restoreStdout(self): # Used when setting up the test.\n        if self._previousTestClass == None:\n            q_time = self.cc.terminate()\n            q_time = np.round(q_time, 2)\n            sys.stdout.flush()\n            if self.show_progress_bar:\n                print(self.cc.title, end="")\n            # start = 10\n            # q_time = np.round(time.time() - start, 2)\n            nL = 80\n            print(" " * max(0, nL - len(self.cc.title)) + (\n                " (" + str(q_time) + " seconds)" if q_time >= 0.1 else ""))  # if q.name in report.payloads else "")\n            # print("=" * nL)\n\n\n\nclass UTextTestRunner(unittest.TextTestRunner):\n    def __init__(self, *args, **kwargs):\n        from io import StringIO\n        stream = StringIO()\n        super().__init__(*args, stream=stream, **kwargs)\n\n    def _makeResult(self):\n        # stream = self.stream # not you!\n        stream = sys.stdout\n        stream = _WritelnDecorator(stream)\n        return self.resultclass(stream, self.descriptions, self.verbosity)\n\n# def wrapper(foo):\n#     def magic(self):\n#         # s = "-".join(map(lambda x: x.__name__, self.__class__.mro()))\n#         foo(self)\n#     magic.__doc__ = foo.__doc__\n#     return magic\n\nfrom functools import update_wrapper, _make_key, RLock\nfrom collections import namedtuple\n_CacheInfo = namedtuple("CacheInfo", ["hits", "misses", "maxsize", "currsize"])\n\ndef cache(foo, typed=False):\n    """ Magic cache wrapper\n    https://github.com/python/cpython/blob/main/Lib/functools.py\n    """\n    maxsize = None\n    def wrapper(self, *args, **kwargs):\n        key = (self.cache_id(), ("@cache", foo.__name__, _make_key(args, kwargs, typed)) )\n        if not self._cache_contains(key):\n            value = foo(self, *args, **kwargs)\n            self._cache_put(key, value)\n        else:\n            value = self._cache_get(key)\n        return value\n    return wrapper\n\n\nclass UTestCase(unittest.TestCase):\n    _outcome = None # A dictionary which stores the user-computed outcomes of all the tests. This differs from the cache.\n    _cache = None  # Read-only cache. Ensures method always produce same result.\n    _cache2 = None  # User-written cache.\n\n    def capture(self):\n        return Capturing2(stdout=self._stdout)\n\n    @classmethod\n    def question_title(cls):\n        """ Return the question title """\n        return cls.__doc__.strip().splitlines()[0].strip() if cls.__doc__ != None else cls.__qualname__\n\n    @classmethod\n    def reset(cls):\n        print("Warning, I am not sure UTestCase.reset() is needed anymore and it seems very hacky.")\n        cls._outcome = None\n        cls._cache = None\n        cls._cache2 = None\n\n    def _callSetUp(self):\n        self._stdout = sys.stdout\n        import io\n        sys.stdout = io.StringIO()\n        super().setUp()\n        # print("Setting up...")\n\n    def _callTearDown(self):\n        sys.stdout = self._stdout\n        super().tearDown()\n        # print("asdfsfd")\n\n    def shortDescriptionStandard(self):\n        sd = super().shortDescription()\n        if sd == None:\n            sd = self._testMethodName\n        return sd\n\n    def shortDescription(self):\n        # self._testMethodDoc.strip().splitlines()[0].strip()\n        sd = self.shortDescriptionStandard()\n        title = self._cache_get(  (self.cache_id(), \'title\'), sd )\n        return title if title != None else sd\n\n    @property\n    def title(self):\n        return self.shortDescription()\n\n    @title.setter\n    def title(self, value):\n        self._cache_put((self.cache_id(), \'title\'), value)\n\n    def _get_outcome(self):\n        if not (self.__class__, \'_outcome\') or self.__class__._outcome == None:\n            self.__class__._outcome = {}\n        return self.__class__._outcome\n\n    def _callTestMethod(self, testMethod):\n        t = time.time()\n        self._ensure_cache_exists() # Make sure cache is there.\n        if self._testMethodDoc != None:\n            # Ensure the cache is eventually updated with the right docstring.\n            self._cache_put((self.cache_id(), \'title\'), self.shortDescriptionStandard() )\n        # Fix temp cache here (for using the @cache decorator)\n        self._cache2[ (self.cache_id(), \'assert\') ] = {}\n\n        res = testMethod()\n        elapsed = time.time() - t\n        # self._cache_put( (self.cache_id(), \'title\'), self.shortDescription() )\n\n        self._get_outcome()[self.cache_id()] = res\n        self._cache_put( (self.cache_id(), "time"), elapsed)\n\n    # This is my base test class. So what is new about it?\n    def cache_id(self):\n        c = self.__class__.__qualname__\n        m = self._testMethodName\n        return (c,m)\n\n    def __init__(self, *args, **kwargs):\n        super().__init__(*args, **kwargs)\n        self._load_cache()\n        self._assert_cache_index = 0\n        # self.cache_indexes = defaultdict(lambda: 0)\n\n    def _ensure_cache_exists(self):\n        if not hasattr(self.__class__, \'_cache\') or self.__class__._cache == None:\n            self.__class__._cache = dict()\n        if not hasattr(self.__class__, \'_cache2\') or self.__class__._cache2 == None:\n            self.__class__._cache2 = dict()\n\n    def _cache_get(self, key, default=None):\n        self._ensure_cache_exists()\n        return self.__class__._cache.get(key, default)\n\n    def _cache_put(self, key, value):\n        self._ensure_cache_exists()\n        self.__class__._cache2[key] = value\n\n    def _cache_contains(self, key):\n        self._ensure_cache_exists()\n        return key in self.__class__._cache\n\n    def wrap_assert(self, assert_fun, first, *args, **kwargs):\n        key = (self.cache_id(), \'assert\')\n        if not self._cache_contains(key):\n            print("Warning, framework missing", key)\n        cache = self._cache_get(key, {})\n        id = self._assert_cache_index\n        if not id in cache:\n            print("Warning, framework missing cache index", key, "id =", id)\n        _expected = cache.get(id, first)\n        assert_fun(first, _expected, *args, **kwargs)\n        cache[id] = first\n        self._cache_put(key, cache)\n        self._assert_cache_index += 1\n\n    def assertEqualC(self, first: Any, msg: Any = ...) -> None:\n        self.wrap_assert(self.assertEqual, first, msg)\n\n    def _cache_file(self):\n        return os.path.dirname(inspect.getfile(self.__class__) ) + "/unitgrade_v1/" + self.__class__.__name__ + ".pkl"\n\n    def _save_cache(self):\n        # get the class name (i.e. what to save to).\n        cfile = self._cache_file()\n        if not os.path.isdir(os.path.dirname(cfile)):\n            os.makedirs(os.path.dirname(cfile))\n\n        if hasattr(self.__class__, \'_cache2\'):\n            with open(cfile, \'wb\') as f:\n                pickle.dump(self.__class__._cache2, f)\n\n    # But you can also set cache explicitly.\n    def _load_cache(self):\n        if self._cache != None: # Cache already loaded. We will not load it twice.\n            return\n            # raise Exception("Loaded cache which was already set. What is going on?!")\n        cfile = self._cache_file()\n        # print("Loading cache from", cfile)\n        if os.path.exists(cfile):\n            with open(cfile, \'rb\') as f:\n                data = pickle.load(f)\n                self.__class__._cache = data\n        else:\n            print("Warning! data file not found", cfile)\n\ndef hide(func):\n    return func\n\ndef makeRegisteringDecorator(foreignDecorator):\n    """\n        Returns a copy of foreignDecorator, which is identical in every\n        way(*), except also appends a .decorator property to the callable it\n        spits out.\n    """\n    def newDecorator(func):\n        # Call to newDecorator(method)\n        # Exactly like old decorator, but output keeps track of what decorated it\n        R = foreignDecorator(func)  # apply foreignDecorator, like call to foreignDecorator(method) would have done\n        R.decorator = newDecorator  # keep track of decorator\n        # R.original = func         # might as well keep track of everything!\n        return R\n\n    newDecorator.__name__ = foreignDecorator.__name__\n    newDecorator.__doc__ = foreignDecorator.__doc__\n    # (*)We can be somewhat "hygienic", but newDecorator still isn\'t signature-preserving, i.e. you will not be able to get a runtime list of parameters. For that, you need hackish libraries...but in this case, the only argument is func, so it\'s not a big issue\n    return newDecorator\n\nhide = makeRegisteringDecorator(hide)\n\ndef methodsWithDecorator(cls, decorator):\n    """\n        Returns all methods in CLS with DECORATOR as the\n        outermost decorator.\n\n        DECORATOR must be a "registering decorator"; one\n        can make any decorator "registering" via the\n        makeRegisteringDecorator function.\n\n        import inspect\n        ls = list(methodsWithDecorator(GeneratorQuestion, deco))\n        for f in ls:\n            print(inspect.getsourcelines(f) ) # How to get all hidden questions.\n    """\n    for maybeDecorated in cls.__dict__.values():\n        if hasattr(maybeDecorated, \'decorator\'):\n            if maybeDecorated.decorator == decorator:\n                print(maybeDecorated)\n                yield maybeDecorated\n\n\n\nimport numpy as np\nfrom tabulate import tabulate\nfrom datetime import datetime\nimport pyfiglet\nimport unittest\n# from unitgrade.unitgrade import MySuite\n\nimport inspect\nimport os\nimport argparse\nimport sys\nimport time\nimport threading # don\'t import Thread bc. of minify issue.\nimport tqdm # don\'t do from tqdm import tqdm because of minify-issue\n\nparser = argparse.ArgumentParser(description=\'Evaluate your report.\', epilog="""Example: \nTo run all tests in a report: \n\n> python assignment1_dp.py\n\nTo run only question 2 or question 2.1\n\n> python assignment1_dp.py -q 2\n> python assignment1_dp.py -q 2.1\n\nNote this scripts does not grade your report. To grade your report, use:\n\n> python report1_grade.py\n\nFinally, note that if your report is part of a module (package), and the report script requires part of that package, the -m option for python may be useful.\nFor instance, if the report file is in Documents/course_package/report3_complete.py, and `course_package` is a python package, then change directory to \'Documents/` and run:\n\n> python -m course_package.report1\n\nsee https://docs.python.org/3.9/using/cmdline.html\n""", formatter_class=argparse.RawTextHelpFormatter)\nparser.add_argument(\'-q\', nargs=\'?\', type=str, default=None, help=\'Only evaluate this question (e.g.: -q 2)\')\nparser.add_argument(\'--showexpected\',  action="store_true",  help=\'Show the expected/desired result\')\nparser.add_argument(\'--showcomputed\',  action="store_true",  help=\'Show the answer your code computes\')\nparser.add_argument(\'--unmute\',  action="store_true",  help=\'Show result of print(...) commands in code\')\nparser.add_argument(\'--passall\',  action="store_true",  help=\'Automatically pass all tests. Useful when debugging.\')\n\ndef evaluate_report_student(report, question=None, qitem=None, unmute=None, passall=None, ignore_missing_file=False, show_tol_err=False):\n    args = parser.parse_args()\n    if question is None and args.q is not None:\n        question = args.q\n        if "." in question:\n            question, qitem = [int(v) for v in question.split(".")]\n        else:\n            question = int(question)\n\n    if hasattr(report, "computed_answer_file") and not os.path.isfile(report.computed_answers_file) and not ignore_missing_file:\n        raise Exception("> Error: The pre-computed answer file", os.path.abspath(report.computed_answers_file), "does not exist. Check your package installation")\n\n    if unmute is None:\n        unmute = args.unmute\n    if passall is None:\n        passall = args.passall\n\n    results, table_data = evaluate_report(report, question=question, show_progress_bar=not unmute, qitem=qitem, verbose=False, passall=passall, show_expected=args.showexpected, show_computed=args.showcomputed,unmute=unmute,\n                                          show_tol_err=show_tol_err)\n\n\n    if question is None:\n        print("Provisional evaluation")\n        tabulate(table_data)\n        table = table_data\n        print(tabulate(table))\n        print(" ")\n\n    fr = inspect.getouterframes(inspect.currentframe())[1].filename\n    gfile = os.path.basename(fr)[:-3] + "_grade.py"\n    if os.path.exists(gfile):\n        print("Note your results have not yet been registered. \\nTo register your results, please run the file:")\n        print(">>>", gfile)\n        print("In the same manner as you ran this file.")\n\n\n    return results\n\n\ndef upack(q):\n    # h = zip([(i[\'w\'], i[\'possible\'], i[\'obtained\']) for i in q.values()])\n    h =[(i[\'w\'], i[\'possible\'], i[\'obtained\']) for i in q.values()]\n    h = np.asarray(h)\n    return h[:,0], h[:,1], h[:,2],\n\nclass UnitgradeTextRunner(unittest.TextTestRunner):\n    def __init__(self, *args, **kwargs):\n        super().__init__(*args, **kwargs)\n\nclass SequentialTestLoader(unittest.TestLoader):\n    def getTestCaseNames(self, testCaseClass):\n        test_names = super().getTestCaseNames(testCaseClass)\n        # testcase_methods = list(testCaseClass.__dict__.keys())\n        ls = []\n        for C in testCaseClass.mro():\n            if issubclass(C, unittest.TestCase):\n                ls = list(C.__dict__.keys()) + ls\n        testcase_methods = ls\n        test_names.sort(key=testcase_methods.index)\n        return test_names\n\ndef evaluate_report(report, question=None, qitem=None, passall=False, verbose=False,  show_expected=False, show_computed=False,unmute=False, show_help_flag=True, silent=False,\n                    show_progress_bar=True,\n                    show_tol_err=False,\n                    big_header=True):\n\n    now = datetime.now()\n    if big_header:\n        ascii_banner = pyfiglet.figlet_format("UnitGrade", font="doom")\n        b = "\\n".join( [l for l in ascii_banner.splitlines() if len(l.strip()) > 0] )\n    else:\n        b = "Unitgrade"\n    print(b + " v" + __version__)\n    dt_string = now.strftime("%d/%m/%Y %H:%M:%S")\n    print("Started: " + dt_string)\n    s = report.title\n    if hasattr(report, "version") and report.version is not None:\n        s += " version " + report.version\n    print("Evaluating " + s, "(use --help for options)" if show_help_flag else "")\n    # print(f"Loaded answers from: ", report.computed_answers_file, "\\n")\n    table_data = []\n    nL = 80\n    t_start = time.time()\n    score = {}\n    loader = SequentialTestLoader()\n\n    for n, (q, w) in enumerate(report.questions):\n        # q = q()\n        # q_hidden = False\n        # q_hidden = issubclass(q.__class__, Hidden)\n        if question is not None and n+1 != question:\n            continue\n        suite = loader.loadTestsFromTestCase(q)\n        qtitle = q.question_title() if hasattr(q, \'question_title\') else q.__qualname__\n        q_title_print = "Question %i: %s"%(n+1, qtitle)\n        print(q_title_print, end="")\n        q.possible = 0\n        q.obtained = 0\n        q_ = {} # Gather score in this class.\n        # unittest.Te\n        # q_with_outstanding_init = [item.question for item in q.items if not item.question.has_called_init_]\n        UTextResult.q_title_print = q_title_print # Hacky\n        UTextResult.show_progress_bar = show_progress_bar # Hacky.\n        UTextResult.number = n\n\n        res = UTextTestRunner(verbosity=2, resultclass=UTextResult).run(suite)\n\n        possible = res.testsRun\n        obtained = len(res.successes)\n\n        assert len(res.successes) +  len(res.errors) + len(res.failures) == res.testsRun\n\n        # possible = int(ws @ possible)\n        # obtained = int(ws @ obtained)\n        # obtained = int(myround(int((w * obtained) / possible ))) if possible > 0 else 0\n\n        obtained = int(w * obtained * 1.0 / possible ) if possible > 0 else 0\n        score[n] = {\'w\': w, \'possible\': w, \'obtained\': obtained, \'items\': q_, \'title\': qtitle}\n        q.obtained = obtained\n        q.possible = possible\n\n        s1 = f"*** Question q{n+1}"\n        s2 = f" {q.obtained}/{w}"\n        print(s1 + ("."* (nL-len(s1)-len(s2) )) + s2 )\n        print(" ")\n        table_data.append([f"Question q{n+1}", f"{q.obtained}/{w}"])\n\n    ws, possible, obtained = upack(score)\n    possible = int( msum(possible) )\n    obtained = int( msum(obtained) ) # Cast to python int\n    report.possible = possible\n    report.obtained = obtained\n    now = datetime.now()\n    dt_string = now.strftime("%H:%M:%S")\n\n    dt = int(time.time()-t_start)\n    minutes = dt//60\n    seconds = dt - minutes*60\n    plrl = lambda i, s: str(i) + " " + s + ("s" if i != 1 else "")\n\n    print(f"Completed: "+ dt_string + " (" + plrl(minutes, "minute") + ", "+ plrl(seconds, "second") +")")\n\n    table_data.append(["Total", ""+str(report.obtained)+"/"+str(report.possible) ])\n    results = {\'total\': (obtained, possible), \'details\': score}\n    return results, table_data\n\n\n\n\nfrom tabulate import tabulate\nfrom datetime import datetime\nimport inspect\nimport json\nimport os\nimport bz2\nimport pickle\nimport os\n\ndef bzwrite(json_str, token): # to get around obfuscation issues\n    with getattr(bz2, \'open\')(token, "wt") as f:\n        f.write(json_str)\n\ndef gather_imports(imp):\n    resources = {}\n    m = imp\n    # for m in pack_imports:\n    # print(f"*** {m.__name__}")\n    f = m.__file__\n    # dn = os.path.dirname(f)\n    # top_package = os.path.dirname(__import__(m.__name__.split(\'.\')[0]).__file__)\n    # top_package = str(__import__(m.__name__.split(\'.\')[0]).__path__)\n\n    if hasattr(m, \'__file__\') and not hasattr(m, \'__path__\'):  # Importing a simple file: m.__class__.__name__ == \'module\' and False:\n        top_package = os.path.dirname(m.__file__)\n        module_import = True\n    else:\n        top_package = __import__(m.__name__.split(\'.\')[0]).__path__._path[0]\n        module_import = False\n\n    # top_package = os.path.dirname(__import__(m.__name__.split(\'.\')[0]).__file__)\n    # top_package = os.path.dirname(top_package)\n    import zipfile\n    # import strea\n    # zipfile.ZipFile\n    import io\n    # file_like_object = io.BytesIO(my_zip_data)\n    zip_buffer = io.BytesIO()\n    with zipfile.ZipFile(zip_buffer, \'w\') as zip:\n        # zip.write()\n        for root, dirs, files in os.walk(top_package):\n            for file in files:\n                if file.endswith(".py"):\n                    fpath = os.path.join(root, file)\n                    v = os.path.relpath(os.path.join(root, file), os.path.dirname(top_package) if not module_import else top_package)\n                    zip.write(fpath, v)\n\n    resources[\'zipfile\'] = zip_buffer.getvalue()\n    resources[\'top_package\'] = top_package\n    resources[\'module_import\'] = module_import\n    return resources, top_package\n\n    if f.endswith("__init__.py"):\n        for root, dirs, files in os.walk(os.path.dirname(f)):\n            for file in files:\n                if file.endswith(".py"):\n                    # print(file)\n                    # print()\n                    v = os.path.relpath(os.path.join(root, file), top_package)\n                    with open(os.path.join(root, file), \'r\') as ff:\n                        resources[v] = ff.read()\n    else:\n        v = os.path.relpath(f, top_package)\n        with open(f, \'r\') as ff:\n            resources[v] = ff.read()\n    return resources\n\nimport argparse\nparser = argparse.ArgumentParser(description=\'Evaluate your report.\', epilog="""Use this script to get the score of your report. Example:\n\n> python report1_grade.py\n\nFinally, note that if your report is part of a module (package), and the report script requires part of that package, the -m option for python may be useful.\nFor instance, if the report file is in Documents/course_package/report3_complete.py, and `course_package` is a python package, then change directory to \'Documents/` and run:\n\n> python -m course_package.report1\n\nsee https://docs.python.org/3.9/using/cmdline.html\n""", formatter_class=argparse.RawTextHelpFormatter)\nparser.add_argument(\'--noprogress\',  action="store_true",  help=\'Disable progress bars\')\nparser.add_argument(\'--autolab\',  action="store_true",  help=\'Show Autolab results\')\n\ndef gather_upload_to_campusnet(report, output_dir=None):\n    n = report.nL\n    args = parser.parse_args()\n    results, table_data = evaluate_report(report, show_help_flag=False, show_expected=False, show_computed=False, silent=True,\n                                          show_progress_bar=not args.noprogress,\n                                          big_header=not args.autolab)\n    print(" ")\n    print("="*n)\n    print("Final evaluation")\n    print(tabulate(table_data))\n    # also load the source code of missing files...\n\n    sources = {}\n\n    if not args.autolab:\n        if len(report.individual_imports) > 0:\n            print("By uploading the .token file, you verify the files:")\n            for m in report.individual_imports:\n                print(">", m.__file__)\n            print("Are created/modified individually by you in agreement with DTUs exam rules")\n            report.pack_imports += report.individual_imports\n\n        if len(report.pack_imports) > 0:\n            print("Including files in upload...")\n            for k, m in enumerate(report.pack_imports):\n                nimp, top_package = gather_imports(m)\n                _, report_relative_location, module_import = report._import_base_relative()\n\n                # report_relative_location = os.path.relpath(inspect.getfile(report.__class__), top_package)\n                nimp[\'report_relative_location\'] = report_relative_location\n                nimp[\'report_module_specification\'] = module_import\n                nimp[\'name\'] = m.__name__\n                sources[k] = nimp\n                # if len([k for k in nimp if k not in sources]) > 0:\n                print(f"*** {m.__name__}")\n                # sources = {**sources, **nimp}\n    results[\'sources\'] = sources\n\n    if output_dir is None:\n        output_dir = os.getcwd()\n\n    payload_out_base = report.__class__.__name__ + "_handin"\n\n    obtain, possible = results[\'total\']\n    vstring = "_v"+report.version if report.version is not None else ""\n\n    token = "%s_%i_of_%i%s.token"%(payload_out_base, obtain, possible,vstring)\n    token = os.path.join(output_dir, token)\n    with open(token, \'wb\') as f:\n        pickle.dump(results, f)\n\n    if not args.autolab:\n        print(" ")\n        print("To get credit for your results, please upload the single file: ")\n        print(">", token)\n        print("To campusnet without any modifications.")\n\n        # print("Now time for some autolab fun")\n\ndef source_instantiate(name, report1_source, payload):\n    eval("exec")(report1_source, globals())\n    pl = pickle.loads(bytes.fromhex(payload))\n    report = eval(name)(payload=pl, strict=True)\n    # report.set_payload(pl)\n    return report\n\n\n__version__ = "0.9.0"\n\nfrom homework1 import reverse_list, add\nimport unittest\n\nclass Week1(unittest.TestCase):\n    def test_add(self):\n        self.assertEqual(add(2,2), 4)\n        self.assertEqual(add(-100, 5), -95)\n\n    def test_reverse(self):\n        self.assertEqual(reverse_list([1,2,3]), [3,2,1])\n\n\nimport homework1\nclass Report1Flat(Report):\n    title = "CS 101 Report 1"\n    questions = [(Week1, 10)]  # Include a single question for 10 credits.\n    pack_imports = [homework1]'
-report1_payload = '8004953f000000000000007d948c055765656b31947d948c2c6e6f20636163686520736565205f73657475705f616e737765727320696e20756e69746772616465322e7079948873732e'
-name="Report1Flat"
-
-report = source_instantiate(name, report1_source, report1_payload)
-output_dir = os.path.dirname(__file__)
-gather_upload_to_campusnet(report, output_dir)
\ No newline at end of file
diff --git a/examples/example_moss/tmp/submissions/s1001/0_homework1.py b/examples/example_moss/tmp/submissions/s1001/0_homework1.py
index 3543f1b..94004fc 100644
--- a/examples/example_moss/tmp/submissions/s1001/0_homework1.py
+++ b/examples/example_moss/tmp/submissions/s1001/0_homework1.py
@@ -1,21 +1,16 @@
-"""
-Example student code. This file is automatically generated from the files in the instructor-directory
-"""
-def reverse_list(mylist): 
+def reverse_list(mylist): #!f #!s;keeptags
     """
     Given a list 'mylist' returns a list consisting of the same elements in reverse order. E.g.
     reverse_list([1,2,3]) should return [3,2,1] (as a list).
     """
-    # TODO: 1 lines missing.
-    raise NotImplementedError("Implement function body")
+    return list(reversed(mylist))
 
-def add(a,b): 
+def add(a,b): #!f
     """ Given two numbers `a` and `b` this function should simply return their sum:
     > add(a,b) = a+b """
-    # TODO: 1 lines missing.
-    raise NotImplementedError("Implement function body")
+    return a+b
 
 if __name__ == "__main__":
-    # Problem 1: Write a function which add two numbers
+    # Example usage:
     print(f"Your result of 2 + 2 = {add(2,2)}")
-    print(f"Reversing a small list", reverse_list([2,3,5,7]))
+    print(f"Reversing a small list", reverse_list([2,3,5,7])) #!s
diff --git a/examples/example_moss/tmp/submissions/s1002/0_homework1.py b/examples/example_moss/tmp/submissions/s1002/0_homework1.py
index cea7abe..f54f487 100644
--- a/examples/example_moss/tmp/submissions/s1002/0_homework1.py
+++ b/examples/example_moss/tmp/submissions/s1002/0_homework1.py
@@ -1,25 +1,21 @@
-"""
-Example student code. This file is automatically generated from the files in the instructor-directory
-"""
-def reverse_list(mylist): 
+def reverse_list(mylist): #!f #!s;keeptags
     """
     Given a list 'mylist' returns a list consisting of the same elements in reverse order. E.g.
     reverse_list([1,2,3]) should return [3,2,1] (as a list).
     """
-    mylist = mylist * 10
-    reverse(mylist)
-    return mylist.reverse(30)
-    # TODO: 1 lines missing.
-    raise NotImplementedError("Implement function body")
+    ls = []
+    for l in mylist:
+        ls = [l] + ls
+    return ls
+    # return list(reversed(mylist))
 
-def add(a,b):
-    return a+b
+def add(a,b): #!f
     """ Given two numbers `a` and `b` this function should simply return their sum:
     > add(a,b) = a+b """
-    # TODO: 1 lines missing.
-    # raise NotImplementedError("Implement function body")
+    sum = a + b
+    return sum
 
 if __name__ == "__main__":
-    # Problem 1: Write a function which add two numbers
+    # Example usage:
     print(f"Your result of 2 + 2 = {add(2,2)}")
-    print(f"Reversing a small list", reverse_list([2,3,5,7]))
+    print(f"Reversing a small list", reverse_list([2,3,5,7])) #!s
diff --git a/examples/example_moss/tmp/submissions/s1003/0_homework1.py b/examples/example_moss/tmp/submissions/s1003/0_homework1.py
index c219775..5ca8046 100644
--- a/examples/example_moss/tmp/submissions/s1003/0_homework1.py
+++ b/examples/example_moss/tmp/submissions/s1003/0_homework1.py
@@ -1,24 +1,21 @@
-"""
-Example student code. This file is automatically generated from the files in the instructor-directory
-"""
-def reverse_list(mylist): 
+def reverse_list(mylist): #!f #!s;keeptags
     """
     Given a list 'mylist' returns a list consisting of the same elements in reverse order. E.g.
     reverse_list([1,2,3]) should return [3,2,1] (as a list).
     """
-    result = []
+    ls = []
     for l in mylist:
-        result = result + [l]
-    return result
+        ls = [l] + ls
+    return ls
+    # return list(reversed(mylist))
 
-def add(a,b):
-    return a+b
+def add(a,b): #!f
     """ Given two numbers `a` and `b` this function should simply return their sum:
     > add(a,b) = a+b """
-    # TODO: 1 lines missing.
-    # raise NotImplementedError("Implement function body")
+    sum2 = a + b
+    return sum2
 
 if __name__ == "__main__":
-    # Problem 1: Write a function which add two numbers
+    # Example usage:
     print(f"Your result of 2 + 2 = {add(2,2)}")
-    print(f"Reversing a small list", reverse_list([2,3,5,7]))
+    print(f"Reversing a small list", reverse_list([2,3,5,7])) #!s
diff --git a/examples/example_moss/whitelist/Report1Flat_handin_10_of_10.token b/examples/example_moss/whitelist/Report1Flat_handin_10_of_10.token
deleted file mode 100644
index 31d365c173fab20a7df39f91213b32fa71d966fa..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 65512
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
KFr~D(R1W}`d933A

diff --git a/examples/example_moss/whitelist/Report1Flat_handin_10_of_10_0/deploy.py b/examples/example_moss/whitelist/Report1Flat_handin_10_of_10_0/deploy.py
deleted file mode 100644
index b110ad5..0000000
--- a/examples/example_moss/whitelist/Report1Flat_handin_10_of_10_0/deploy.py
+++ /dev/null
@@ -1,8 +0,0 @@
-from report1flat import Report1Flat
-from unitgrade_private.hidden_create_files import setup_grade_file_report
-from snipper import snip_dir
-
-if __name__ == "__main__":
-    setup_grade_file_report(Report1Flat)
-    # Deploy the files using snipper: https://gitlab.compute.dtu.dk/tuhe/snipper
-    snip_dir.snip_dir("./", "../../students/cs101flat", clean_destination_dir=True, exclude=['__pycache__', '*.token', 'deploy.py'])
diff --git a/examples/example_moss/whitelist/Report1Flat_handin_10_of_10_0/report1flat.py b/examples/example_moss/whitelist/Report1Flat_handin_10_of_10_0/report1flat.py
deleted file mode 100644
index f944f97..0000000
--- a/examples/example_moss/whitelist/Report1Flat_handin_10_of_10_0/report1flat.py
+++ /dev/null
@@ -1,21 +0,0 @@
-from unitgrade.framework import Report
-from unitgrade.evaluate import evaluate_report_student
-from homework1 import reverse_list, add
-import homework1
-import unittest
-
-class Week1(unittest.TestCase):
-    def test_add(self):
-        self.assertEqual(add(2,2), 4)
-        self.assertEqual(add(-100, 5), -95)
-
-    def test_reverse(self):
-        self.assertEqual(reverse_list([1,2,3]), [3,2,1])
-
-class Report1Flat(Report):
-    title = "CS 101 Report 1"
-    questions = [(Week1, 10)]  # Include a single question for 10 credits.
-    pack_imports = [homework1] # Unitgrade will recursively include all .py files from "cs101flat"
-
-if __name__ == "__main__":
-    evaluate_report_student(Report1Flat())
diff --git a/examples/example_moss/whitelist/Report1Flat_handin_10_of_10_0/report1flat_grade.py b/examples/example_moss/whitelist/Report1Flat_handin_10_of_10_0/report1flat_grade.py
deleted file mode 100644
index 96e8e37..0000000
--- a/examples/example_moss/whitelist/Report1Flat_handin_10_of_10_0/report1flat_grade.py
+++ /dev/null
@@ -1,349 +0,0 @@
-
-import numpy as np
-from tabulate import tabulate
-from datetime import datetime
-import pyfiglet
-import unittest
-# from unitgrade.unitgrade import MySuite
-
-import inspect
-import os
-import argparse
-import sys
-import time
-import threading # don't import Thread bc. of minify issue.
-import tqdm # don't do from tqdm import tqdm because of minify-issue
-
-parser = argparse.ArgumentParser(description='Evaluate your report.', epilog="""Example: 
-To run all tests in a report: 
-
-> python assignment1_dp.py
-
-To run only question 2 or question 2.1
-
-> python assignment1_dp.py -q 2
-> python assignment1_dp.py -q 2.1
-
-Note this scripts does not grade your report. To grade your report, use:
-
-> python report1_grade.py
-
-Finally, note that if your report is part of a module (package), and the report script requires part of that package, the -m option for python may be useful.
-For instance, if the report file is in Documents/course_package/report3_complete.py, and `course_package` is a python package, then change directory to 'Documents/` and run:
-
-> python -m course_package.report1
-
-see https://docs.python.org/3.9/using/cmdline.html
-""", formatter_class=argparse.RawTextHelpFormatter)
-parser.add_argument('-q', nargs='?', type=str, default=None, help='Only evaluate this question (e.g.: -q 2)')
-parser.add_argument('--showexpected',  action="store_true",  help='Show the expected/desired result')
-parser.add_argument('--showcomputed',  action="store_true",  help='Show the answer your code computes')
-parser.add_argument('--unmute',  action="store_true",  help='Show result of print(...) commands in code')
-parser.add_argument('--passall',  action="store_true",  help='Automatically pass all tests. Useful when debugging.')
-
-def evaluate_report_student(report, question=None, qitem=None, unmute=None, passall=None, ignore_missing_file=False, show_tol_err=False):
-    args = parser.parse_args()
-    if question is None and args.q is not None:
-        question = args.q
-        if "." in question:
-            question, qitem = [int(v) for v in question.split(".")]
-        else:
-            question = int(question)
-
-    if hasattr(report, "computed_answer_file") and not os.path.isfile(report.computed_answers_file) and not ignore_missing_file:
-        raise Exception("> Error: The pre-computed answer file", os.path.abspath(report.computed_answers_file), "does not exist. Check your package installation")
-
-    if unmute is None:
-        unmute = args.unmute
-    if passall is None:
-        passall = args.passall
-
-    results, table_data = evaluate_report(report, question=question, show_progress_bar=not unmute, qitem=qitem, verbose=False, passall=passall, show_expected=args.showexpected, show_computed=args.showcomputed,unmute=unmute,
-                                          show_tol_err=show_tol_err)
-
-
-    if question is None:
-        print("Provisional evaluation")
-        tabulate(table_data)
-        table = table_data
-        print(tabulate(table))
-        print(" ")
-
-    fr = inspect.getouterframes(inspect.currentframe())[1].filename
-    gfile = os.path.basename(fr)[:-3] + "_grade.py"
-    if os.path.exists(gfile):
-        print("Note your results have not yet been registered. \nTo register your results, please run the file:")
-        print(">>>", gfile)
-        print("In the same manner as you ran this file.")
-
-
-    return results
-
-
-def upack(q):
-    # h = zip([(i['w'], i['possible'], i['obtained']) for i in q.values()])
-    h =[(i['w'], i['possible'], i['obtained']) for i in q.values()]
-    h = np.asarray(h)
-    return h[:,0], h[:,1], h[:,2],
-
-class UnitgradeTextRunner(unittest.TextTestRunner):
-    def __init__(self, *args, **kwargs):
-        super().__init__(*args, **kwargs)
-
-class SequentialTestLoader(unittest.TestLoader):
-    def getTestCaseNames(self, testCaseClass):
-        test_names = super().getTestCaseNames(testCaseClass)
-        # testcase_methods = list(testCaseClass.__dict__.keys())
-        ls = []
-        for C in testCaseClass.mro():
-            if issubclass(C, unittest.TestCase):
-                ls = list(C.__dict__.keys()) + ls
-        testcase_methods = ls
-        test_names.sort(key=testcase_methods.index)
-        return test_names
-
-def evaluate_report(report, question=None, qitem=None, passall=False, verbose=False,  show_expected=False, show_computed=False,unmute=False, show_help_flag=True, silent=False,
-                    show_progress_bar=True,
-                    show_tol_err=False,
-                    big_header=True):
-
-    now = datetime.now()
-    if big_header:
-        ascii_banner = pyfiglet.figlet_format("UnitGrade", font="doom")
-        b = "\n".join( [l for l in ascii_banner.splitlines() if len(l.strip()) > 0] )
-    else:
-        b = "Unitgrade"
-    print(b + " v" + __version__)
-    dt_string = now.strftime("%d/%m/%Y %H:%M:%S")
-    print("Started: " + dt_string)
-    s = report.title
-    if hasattr(report, "version") and report.version is not None:
-        s += " version " + report.version
-    print("Evaluating " + s, "(use --help for options)" if show_help_flag else "")
-    # print(f"Loaded answers from: ", report.computed_answers_file, "\n")
-    table_data = []
-    nL = 80
-    t_start = time.time()
-    score = {}
-    loader = SequentialTestLoader()
-
-    for n, (q, w) in enumerate(report.questions):
-        # q = q()
-        # q_hidden = False
-        # q_hidden = issubclass(q.__class__, Hidden)
-        if question is not None and n+1 != question:
-            continue
-        suite = loader.loadTestsFromTestCase(q)
-        qtitle = q.question_title() if hasattr(q, 'question_title') else q.__qualname__
-        q_title_print = "Question %i: %s"%(n+1, qtitle)
-        print(q_title_print, end="")
-        q.possible = 0
-        q.obtained = 0
-        q_ = {} # Gather score in this class.
-        # unittest.Te
-        # q_with_outstanding_init = [item.question for item in q.items if not item.question.has_called_init_]
-        UTextResult.q_title_print = q_title_print # Hacky
-        UTextResult.show_progress_bar = show_progress_bar # Hacky.
-        UTextResult.number = n
-
-        res = UTextTestRunner(verbosity=2, resultclass=UTextResult).run(suite)
-
-        possible = res.testsRun
-        obtained = len(res.successes)
-
-        assert len(res.successes) +  len(res.errors) + len(res.failures) == res.testsRun
-
-        # possible = int(ws @ possible)
-        # obtained = int(ws @ obtained)
-        # obtained = int(myround(int((w * obtained) / possible ))) if possible > 0 else 0
-
-        obtained = int(w * obtained * 1.0 / possible ) if possible > 0 else 0
-        score[n] = {'w': w, 'possible': w, 'obtained': obtained, 'items': q_, 'title': qtitle}
-        q.obtained = obtained
-        q.possible = possible
-
-        s1 = f"*** Question q{n+1}"
-        s2 = f" {q.obtained}/{w}"
-        print(s1 + ("."* (nL-len(s1)-len(s2) )) + s2 )
-        print(" ")
-        table_data.append([f"Question q{n+1}", f"{q.obtained}/{w}"])
-
-    ws, possible, obtained = upack(score)
-    possible = int( msum(possible) )
-    obtained = int( msum(obtained) ) # Cast to python int
-    report.possible = possible
-    report.obtained = obtained
-    now = datetime.now()
-    dt_string = now.strftime("%H:%M:%S")
-
-    dt = int(time.time()-t_start)
-    minutes = dt//60
-    seconds = dt - minutes*60
-    plrl = lambda i, s: str(i) + " " + s + ("s" if i != 1 else "")
-
-    print(f"Completed: "+ dt_string + " (" + plrl(minutes, "minute") + ", "+ plrl(seconds, "second") +")")
-
-    table_data.append(["Total", ""+str(report.obtained)+"/"+str(report.possible) ])
-    results = {'total': (obtained, possible), 'details': score}
-    return results, table_data
-
-
-
-
-from tabulate import tabulate
-from datetime import datetime
-import inspect
-import json
-import os
-import bz2
-import pickle
-import os
-
-def bzwrite(json_str, token): # to get around obfuscation issues
-    with getattr(bz2, 'open')(token, "wt") as f:
-        f.write(json_str)
-
-def gather_imports(imp):
-    resources = {}
-    m = imp
-    # for m in pack_imports:
-    # print(f"*** {m.__name__}")
-    f = m.__file__
-    # dn = os.path.dirname(f)
-    # top_package = os.path.dirname(__import__(m.__name__.split('.')[0]).__file__)
-    # top_package = str(__import__(m.__name__.split('.')[0]).__path__)
-
-    if hasattr(m, '__file__') and not hasattr(m, '__path__'):  # Importing a simple file: m.__class__.__name__ == 'module' and False:
-        top_package = os.path.dirname(m.__file__)
-        module_import = True
-    else:
-        top_package = __import__(m.__name__.split('.')[0]).__path__._path[0]
-        module_import = False
-
-    # top_package = os.path.dirname(__import__(m.__name__.split('.')[0]).__file__)
-    # top_package = os.path.dirname(top_package)
-    import zipfile
-    # import strea
-    # zipfile.ZipFile
-    import io
-    # file_like_object = io.BytesIO(my_zip_data)
-    zip_buffer = io.BytesIO()
-    with zipfile.ZipFile(zip_buffer, 'w') as zip:
-        # zip.write()
-        for root, dirs, files in os.walk(top_package):
-            for file in files:
-                if file.endswith(".py"):
-                    fpath = os.path.join(root, file)
-                    v = os.path.relpath(os.path.join(root, file), os.path.dirname(top_package) if not module_import else top_package)
-                    zip.write(fpath, v)
-
-    resources['zipfile'] = zip_buffer.getvalue()
-    resources['top_package'] = top_package
-    resources['module_import'] = module_import
-    return resources, top_package
-
-    if f.endswith("__init__.py"):
-        for root, dirs, files in os.walk(os.path.dirname(f)):
-            for file in files:
-                if file.endswith(".py"):
-                    # print(file)
-                    # print()
-                    v = os.path.relpath(os.path.join(root, file), top_package)
-                    with open(os.path.join(root, file), 'r') as ff:
-                        resources[v] = ff.read()
-    else:
-        v = os.path.relpath(f, top_package)
-        with open(f, 'r') as ff:
-            resources[v] = ff.read()
-    return resources
-
-import argparse
-parser = argparse.ArgumentParser(description='Evaluate your report.', epilog="""Use this script to get the score of your report. Example:
-
-> python report1_grade.py
-
-Finally, note that if your report is part of a module (package), and the report script requires part of that package, the -m option for python may be useful.
-For instance, if the report file is in Documents/course_package/report3_complete.py, and `course_package` is a python package, then change directory to 'Documents/` and run:
-
-> python -m course_package.report1
-
-see https://docs.python.org/3.9/using/cmdline.html
-""", formatter_class=argparse.RawTextHelpFormatter)
-parser.add_argument('--noprogress',  action="store_true",  help='Disable progress bars')
-parser.add_argument('--autolab',  action="store_true",  help='Show Autolab results')
-
-def gather_upload_to_campusnet(report, output_dir=None):
-    n = report.nL
-    args = parser.parse_args()
-    results, table_data = evaluate_report(report, show_help_flag=False, show_expected=False, show_computed=False, silent=True,
-                                          show_progress_bar=not args.noprogress,
-                                          big_header=not args.autolab)
-    print(" ")
-    print("="*n)
-    print("Final evaluation")
-    print(tabulate(table_data))
-    # also load the source code of missing files...
-
-    sources = {}
-
-    if not args.autolab:
-        if len(report.individual_imports) > 0:
-            print("By uploading the .token file, you verify the files:")
-            for m in report.individual_imports:
-                print(">", m.__file__)
-            print("Are created/modified individually by you in agreement with DTUs exam rules")
-            report.pack_imports += report.individual_imports
-
-        if len(report.pack_imports) > 0:
-            print("Including files in upload...")
-            for k, m in enumerate(report.pack_imports):
-                nimp, top_package = gather_imports(m)
-                _, report_relative_location, module_import = report._import_base_relative()
-
-                # report_relative_location = os.path.relpath(inspect.getfile(report.__class__), top_package)
-                nimp['report_relative_location'] = report_relative_location
-                nimp['report_module_specification'] = module_import
-                nimp['name'] = m.__name__
-                sources[k] = nimp
-                # if len([k for k in nimp if k not in sources]) > 0:
-                print(f"*** {m.__name__}")
-                # sources = {**sources, **nimp}
-    results['sources'] = sources
-
-    if output_dir is None:
-        output_dir = os.getcwd()
-
-    payload_out_base = report.__class__.__name__ + "_handin"
-
-    obtain, possible = results['total']
-    vstring = "_v"+report.version if report.version is not None else ""
-
-    token = "%s_%i_of_%i%s.token"%(payload_out_base, obtain, possible,vstring)
-    token = os.path.join(output_dir, token)
-    with open(token, 'wb') as f:
-        pickle.dump(results, f)
-
-    if not args.autolab:
-        print(" ")
-        print("To get credit for your results, please upload the single file: ")
-        print(">", token)
-        print("To campusnet without any modifications.")
-
-        # print("Now time for some autolab fun")
-
-def source_instantiate(name, report1_source, payload):
-    eval("exec")(report1_source, globals())
-    pl = pickle.loads(bytes.fromhex(payload))
-    report = eval(name)(payload=pl, strict=True)
-    # report.set_payload(pl)
-    return report
-
-
-
-report1_source = 'import os\n\n# DONT\'t import stuff here since install script requires __version__\n\ndef cache_write(object, file_name, verbose=True):\n    import compress_pickle\n    dn = os.path.dirname(file_name)\n    if not os.path.exists(dn):\n        os.mkdir(dn)\n    if verbose: print("Writing cache...", file_name)\n    with open(file_name, \'wb\', ) as f:\n        compress_pickle.dump(object, f, compression="lzma")\n    if verbose: print("Done!")\n\n\ndef cache_exists(file_name):\n    # file_name = cn_(file_name) if cache_prefix else file_name\n    return os.path.exists(file_name)\n\n\ndef cache_read(file_name):\n    import compress_pickle # Import here because if you import in top the __version__ tag will fail.\n    # file_name = cn_(file_name) if cache_prefix else file_name\n    if os.path.exists(file_name):\n        try:\n            with open(file_name, \'rb\') as f:\n                return compress_pickle.load(f, compression="lzma")\n        except Exception as e:\n            print("Tried to load a bad pickle file at", file_name)\n            print("If the file appears to be automatically generated, you can try to delete it, otherwise download a new version")\n            print(e)\n            # return pickle.load(f)\n    else:\n        return None\n\n\n\n"""\ngit add . && git commit -m "Options" && git push &&  pip install git+ssh://git@gitlab.compute.dtu.dk/tuhe/unitgrade_v1.git --upgrade\n\n"""\n# from . import cache_read\nimport unittest\nimport numpy as np\nimport sys\nimport collections\nimport re\nimport threading\nimport tqdm\nimport time\nimport pickle\nimport os\nfrom io import StringIO\nfrom unittest.runner import _WritelnDecorator\nimport inspect\n\nmyround = lambda x: np.round(x)  # required.\nmsum = lambda x: sum(x)\nmfloor = lambda x: np.floor(x)\n\ndef setup_dir_by_class(C,base_dir):\n    name = C.__class__.__name__\n    # base_dir = os.path.join(base_dir, name)\n    # if not os.path.isdir(base_dir):\n    #     os.makedirs(base_dir)\n    return base_dir, name\n\nclass Hidden:\n    def hide(self):\n        return True\n\nclass Logger(object):\n    def __init__(self, buffer):\n        self.terminal = sys.stdout\n        self.log = buffer\n\n    def write(self, message):\n        self.terminal.write(message)\n        self.log.write(message)\n\n    def flush(self):\n        # this flush method is needed for python 3 compatibility.\n        pass\n\nclass Capturing(list):\n    def __init__(self, *args, stdout=None, unmute=False, **kwargs):\n        self._stdout = stdout\n        self.unmute = unmute\n        super().__init__(*args, **kwargs)\n\n    def __enter__(self, capture_errors=True): # don\'t put arguments here.\n        self._stdout = sys.stdout if self._stdout == None else self._stdout\n        self._stringio = StringIO()\n        if self.unmute:\n            sys.stdout = Logger(self._stringio)\n        else:\n            sys.stdout = self._stringio\n\n        if capture_errors:\n            self._sterr = sys.stderr\n            sys.sterr = StringIO() # memory hole it\n        self.capture_errors = capture_errors\n        return self\n\n    def __exit__(self, *args):\n        self.extend(self._stringio.getvalue().splitlines())\n        del self._stringio    # free up some memory\n        sys.stdout = self._stdout\n        if self.capture_errors:\n            sys.sterr = self._sterr\n\nclass Capturing2(Capturing):\n    def __exit__(self, *args):\n        lines = self._stringio.getvalue().splitlines()\n        txt = "\\n".join(lines)\n        numbers = extract_numbers(txt)\n        self.extend(lines)\n        del self._stringio    # free up some memory\n        sys.stdout = self._stdout\n        if self.capture_errors:\n            sys.sterr = self._sterr\n\n        self.output = txt\n        self.numbers = numbers\n\n\nclass QItem(unittest.TestCase):\n    title = None\n    testfun = None\n    tol = 0\n    estimated_time = 0.42\n    _precomputed_payload = None\n    _computed_answer = None # Internal helper to later get results.\n    weight = 1 # the weight of the question.\n\n    def __init__(self, question=None, *args, **kwargs):\n        if self.tol > 0 and self.testfun is None:\n            self.testfun = self.assertL2Relative\n        elif self.testfun is None:\n            self.testfun = self.assertEqual\n\n        self.name = self.__class__.__name__\n        # self._correct_answer_payload = correct_answer_payload\n        self.question = question\n\n        super().__init__(*args, **kwargs)\n        if self.title is None:\n            self.title = self.name\n\n    def _safe_get_title(self):\n        if self._precomputed_title is not None:\n            return self._precomputed_title\n        return self.title\n\n    def assertNorm(self, computed, expected, tol=None):\n        if tol == None:\n            tol = self.tol\n        diff = np.abs( (np.asarray(computed).flat- np.asarray(expected)).flat )\n        nrm = np.sqrt(np.sum( diff ** 2))\n\n        self.error_computed = nrm\n\n        if nrm > tol:\n            print(f"Not equal within tolerance {tol}; norm of difference was {nrm}")\n            print(f"Element-wise differences {diff.tolist()}")\n            self.assertEqual(computed, expected, msg=f"Not equal within tolerance {tol}")\n\n    def assertL2(self, computed, expected, tol=None):\n        if tol == None:\n            tol = self.tol\n        diff = np.abs( (np.asarray(computed) - np.asarray(expected)) )\n        self.error_computed = np.max(diff)\n\n        if np.max(diff) > tol:\n            print(f"Not equal within tolerance {tol=}; deviation was {np.max(diff)=}")\n            print(f"Element-wise differences {diff.tolist()}")\n            self.assertEqual(computed, expected, msg=f"Not equal within tolerance {tol=}, {np.max(diff)=}")\n\n    def assertL2Relative(self, computed, expected, tol=None):\n        if tol == None:\n            tol = self.tol\n        diff = np.abs( (np.asarray(computed) - np.asarray(expected)) )\n        diff = diff / (1e-8 + np.abs( (np.asarray(computed) + np.asarray(expected)) ) )\n        self.error_computed = np.max(np.abs(diff))\n        if np.sum(diff > tol) > 0:\n            print(f"Not equal within tolerance {tol}")\n            print(f"Element-wise differences {diff.tolist()}")\n            self.assertEqual(computed, expected, msg=f"Not equal within tolerance {tol}")\n\n    def precomputed_payload(self):\n        return self._precomputed_payload\n\n    def precompute_payload(self):\n        # Pre-compute resources to include in tests (useful for getting around rng).\n        pass\n\n    def compute_answer(self, unmute=False):\n        raise NotImplementedError("test code here")\n\n    def test(self, computed, expected):\n        self.testfun(computed, expected)\n\n    def get_points(self, verbose=False, show_expected=False, show_computed=False,unmute=False, passall=False, silent=False, **kwargs):\n        possible = 1\n        computed = None\n        def show_computed_(computed):\n            print(">>> Your output:")\n            print(computed)\n\n        def show_expected_(expected):\n            print(">>> Expected output (note: may have been processed; read text script):")\n            print(expected)\n\n        correct = self._correct_answer_payload\n        try:\n            if unmute: # Required to not mix together print stuff.\n                print("")\n            computed = self.compute_answer(unmute=unmute)\n        except Exception as e:\n            if not passall:\n                if not silent:\n                    print("\\n=================================================================================")\n                    print(f"When trying to run test class \'{self.name}\' your code threw an error:", e)\n                    show_expected_(correct)\n                    import traceback\n                    print(traceback.format_exc())\n                    print("=================================================================================")\n                return (0, possible)\n\n        if self._computed_answer is None:\n            self._computed_answer = computed\n\n        if show_expected or show_computed:\n            print("\\n")\n        if show_expected:\n            show_expected_(correct)\n        if show_computed:\n            show_computed_(computed)\n        try:\n            if not passall:\n                self.test(computed=computed, expected=correct)\n        except Exception as e:\n            if not silent:\n                print("\\n=================================================================================")\n                print(f"Test output from test class \'{self.name}\' does not match expected result. Test error:")\n                print(e)\n                show_computed_(computed)\n                show_expected_(correct)\n            return (0, possible)\n        return (1, possible)\n\n    def score(self):\n        try:\n            self.test()\n        except Exception as e:\n            return 0\n        return 1\n\nclass QPrintItem(QItem):\n    def compute_answer_print(self):\n        """\n        Generate output which is to be tested. By default, both text written to the terminal using print(...) as well as return values\n        are send to process_output (see compute_answer below). In other words, the text generated is:\n\n        res = compute_Answer_print()\n        txt = (any terminal output generated above)\n        numbers = (any numbers found in terminal-output txt)\n\n        self.test(process_output(res, txt, numbers), <expected result>)\n\n        :return: Optional values for comparison\n        """\n        raise Exception("Generate output here. The output is passed to self.process_output")\n\n    def process_output(self, res, txt, numbers):\n        return res\n\n    def compute_answer(self, unmute=False):\n        with Capturing(unmute=unmute) as output:\n            res = self.compute_answer_print()\n        s = "\\n".join(output)\n        s = rm_progress_bar(s) # Remove progress bar.\n        numbers = extract_numbers(s)\n        self._computed_answer = (res, s, numbers)\n        return self.process_output(res, s, numbers)\n\nclass OrderedClassMembers(type):\n    @classmethod\n    def __prepare__(self, name, bases):\n        return collections.OrderedDict()\n    def __new__(self, name, bases, classdict):\n        ks = list(classdict.keys())\n        for b in bases:\n            ks += b.__ordered__\n        classdict[\'__ordered__\'] = [key for key in ks if key not in (\'__module__\', \'__qualname__\')]\n        return type.__new__(self, name, bases, classdict)\n\nclass QuestionGroup(metaclass=OrderedClassMembers):\n    title = "Untitled question"\n    partially_scored = False\n    t_init = 0  # Time spend on initialization (placeholder; set this externally).\n    estimated_time = 0.42\n    has_called_init_ = False\n    _name = None\n    _items = None\n\n    @property\n    def items(self):\n        if self._items == None:\n            self._items = []\n            members = [gt for gt in [getattr(self, gt) for gt in self.__ordered__ if gt not in ["__classcell__", "__init__"]] if inspect.isclass(gt) and issubclass(gt, QItem)]\n            for I in members:\n                self._items.append( I(question=self))\n        return self._items\n\n    @items.setter\n    def items(self, value):\n        self._items = value\n\n    @property\n    def name(self):\n        if self._name == None:\n            self._name = self.__class__.__name__\n        return self._name #\n\n    @name.setter\n    def name(self, val):\n        self._name = val\n\n    def init(self):\n        # Can be used to set resources relevant for this question instance.\n        pass\n\n    def init_all_item_questions(self):\n        for item in self.items:\n            if not item.question.has_called_init_:\n                item.question.init()\n                item.question.has_called_init_ = True\n\n\nclass Report:\n    title = "report title"\n    version = None\n    questions = []\n    pack_imports = []\n    individual_imports = []\n    nL = 80 # Maximum line width\n\n    @classmethod\n    def reset(cls):\n        for (q,_) in cls.questions:\n            if hasattr(q, \'reset\'):\n                q.reset()\n\n    @classmethod\n    def mfile(clc):\n        return inspect.getfile(clc)\n\n    def _file(self):\n        return inspect.getfile(type(self))\n\n    def _import_base_relative(self):\n        if hasattr(self.pack_imports[0], \'__path__\'):\n            root_dir = self.pack_imports[0].__path__._path[0]\n        else:\n            root_dir = self.pack_imports[0].__file__\n\n        root_dir = os.path.dirname(root_dir)\n        relative_path = os.path.relpath(self._file(), root_dir)\n        modules = os.path.normpath(relative_path[:-3]).split(os.sep)\n        return root_dir, relative_path, modules\n\n    def __init__(self, strict=False, payload=None):\n        working_directory = os.path.abspath(os.path.dirname(self._file()))\n\n        self.wdir, self.name = setup_dir_by_class(self, working_directory)\n        # self.computed_answers_file = os.path.join(self.wdir, self.name + "_resources_do_not_hand_in.dat")\n        for (q,_) in self.questions:\n            q.nL = self.nL # Set maximum line length.\n\n        if payload is not None:\n            self.set_payload(payload, strict=strict)\n        # else:\n        #     if os.path.isfile(self.computed_answers_file):\n        #         self.set_payload(cache_read(self.computed_answers_file), strict=strict)\n        #     else:\n        #         s = f"> Warning: The pre-computed answer file, {os.path.abspath(self.computed_answers_file)} is missing. The framework will NOT work as intended. Reasons may be a broken local installation."\n        #         if strict:\n        #             raise Exception(s)\n        #         else:\n        #             print(s)\n\n    def main(self, verbosity=1):\n        # Run all tests using standard unittest (nothing fancy).\n        import unittest\n        loader = unittest.TestLoader()\n        for q,_ in self.questions:\n            import time\n            start = time.time() # A good proxy for setup time is to\n            suite = loader.loadTestsFromTestCase(q)\n            unittest.TextTestRunner(verbosity=verbosity).run(suite)\n            total = time.time()              - start\n            q.time = total\n\n    def _setup_answers(self):\n        self.main()  # Run all tests in class just to get that out of the way...\n        report_cache = {}\n        for q, _ in self.questions:\n            if hasattr(q, \'_save_cache\'):\n                q()._save_cache()\n                q._cache[\'time\'] = q.time\n                report_cache[q.__qualname__] = q._cache\n            else:\n                report_cache[q.__qualname__] = {\'no cache see _setup_answers in framework.py\':True}\n        return report_cache\n\n    def set_payload(self, payloads, strict=False):\n        for q, _ in self.questions:\n            q._cache = payloads[q.__qualname__]\n\ndef rm_progress_bar(txt):\n    # More robust version. Apparently length of bar can depend on various factors, so check for order of symbols.\n    nlines = []\n    for l in txt.splitlines():\n        pct = l.find("%")\n        ql = False\n        if pct > 0:\n            i = l.find("|", pct+1)\n            if i > 0 and l.find("|", i+1) > 0:\n                ql = True\n        if not ql:\n            nlines.append(l)\n    return "\\n".join(nlines)\n\ndef extract_numbers(txt):\n    # txt = rm_progress_bar(txt)\n    numeric_const_pattern = \'[-+]? (?: (?: \\d* \\. \\d+ ) | (?: \\d+ \\.? ) )(?: [Ee] [+-]? \\d+ ) ?\'\n    rx = re.compile(numeric_const_pattern, re.VERBOSE)\n    all = rx.findall(txt)\n    all = [float(a) if (\'.\' in a or "e" in a) else int(a) for a in all]\n    if len(all) > 500:\n        print(txt)\n        raise Exception("unitgrade_v1.unitgrade_v1.py: Warning, too many numbers!", len(all))\n    return all\n\nclass ActiveProgress():\n    def __init__(self, t, start=True, title="my progress bar",show_progress_bar=True):\n        self.t = t\n        self._running = False\n        self.title = title\n        self.dt = 0.1\n        self.n = int(np.round(self.t / self.dt))\n        self.show_progress_bar = show_progress_bar\n\n        # self.pbar = tqdm.tqdm(total=self.n)\n        if start:\n            self.start()\n\n    def start(self):\n        self._running = True\n        if self.show_progress_bar:\n            self.thread = threading.Thread(target=self.run)\n            self.thread.start()\n        self.time_started = time.time()\n\n    def terminate(self):\n        if not self._running:\n            raise Exception("Stopping a stopped progress bar. ")\n        self._running = False\n        if self.show_progress_bar:\n            self.thread.join()\n        if hasattr(self, \'pbar\') and self.pbar is not None:\n            self.pbar.update(1)\n            self.pbar.close()\n            self.pbar=None\n\n        sys.stdout.flush()\n        return time.time() - self.time_started\n\n    def run(self):\n        self.pbar = tqdm.tqdm(total=self.n, file=sys.stdout, position=0, leave=False, desc=self.title, ncols=100,\n                              bar_format=\'{l_bar}{bar}| [{elapsed}<{remaining}]\')  # , unit_scale=dt, unit=\'seconds\'):\n\n        for _ in range(self.n-1): # Don\'t terminate completely; leave bar at 99% done until terminate.\n            if not self._running:\n                self.pbar.close()\n                self.pbar = None\n                break\n\n            time.sleep(self.dt)\n            self.pbar.update(1)\n\n\n# class MySuite(unittest.suite.TestSuite): # Not sure we need this one anymore.\n#     raise Exception("no suite")\n#     pass\n\ndef instance_call_stack(instance):\n    s = "-".join(map(lambda x: x.__name__, instance.__class__.mro()))\n    return s\n\ndef get_class_that_defined_method(meth):\n    for cls in inspect.getmro(meth.im_class):\n        if meth.__name__ in cls.__dict__:\n            return cls\n    return None\n\ndef caller_name(skip=2):\n    """Get a name of a caller in the format module.class.method\n\n       `skip` specifies how many levels of stack to skip while getting caller\n       name. skip=1 means "who calls me", skip=2 "who calls my caller" etc.\n\n       An empty string is returned if skipped levels exceed stack height\n    """\n    stack = inspect.stack()\n    start = 0 + skip\n    if len(stack) < start + 1:\n      return \'\'\n    parentframe = stack[start][0]\n\n    name = []\n    module = inspect.getmodule(parentframe)\n    # `modname` can be None when frame is executed directly in console\n    # TODO(techtonik): consider using __main__\n    if module:\n        name.append(module.__name__)\n    # detect classname\n    if \'self\' in parentframe.f_locals:\n        # I don\'t know any way to detect call from the object method\n        # XXX: there seems to be no way to detect static method call - it will\n        #      be just a function call\n        name.append(parentframe.f_locals[\'self\'].__class__.__name__)\n    codename = parentframe.f_code.co_name\n    if codename != \'<module>\':  # top level usually\n        name.append( codename ) # function or a method\n\n    ## Avoid circular refs and frame leaks\n    #  https://docs.python.org/2.7/library/inspect.html#the-interpreter-stack\n    del parentframe, stack\n\n    return ".".join(name)\n\ndef get_class_from_frame(fr):\n\n      args, _, _, value_dict = inspect.getargvalues(fr)\n      # we check the first parameter for the frame function is\n      # named \'self\'\n      if len(args) and args[0] == \'self\':\n            # in that case, \'self\' will be referenced in value_dict\n            instance = value_dict.get(\'self\', None)\n            if instance:\n                  # return its class\n                  # isinstance(instance, Testing) # is the actual class instance.\n\n                  return getattr(instance, \'__class__\', None)\n      # return None otherwise\n      return None\n\nfrom typing import Any\nimport inspect, gc\n\ndef giveupthefunc():\n    frame = inspect.currentframe()\n    code  = frame.f_code\n    globs = frame.f_globals\n    functype = type(lambda: 0)\n    funcs = []\n    for func in gc.get_referrers(code):\n        if type(func) is functype:\n            if getattr(func, "__code__", None) is code:\n                if getattr(func, "__globals__", None) is globs:\n                    funcs.append(func)\n                    if len(funcs) > 1:\n                        return None\n    return funcs[0] if funcs else None\n\n\nfrom collections import defaultdict\n\nclass UTextResult(unittest.TextTestResult):\n    nL = 80\n    number = -1 # HAcky way to set question number.\n    show_progress_bar = True\n    def __init__(self, stream, descriptions, verbosity):\n        super().__init__(stream, descriptions, verbosity)\n        self.successes = []\n\n    def printErrors(self) -> None:\n        # if self.dots or self.showAll:\n        #     self.stream.writeln()\n        # if hasattr(self, \'cc\'):\n        #     self.cc.terminate()\n        # self.cc_terminate(success=False)\n        self.printErrorList(\'ERROR\', self.errors)\n        self.printErrorList(\'FAIL\', self.failures)\n\n    def addError(self, test, err):\n        super(unittest.TextTestResult, self).addFailure(test, err)\n        self.cc_terminate(success=False)\n\n    def addFailure(self, test, err):\n        super(unittest.TextTestResult, self).addFailure(test, err)\n        self.cc_terminate(success=False)\n        # if self.showAll:\n        #     self.stream.writeln("FAIL")\n        # elif self.dots:\n        #     self.stream.write(\'F\')\n        #     self.stream.flush()\n\n    def addSuccess(self, test: unittest.case.TestCase) -> None:\n        # super().addSuccess(test)\n        self.successes.append(test)\n        # super().addSuccess(test)\n        #     hidden = issubclass(item.__class__, Hidden)\n        #     # if not hidden:\n        #     #     print(ss, end="")\n        #     # sys.stdout.flush()\n        #     start = time.time()\n        #\n        #     (current, possible) = item.get_points(show_expected=show_expected, show_computed=show_computed,unmute=unmute, passall=passall, silent=silent)\n        #     q_[j] = {\'w\': item.weight, \'possible\': possible, \'obtained\': current, \'hidden\': hidden, \'computed\': str(item._computed_answer), \'title\': item.title}\n        #     tsecs = np.round(time.time()-start, 2)\n        self.cc_terminate()\n\n\n\n    def cc_terminate(self, success=True):\n        if self.show_progress_bar or True:\n            tsecs = np.round(self.cc.terminate(), 2)\n            sys.stdout.flush()\n            ss = self.item_title_print\n\n            state = "PASS" if success else "FAILED"\n\n            dot_parts = (\'.\' * max(0, self.nL - len(state) - len(ss)))\n            if self.show_progress_bar or True:\n                print(self.item_title_print + dot_parts, end="")\n            else:\n                print( dot_parts, end="")\n\n            if tsecs >= 0.1:\n                state += " (" + str(tsecs) + " seconds)"\n            print(state)\n\n\n    def startTest(self, test):\n        # super().startTest(test)\n        j =self.testsRun\n        self.testsRun += 1\n        # print("Starting the test...")\n        # show_progress_bar = True\n        n = UTextResult.number\n\n        item_title = self.getDescription(test)\n        # item_title = item_title.split("\\n")[0]\n        item_title = test.shortDescription() # Better for printing (get from cache).\n        if item_title == None:\n            # For unittest framework where getDescription may return None.\n            item_title = self.getDescription(test)\n        # test.countTestCases()\n        self.item_title_print = "*** q%i.%i) %s" % (n + 1, j + 1, item_title)\n        estimated_time = 10\n        nL = 80\n        #\n        if self.show_progress_bar or True:\n            self.cc = ActiveProgress(t=estimated_time, title=self.item_title_print, show_progress_bar=self.show_progress_bar)\n        else:\n            print(self.item_title_print + (\'.\' * max(0, nL - 4 - len(self.item_title_print))), end="")\n\n        self._test = test\n\n    def _setupStdout(self):\n        if self._previousTestClass == None:\n            total_estimated_time = 1\n            if hasattr(self.__class__, \'q_title_print\'):\n                q_title_print = self.__class__.q_title_print\n            else:\n                q_title_print = "<unnamed test. See unitgrade_v1.py>"\n\n            # q_title_print = "some printed title..."\n            cc = ActiveProgress(t=total_estimated_time, title=q_title_print, show_progress_bar=self.show_progress_bar)\n            self.cc = cc\n\n    def _restoreStdout(self): # Used when setting up the test.\n        if self._previousTestClass == None:\n            q_time = self.cc.terminate()\n            q_time = np.round(q_time, 2)\n            sys.stdout.flush()\n            if self.show_progress_bar:\n                print(self.cc.title, end="")\n            # start = 10\n            # q_time = np.round(time.time() - start, 2)\n            nL = 80\n            print(" " * max(0, nL - len(self.cc.title)) + (\n                " (" + str(q_time) + " seconds)" if q_time >= 0.1 else ""))  # if q.name in report.payloads else "")\n            # print("=" * nL)\n\n\n\nclass UTextTestRunner(unittest.TextTestRunner):\n    def __init__(self, *args, **kwargs):\n        from io import StringIO\n        stream = StringIO()\n        super().__init__(*args, stream=stream, **kwargs)\n\n    def _makeResult(self):\n        # stream = self.stream # not you!\n        stream = sys.stdout\n        stream = _WritelnDecorator(stream)\n        return self.resultclass(stream, self.descriptions, self.verbosity)\n\n# def wrapper(foo):\n#     def magic(self):\n#         # s = "-".join(map(lambda x: x.__name__, self.__class__.mro()))\n#         foo(self)\n#     magic.__doc__ = foo.__doc__\n#     return magic\n\nfrom functools import update_wrapper, _make_key, RLock\nfrom collections import namedtuple\n_CacheInfo = namedtuple("CacheInfo", ["hits", "misses", "maxsize", "currsize"])\n\ndef cache(foo, typed=False):\n    """ Magic cache wrapper\n    https://github.com/python/cpython/blob/main/Lib/functools.py\n    """\n    maxsize = None\n    def wrapper(self, *args, **kwargs):\n        key = (self.cache_id(), ("@cache", foo.__name__, _make_key(args, kwargs, typed)) )\n        if not self._cache_contains(key):\n            value = foo(self, *args, **kwargs)\n            self._cache_put(key, value)\n        else:\n            value = self._cache_get(key)\n        return value\n    return wrapper\n\n\nclass UTestCase(unittest.TestCase):\n    _outcome = None # A dictionary which stores the user-computed outcomes of all the tests. This differs from the cache.\n    _cache = None  # Read-only cache. Ensures method always produce same result.\n    _cache2 = None  # User-written cache.\n\n    def capture(self):\n        return Capturing2(stdout=self._stdout)\n\n    @classmethod\n    def question_title(cls):\n        """ Return the question title """\n        return cls.__doc__.strip().splitlines()[0].strip() if cls.__doc__ != None else cls.__qualname__\n\n    @classmethod\n    def reset(cls):\n        print("Warning, I am not sure UTestCase.reset() is needed anymore and it seems very hacky.")\n        cls._outcome = None\n        cls._cache = None\n        cls._cache2 = None\n\n    def _callSetUp(self):\n        self._stdout = sys.stdout\n        import io\n        sys.stdout = io.StringIO()\n        super().setUp()\n        # print("Setting up...")\n\n    def _callTearDown(self):\n        sys.stdout = self._stdout\n        super().tearDown()\n        # print("asdfsfd")\n\n    def shortDescriptionStandard(self):\n        sd = super().shortDescription()\n        if sd == None:\n            sd = self._testMethodName\n        return sd\n\n    def shortDescription(self):\n        # self._testMethodDoc.strip().splitlines()[0].strip()\n        sd = self.shortDescriptionStandard()\n        title = self._cache_get(  (self.cache_id(), \'title\'), sd )\n        return title if title != None else sd\n\n    @property\n    def title(self):\n        return self.shortDescription()\n\n    @title.setter\n    def title(self, value):\n        self._cache_put((self.cache_id(), \'title\'), value)\n\n    def _get_outcome(self):\n        if not (self.__class__, \'_outcome\') or self.__class__._outcome == None:\n            self.__class__._outcome = {}\n        return self.__class__._outcome\n\n    def _callTestMethod(self, testMethod):\n        t = time.time()\n        self._ensure_cache_exists() # Make sure cache is there.\n        if self._testMethodDoc != None:\n            # Ensure the cache is eventually updated with the right docstring.\n            self._cache_put((self.cache_id(), \'title\'), self.shortDescriptionStandard() )\n        # Fix temp cache here (for using the @cache decorator)\n        self._cache2[ (self.cache_id(), \'assert\') ] = {}\n\n        res = testMethod()\n        elapsed = time.time() - t\n        # self._cache_put( (self.cache_id(), \'title\'), self.shortDescription() )\n\n        self._get_outcome()[self.cache_id()] = res\n        self._cache_put( (self.cache_id(), "time"), elapsed)\n\n    # This is my base test class. So what is new about it?\n    def cache_id(self):\n        c = self.__class__.__qualname__\n        m = self._testMethodName\n        return (c,m)\n\n    def __init__(self, *args, **kwargs):\n        super().__init__(*args, **kwargs)\n        self._load_cache()\n        self._assert_cache_index = 0\n        # self.cache_indexes = defaultdict(lambda: 0)\n\n    def _ensure_cache_exists(self):\n        if not hasattr(self.__class__, \'_cache\') or self.__class__._cache == None:\n            self.__class__._cache = dict()\n        if not hasattr(self.__class__, \'_cache2\') or self.__class__._cache2 == None:\n            self.__class__._cache2 = dict()\n\n    def _cache_get(self, key, default=None):\n        self._ensure_cache_exists()\n        return self.__class__._cache.get(key, default)\n\n    def _cache_put(self, key, value):\n        self._ensure_cache_exists()\n        self.__class__._cache2[key] = value\n\n    def _cache_contains(self, key):\n        self._ensure_cache_exists()\n        return key in self.__class__._cache\n\n    def wrap_assert(self, assert_fun, first, *args, **kwargs):\n        key = (self.cache_id(), \'assert\')\n        if not self._cache_contains(key):\n            print("Warning, framework missing", key)\n        cache = self._cache_get(key, {})\n        id = self._assert_cache_index\n        if not id in cache:\n            print("Warning, framework missing cache index", key, "id =", id)\n        _expected = cache.get(id, first)\n        assert_fun(first, _expected, *args, **kwargs)\n        cache[id] = first\n        self._cache_put(key, cache)\n        self._assert_cache_index += 1\n\n    def assertEqualC(self, first: Any, msg: Any = ...) -> None:\n        self.wrap_assert(self.assertEqual, first, msg)\n\n    def _cache_file(self):\n        return os.path.dirname(inspect.getfile(self.__class__) ) + "/unitgrade_v1/" + self.__class__.__name__ + ".pkl"\n\n    def _save_cache(self):\n        # get the class name (i.e. what to save to).\n        cfile = self._cache_file()\n        if not os.path.isdir(os.path.dirname(cfile)):\n            os.makedirs(os.path.dirname(cfile))\n\n        if hasattr(self.__class__, \'_cache2\'):\n            with open(cfile, \'wb\') as f:\n                pickle.dump(self.__class__._cache2, f)\n\n    # But you can also set cache explicitly.\n    def _load_cache(self):\n        if self._cache != None: # Cache already loaded. We will not load it twice.\n            return\n            # raise Exception("Loaded cache which was already set. What is going on?!")\n        cfile = self._cache_file()\n        # print("Loading cache from", cfile)\n        if os.path.exists(cfile):\n            with open(cfile, \'rb\') as f:\n                data = pickle.load(f)\n                self.__class__._cache = data\n        else:\n            print("Warning! data file not found", cfile)\n\ndef hide(func):\n    return func\n\ndef makeRegisteringDecorator(foreignDecorator):\n    """\n        Returns a copy of foreignDecorator, which is identical in every\n        way(*), except also appends a .decorator property to the callable it\n        spits out.\n    """\n    def newDecorator(func):\n        # Call to newDecorator(method)\n        # Exactly like old decorator, but output keeps track of what decorated it\n        R = foreignDecorator(func)  # apply foreignDecorator, like call to foreignDecorator(method) would have done\n        R.decorator = newDecorator  # keep track of decorator\n        # R.original = func         # might as well keep track of everything!\n        return R\n\n    newDecorator.__name__ = foreignDecorator.__name__\n    newDecorator.__doc__ = foreignDecorator.__doc__\n    # (*)We can be somewhat "hygienic", but newDecorator still isn\'t signature-preserving, i.e. you will not be able to get a runtime list of parameters. For that, you need hackish libraries...but in this case, the only argument is func, so it\'s not a big issue\n    return newDecorator\n\nhide = makeRegisteringDecorator(hide)\n\ndef methodsWithDecorator(cls, decorator):\n    """\n        Returns all methods in CLS with DECORATOR as the\n        outermost decorator.\n\n        DECORATOR must be a "registering decorator"; one\n        can make any decorator "registering" via the\n        makeRegisteringDecorator function.\n\n        import inspect\n        ls = list(methodsWithDecorator(GeneratorQuestion, deco))\n        for f in ls:\n            print(inspect.getsourcelines(f) ) # How to get all hidden questions.\n    """\n    for maybeDecorated in cls.__dict__.values():\n        if hasattr(maybeDecorated, \'decorator\'):\n            if maybeDecorated.decorator == decorator:\n                print(maybeDecorated)\n                yield maybeDecorated\n\n\n\nimport numpy as np\nfrom tabulate import tabulate\nfrom datetime import datetime\nimport pyfiglet\nimport unittest\n# from unitgrade.unitgrade import MySuite\n\nimport inspect\nimport os\nimport argparse\nimport sys\nimport time\nimport threading # don\'t import Thread bc. of minify issue.\nimport tqdm # don\'t do from tqdm import tqdm because of minify-issue\n\nparser = argparse.ArgumentParser(description=\'Evaluate your report.\', epilog="""Example: \nTo run all tests in a report: \n\n> python assignment1_dp.py\n\nTo run only question 2 or question 2.1\n\n> python assignment1_dp.py -q 2\n> python assignment1_dp.py -q 2.1\n\nNote this scripts does not grade your report. To grade your report, use:\n\n> python report1_grade.py\n\nFinally, note that if your report is part of a module (package), and the report script requires part of that package, the -m option for python may be useful.\nFor instance, if the report file is in Documents/course_package/report3_complete.py, and `course_package` is a python package, then change directory to \'Documents/` and run:\n\n> python -m course_package.report1\n\nsee https://docs.python.org/3.9/using/cmdline.html\n""", formatter_class=argparse.RawTextHelpFormatter)\nparser.add_argument(\'-q\', nargs=\'?\', type=str, default=None, help=\'Only evaluate this question (e.g.: -q 2)\')\nparser.add_argument(\'--showexpected\',  action="store_true",  help=\'Show the expected/desired result\')\nparser.add_argument(\'--showcomputed\',  action="store_true",  help=\'Show the answer your code computes\')\nparser.add_argument(\'--unmute\',  action="store_true",  help=\'Show result of print(...) commands in code\')\nparser.add_argument(\'--passall\',  action="store_true",  help=\'Automatically pass all tests. Useful when debugging.\')\n\ndef evaluate_report_student(report, question=None, qitem=None, unmute=None, passall=None, ignore_missing_file=False, show_tol_err=False):\n    args = parser.parse_args()\n    if question is None and args.q is not None:\n        question = args.q\n        if "." in question:\n            question, qitem = [int(v) for v in question.split(".")]\n        else:\n            question = int(question)\n\n    if hasattr(report, "computed_answer_file") and not os.path.isfile(report.computed_answers_file) and not ignore_missing_file:\n        raise Exception("> Error: The pre-computed answer file", os.path.abspath(report.computed_answers_file), "does not exist. Check your package installation")\n\n    if unmute is None:\n        unmute = args.unmute\n    if passall is None:\n        passall = args.passall\n\n    results, table_data = evaluate_report(report, question=question, show_progress_bar=not unmute, qitem=qitem, verbose=False, passall=passall, show_expected=args.showexpected, show_computed=args.showcomputed,unmute=unmute,\n                                          show_tol_err=show_tol_err)\n\n\n    if question is None:\n        print("Provisional evaluation")\n        tabulate(table_data)\n        table = table_data\n        print(tabulate(table))\n        print(" ")\n\n    fr = inspect.getouterframes(inspect.currentframe())[1].filename\n    gfile = os.path.basename(fr)[:-3] + "_grade.py"\n    if os.path.exists(gfile):\n        print("Note your results have not yet been registered. \\nTo register your results, please run the file:")\n        print(">>>", gfile)\n        print("In the same manner as you ran this file.")\n\n\n    return results\n\n\ndef upack(q):\n    # h = zip([(i[\'w\'], i[\'possible\'], i[\'obtained\']) for i in q.values()])\n    h =[(i[\'w\'], i[\'possible\'], i[\'obtained\']) for i in q.values()]\n    h = np.asarray(h)\n    return h[:,0], h[:,1], h[:,2],\n\nclass UnitgradeTextRunner(unittest.TextTestRunner):\n    def __init__(self, *args, **kwargs):\n        super().__init__(*args, **kwargs)\n\nclass SequentialTestLoader(unittest.TestLoader):\n    def getTestCaseNames(self, testCaseClass):\n        test_names = super().getTestCaseNames(testCaseClass)\n        # testcase_methods = list(testCaseClass.__dict__.keys())\n        ls = []\n        for C in testCaseClass.mro():\n            if issubclass(C, unittest.TestCase):\n                ls = list(C.__dict__.keys()) + ls\n        testcase_methods = ls\n        test_names.sort(key=testcase_methods.index)\n        return test_names\n\ndef evaluate_report(report, question=None, qitem=None, passall=False, verbose=False,  show_expected=False, show_computed=False,unmute=False, show_help_flag=True, silent=False,\n                    show_progress_bar=True,\n                    show_tol_err=False,\n                    big_header=True):\n\n    now = datetime.now()\n    if big_header:\n        ascii_banner = pyfiglet.figlet_format("UnitGrade", font="doom")\n        b = "\\n".join( [l for l in ascii_banner.splitlines() if len(l.strip()) > 0] )\n    else:\n        b = "Unitgrade"\n    print(b + " v" + __version__)\n    dt_string = now.strftime("%d/%m/%Y %H:%M:%S")\n    print("Started: " + dt_string)\n    s = report.title\n    if hasattr(report, "version") and report.version is not None:\n        s += " version " + report.version\n    print("Evaluating " + s, "(use --help for options)" if show_help_flag else "")\n    # print(f"Loaded answers from: ", report.computed_answers_file, "\\n")\n    table_data = []\n    nL = 80\n    t_start = time.time()\n    score = {}\n    loader = SequentialTestLoader()\n\n    for n, (q, w) in enumerate(report.questions):\n        # q = q()\n        # q_hidden = False\n        # q_hidden = issubclass(q.__class__, Hidden)\n        if question is not None and n+1 != question:\n            continue\n        suite = loader.loadTestsFromTestCase(q)\n        qtitle = q.question_title() if hasattr(q, \'question_title\') else q.__qualname__\n        q_title_print = "Question %i: %s"%(n+1, qtitle)\n        print(q_title_print, end="")\n        q.possible = 0\n        q.obtained = 0\n        q_ = {} # Gather score in this class.\n        # unittest.Te\n        # q_with_outstanding_init = [item.question for item in q.items if not item.question.has_called_init_]\n        UTextResult.q_title_print = q_title_print # Hacky\n        UTextResult.show_progress_bar = show_progress_bar # Hacky.\n        UTextResult.number = n\n\n        res = UTextTestRunner(verbosity=2, resultclass=UTextResult).run(suite)\n\n        possible = res.testsRun\n        obtained = len(res.successes)\n\n        assert len(res.successes) +  len(res.errors) + len(res.failures) == res.testsRun\n\n        # possible = int(ws @ possible)\n        # obtained = int(ws @ obtained)\n        # obtained = int(myround(int((w * obtained) / possible ))) if possible > 0 else 0\n\n        obtained = int(w * obtained * 1.0 / possible ) if possible > 0 else 0\n        score[n] = {\'w\': w, \'possible\': w, \'obtained\': obtained, \'items\': q_, \'title\': qtitle}\n        q.obtained = obtained\n        q.possible = possible\n\n        s1 = f"*** Question q{n+1}"\n        s2 = f" {q.obtained}/{w}"\n        print(s1 + ("."* (nL-len(s1)-len(s2) )) + s2 )\n        print(" ")\n        table_data.append([f"Question q{n+1}", f"{q.obtained}/{w}"])\n\n    ws, possible, obtained = upack(score)\n    possible = int( msum(possible) )\n    obtained = int( msum(obtained) ) # Cast to python int\n    report.possible = possible\n    report.obtained = obtained\n    now = datetime.now()\n    dt_string = now.strftime("%H:%M:%S")\n\n    dt = int(time.time()-t_start)\n    minutes = dt//60\n    seconds = dt - minutes*60\n    plrl = lambda i, s: str(i) + " " + s + ("s" if i != 1 else "")\n\n    print(f"Completed: "+ dt_string + " (" + plrl(minutes, "minute") + ", "+ plrl(seconds, "second") +")")\n\n    table_data.append(["Total", ""+str(report.obtained)+"/"+str(report.possible) ])\n    results = {\'total\': (obtained, possible), \'details\': score}\n    return results, table_data\n\n\n\n\nfrom tabulate import tabulate\nfrom datetime import datetime\nimport inspect\nimport json\nimport os\nimport bz2\nimport pickle\nimport os\n\ndef bzwrite(json_str, token): # to get around obfuscation issues\n    with getattr(bz2, \'open\')(token, "wt") as f:\n        f.write(json_str)\n\ndef gather_imports(imp):\n    resources = {}\n    m = imp\n    # for m in pack_imports:\n    # print(f"*** {m.__name__}")\n    f = m.__file__\n    # dn = os.path.dirname(f)\n    # top_package = os.path.dirname(__import__(m.__name__.split(\'.\')[0]).__file__)\n    # top_package = str(__import__(m.__name__.split(\'.\')[0]).__path__)\n\n    if hasattr(m, \'__file__\') and not hasattr(m, \'__path__\'):  # Importing a simple file: m.__class__.__name__ == \'module\' and False:\n        top_package = os.path.dirname(m.__file__)\n        module_import = True\n    else:\n        top_package = __import__(m.__name__.split(\'.\')[0]).__path__._path[0]\n        module_import = False\n\n    # top_package = os.path.dirname(__import__(m.__name__.split(\'.\')[0]).__file__)\n    # top_package = os.path.dirname(top_package)\n    import zipfile\n    # import strea\n    # zipfile.ZipFile\n    import io\n    # file_like_object = io.BytesIO(my_zip_data)\n    zip_buffer = io.BytesIO()\n    with zipfile.ZipFile(zip_buffer, \'w\') as zip:\n        # zip.write()\n        for root, dirs, files in os.walk(top_package):\n            for file in files:\n                if file.endswith(".py"):\n                    fpath = os.path.join(root, file)\n                    v = os.path.relpath(os.path.join(root, file), os.path.dirname(top_package) if not module_import else top_package)\n                    zip.write(fpath, v)\n\n    resources[\'zipfile\'] = zip_buffer.getvalue()\n    resources[\'top_package\'] = top_package\n    resources[\'module_import\'] = module_import\n    return resources, top_package\n\n    if f.endswith("__init__.py"):\n        for root, dirs, files in os.walk(os.path.dirname(f)):\n            for file in files:\n                if file.endswith(".py"):\n                    # print(file)\n                    # print()\n                    v = os.path.relpath(os.path.join(root, file), top_package)\n                    with open(os.path.join(root, file), \'r\') as ff:\n                        resources[v] = ff.read()\n    else:\n        v = os.path.relpath(f, top_package)\n        with open(f, \'r\') as ff:\n            resources[v] = ff.read()\n    return resources\n\nimport argparse\nparser = argparse.ArgumentParser(description=\'Evaluate your report.\', epilog="""Use this script to get the score of your report. Example:\n\n> python report1_grade.py\n\nFinally, note that if your report is part of a module (package), and the report script requires part of that package, the -m option for python may be useful.\nFor instance, if the report file is in Documents/course_package/report3_complete.py, and `course_package` is a python package, then change directory to \'Documents/` and run:\n\n> python -m course_package.report1\n\nsee https://docs.python.org/3.9/using/cmdline.html\n""", formatter_class=argparse.RawTextHelpFormatter)\nparser.add_argument(\'--noprogress\',  action="store_true",  help=\'Disable progress bars\')\nparser.add_argument(\'--autolab\',  action="store_true",  help=\'Show Autolab results\')\n\ndef gather_upload_to_campusnet(report, output_dir=None):\n    n = report.nL\n    args = parser.parse_args()\n    results, table_data = evaluate_report(report, show_help_flag=False, show_expected=False, show_computed=False, silent=True,\n                                          show_progress_bar=not args.noprogress,\n                                          big_header=not args.autolab)\n    print(" ")\n    print("="*n)\n    print("Final evaluation")\n    print(tabulate(table_data))\n    # also load the source code of missing files...\n\n    sources = {}\n\n    if not args.autolab:\n        if len(report.individual_imports) > 0:\n            print("By uploading the .token file, you verify the files:")\n            for m in report.individual_imports:\n                print(">", m.__file__)\n            print("Are created/modified individually by you in agreement with DTUs exam rules")\n            report.pack_imports += report.individual_imports\n\n        if len(report.pack_imports) > 0:\n            print("Including files in upload...")\n            for k, m in enumerate(report.pack_imports):\n                nimp, top_package = gather_imports(m)\n                _, report_relative_location, module_import = report._import_base_relative()\n\n                # report_relative_location = os.path.relpath(inspect.getfile(report.__class__), top_package)\n                nimp[\'report_relative_location\'] = report_relative_location\n                nimp[\'report_module_specification\'] = module_import\n                nimp[\'name\'] = m.__name__\n                sources[k] = nimp\n                # if len([k for k in nimp if k not in sources]) > 0:\n                print(f"*** {m.__name__}")\n                # sources = {**sources, **nimp}\n    results[\'sources\'] = sources\n\n    if output_dir is None:\n        output_dir = os.getcwd()\n\n    payload_out_base = report.__class__.__name__ + "_handin"\n\n    obtain, possible = results[\'total\']\n    vstring = "_v"+report.version if report.version is not None else ""\n\n    token = "%s_%i_of_%i%s.token"%(payload_out_base, obtain, possible,vstring)\n    token = os.path.join(output_dir, token)\n    with open(token, \'wb\') as f:\n        pickle.dump(results, f)\n\n    if not args.autolab:\n        print(" ")\n        print("To get credit for your results, please upload the single file: ")\n        print(">", token)\n        print("To campusnet without any modifications.")\n\n        # print("Now time for some autolab fun")\n\ndef source_instantiate(name, report1_source, payload):\n    eval("exec")(report1_source, globals())\n    pl = pickle.loads(bytes.fromhex(payload))\n    report = eval(name)(payload=pl, strict=True)\n    # report.set_payload(pl)\n    return report\n\n\n__version__ = "0.9.0"\n\nfrom homework1 import reverse_list, add\nimport unittest\n\nclass Week1(unittest.TestCase):\n    def test_add(self):\n        self.assertEqual(add(2,2), 4)\n        self.assertEqual(add(-100, 5), -95)\n\n    def test_reverse(self):\n        self.assertEqual(reverse_list([1,2,3]), [3,2,1])\n\n\nimport homework1\nclass Report1Flat(Report):\n    title = "CS 101 Report 1"\n    questions = [(Week1, 10)]  # Include a single question for 10 credits.\n    pack_imports = [homework1]'
-report1_payload = '8004953f000000000000007d948c055765656b31947d948c2c6e6f20636163686520736565205f73657475705f616e737765727320696e20756e69746772616465322e7079948873732e'
-name="Report1Flat"
-
-report = source_instantiate(name, report1_source, report1_payload)
-output_dir = os.path.dirname(__file__)
-gather_upload_to_campusnet(report, output_dir)
\ No newline at end of file
diff --git a/examples/example_moss/whitelist/Report2_handin_3_of_18.token b/examples/example_moss/whitelist/Report2_handin_3_of_18.token
new file mode 100644
index 0000000..7d7248b
--- /dev/null
+++ b/examples/example_moss/whitelist/Report2_handin_3_of_18.token
@@ -0,0 +1,249 @@
+# This file contains your results. Do not edit its content. Simply upload it as it is. 
+### Content of cs102\homework1.py ###
+
+def reverse_list(mylist): 
+    """
+    Given a list 'mylist' returns a list consisting of the same elements in reverse order. E.g.
+    reverse_list([1,2,3]) should return [3,2,1] (as a list).
+    """
+    # TODO: 1 lines missing.
+    raise NotImplementedError("Implement function body")
+
+def add(a,b): 
+    """ Given two numbers `a` and `b` this function should simply return their sum:
+    > add(a,b) = a+b """
+    # TODO: 1 lines missing.
+    raise NotImplementedError("Implement function body")
+
+if __name__ == "__main__":
+    # Example usage:
+    print(f"Your result of 2 + 2 = {add(2,2)}")
+    print(f"Reversing a small list", reverse_list([2,3,5,7])) 
+
+
+### Content of cs102\report2.py ###
+
+from unitgrade.framework import Report
+from unitgrade.evaluate import evaluate_report_student
+from cs102.homework1 import add, reverse_list
+from unitgrade import UTestCase, cache  
+
+class Week1(UTestCase):
+    def test_add(self):
+        self.assertEqualC(add(2,2))
+        self.assertEqualC(add(-100, 5))
+
+    def test_reverse(self):
+        self.assertEqualC(reverse_list([1, 2, 3])) 
+
+    def test_output_capture(self):
+        with self.capture() as out:
+            print("hello world 42")                     # Genereate some output (i.e. in a homework script)
+        self.assertEqual(out.numbers[0], 42)            # out.numbers is a list of all numbers generated
+        self.assertEqual(out.output, "hello world 42")  # you can also access the raw output.
+
+class Week1Titles(UTestCase): 
+    """ The same problem as before with nicer titles """
+    def test_add(self):
+        """ Test the addition method add(a,b) """
+        self.assertEqualC(add(2,2))
+        self.assertEqualC(add(-100, 5))
+
+    def test_reverse(self):
+        ls = [1, 2, 3]
+        reverse = reverse_list(ls)
+        self.assertEqualC(reverse)
+        # Although the title is set after the test potentially fails, it will *always* show correctly for the student.
+        self.title = f"Checking if reverse_list({ls}) = {reverse}"  # Programmatically set the title 
+
+    def ex_test_output_capture(self):
+        with self.capture() as out:
+            print("hello world 42")                     # Genereate some output (i.e. in a homework script)
+        self.assertEqual(out.numbers[0], 42)            # out.numbers is a list of all numbers generated
+        self.assertEqual(out.output, "hello world 42")  # you can also access the raw output.
+
+
+class Question2(UTestCase): 
+    @cache
+    def my_reversal(self, ls):
+        # The '@cache' decorator ensures the function is not run on the *students* computer
+        # Instead the code is run on the teachers computer and the result is passed on with the
+        # other pre-computed results -- i.e. this function will run regardless of how the student happens to have
+        # implemented reverse_list.
+        return reverse_list(ls)
+
+    def test_reverse_tricky(self):
+        ls = (2,4,8)
+        ls2 = self.my_reversal(tuple(ls))                   # This will always produce the right result, [8, 4, 2]
+        print("The correct answer is supposed to be", ls2)  # Show students the correct answer
+        self.assertEqualC(reverse_list(ls))                 # This will actually test the students code.
+        return "Buy world!"                                 # This value will be stored in the .token file  
+
+
+import cs102
+class Report2(Report):
+    title = "CS 101 Report 2"
+    questions = [(Week1, 10), (Week1Titles, 8)]
+    pack_imports = [cs102]
+
+if __name__ == "__main__":
+    evaluate_report_student(Report2(), unmute=True)
+---------------------------------------------------------------------- ..ooO0Ooo.. ----------------------------------------------------------------------
+b07038a0b034c106f5b09a9caf41338fec2b87d22a1ec09e7e928ebdd8b369fafc7af5a17147e8169155306549044a9353a5631917c44709182c615ce4659f6c 28048
+---------------------------------------------------------------------- ..ooO0Ooo.. ----------------------------------------------------------------------
+.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.
\ No newline at end of file
diff --git a/examples/example_moss/student_submissions/s1001/Report1Flat_handin_0_of_10_0/homework1.py b/examples/example_moss/whitelist/Report2_handin_3_of_18_0/cs102/homework1.py
similarity index 71%
rename from examples/example_moss/student_submissions/s1001/Report1Flat_handin_0_of_10_0/homework1.py
rename to examples/example_moss/whitelist/Report2_handin_3_of_18_0/cs102/homework1.py
index 3543f1b..c314aab 100644
--- a/examples/example_moss/student_submissions/s1001/Report1Flat_handin_0_of_10_0/homework1.py
+++ b/examples/example_moss/whitelist/Report2_handin_3_of_18_0/cs102/homework1.py
@@ -1,6 +1,3 @@
-"""
-Example student code. This file is automatically generated from the files in the instructor-directory
-"""
 def reverse_list(mylist): 
     """
     Given a list 'mylist' returns a list consisting of the same elements in reverse order. E.g.
@@ -16,6 +13,6 @@ def add(a,b):
     raise NotImplementedError("Implement function body")
 
 if __name__ == "__main__":
-    # Problem 1: Write a function which add two numbers
+    # Example usage:
     print(f"Your result of 2 + 2 = {add(2,2)}")
-    print(f"Reversing a small list", reverse_list([2,3,5,7]))
+    print(f"Reversing a small list", reverse_list([2,3,5,7])) 
diff --git a/examples/example_moss/whitelist/Report2_handin_3_of_18_0/cs102/report2.py b/examples/example_moss/whitelist/Report2_handin_3_of_18_0/cs102/report2.py
new file mode 100644
index 0000000..894b769
--- /dev/null
+++ b/examples/example_moss/whitelist/Report2_handin_3_of_18_0/cs102/report2.py
@@ -0,0 +1,65 @@
+from unitgrade.framework import Report
+from unitgrade.evaluate import evaluate_report_student
+from cs102.homework1 import add, reverse_list
+from unitgrade import UTestCase, cache  
+
+class Week1(UTestCase):
+    def test_add(self):
+        self.assertEqualC(add(2,2))
+        self.assertEqualC(add(-100, 5))
+
+    def test_reverse(self):
+        self.assertEqualC(reverse_list([1, 2, 3])) 
+
+    def test_output_capture(self):
+        with self.capture() as out:
+            print("hello world 42")                     # Genereate some output (i.e. in a homework script)
+        self.assertEqual(out.numbers[0], 42)            # out.numbers is a list of all numbers generated
+        self.assertEqual(out.output, "hello world 42")  # you can also access the raw output.
+
+class Week1Titles(UTestCase): 
+    """ The same problem as before with nicer titles """
+    def test_add(self):
+        """ Test the addition method add(a,b) """
+        self.assertEqualC(add(2,2))
+        self.assertEqualC(add(-100, 5))
+
+    def test_reverse(self):
+        ls = [1, 2, 3]
+        reverse = reverse_list(ls)
+        self.assertEqualC(reverse)
+        # Although the title is set after the test potentially fails, it will *always* show correctly for the student.
+        self.title = f"Checking if reverse_list({ls}) = {reverse}"  # Programmatically set the title 
+
+    def ex_test_output_capture(self):
+        with self.capture() as out:
+            print("hello world 42")                     # Genereate some output (i.e. in a homework script)
+        self.assertEqual(out.numbers[0], 42)            # out.numbers is a list of all numbers generated
+        self.assertEqual(out.output, "hello world 42")  # you can also access the raw output.
+
+
+class Question2(UTestCase): 
+    @cache
+    def my_reversal(self, ls):
+        # The '@cache' decorator ensures the function is not run on the *students* computer
+        # Instead the code is run on the teachers computer and the result is passed on with the
+        # other pre-computed results -- i.e. this function will run regardless of how the student happens to have
+        # implemented reverse_list.
+        return reverse_list(ls)
+
+    def test_reverse_tricky(self):
+        ls = (2,4,8)
+        ls2 = self.my_reversal(tuple(ls))                   # This will always produce the right result, [8, 4, 2]
+        print("The correct answer is supposed to be", ls2)  # Show students the correct answer
+        self.assertEqualC(reverse_list(ls))                 # This will actually test the students code.
+        return "Buy world!"                                 # This value will be stored in the .token file  
+
+
+import cs102
+class Report2(Report):
+    title = "CS 101 Report 2"
+    questions = [(Week1, 10), (Week1Titles, 8)]
+    pack_imports = [cs102]
+
+if __name__ == "__main__":
+    evaluate_report_student(Report2(), unmute=True)
diff --git a/examples/example_moss/whitelist/Report2_handin_3_of_18_0/cs102/report2_grade.py b/examples/example_moss/whitelist/Report2_handin_3_of_18_0/cs102/report2_grade.py
new file mode 100644
index 0000000..13a61a6
--- /dev/null
+++ b/examples/example_moss/whitelist/Report2_handin_3_of_18_0/cs102/report2_grade.py
@@ -0,0 +1,3 @@
+''' WARNING: Modifying, decompiling or otherwise tampering with this script, it's data or the resulting .token file will be investigated as a cheating attempt. '''
+import bz2, base64
+exec(bz2.decompress(base64.b64decode('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')))
\ No newline at end of file
diff --git a/examples/example_moss/whitelist/report1flat.py b/examples/example_moss/whitelist/report1flat.py
deleted file mode 100644
index e80df4b..0000000
--- a/examples/example_moss/whitelist/report1flat.py
+++ /dev/null
@@ -1,27 +0,0 @@
-"""
-Example student code. This file is automatically generated from the files in the instructor-directory
-"""
-from src.unitgrade.framework import Report
-from src.unitgrade import evaluate_report_student
-from homework1 import reverse_list, add
-import unittest
-
-class Week1(unittest.TestCase):
-    def test_add(self):
-        self.assertEqual(add(2,2), 4)
-        self.assertEqual(add(-100, 5), -95)
-
-    def test_reverse(self):
-        self.assertEqual(reverse_list([1,2,3]), [3,2,1])
-
-
-import homework1
-class Report1Flat(Report):
-    title = "CS 101 Report 1"
-    questions = [(Week1, 10)]  # Include a single question for 10 credits.
-    pack_imports = [homework1]
-
-if __name__ == "__main__":
-    # Uncomment to simply run everything as a unittest:
-    # unittest.main(verbosity=2)
-    evaluate_report_student(Report1Flat())
diff --git a/examples/example_moss/whitelist/report1flat2.py b/examples/example_moss/whitelist/report1flat2.py
deleted file mode 100644
index e80df4b..0000000
--- a/examples/example_moss/whitelist/report1flat2.py
+++ /dev/null
@@ -1,27 +0,0 @@
-"""
-Example student code. This file is automatically generated from the files in the instructor-directory
-"""
-from src.unitgrade.framework import Report
-from src.unitgrade import evaluate_report_student
-from homework1 import reverse_list, add
-import unittest
-
-class Week1(unittest.TestCase):
-    def test_add(self):
-        self.assertEqual(add(2,2), 4)
-        self.assertEqual(add(-100, 5), -95)
-
-    def test_reverse(self):
-        self.assertEqual(reverse_list([1,2,3]), [3,2,1])
-
-
-import homework1
-class Report1Flat(Report):
-    title = "CS 101 Report 1"
-    questions = [(Week1, 10)]  # Include a single question for 10 credits.
-    pack_imports = [homework1]
-
-if __name__ == "__main__":
-    # Uncomment to simply run everything as a unittest:
-    # unittest.main(verbosity=2)
-    evaluate_report_student(Report1Flat())
diff --git a/setup.py b/setup.py
index e17f654..8afe26c 100644
--- a/setup.py
+++ b/setup.py
@@ -30,5 +30,5 @@ setuptools.setup(
     packages=setuptools.find_packages(where="src"),
     python_requires=">=3.8",
     install_requires=['numpy', "unitgrade", "codesnipper", 'tabulate', 'tqdm', "pyfiglet",
-                      "colorama", "coverage", 'mosspy', 'pyminifier'],
+                      "colorama", "coverage", 'mosspy', 'pyminifier', 'mosspy'],
 )
diff --git a/src/unitgrade_devel.egg-info/PKG-INFO b/src/unitgrade_devel.egg-info/PKG-INFO
index 0b4565e..b8a0c27 100644
--- a/src/unitgrade_devel.egg-info/PKG-INFO
+++ b/src/unitgrade_devel.egg-info/PKG-INFO
@@ -1,6 +1,6 @@
 Metadata-Version: 2.1
 Name: unitgrade-devel
-Version: 0.1.7
+Version: 0.1.12
 Summary: A set of tools to develop unitgrade tests and reports and later evaluate them
 Home-page: https://lab.compute.dtu.dk/tuhe/unitgrade_private
 Author: Tue Herlau
@@ -33,8 +33,18 @@ Unitgrade is an automatic report and exam evaluation framework that enables inst
  - Automatic Moss anti-plagiarism detection
  - CMU Autolab integration (Experimental)
 
-# Using unitgrade
-The examples can be found in the `/examples/` directory: https://gitlab.compute.dtu.dk/tuhe/unitgrade_private/examples
+### Install
+Simply use `pip`
+```terminal
+pip install unitgrade-devel
+```
+This will install `unitgrade-devel` (this package) and all dependencies to get you started.
+
+### Videos
+For videos see the `/videos` directory : https://gitlab.compute.dtu.dk/tuhe/unitgrade_private/-/tree/master/videos
+
+# Instructions and examples of use
+The examples can be found in the `/examples` directory: https://gitlab.compute.dtu.dk/tuhe/unitgrade_private/-/tree/master/examples
 
 ## A simple example
 Unitgrade makes the following assumptions:
@@ -90,7 +100,6 @@ class Week1(unittest.TestCase):
         self.assertEqual(reverse_list([1,2,3]), [3,2,1]) 
 ```
 A number of tests can be collected into a `Report`, which will allow us to assign points to the tests and use the more advanced features of the framework later. A complete, minimal example:
-
 ```python
 # example_simplest/instructor/cs101/report1.py
 import unittest 
@@ -118,19 +127,12 @@ if __name__ == "__main__":
 ### Deployment
 The above is all you need if you simply want to use the framework as a self-check: Students can run the code and see how well they did. 
 In order to begin using the framework for evaluation we need to create a bit more structure. We do that by deploying the report class as follows:
-
 ```python
 # example_simplest/instructor/cs101/deploy.py
 from cs101.report1 import Report1 
 from unitgrade_private.hidden_create_files import setup_grade_file_report
 from snipper import snip_dir
 
-a = 34 #!i
-print(a)
-a
-z = 23 #!i
-
-
 if __name__ == "__main__":
     setup_grade_file_report(Report1)  # Make the report1_grade.py report file
 
@@ -195,7 +197,7 @@ One of the main advantages of `unitgrade` over web-based autograders it that tes
 
 ```python 
 # example_framework/instructor/cs102/report2.py
-from unitgrade2 import UTestCase 
+from unitgrade import UTestCase 
 
 class Week1(UTestCase):
     def test_add(self):
@@ -234,7 +236,7 @@ When this is run, the titles are shown as follows:
 | | | |_ __  _| |_| |  \/_ __ __ _  __| | ___ 
 | | | | '_ \| | __| | __| '__/ _` |/ _` |/ _ \
 | |_| | | | | | |_| |_\ \ | | (_| | (_| |  __/
- \___/|_| |_|_|\__|\____/_|  \__,_|\__,_|\___| v0.1.0, started: 09/09/2021 19:52:23
+ \___/|_| |_|_|\__|\____/_|  \__,_|\__,_|\___| v0.1.5, started: 16/09/2021 17:42:18
 
 CS 101 Report 2 (use --help for options)
 Question 1: Week1                                                                                                       
@@ -248,7 +250,7 @@ Question 2: The same problem as before with nicer titles
  * q2.2) Checking if reverse_list([1, 2, 3]) = [3, 2, 1]............................................................PASS
  * q2)   Total...................................................................................................... 8/8
  
-Total points at 19:52:23 (0 minutes, 0 seconds)....................................................................18/18
+Total points at 17:42:18 (0 minutes, 0 seconds)....................................................................18/18
 
 ```
 What happens behind the scenes when we set `self.title` is that the result is pre-computed on the instructors machine and cached. This means the last test will display the correct result regardless of how `reverse_list` has been implemented by the student. The titles are also shown correctly when the method is run as a unittest. 
@@ -289,10 +291,12 @@ Let's start with the hidden tests. As usual we write a complete report script (`
 
 ```python
 # example_docker/instructor/cs103/report3_complete.py
-from unitgrade import UTestCase, Report, hide 
+from unitgrade import UTestCase, Report
+from unitgrade.utils import hide
 from unitgrade import evaluate_report_student
 import cs103
 
+
 class AutomaticPass(UTestCase):
     def test_automatic_pass(self):
         self.assertEqual(2, 2)  # For simplicity, this test will always pass
@@ -301,6 +305,7 @@ class AutomaticPass(UTestCase):
     def test_hidden_fail(self):
         self.assertEqual(2, 3)  # For simplicity, this test will always fail.
 
+
 class Report3(Report):
     title = "CS 101 Report 3"
     questions = [(AutomaticPass, 10)]  # Include a single question for 10 credits.
@@ -325,10 +330,12 @@ Just to check, let's have a quick look at the students report script `report3.py
 
 ```python
 # example_docker/instructor/cs103/report3.py
-from unitgrade import UTestCase, Report, hide 
+from unitgrade import UTestCase, Report
+from unitgrade.utils import hide
 from unitgrade import evaluate_report_student
 import cs103
 
+
 class AutomaticPass(UTestCase):
     def test_automatic_pass(self):
         self.assertEqual(2, 2)  # For simplicity, this test will always pass
@@ -410,7 +417,7 @@ The files in the whitelist/student directory can be either `.token` files (which
 When done just call moss as follows:
 ```python 
 # example_moss/moss_example.py
-from unitgrade_private2.plagiarism.mossit import moss_it, get_id 
+from unitgrade_private.plagiarism.mossit import moss_it, get_id 
 
 if __name__ == "__main__":
     # Extract the moss id ("12415...") from the perl script and test:
@@ -456,12 +463,12 @@ class Week1(UTestCase):
         Hints:
             * Insert a breakpoint and check what your function find_primes(4) actually outputs
         """
-        self.assertEqual(find_primes(4), [2,3])
+        self.assertEqual(find_primes(4), [2, 3], msg="The list should only contain primes <= 4")
 
 class Report1Hints(Report):
     title = "CS 106 Report 1"
     questions = [(Week1, 10)]
-    pack_imports = [homework1]  
+    pack_imports = [homework_hints]  
 ```
 
 When students run this homework it will fail and display the hints from the two methods:
@@ -474,9 +481,9 @@ collected and displayed. This feature requires no external configuration; simply
 # Citing
 ```bibtex
 @online{unitgrade_devel,
-	title={Unitgrade-devel (0.1.2): \texttt{pip install unitgrade-devel}},
+	title={Unitgrade-devel (0.1.7): \texttt{pip install unitgrade-devel}},
 	url={https://lab.compute.dtu.dk/tuhe/unitgrade_private},
-	urldate = {2021-09-09}, 
+	urldate = {2021-09-16}, 
 	month={9},
 	publisher={Technical University of Denmark (DTU)},
 	author={Tue Herlau},
diff --git a/src/unitgrade_devel.egg-info/requires.txt b/src/unitgrade_devel.egg-info/requires.txt
index f59ec67..d067d6e 100644
--- a/src/unitgrade_devel.egg-info/requires.txt
+++ b/src/unitgrade_devel.egg-info/requires.txt
@@ -7,3 +7,5 @@ pyfiglet
 colorama
 coverage
 mosspy
+pyminifier
+mosspy
diff --git a/src/unitgrade_private/__init__.py b/src/unitgrade_private/__init__.py
index 01bac36..812077f 100644
--- a/src/unitgrade_private/__init__.py
+++ b/src/unitgrade_private/__init__.py
@@ -1,12 +1,11 @@
-
 import os
 import compress_pickle
 from unitgrade_private.hidden_gather_upload import load_token, save_token
 from unitgrade_private.plagiarism.mossit import unpack_sources_from_token
-
-# __version__ = "0.0.1"
+from unitgrade_private.hidden_create_files import setup_grade_file_report
 
 def cache_write(object, file_name, verbose=True):
+    assert False
     dn = os.path.dirname(file_name)
     if not os.path.exists(dn):
         os.mkdir(dn)
@@ -17,16 +16,15 @@ def cache_write(object, file_name, verbose=True):
 
 
 def cache_exists(file_name):
-    # file_name = cn_(file_name) if cache_prefix else file_name
+    assert False
     return os.path.exists(file_name)
 
 
 def cache_read(file_name):
-    # file_name = cn_(file_name) if cache_prefix else file_name
+    assert False
     if os.path.exists(file_name):
         with open(file_name, 'rb') as f:
             return compress_pickle.load(f, compression="lzma")
-            # return pickle.load(f)
     else:
         return None
 
diff --git a/src/unitgrade_private/deployment.py b/src/unitgrade_private/deployment.py
index 775fe84..65a618a 100644
--- a/src/unitgrade_private/deployment.py
+++ b/src/unitgrade_private/deployment.py
@@ -1,8 +1,9 @@
 import inspect
-from unitgrade.framework import methodsWithDecorator, hide
+from unitgrade.utils import hide, methodsWithDecorator
 import os
 import importlib
 
+
 def remove_hidden_methods(ReportClass, outfile=None):
     # Given a ReportClass, clean out all @hidden tests from the imports of that class.
     file = ReportClass()._file()
@@ -12,7 +13,6 @@ def remove_hidden_methods(ReportClass, outfile=None):
     lines_to_rem = []
 
     for Q,_ in ReportClass.questions:
-        print(Q)
         ls = list(methodsWithDecorator(Q, hide))
         print("hide decorateed is", ls)
         for f in ls:
@@ -31,13 +31,11 @@ def remove_hidden_methods(ReportClass, outfile=None):
     with open(outfile, 'w') as f:
         f.write(source)
 
-    mname = ReportClass.__module__
-    mname.find(".")
-    mname = mname[:mname.rfind(".")] + "." + os.path.basename(outfile)[:-3]
+    module_name = ReportClass.__module__
+    module_name.find(".")
+    module_name = module_name[:module_name.rfind(".")] + "." + os.path.basename(outfile)[:-3]
 
-    module = importlib.import_module(mname)
+    module = importlib.import_module(module_name)
 
     HiddenReportClass = getattr(module, ReportClass.__name__)
     return outfile, HiddenReportClass
-
-
diff --git a/src/unitgrade_private/docker_helpers.py b/src/unitgrade_private/docker_helpers.py
index 81bbd12..e7b533d 100644
--- a/src/unitgrade_private/docker_helpers.py
+++ b/src/unitgrade_private/docker_helpers.py
@@ -71,7 +71,7 @@ def student_token_file_runner(host_tmp_dir, student_token_file, instructor_grade
     return pycom, token_location
 
 
-def docker_run_token_file(Dockerfile_location, host_tmp_dir, student_token_file, instructor_grade_script=None):
+def docker_run_token_file(Dockerfile_location, host_tmp_dir, student_token_file, tag=None, instructor_grade_script=None, fix_user=True):
     """
     This thingy works:
 
@@ -87,8 +87,11 @@ def docker_run_token_file(Dockerfile_location, host_tmp_dir, student_token_file,
     assert os.path.exists(Dockerfile_location)
     start = time.time()
 
-    with open(student_token_file, 'rb') as f:
-        results = pickle.load(f)
+    # with open(student_token_file, 'rb') as f:
+    #     results = pickle.load(f)
+    from unitgrade_private import load_token
+    results, _ = load_token(student_token_file)
+
     sources = results['sources'][0]
 
     if os.path.exists(host_tmp_dir):
@@ -107,22 +110,29 @@ def docker_run_token_file(Dockerfile_location, host_tmp_dir, student_token_file,
     """
     docker run -v c:/Users/tuhe/Documents/2021/python-docker/tmp:/home python-docker python3 -m cs202courseware.ug2report1_grade
     """
-    dockname = os.path.basename( os.path.dirname(Dockerfile_location) )
+    if tag is None:
+        dockname = os.path.basename( os.path.dirname(Dockerfile_location) )
+    else:
+        dockname = tag
 
     tmp_grade_file =  sources['name'] + "/" + sources['report_relative_location']
 
     pycom = ".".join( sources['report_module_specification'][:-1] + [os.path.basename(gscript)[:-3],] )
     pycom = "python3 -m " + pycom
 
+    if fix_user:
+        user_cmd = ' --user "$(id -u):$(id -g)" '
+    else:
+        user_cmd = ''
     tmp_path = os.path.abspath(host_tmp_dir).replace("\\", "/")
-    dcom = f"docker run -v {tmp_path}:/home {dockname} {pycom}"
+    dcom = f"docker run {user_cmd} -v {tmp_path}:/home {dockname} {pycom}"
     cdcom = f"cd {os.path.dirname(Dockerfile_location)}"
     fcom = f"{cdcom}  && {dcom}"
     print("> Running docker command")
     print(fcom)
     init = time.time() - start
     # thtools.execute_command(fcom.split())
-    subprocess.check_output(fcom.split(), shell=True).decode("utf-8")
+    subprocess.check_output(fcom, shell=True).decode("utf-8")
     host_tmp_dir +"/" + os.path.dirname(tmp_grade_file) + "/"
     tokens = glob.glob( os.path.dirname(instructor_grade_script) + "/*.token" )
     for t in tokens:
diff --git a/src/unitgrade_private/hidden_create_files.py b/src/unitgrade_private/hidden_create_files.py
index 18eb717..b4eede4 100644
--- a/src/unitgrade_private/hidden_create_files.py
+++ b/src/unitgrade_private/hidden_create_files.py
@@ -19,40 +19,6 @@ output_dir = os.path.dirname(__file__)
 gather_upload_to_campusnet(report, output_dir)
 """
 
-def setup_answers(report):
-    """
-    Obtain student answers by executing the test in the report and then same them to the disk.
-    """
-    assert False
-    payloads = {}
-    import tabulate
-
-    from collections import defaultdict
-    rs = defaultdict(lambda: [])
-    for q, _ in report.questions:
-        # for q, _ in report.questions:
-        q()._save_cache()
-
-        q.name = q.__class__
-        payloads[q.name] = {}
-        print("> Setting up question", q)
-        # start = time.time()
-        # q.init_all_item_questions() # Initialize all this questions items questions (i.e. make sure the items can run).
-        # payloads[q.name]['time'] = time.time()-start
-        # for item in q.items:
-        #     print("    Setting up item", item)
-        #     start = time.time()
-        #     item._precomputed_payload = item.precompute_payload()
-        #     answer = item.compute_answer(unmute=True)
-        #
-        #     rs['Name'].append(str(item))
-        #     rs['Answer'].append( sys.getsizeof(pickle.dumps(answer)) )
-        #     rs['Precomputed'].append( sys.getsizeof( pickle.dumps(item._precomputed_payload)))
-        #     payloads[q.name][item.name] = {'payload': answer, 'precomputed': item._precomputed_payload, 'time': time.time() - start, 'title': item.title}
-
-    print(tabulate.tabulate(rs, headers="keys"))
-    # cache_write(payloads, report.computed_answers_file, verbose=False)
-
 
 def strip_main(report1_source):
     dx = report1_source.find("__main__")
@@ -61,6 +27,18 @@ def strip_main(report1_source):
     return report1_source
 
 
+def rmimports(s, excl):
+    s = "\n".join([l for l in s.splitlines() if not any([l.strip().startswith(e) for e in excl])])
+    return s
+
+def lload(flist, excl):
+    s = ""
+    for fname in flist:
+        with open(fname, 'r', encoding="utf-8") as f:
+            s += f.read() + "\n" + "\n"
+    s = rmimports(s, excl)  # remove import statements from helper class.
+    return s
+
 def setup_grade_file_report(ReportClass, execute=False, obfuscate=False, minify=False, bzip=True, nonlatin=False, source_process_fun=None, with_coverage=True):
     print("Setting up answers...")
     report = ReportClass()
@@ -94,24 +72,15 @@ def setup_grade_file_report(ReportClass, execute=False, obfuscate=False, minify=
             "from unitgrade ",
             "import unitgrade"]
 
-    def rmimports(s, excl):
-        s = "\n".join([l for l in s.splitlines() if not any([l.strip().startswith(e) for e in excl])])
-        return s
-
-    def lload(flist, excl):
-        s = ""
-        for fname in flist:
-            with open(fname, 'r', encoding="utf-8") as f:
-                s += f.read() + "\n" + "\n"
-        s = rmimports(s, excl)  # remove import statements from helper class.
-        return s
     report1_source = rmimports(report1_source, excl)
 
     pyhead = lload([evaluate.__file__, hidden_gather_upload.__file__], excl)
     from unitgrade import version
     from unitgrade import utils
     print(unitgrade.__file__)
-    report1_source = lload([unitgrade.__file__, unitgrade.framework.__file__, utils.__file__, unitgrade.evaluate.__file__, hidden_gather_upload.__file__, version.__file__], excl) + "\n" + report1_source
+    report1_source = lload([unitgrade.__file__, unitgrade.framework.__file__, utils.__file__,
+                            unitgrade.evaluate.__file__, hidden_gather_upload.__file__,
+                            version.__file__], excl) + "\n" + report1_source
 
     print(sys.getsizeof(picklestring))
     print(len(picklestring))
@@ -141,7 +110,7 @@ def setup_grade_file_report(ReportClass, execute=False, obfuscate=False, minify=
         time.sleep(0.2)
         with open(output, 'r') as f:
             sauce = f.read().splitlines()
-        wa = """WARNING: Modifying, decompiling or otherwise tampering with this script, it's data or the resulting .token file will be investigated as a cheating attempt."""
+        wa = """ WARNING: Modifying, decompiling or otherwise tampering with this script, it's data or the resulting .token file will be investigated as a cheating attempt. """
         sauce = ["'''" + wa + "'''"] + sauce[:-1]
         sauce = "\n".join(sauce)
         with open(output, 'w') as f:
diff --git a/src/unitgrade_private/hidden_gather_upload.py b/src/unitgrade_private/hidden_gather_upload.py
index 8ed0b4d..835227a 100644
--- a/src/unitgrade_private/hidden_gather_upload.py
+++ b/src/unitgrade_private/hidden_gather_upload.py
@@ -1,4 +1,4 @@
-from unitgrade.evaluate import evaluate_report, python_code_str_id, file_id
+from unitgrade.evaluate import evaluate_report, python_code_str_id
 import lzma
 import base64
 import textwrap
@@ -14,6 +14,7 @@ def bzwrite(json_str, token): # to get around obfuscation issues
     with getattr(bz2, 'open')(token, "wt") as f:
         f.write(json_str)
 
+
 def gather_imports(imp):
     resources = {}
     m = imp
@@ -85,10 +86,9 @@ def gather_report_source_include(report):
             nimp['report_module_specification'] = module_import
             nimp['name'] = m.__name__
             sources[k] = nimp
-            # if len([k for k in nimp if k not in sources]) > 0:
             print(f" * {m.__name__}")
     return sources
-                # sources = {**sources, **nimp}
+
 
 def gather_upload_to_campusnet(report, output_dir=None):
     # n = report.nL
@@ -170,22 +170,16 @@ def save_token(dictionary, plain_text, file_out):
     if len(plain_text) == 0:
         plain_text = "Start token file"
     plain_text = plain_text.strip()
-
-    # hexed = lzma.compress(pickle.dumps(dictionary))
-    # b_hash = hashlib.blake2b(b).hexdigest()
-
     b, b_hash = dict2picklestring(dictionary)
     b_l1 = len(b)
-    # b_l1 = len(hexed)
-    # b = base64.b64encode(hexed).decode("utf-8")
-    # b_l2 = len(b)
     b = "."+b+"."
-    b = "\n".join( textwrap.wrap(b, 180) )
+    b = "\n".join( textwrap.wrap(b, 180))
 
     out = [plain_text, token_sep, f"{b_hash} {b_l1}", token_sep, b]
     with open(file_out, 'w') as f:
         f.write("\n".join(out))
 
+
 def load_token(file_in):
     with open(file_in, 'r') as f:
         s = f.read()
@@ -197,20 +191,16 @@ def load_token(file_in):
     hash, l1 = info.split(" ")
     data = "".join( data.strip()[1:-1].splitlines() )
     l1 = int(l1)
-    # l2 = int(l2)
 
     dictionary, b_hash = picklestring2dict(data)
 
-    # b = base64.b64decode(data)
-    # dictionary = pickle.loads(lzma.decompress(b))
-    # assert len(data) == l2
     assert len(data) == l1
     assert b_hash == hash.strip()
     return dictionary, plain_text
 
+
 def source_instantiate(name, report1_source, payload):
     eval("exec")(report1_source, globals())
     pl = pickle.loads(bytes.fromhex(payload))
     report = eval(name)(payload=pl, strict=True)
-    # report.set_payload(pl)
     return report
diff --git a/src/unitgrade_private/plagiarism/mossit.py b/src/unitgrade_private/plagiarism/mossit.py
index 2682496..17845d6 100644
--- a/src/unitgrade_private/plagiarism/mossit.py
+++ b/src/unitgrade_private/plagiarism/mossit.py
@@ -19,6 +19,7 @@ def moss_prepare(whitelist_dir, submission_dir):
     white_hashes = set()
     for k, py in enumerate(pys):
         id = file_id(py)
+        print("> Whitelisting", py)
         if id not in white_hashes:
             white_hashes.add(id)
             shutil.copy(py, tmp_base + f"/{k}_" + os.path.basename(py))
@@ -40,19 +41,18 @@ def moss_prepare(whitelist_dir, submission_dir):
     return tmp_base, tmp_submission_dir
 
 
-def ensure_tokens_unpacked(dir, flat=True):
-    tokens = glob.glob(dir +"/*/*.token", recursive=True)
+def ensure_tokens_unpacked(directory, flat=True):
+    tokens = glob.glob(directory + "/**/*.token", recursive=True)
     for t in tokens:
         unpack_sources_from_token(t)
 
 
 def get_id(moss_pl):
     with open(moss_pl, "r") as f:
-        pl = [l for l in f.read().splitlines() if "$userid=" in l].pop()
+        pl = [line for line in f.read().splitlines() if "$userid=" in line].pop()
     return pl.split("=")[1][:-1]
 
 
-
 def moss_it(whitelist_dir="", submissions_dir="", moss_id=None):
     whitelist_dir = os.path.abspath(whitelist_dir)
     ensure_tokens_unpacked(whitelist_dir)
@@ -72,7 +72,7 @@ def moss_it(whitelist_dir="", submissions_dir="", moss_id=None):
     if not os.path.isdir(report_dir):
         os.mkdir(report_dir)
 
-    r = report_dir +"/report.html"
+    r = report_dir + "/report.html"
     m.saveWebPage(url, r)
     print("Saved report to:", r)
-    mosspy.download_report(url, report_dir, connections=8, log_level=10, on_read=lambda url: print('*', end='', flush=True))
+    mosspy.download_report(url, report_dir, connections=8, log_level=10, on_read=lambda u: print('*', end='', flush=True))
diff --git a/src/unitgrade_private/token_loader.py b/src/unitgrade_private/token_loader.py
index b4c1923..65ee0a9 100644
--- a/src/unitgrade_private/token_loader.py
+++ b/src/unitgrade_private/token_loader.py
@@ -1,41 +1,18 @@
-import glob
 import os
-import pickle
-import bz2
 import zipfile
 import io
 
+
 def unpack_sources_from_token(token_file, destination=None):
-    # with open(token_file, 'rb') as f:
-    #     rs = pickle.load(f)
     from unitgrade_private import load_token
 
     rs, _ = load_token(token_file)
     if destination is None:
-        destination = os.path.dirname(token_file )
+        destination = os.path.dirname(token_file)
     destination = os.path.normpath(destination)
 
     for k, data in rs['sources'].items():
-
-        out = destination +"/" + os.path.basename(token_file)[:-6] + f"_{k}/"
-
+        out = destination + "/" + os.path.basename(token_file)[:-6] + f"_{k}/"
         if not os.path.exists(out):
-            zip = zipfile.ZipFile(io.BytesIO(data['zipfile']))
-            zip.extractall(out)
-
-
-if __name__ == "__main__":
-    import irlc
-    import irlc.assignments.assignment_fruit as fa
-    fa.__file__
-
-
-    dn = os.path.dirname(fa.__file__ )
-
-    l = glob.glob(dn+"/*fruit*.token")
-    token_file = l[0]
-    print(token_file)
-
-    rs = unpack_sources_from_token(token_file)
-
-    a = 3455
\ No newline at end of file
+            zf = zipfile.ZipFile(io.BytesIO(data['zipfile']))
+            zf.extractall(out)
diff --git a/src/unitgrade_private/version.py b/src/unitgrade_private/version.py
index 003dbe0..edd90a9 100644
--- a/src/unitgrade_private/version.py
+++ b/src/unitgrade_private/version.py
@@ -1 +1 @@
-version = "0.1.7"
\ No newline at end of file
+version = "0.1.12"
-- 
GitLab