From 39491d244c744d8da50f955f2f80645f7b28cfe5 Mon Sep 17 00:00:00 2001 From: "lucawolfcs@hotmail.com" <39681420+LucasWolfgang@users.noreply.github.com> Date: Sat, 7 Oct 2023 01:20:36 -0300 Subject: [PATCH] Implementing new QQuestion: aiken Installed mypy and ended up refactoring random files --- pyproject.toml | 2 +- qas_editor/__init__.py | 2 +- qas_editor/answer.py | 82 +- qas_editor/category.py | 12 +- qas_editor/gui/popup.py | 4 +- qas_editor/gui/widget.py | 3 +- qas_editor/parsers/aiken.py | 26 +- qas_editor/parsers/gift.py | 3 +- qas_editor/parsers/ims/canvas.py | 6 +- qas_editor/parsers/json.py | 381 --- qas_editor/parsers/latex.py | 4 +- qas_editor/parsers/markdown.py | 2 +- qas_editor/parsers/moodle.py | 8 +- qas_editor/parsers/text.py | 277 +++ qas_editor/processors.py | 29 + qas_editor/question.py | 59 +- qas_editor/utils.py | 345 +-- test/datasets/json/all.json | 2520 -------------------- test/datasets/json/qcalculated.json | 129 - test/datasets/json/qcalculatedmc.json | 129 - test/datasets/json/qdadimage.json | 114 - test/datasets/json/qdadmarker.json | 132 - test/datasets/json/qdadtext.json | 81 - test/datasets/json/qembedded.json | 150 -- test/datasets/json/qessay.json | 42 - test/datasets/json/qmatching.json | 83 - test/datasets/json/qmissingword.json | 94 - test/datasets/json/qmultichoice.json | 127 - test/datasets/json/qnumerical.json | 72 - test/datasets/json/qshortanswer.json | 66 - test/datasets/json/qtruefalse.json | 49 - test/datasets/olx/library.tar.xz | Bin 0 -> 1888 bytes test/datasets/olx/test-problem-bank.tar.xz | Bin 1900 -> 0 bytes test/test_parser/test_aiken.py | 11 +- test/test_parser/test_latex.py | 2 +- test/test_parser/test_moodle.py | 2 +- test/test_parser/test_olx.py | 8 +- test/test_parser/test_qti.py | 14 +- 38 files changed, 470 insertions(+), 4600 deletions(-) delete mode 100644 qas_editor/parsers/json.py create mode 100644 qas_editor/parsers/text.py create mode 100644 qas_editor/processors.py delete mode 100644 test/datasets/json/all.json delete mode 100644 test/datasets/json/qcalculated.json delete mode 100644 test/datasets/json/qcalculatedmc.json delete mode 100644 test/datasets/json/qdadimage.json delete mode 100644 test/datasets/json/qdadmarker.json delete mode 100644 test/datasets/json/qdadtext.json delete mode 100644 test/datasets/json/qembedded.json delete mode 100644 test/datasets/json/qessay.json delete mode 100644 test/datasets/json/qmatching.json delete mode 100644 test/datasets/json/qmissingword.json delete mode 100644 test/datasets/json/qmultichoice.json delete mode 100644 test/datasets/json/qnumerical.json delete mode 100644 test/datasets/json/qshortanswer.json delete mode 100644 test/datasets/json/qtruefalse.json create mode 100644 test/datasets/olx/library.tar.xz delete mode 100644 test/datasets/olx/test-problem-bank.tar.xz diff --git a/pyproject.toml b/pyproject.toml index 8c4a13e..61d4539 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -4,7 +4,7 @@ build-backend = "poetry.core.masonry.api" [tool.poetry] name = "QAS Editor" -version = "0.0.6" +version = "0.0.7" description = "Question and Answer Sheet editor" authors = [ "Lucas Wolfgang " diff --git a/qas_editor/__init__.py b/qas_editor/__init__.py index d5c2022..b520b80 100644 --- a/qas_editor/__init__.py +++ b/qas_editor/__init__.py @@ -20,7 +20,7 @@ __author__ = "Lucas Wolfgang" -__version__ = "0.0.6" +__version__ = "0.0.7" __doc__= """Question and Answer Sheet Editor is a desktop-focused python API\ and a UI\nutility to automate/help with tasks related to the creation, deletion\ diff --git a/qas_editor/answer.py b/qas_editor/answer.py index 42235e2..026bacb 100644 --- a/qas_editor/answer.py +++ b/qas_editor/answer.py @@ -21,7 +21,8 @@ from typing import TYPE_CHECKING, Dict, List, Callable from .enums import TolFormat, TextFormat, ShapeType, EmbeddedFormat, Direction,\ TolType -from .utils import Serializable, File, FText, TList, attribute_setup +from .parsers.text import FText +from .utils import Serializable, File, TList _LOG = logging.getLogger(__name__) @@ -29,51 +30,75 @@ class Item: """This is an abstract class Question used as a parent for specific types of Questions. """ - ANS_TYPE = None - def __init__(self, feedbacks: Dict[str, FText] = None, - hints: Dict[str, FText] = None): + def __init__(self, feedbacks: List[FText] = None, + hints: List[FText] = None): """[summary] Args: - name (str): name of the question - question (FText): text of the question - default_grade (float): the default mark - general_feedback (str, optional): general feedback. - dbid (int, optional): id number. + feedback (str, optional): general feedback. + hints (Dict[str, FText], optional): hints. """ - self._grading = None + self._proc = None self._feedbacks = feedbacks self._hints = hints - self._options = None - grading = attribute_setup(float, "_grading") - feedbacks = attribute_setup(dict, "_feedbacks") - hints = attribute_setup(dict, "_free_hints") - options = attribute_setup(TList, "_options") + @property + def feedbacks(self) -> List[FText]: + return self._feedbacks + + @property + def hints(self) -> List[FText]: + return self._hints + + @property + def processor(self) -> str: + """Function that does the processing part (define grades, when hints + will be shown, etc). Stored in text format. + """ + return self._proc + + @processor.setter + def processor(self, value): + if isinstance(value, str): + exec(value) # Ignore the result. What we want is no Exception here + self._value = value + + def check(self): + return True class ChoicesItem(Item): + """This is the basic class used to hold possible answers """ - This is the basic class used to hold possible answers - """ + MARKER_INT = 9635 def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) - self._options = TList(Choice) + self._options = TList[Choice]() + @property + def options(self) -> TList[Choice]: + """_summary_ + Returns: + TList[Choice]: _description_ + """ + return self._options -class Choice(Item): - """ - This is the basic class used to hold possible answers - """ + def check(self): + return True - def __init__(self, fraction=0.0, text="", feedback: FText = None, - formatting: TextFormat = None): - self.fraction = fraction - options = attribute_setup(dict, "_options") +class Choice: + """This is the basic class used to hold possible answers + Attributes: + """ + def __init__(self, text, parser: Callable = None): + self._text = FText() + self._text.parse(text, parser) + self.fixed = False + self.show = False class Answer(Serializable): @@ -87,9 +112,8 @@ def __init__(self, fraction=0.0, text="", feedback: FText = None, self.formatting = TextFormat.AUTO if formatting is None else formatting self.text = text self._feedback = FText() - self.feedback = feedback + self._feedback.parse(feedback) - feedback = FText.prop("_feedback") class ANumerical(Answer): @@ -126,7 +150,7 @@ def __init__(self, grade: int, cformat: EmbeddedFormat, opts: List[Answer] = None): self.cformat = cformat self.grade = grade - self.opts = TList(Answer, opts) + self.opts = TList[Answer](opts) def to_cloze(self) -> str: """A diff --git a/qas_editor/category.py b/qas_editor/category.py index a3efc4d..d3df14f 100644 --- a/qas_editor/category.py +++ b/qas_editor/category.py @@ -21,10 +21,10 @@ import csv from typing import TYPE_CHECKING, Dict, List, Iterator -from .utils import Serializable, File, FText -from .question import _Question +from .utils import Serializable, File +from .question import QQuestion, _Question from .enums import Status -from .parsers import aiken, csv_card, cloze, gift, json, kahoot, latex, \ +from .parsers import aiken, csv_card, cloze, gift, kahoot, latex, \ markdown, moodle, olx, ims if TYPE_CHECKING: from .utils import Dataset @@ -54,7 +54,6 @@ class Category(Serializable): # pylint: disable=R0904 read_cloze = classmethod(cloze.read_cloze) read_csvcard = classmethod(csv_card.read_cards) read_gift = classmethod(gift.read_gift) - read_json = classmethod(json.read_json) read_kahoot = classmethod(kahoot.read_kahoot) read_latex = classmethod(latex.read_latex) read_markdown = classmethod(markdown.read_markdown) @@ -67,7 +66,6 @@ class Category(Serializable): # pylint: disable=R0904 write_cloze = cloze.write_cloze write_csvcard = csv_card.write_cards write_gift = gift.write_gift - write_json = json.write_json write_kahoot = kahoot.write_kahoot write_latex = latex.write_latex write_markdown = markdown.write_markdown @@ -161,7 +159,7 @@ def add_question(self, question) -> bool: Returns: bool: _description_ """ - if question in self.__questions or not isinstance(question, _Question): + if question in self.__questions or not isinstance(question, QQuestion): return False if question.parent is not None: question.parent.pop_question(question) @@ -268,7 +266,7 @@ def get_tags(self, tags: dict): for cat in self.__categories.values(): cat.get_tags(tags) - def get_question(self, index: int) -> _Question: + def get_question(self, index: int) -> QQuestion: """A helper to get an given index. Using questions would not work becuase it returns an iterator, which requires to be cast to list before accessing. diff --git a/qas_editor/gui/popup.py b/qas_editor/gui/popup.py index ead5b20..044c980 100644 --- a/qas_editor/gui/popup.py +++ b/qas_editor/gui/popup.py @@ -16,7 +16,7 @@ along with this program. If not, see . """ from __future__ import annotations -from typing import TYPE_CHECKING, Callable +from typing import TYPE_CHECKING from PyQt5 import QtWidgets, Qt, QtGui, QtCore from .utils import action_handler, HOTKEYS, key_name from ..enums import Distribution, Status @@ -148,7 +148,7 @@ def __init__(self, parent, top: Category, gtags: dict): _content.addWidget(self._title, 0, 1) self._by_tags = QtWidgets.QCheckBox("By tags", self) _content.addWidget(self._by_tags, 1, 0) - self._tags = TList(str) + self._tags = TList[str]() _tagbar = QtWidgets.GTagBar(self) _tagbar.from_list(self._tags) _tagbar.set_gtags(gtags) diff --git a/qas_editor/gui/widget.py b/qas_editor/gui/widget.py index 475f380..81caa5b 100644 --- a/qas_editor/gui/widget.py +++ b/qas_editor/gui/widget.py @@ -32,7 +32,8 @@ from ..answer import Answer, ACalculated, DragGroup, EmbeddedItem, DropZone,\ SelectOption from ..enums import EmbeddedFormat, TextFormat, TolType, TolFormat, EnhancedEnum -from ..utils import FText, Hint +from ..utils import Hint +from ..parsers.text import FText if TYPE_CHECKING: from PyQt5.QtGui import QKeyEvent diff --git a/qas_editor/parsers/aiken.py b/qas_editor/parsers/aiken.py index 800b811..f5a4ce8 100644 --- a/qas_editor/parsers/aiken.py +++ b/qas_editor/parsers/aiken.py @@ -20,10 +20,9 @@ import logging import glob from typing import TYPE_CHECKING, Type -from ..question import QMultichoice -from ..utils import FText -from ..enums import TextFormat -from ..answer import Answer +from qas_editor.question import QMultichoice, QQuestion +from qas_editor.processors import PROCESSORS +from qas_editor.answer import Choice, ChoicesItem if TYPE_CHECKING: from ..category import Category @@ -32,23 +31,27 @@ def _from_question(buffer, line: str, name: str): + question = QQuestion(name) + simple_choice = ChoicesItem() header = line - answers = [] match = None for _line in buffer: match = _PATTERN.match(_line) if match: - answers.append(Answer(0.0, match[1], None, TextFormat.PLAIN)) + simple_choice.options.append(Choice(match[1])) break header += _line + target = 0 for _line in buffer: match = _PATTERN.match(_line) if not match: - answers[ord(_line[8].upper())-65].fraction = 100.0 + target = ord(_line[8].upper())-65 break - answers.append(Answer(0.0, match[1], None, TextFormat.PLAIN)) - question = FText([header.strip()]).from_string - return QMultichoice(name=name, options=answers, question=question) + simple_choice.options.append(Choice(match[1])) + question.body.text.append(header.strip()) + question.body.text.append(simple_choice) + simple_choice.processor = PROCESSORS["multichoice"].format(index=target) + return question # ----------------------------------------------------------------------------- @@ -82,7 +85,7 @@ def write_aiken(category: Type[Category], file_path: str) -> None: Args: file_path (str): _description_ """ - def _to_aiken(cat: "Category", writer) -> str: + def _to_aiken(cat: Type[Category], writer) -> str: for question in cat.questions: if isinstance(question, QMultichoice): writer(f"{question.question.get()}\n") @@ -94,5 +97,6 @@ def _to_aiken(cat: "Category", writer) -> str: writer(correct) for name in cat: _to_aiken(cat[name], writer) + return None with open(file_path, "w", encoding="utf-8") as ofile: _to_aiken(category, ofile.write) diff --git a/qas_editor/parsers/gift.py b/qas_editor/parsers/gift.py index 675c294..c61b09c 100644 --- a/qas_editor/parsers/gift.py +++ b/qas_editor/parsers/gift.py @@ -22,7 +22,8 @@ QProblem, QShortAnswer, QMultichoice from ..enums import TextFormat from ..answer import Answer, ANumerical, Subquestion -from ..utils import FText, gen_hier +from ..utils import gen_hier +from .text import FText if TYPE_CHECKING: from ..category import Category _LOG = logging.getLogger(__name__) diff --git a/qas_editor/parsers/ims/canvas.py b/qas_editor/parsers/ims/canvas.py index cbf7ed7..071e02d 100644 --- a/qas_editor/parsers/ims/canvas.py +++ b/qas_editor/parsers/ims/canvas.py @@ -17,15 +17,13 @@ """ from __future__ import annotations from typing import TYPE_CHECKING -import re import logging import random -import hashlib from xml.etree import ElementTree as et from ... import _LOG from ...question import QQuestion from ...answer import Item -from ...utils import Var, FText +from ..text import Var, FText from .imscc import CC if TYPE_CHECKING: from ...category import Category @@ -90,7 +88,7 @@ def _parse_calculated(self, xml: et.ElementTree): def _parse_fill_in_multiple_blanks(self, xml: et.ElementTree, qst: QQuestion): """ Return an array of possible answers """ - qst.body.from_string(xml.find("presentation/material/mattext", self._ns).text, + qst.body.parse(xml.find("presentation/material/mattext", self._ns).text, {"[": get_canvas_vars}) answers = [] correct_answers = [] diff --git a/qas_editor/parsers/json.py b/qas_editor/parsers/json.py deleted file mode 100644 index 403c183..0000000 --- a/qas_editor/parsers/json.py +++ /dev/null @@ -1,381 +0,0 @@ -"""" -Question and Answer Sheet Editor -Copyright (C) 2022 Lucas Wolfgang - -This program is free software: you can redistribute it and/or modify -it under the terms of the GNU General Public License as published by -the Free Software Foundation, either version 3 of the License, or -(at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with this program. If not, see . -""" -import json -import logging -from typing import TYPE_CHECKING -from enum import Enum -from ..enums import EmbeddedFormat, Direction, Distribution, Grading, RespFormat,\ - ShapeType, Synchronise, TolType, TolFormat, Status,\ - ShowUnits, TextFormat, Numbering -from ..utils import File, Dataset, FText, Hint, TList, Unit -from ..answer import ACalculated, ANumerical, Answer, EmbeddedItem, DragItem,\ - ACrossWord, DropZone, SelectOption, DragGroup, DragImage,\ - Subquestion -from ..question import _Question, QCalculatedMC, QCrossWord, QEmbedded,\ - QTrueFalse, QCalculated, QEssay,\ - QDaDImage, QDaDMarker, QMissingWord, QProblem,\ - QMatching, QDaDText, QMultichoice, QRandomMatching,\ - QNumerical, QShortAnswer -if TYPE_CHECKING: - from ..category import Category - - -_LOG = logging.getLogger(__name__) - -def _from_json(data: dict, cls): - # all_cls = list(cls.__mro__[:-1]) # Removed Object class - # all_cls.pop(Serializable) # Pop Serializable class if it exists - # all_args = [_cls.__init__.__code__.co_varnames for _cls in all_cls] - if isinstance(data, dict): - # for key in list(data): - # if key not in all_args: - # data.pop(key) - # _LOG.debug("Removed argument %s for %s __init__.", key, cls) - item = cls(**data) - return item - return None - - -def _from_file(data: dict): - if data is None: - return None - data.pop("_media", None) - data.pop("_type", None) - if "metadata" in data: - data.update(data.pop("metadata")) - return _from_json(data, File) - - -def _from_dataset(data: dict): - if data is None: - return None - data["status"] = Status(data["status"]) - data["distribution"] = Distribution(data["distribution"]) - tmp = {} # Convertion of keys from string to int - for key in data["items"]: - tmp[int(key)] = data["items"][key] - data["items"] = tmp - return _from_json(data, Dataset) - - -def _from_ftext(data: dict): - if data is None: - return None - data["formatting"] = TextFormat(data["formatting"]) - data["text"] = data.pop("_text", "") - for index in range(len(data["bfile"])): - data["bfile"][index] = _from_file(data["bfile"][index]) - return _from_json(data, FText) - - -def _from_hint(data: dict): - if data is None: - return None - data["formatting"] = TextFormat(data["formatting"]) - return _from_json(data, Hint) - - -def _from_tags(data: list): - if data is None: - return None - return TList(str, data) - - -def _from_unit(data: dict): - if data is None: - return None - return _from_json(data, Unit) - - -# ----------------------------------------------------------------------------- - - -def _from_answer(data: dict, cls=None): - if data is None: - return None - data["formatting"] = TextFormat(data["formatting"]) - data["feedback"] = _from_ftext(data.pop("_feedback")) - return _from_json(data, cls if cls else Answer) - - -def _from_anumerical(data: dict, cls=None): - if data is None: - return None - return _from_answer(data, cls if cls else ANumerical) - - -def _from_acalculated(data: dict): - if data is None: - return None - data["ttype"] = TolType(data["ttype"]) - data["aformat"] = TolFormat(data["aformat"]) - return _from_anumerical(data, ACalculated) - - -def _from_clozeitem(data: dict): - if data is None: - return None - data["cformat"] = EmbeddedFormat(data["cformat"]) - for i in range(len(data["opts"])): - data["opts"][i] = _from_answer(data["opts"][i]) - return _from_json(data, EmbeddedItem) - - -def _from_dragitem(data: dict): - if data is None: - return None - return DragItem(**data) - - -def _from_draggroup(data: dict): - if data is None: - return None - return DragGroup(**data) - - -def _from_dragimage(data: dict): - if data is None: - return None - data["image"] = _from_file(data["image"]) - return DragImage(**data) - - -def _from_dropzone(data: dict): - if data is None: - return None - if data["shape"] is not None: - data["shape"] = ShapeType(data["shape"]) - return _from_json(data, DropZone) - - -def _from_acrossword(data: dict): - if data is None: - return None - data["direction"] = Direction(data["direction"]) - return _from_json(data, ACrossWord) - - -def _from_subquestion(data: dict): - if data is None: - return None - data["formatting"] = TextFormat(data["formatting"]) - return _from_json(data, Subquestion) - - -def _from_selectoption(data: dict): - return _from_json(data, SelectOption) - - -# ----------------------------------------------------------------------------- - - -def _from_question(data: dict, cls): - data["question"] = _from_ftext(data.pop("_question")) - data["remarks"] = _from_ftext(data.pop("_remarks")) - data["tags"] = _from_tags(data.pop("_tags", None)) - for key in data["_feedbacks"]: - data["_feedbacks"][key] = _from_ftext(data["_feedbacks"][key]) - data["feedbacks"] = data.pop("_feedbacks") - data["free_hints"] = data.pop("_free_hints", None) - return _from_json(data, cls) - - -def _from_question_mt(data: dict, cls, opt_callback): - for i in range(len(data["_fail_hints"])): - data["_fail_hints"][i] = _from_hint(data["_fail_hints"][i]) - data["hints"] = data.pop("_fail_hints") - if opt_callback is not None: - for i in range(len(data["_options"])): - data["_options"][i] = opt_callback(data["_options"][i]) - data["options"] = data.pop("_options") - return _from_question(data, cls) - - -def _from_question_mtuh(data: dict, cls, opt_callback): - data["grading_type"] = Grading(data["grading_type"]) - data["show_unit"] = ShowUnits(data["show_unit"]) - return _from_question_mt(data, cls, opt_callback) - - -def _from_qcalculated(data: dict, cls=None): - data["synchronize"] = Synchronise(data["synchronize"]) - for i in range(len(data["units"])): - data["units"][i] = _from_unit(data["units"][i]) - for i in range(len(data["datasets"])): - data["datasets"][i] = _from_dataset(data["datasets"][i]) - return _from_question_mtuh(data, cls if cls else QCalculated, - _from_acalculated) - - -def _from_qcalculatedsimple(data: dict): - return _from_qcalculated(data, QCalculated) - - -def _from_qcalculatedmc(data: dict): - data["numbering"] = Numbering(data["numbering"]) - data["synchronize"] = Synchronise(data["synchronize"]) - for i in range(len(data["datasets"])): - data["datasets"][i] = _from_dataset(data["datasets"][i]) - return _from_question_mt(data, QCalculatedMC, _from_acalculated) - - -def _from_qcloze(data: dict): - return _from_question_mt(data, QEmbedded, _from_clozeitem) - - -def _from_qdescription(data: dict): - return _from_question(data, QProblem) - - -def _from_qdraganddroptext(data: dict): - return _from_question_mt(data, QDaDText, _from_draggroup) - - -def _from_qdraganddropimage(data: dict, cls=None, callback=None): - data["background"] = _from_file(data["background"]) - for i in range(len(data["_zones"])): - data["_zones"][i] = _from_dropzone(data["_zones"][i]) - data["zones"] = data.pop("_zones") - return _from_question_mt(data, cls if cls else QDaDImage, - callback if callback else _from_dragimage) - - -def _from_qdraganddropmarker(data: dict): - return _from_qdraganddropimage(data, QDaDMarker, _from_dragitem) - - -def _from_qessay(data: dict): - data["rsp_format"] = RespFormat(data["rsp_format"]) - data["grader_info"] = _from_ftext(data["grader_info"]) - data["template"] = _from_ftext(data["template"]) - return _from_question(data, QEssay) - - -def _from_qmatching(data: dict): - return _from_question_mt(data, QMatching, _from_subquestion) - - -def _from_qrandommatching(data: dict): - return _from_question_mt(data, QRandomMatching, None) - - -def _from_qmissingword(data: dict): - return _from_question_mt(data, QMissingWord, _from_selectoption) - - -def _from_qcrossword(data: dict): - for i in range(len(data["words"])): - data["words"][i] = _from_acrossword(data["words"][i]) - return _from_question(data, QCrossWord) - - -def _from_qmultichoice(data: dict): - data["numbering"] = Numbering(data["numbering"]) - return _from_question_mt(data, QMultichoice, _from_answer) - - -def _from_qnumerical(data: dict): - for i in range(len(data["units"])): - data["units"][i] = _from_unit(data["units"][i]) - return _from_question_mtuh(data, QNumerical, _from_anumerical) - - -def _from_qshortanswer(data: dict): - return _from_question_mt(data, QShortAnswer, _from_answer) - - -def _from_qtruefalse(data: dict): - data["true_feedback"] = _from_ftext(data.pop("_true_feedback")) - data["false_feedback"] = _from_ftext(data.pop("_false_feedback")) - return _from_question(data, QTrueFalse) - - -# ----------------------------------------------------------------------------- - - -_QTYPE = { - "QCalculated": _from_qcalculated, - "QCalculatedMC": _from_qcalculatedmc, - "QEmbedded": _from_qcloze, - "QProblem": _from_qdescription, - "QDaDText": _from_qdraganddroptext, - "QDaDImage": _from_qdraganddropimage, - "QDaDMarker": _from_qdraganddropmarker, - "QEssay": _from_qessay, - "QMatching": _from_qmatching, - "QRandomMatching": _from_qrandommatching, - "QMissingWord": _from_qmissingword, - "QMultichoice": _from_qmultichoice, - "QNumerical": _from_qnumerical, - "QShortAnswer": _from_qshortanswer, - "QTrueFalse": _from_qtruefalse -} - - -def read_json(cls, file_path) -> "Category": - """ - Generic file. This is the default file format used by the QAS Editor. - """ - def _rjrecursive(_dt: dict): - quiz = cls(_dt["_Category__name"]) - for qst in _dt["_Category__questions"]: - quiz.add_question(_QTYPE[qst.pop("__clsname__")](qst)) - for i in _dt["_Category__categories"]: - quiz.add_subcat(_rjrecursive(_dt["_Category__categories"][i])) - return quiz - with open(file_path, "rb") as infile: - data = json.load(infile) - return _rjrecursive(data) - - -# ----------------------------------------------------------------------------- - - -def write_json(self, file_path: str, pretty=False) -> None: - """[summary] - - Args: - file_path (str): [description] - pretty (bool, optional): [description]. Defaults to False. - """ - def _tjrecursive(data): - for num, i in enumerate(data): - res = val = data[i] if isinstance(data, dict) else i - if isinstance(val, (list, dict)): - res = _tjrecursive(val.copy()) - elif isinstance(val, Enum): # For the enums - res = val.value - elif hasattr(val, "__dict__"): # for the objects - tmp = val.__dict__.copy() - if isinstance(val, _Question): - tmp["__clsname__"] = val.__class__.__name__ - if "_Question__parent" in tmp: - del tmp["_Question__parent"] - elif "_Category__parent" in tmp: - del tmp["_Category__parent"] - res = _tjrecursive(tmp) - if res != val: - if isinstance(data, dict): - data[i] = res - else: - data[num] = res - return data - tmp = self.__dict__.copy() - del tmp["_Category__parent"] - with open(file_path, "w", encoding="utf-8") as ofile: - json.dump(_tjrecursive(tmp), ofile, indent=4 if pretty else None) diff --git a/qas_editor/parsers/latex.py b/qas_editor/parsers/latex.py index d21a05c..eec8dcf 100644 --- a/qas_editor/parsers/latex.py +++ b/qas_editor/parsers/latex.py @@ -21,15 +21,15 @@ See http://www.gnu.org/licenses/gpl.txt for details. """ from __future__ import annotations +from typing import TYPE_CHECKING, Type, List, Tuple import re import os import logging from ..enums import Numbering -from ..utils import FText from ..answer import Answer from ..question import QEssay, QMultichoice -from typing import TYPE_CHECKING, Type, List, Tuple +from .text import FText if TYPE_CHECKING: from ..category import Category from io import StringIO diff --git a/qas_editor/parsers/markdown.py b/qas_editor/parsers/markdown.py index 023f785..14231fc 100644 --- a/qas_editor/parsers/markdown.py +++ b/qas_editor/parsers/markdown.py @@ -18,9 +18,9 @@ import re from ..enums import TextFormat -from ..utils import FText from ..question import QMultichoice from ..answer import Answer +from .text import FText class DefaultMD: diff --git a/qas_editor/parsers/moodle.py b/qas_editor/parsers/moodle.py index 582b038..f2d4631 100644 --- a/qas_editor/parsers/moodle.py +++ b/qas_editor/parsers/moodle.py @@ -31,8 +31,8 @@ from ..enums import TextFormat, ShowUnits, Numbering, RespFormat, Synchronise,\ ShapeType, Grading, Status, TolFormat, TolType,\ Distribution, ShowAnswer, MathType, ShuffleType -from ..utils import gen_hier, Dataset, Hint, TList, FText, File, Unit, \ - serialize_fxml, XHTMLParser +from ..utils import gen_hier, Dataset, Hint, TList, File, Unit, serialize_fxml +from .text import FText, XHTMLParser if TYPE_CHECKING: from ..category import Category, _Question @@ -210,8 +210,8 @@ def _from_units(root: et.Element, *_) -> Unit: return units -def _from_Tags(root: et.Element, *_) -> TList: - _tags = TList(str) +def _from_Tags(root: et.Element, *_): + _tags = TList[str]() for elem in root: _tags.append(elem.find("text").text) return _tags diff --git a/qas_editor/parsers/text.py b/qas_editor/parsers/text.py new file mode 100644 index 0000000..3cb2e0a --- /dev/null +++ b/qas_editor/parsers/text.py @@ -0,0 +1,277 @@ +"""" +Question and Answer Sheet Editor +Copyright (C) 2022 Lucas Wolfgang + +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program. If not, see . +""" +from __future__ import annotations +from io import TextIOWrapper +from html.parser import HTMLParser +from typing import List, Callable +from importlib import util +from qas_editor.enums import FileAddr, MathType +from qas_editor.utils import File, LinkRef, ParseError, render_latex + +EXTRAS_FORMULAE = util.find_spec("sympy") is not None +if EXTRAS_FORMULAE: + from sympy import printing, Expr + +class Var: + """ + """ + + def __init__(self, text: str): + self.data = text if not EXTRAS_FORMULAE else [] + + +class XItem: + """ + """ + + def __init__(self, tag, attrib: dict = None, closed: bool = False): + self.tag = tag + self.attrs = attrib + self._children = None if closed else [] + + def __iter__(self): + return iter(self._children) + + def append(self, item: XItem): + """ + """ + self._children.append(item) + + def get(self, mtype: MathType, ftype: FileAddr) -> str: + value = f"<{self.tag} " + if self.attrs: + for key, val in self.attrs.items(): + value += f"{key}={val} " + value += ">" + for child in self._children: + value += FText.to_string(child, mtype, ftype) + value = f"" + return value + + +class XHTMLParser(HTMLParser): + """A parser for HTML and XML that may contain other formats""" + + def __init__(self, convert_charrefs: bool = True, check_closing: bool = False, + files: List[File] = None): + super().__init__(convert_charrefs=convert_charrefs) + self.root = XItem("") + self._stack = [self.root] + self._check = check_closing + self.files = files or [] + + def __str__(self) -> str: + """Hope this will not need to be enhanced due to performance metrics + Returns: + str: resulting text + """ + return str(self.root) + + def _get_file_ref(self, data: str): + tag = self._stack[-1].tag + attrs = self._stack[-1].attrs + if tag == "file": + path = attrs.pop("path", "/") + attrs.pop("name") + file = File(path, data) + else: + if attrs.get("src", "")[:5] == "data:": + data, scr = attrs.pop("src").split(";", 1) + _, ext = data.split("/", 1) + path = f"/{len(self.files)}.{ext}" + file = File(path, scr[7:]) # Consider this is a base64 data + else: + path = attrs.pop("src") + for item in self.files: + if item.path == path: + return LinkRef(tag, item, **attrs) + file = File(path, None) + self.files.append(file) + return LinkRef(tag, file, **attrs) + + def handle_startendtag(self, tag, attrs): + if self._check or tag not in ("source", "area", "track", "input", "col", + "embed", "hr", "link", "meta", "br", "base", "wbr", "img"): + raise ParseError() + self._stack[-1].append(XItem(tag, attrs, True)) + + def handle_starttag(self, tag, attrs): + self._stack.append(XItem(tag, attrs)) + self.root.append(self._stack[-1]) + + def handle_endtag(self, tag): + self._stack.pop() + + def handle_data(self, data): + if self._stack[-1].tag not in ("", "a", "base", "base", "input", "link", + "audio", "embed", "img", "video", "file", + "script", "source", "iframe", "track"): + self._get_file_ref(data) + else: + self._stack[-1].append(data) + + def parse(self, data: str|TextIOWrapper): + if isinstance(data, str): + self.feed(data) + self.close() + elif isinstance(data, TextIOWrapper): + for line in data: + self.feed(line) + self.close() + else: + raise ParseError() + + +class TextParser(): + """A global text parser to generate FText instances + """ + + def __init__(self, **_): + self.ftext = [] + self.text = "" + self.pos = 0 + self.lst = 0 + self.scp = False + + def _wrapper(self, callback: Callable, size=1): + if self.text[self.lst: self.pos]: + self.ftext.append(self.text[self.lst: self.pos]) + self.pos += size + self.lst = self.pos + self.ftext.append(callback()) + self.lst = self.pos + 1 + + def _nxt(self): + self.scp = (self.text[self.pos] == "\\") and not self.scp + self.pos += 1 + + def do(self): + """Modify this functions in super classes. + """ + pass + + def clean_up(self): + if self.text[self.lst:]: + self.ftext.append(self.text[self.lst:]) + + def parse(self, data: str|TextIOWrapper): + if isinstance(data, str): + self.text = data + elif isinstance(data, TextIOWrapper): + self.text = data.read() + else: + raise ParseError() + while self.pos < len(self.text): + self.do() + self._nxt() + self.clean_up() + + +class FText: + """A formated text. + Attributes: + text (list): + files (List[File]): Local reference of the list of files used. + """ + + def __init__(self, files: List[File] = None): + super().__init__() + self._files = files or [] + self._text = [] + + def __str__(self) -> str: + return self.get() + + @staticmethod + def to_string(item, mtype: MathType, ftype: FileAddr) -> str: + """_summary_ + Args: + item (_type_): _description_ + math_type (MathType, optional): _description_. Defaults to None. + Returns: + str: _description_ + """ + if isinstance(item, str) or hasattr(item, "__str__"): + return str(item) + elif hasattr(item, "MARKER_INT"): + return chr(item.MARKER_INT) + elif isinstance(item, LinkRef): + return item.get_tag() + elif EXTRAS_FORMULAE and isinstance(item, Expr): + if mtype == MathType.LATEX: + return f"$${printing.latex(item)}$$" + elif mtype == MathType.MOODLE: + return "{" + ("" if item.is_Atom else "=") + printing.latex(item) + "}" + elif mtype == MathType.MATHJAX: + return f"[mathjax]{printing.latex(item)}[/mathjax]" + elif mtype == MathType.MATHML: + return str(printing.mathml(item)) + elif mtype == MathType.ASCII: + return str(printing.pretty(item)) + elif mtype == MathType.FILE: + return render_latex(printing.latex(item), ftype) + else: + raise TypeError(f"Item has unknown type {type(item)}") + + @property + def files(self): + return self._files + + @property + def text(self) -> list: + """A list of strings, file references, questions and math expressions + (if EXTRAS_FORMULAE). + """ + return self._text + + @text.setter + def text(self, value): + if isinstance(value, str): + self._text = [value] + elif isinstance(value, list): + self._text = value + else: + raise ValueError() + + def parse(self, text: str, parser: Callable, **args): + """Parses the provided string to a FText class by finding file pointers + and math expression and returning them as a list. + Args: + text (str): _description_ + Returns: + FText: _description_ + """ + if parser is None: + self._text.append(text) + else: + if "files" not in args: + args["files"] = self._files + tmp = parser(**args).parse(text) + self._text = tmp.ftext + + def get(self, mtype=MathType.ASCII, ftype=FileAddr.LOCAL) -> str: + """Get a string representation of the object + Args: + math_type (MathType, optional): Which type of + Returns: + str: A string representation of the object + """ + data = "" + for item in self._text: + data += self.to_string(item, mtype, ftype) + return data + diff --git a/qas_editor/processors.py b/qas_editor/processors.py new file mode 100644 index 0000000..406171c --- /dev/null +++ b/qas_editor/processors.py @@ -0,0 +1,29 @@ +"""" +Question and Answer Sheet Editor +Copyright (C) 2022 Lucas Wolfgang + +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program. If not, see . +""" + +multichoice_def = """ +def func(a): + if a == {index}: + return 100 + else: + return 0 +""" + +PROCESSORS = { + "multichoice": multichoice_def +} diff --git a/qas_editor/question.py b/qas_editor/question.py index 29048e9..51f00ab 100644 --- a/qas_editor/question.py +++ b/qas_editor/question.py @@ -22,8 +22,8 @@ from typing import TYPE_CHECKING from .enums import EmbeddedFormat, Grading, RespFormat, ShowUnits, ShowAnswer, ShuffleType,\ Distribution, Numbering, Synchronise, TextFormat, Status -from .utils import Serializable, MarkerError, AnswerError, File, Dataset, \ - FText, Hint, Unit, TList, attribute_setup +from .parsers.text import FText +from .utils import Serializable, File, Dataset, Hint, Unit, TList from .answer import ACalculated, ACrossWord, Answer, EmbeddedItem, ANumerical,\ DragGroup, DragImage, SelectOption, Subquestion,\ DropZone, DragItem @@ -71,16 +71,16 @@ def __init__(self, name="qstn", default_grade=1.0, question: FText = None, self._remarks = FText() self.remarks = remarks self._feedbacks: Dict[float, FText] = feedbacks if feedbacks else {} - self._tags = TList(str, tags) - self._free_hints = TList(FText, free_hints) + self._tags = TList[str](tags) + self._free_hints = TList[FText](free_hints) self.__parent = None _LOG.debug("New question (%s) created.", self) def __str__(self) -> str: return f"{self.QNAME}: '{self.name}' @{hex(id(self))}" - question = FText.prop("_question", "Question text") - remarks = FText.prop("_remarks", "Solution or global feedback") + # question = FText.prop("_question", "Question text") + # remarks = FText.prop("_remarks", "Solution or global feedback") @property def feedbacks(self) -> Dict[float, FText]: @@ -141,8 +141,8 @@ def __init__(self, options: list = None, hints: List[Hint] = None, show_ans: ShowAnswer | bool = False, ordered=True, **kwargs): super().__init__(**kwargs) self.max_tries = int(max_tries) - self._fail_hints = TList(Hint, hints) - self._options = TList(self.ANS_TYPE, options) + self._fail_hints = TList[Hint](hints) + self._options = TList[self.ANS_TYPE](options) self.ordered = bool(ordered) if isinstance(show_ans, ShowAnswer): self.show_ans = show_ans @@ -295,7 +295,7 @@ def __init__(self, background: File = None, zones: List[DropZone] = None, **kwargs): super().__init__(**kwargs) self.background = background - self._zones = TList(DropZone, zones) + self._zones = TList[DropZone](zones) @property def zones(self): @@ -351,10 +351,10 @@ class QEmbedded(_QHasOptions): def check(self): markers = self.question.text.count(chr(MARKER_INT)) if markers != len(self.options): - raise MarkerError("Number of markers and questions differ") + raise ValueError("Number of markers and questions differ") for question in self.options: if all(opt.fraction == 0 for opt in question.opts): - raise AnswerError("All answer options have 0 grade") + raise ValueError("All answer options have 0 grade") @staticmethod def from_cloze_text(text: str) -> Tuple[list, list]: @@ -456,7 +456,7 @@ class QMissingWord(_QHasOptions): def check(self): total = len(re.findall(r"\[\[[0-9]+\]\]", self.question.text)) if total != len(self.options): - raise MarkerError("Incorrect number of marker in text.") + raise ValueError("Incorrect number of marker in text.") @staticmethod def get_items(text: str) -> Tuple[list, list]: @@ -590,8 +590,8 @@ def __init__(self, correct: bool, true_feedback: FText | str, self._false_feedback = FText() self.false_feedback = false_feedback - true_feedback = FText.prop("_true_feedback") - false_feedback = FText.prop("_false_feedback") + # true_feedback = FText.prop("_true_feedback") + # false_feedback = FText.prop("_false_feedback") class QQuestion: @@ -599,30 +599,30 @@ class QQuestion: Moodle, which was the previous one. """ - def __init__(self, name="qstn", dbid: int = None, tags: TList = None, - notes: str = ""): + def __init__(self, name="question", dbid: int = 0, tags: TList = None, + notes: str = ""): """[summary] Args: name (str): name of the question - question (FText): text of the question - default_grade (float): the default mark dbid (int, optional): id number. """ - self.name = str(name) - self.dbid = int(dbid) if dbid else None - self.notes = str(notes) - self._time_lim = 0 - self._body = None - self._notes = None - self._tags = TList(str, tags) - self.__parent: Category = None + self.name = name + self.dbid = dbid + self.notes = notes + self.time_lim = 0 + self._body = FText() + self._tags: List[str] = [] + self.__parent = None _LOG.debug("New question (%s) created.", self) def __str__(self) -> str: - return f"{self.QNAME}: '{self.name}' @{hex(id(self))}" + return f"'{self.name}_{self.dbid}' @{hex(id(self))}" - body = attribute_setup(FText, "_body", "Question body") - time_lim = attribute_setup(int, "_time_lim") + @property + def body(self) -> FText: + """Question body + """ + return self._body @property def parent(self) -> Category: @@ -637,6 +637,7 @@ def parent(self, value: Category): raise ValueError("This attribute can't be assigned directly. Use " "parent's add/pop_question functions instead.") self.__parent = value + self._body._files = value.resources _LOG.debug("Added (%s) to parent (%s).", self, value) @property diff --git a/qas_editor/utils.py b/qas_editor/utils.py index 1885c18..b058f85 100644 --- a/qas_editor/utils.py +++ b/qas_editor/utils.py @@ -28,24 +28,25 @@ import hashlib import unicodedata import mimetypes -from io import TextIOWrapper -from html.parser import HTMLParser from io import BytesIO from xml.sax import saxutils from importlib import util from urllib import request, parse from xml.etree import ElementTree as et -from typing import Dict, List, Tuple, Callable -from .enums import FileAddr, OutFormat, TextFormat, Status, Distribution, MathType +from typing import Dict, List, Tuple, TypeVar, Generic, Iterable, TYPE_CHECKING +from .enums import FileAddr, OutFormat, TextFormat, Status, Distribution EXTRAS_FORMULAE = util.find_spec("sympy") is not None if EXTRAS_FORMULAE: from matplotlib import figure, font_manager, mathtext from matplotlib.backends import backend_agg from pyparsing import ParseFatalException # Part of matplotlib package - from sympy import printing, Expr - +if TYPE_CHECKING: + from parsers.text import FText +T = TypeVar('T') +KT = TypeVar('KT') # Key type. +VT = TypeVar('VT') # Value type. _LOG = logging.getLogger(__name__) EXTRAS_GUI = util.find_spec("PyQt5") is not None # moodle, sympy, latex @@ -166,7 +167,7 @@ def render_latex(latex: str, ftype: FileAddr, scale=1.0): def run_me(cmd): flag = 0x08000000 if os.name == 'nt' else 0 return subprocess.run(cmd, stdout=subprocess.PIPE, check=True, - creationflags=flag, cmd=workdir) + creationflags=flag, cmd=workdir) with open(f"{workdir}/texput.tex", 'w', encoding='utf-8') as fh: fh.write("\\documentclass[varwidth,12pt]{standalone}" @@ -218,7 +219,7 @@ def clean_q_name(string: str): return out.strip() -def attribute_setup(cls, attr: str, doc: str=""): +def attribute_setup(cls: T, attr: str, doc: str=""): """Generate get/set/del properties for a Ftext attribute. """ def setter(self, value): @@ -226,9 +227,9 @@ def setter(self, value): setattr(self, attr, value) elif value is not None: raise ValueError(f"Can't assign {value} to {attr}") - def getter(self): + def getter(self) -> T: return getattr(self, attr) - return property(getter, setter, doc=doc) + return property[Generic[T]](getter, setter, doc=doc) # ----------------------------------------------------------------------------- @@ -306,44 +307,28 @@ def compare(self, __o: object, path: list) -> bool: return True -class TList(list): - """Type List (or Datatype list) is a class that restricts the datatype of - all the items to a single one defined in constructor. It works exactly like - an list in C++, Java and other compiled languages. Could use an array - instead if it allowed any time to be used. TODO If there is something - native we could use instead, it is worthy an PR to update. +class TList(Generic[T]): + """Typed List (or Datatype list) is a class that restricts the datatype of + all the items to a single one defined in constructor. """ - def __init__(self, obj_type: type, iterable=None): - super().__init__() - self.__type = obj_type + def __init__(self, iterable: Iterable = None): + self._items: List[T] = [] if iterable is not None: self.extend(iterable) - @property - def datatype(self): - """The datatype of the items in this list. - """ - return self.__type - - @datatype.setter - def datatype(self, value): - if not all(isinstance(obj, value) for obj in self): - self.clear() - self.__type = value - def append(self, __object): - if isinstance(__object, self.__type): - super().append(__object) - - def extend(self, __iterable): - if all(isinstance(obj, self.__type) for obj in __iterable): - super().extend(__iterable) + self._items.append(__object) # ----------------------------------------------------------------------------- +class ParseError(Exception): + """Exception used when there is a Marker related error + """ + + class MarkerError(Exception): """Exception used when there is a Marker related error """ @@ -525,255 +510,6 @@ def generate(self): pass -class XItem: - - def __init__(self, tag, attrib: dict = None, closed: bool = False): - self.tag = tag - self.attrs = attrib - self._children = None if closed else [] - - def __iter__(self): - return iter(self._children) - - def append(self, item: XItem): - self._children.append(item) - - def __str__(self) -> str: - value = f"<{self.tag} " - if self.attrs: - for key, val in self.attrs.items(): - value += f"{key}={val} " - value += ">" - for child in self._children: - value += FText.to_string(child) - value = f"" - return value - - -class XHTMLParser(HTMLParser): - """A parser for HTML and XML that may contain other formats""" - - def __init__(self, convert_charrefs: bool = True, check_closing: bool = False, - files: List[File] = None): - super().__init__(convert_charrefs=convert_charrefs) - self.root = XItem("") - self._stack = [self.root] - self._check = check_closing - self.files = files or [] - - def __str__(self) -> str: - """Hope this will not need to be enhanced due to performance metrics - Returns: - str: resulting text - """ - return str(self.root) - - def _get_file_ref(self, data: str): - tag = self._stack[-1].tag - attrs = self._stack[-1].attrs - if tag == "file": - path = attrs.pop("path", "/") + attrs.pop("name") - file = File(path, data) - else: - if attrs.get("src", "")[:5] == "data:": - data, scr = attrs.pop("src").split(";", 1) - _, ext = data.split("/", 1) - path = f"/{len(self.files)}.{ext}" - file = File(path, scr[7:]) # Consider this is a base64 data - else: - path = attrs.pop("src") - for item in self.files: - if item.path == path: - return LinkRef(tag, item, **attrs) - file = File(path, None) - self.files.append(file) - return LinkRef(tag, file, **attrs) - - def handle_startendtag(self, tag, attrs): - if self._check or tag not in ("source", "area", "track", "input", "col", - "embed", "hr", "link", "meta", "br", "base", "wbr", "img"): - raise ParseFatalException() - self._stack[-1].append(XItem(tag, attrs, True)) - - def handle_starttag(self, tag, attrs): - self._stack.append(XItem(tag, attrs)) - self.root.append(self._stack[-1]) - - def handle_endtag(self, tag): - self._stack.pop() - - def handle_data(self, data): - if self._stack[-1].tag not in ("", "a", "base", "base", "input", "link", - "audio", "embed", "img", "video", "file", - "script", "source", "iframe", "track"): - self._get_file_ref(data) - else: - self._stack[-1].append(data) - - def parse(self, data: str|TextIOWrapper): - if isinstance(data, str): - self.feed(data) - self.close() - elif isinstance(data, TextIOWrapper): - for line in data: - self.feed(line) - self.close() - else: - raise ParseFatalException() - return FText(self.root._children, self.files) - - -class TextParser(): - """A global text parser to generate FText instances - """ - - def __init__(self, **_): - self.ftext = [] - self.text = "" - self.pos = 0 - self.lst = 0 - self.scp = False - - def _wrapper(self, callback: Callable, size=1): - if self.text[self.lst: self.pos]: - self.ftext.append(self.text[self.lst: self.pos]) - self.pos += size - self.lst = self.pos - self.ftext.append(callback()) - self.lst = self.pos + 1 - - def _nxt(self): - self.scp = (self.text[self.pos] == "\\") and not self.scp - self.pos += 1 - - def do(self): - """Modify this functions in super classes. - """ - pass - - def clean_up(self): - if self.text[self.lst:]: - self.ftext.append(self.text[self.lst:]) - - def parse(self, data: str|TextIOWrapper): - if isinstance(data, str): - self.text = data - elif isinstance(data, TextIOWrapper): - self.text = data.read() - else: - raise ParseFatalException() - while self.pos < len(self.text): - self.do() - self._nxt() - self.clean_up() - return FText(self.ftext, None) - - -class FText(Serializable): - """A formated text. - Attributes: - text (list): - """ - - def __init__(self, text: list, files: List[File] = None): - super().__init__() - self._text = text - self.files = files # Local reference of the list of files used. - - def __str__(self) -> str: - return self.get() - - @staticmethod - def to_string(item, math_type: MathType = None): - if isinstance(item, str) or hasattr(item, "__str__"): - return str(item) - elif hasattr(item, "MARKER_INT"): - return chr(item.MARKER_INT) - elif isinstance(item, LinkRef): - return item.get_tag() - elif EXTRAS_FORMULAE and isinstance(item, Expr): - if math_type == MathType.LATEX: - return f"$${printing.latex(item)}$$" - elif math_type == MathType.MOODLE: - return "{" + ("" if item.is_Atom else "=") + printing.latex(item) + "}" - elif math_type == MathType.MATHJAX: - return f"[mathjax]{printing.latex(item)}[/mathjax]" - elif math_type == MathType.MATHML: - return str(printing.mathml(item)) - elif math_type == MathType.ASCII: - return str(printing.pretty(item)) - elif math_type == MathType.FILE: - return render_latex(printing.latex(item), FileAddr.LOCAL) - else: - raise TypeError(f"Item has unknown type {type(item)}") - - @property - def text(self) -> List[str|LinkRef]: - """A list of strings, file references, questions and math expressions - (if EXTRAS_FORMULAE). - """ - return self._text - - @text.getter - def text(self) -> list: - return self._text - - @text.setter - def text(self, value): - if isinstance(value, str): - self._text = [value] - elif isinstance(value, list): - self._text = value - else: - raise ValueError() - - @classmethod - def from_string(cls, text: str, parser, **args) -> FText: - """Parses the provided string to a FText class by finding file pointers - and math expression and returning them as a list. - Args: - text (str): _description_ - formatting (_type_, optional): _description_. Defaults to TextFormat.AUTO. - check_tags (bool, optional): _description_. Defaults to True. - check_math (bool, optional): _description_. Defaults to True. - files (list, optional): _description_. Defaults to None. - Returns: - FText: _description_ - """ - if parser is None: - return cls([text], args.get("files")) - else: - return parser(**args).parse(text) - - def get(self, math_type=MathType.ASCII) -> str: - """Get a string representation of the object - Args: - math_type (MathType, optional): Which type of - Returns: - str: A string representation of the object - """ - data = "" - for item in self._text: - data += self.to_string(item, math_type) - return data - - @staticmethod - def prop(attr: str, doc: str="") -> FText: - """Generate get/set/del properties for a Ftext attribute. - """ - def setter(self, value): - data = getattr(self, attr) - if isinstance(value, FText): - setattr(self, attr, value) - elif isinstance(value, (list, str)): - data.text = value - elif value is not None: - raise ValueError(f"Can't assign {value} to {attr}") - def getter(self) -> FText: - return getattr(self, attr) - return property(getter, setter, doc=doc) - - class Hint(Serializable): """Represents a hint to be displayed when a wrong answer is provided to a "multiple tries" question. The hints are give in the listed order. @@ -797,40 +533,3 @@ def __init__(self, unit_name: str, multiplier: float): self.unit_name = unit_name self.multiplier = multiplier - -class Equation(Serializable): - """Represents an equation in a formulary. It can be define to be used in - either a quiz description or a question header. - """ - - def __init__(self, name: str, text: FText): - self.name = name - self.text = text - - -class Table(Serializable): - """Represents a table in a formulary. It can be define to be used in - either a quiz description or a question header. - """ - - def __init__(self, name: str, text: FText): - self.name = name - self.text = text - - -class Rule(Serializable): - """Represents a theory, law or other set of sentences that describe a - given phenomenum. It can be define to be used in either a quiz description - or a question header. - """ - - def __init__(self, name: str, text: FText, proof: FText): - self.name = name - self.text = text - self.proof = proof - - -class Var(Serializable): - - def __init__(self, text: FText): - self.data = text if not EXTRAS_FORMULAE else [] \ No newline at end of file diff --git a/test/datasets/json/all.json b/test/datasets/json/all.json deleted file mode 100644 index b57ae56..0000000 --- a/test/datasets/json/all.json +++ /dev/null @@ -1,2520 +0,0 @@ -{ - "_Category__questions": [], - "_Category__categories": { - "qas_editor": { - "_Category__questions": [ - { - "name": "Essai1", - "default_grade": 1.1, - "time_lim": 60, - "dbid": null, - "notes": "", - "_question": { - "formatting": "html", - "_text": [ - "Explain in few words the aim of this course.
" - ], - "bfile": [] - }, - "_remarks": { - "formatting": "html", - "_text": [ - "" - ], - "bfile": [] - }, - "_feedbacks": {}, - "_tags": [], - "_free_hints": [], - "rsp_format": "editor", - "rsp_required": true, - "lines": 3, - "min_words": null, - "max_words": null, - "attachments": 0, - "atts_required": false, - "max_bytes": 0, - "file_types": "", - "grader_info": { - "formatting": "html", - "_text": [ - "" - ], - "bfile": [] - }, - "template": { - "formatting": "html", - "_text": [ - "" - ], - "bfile": [] - }, - "__clsname__": "QEssay" - }, - { - "name": "Drag and Drop Text and Image", - "default_grade": 6.0, - "time_lim": 60, - "dbid": null, - "notes": "", - "_question": { - "formatting": "html", - "_text": [ - "

Six sentences have been removed from the article. Choose from sentences A - G the one which first each gap. There is one extra sentence which you do not need to use.

\n

How a music festival turned into a money-making monster

\n

A. When the American 90s rock band Pearl Jam put on a concert in the dried-up, baking-hot Coachella Valley in California, it was an attempt to prove that they could break away from the monopoly of the concert giant TicketMaster, who, they believed, was using its considerable power to exploit music fans by continually increasing prices. Their concert was well attended and inspired the idea for a future, more ambitious event. Naturally, nobody could have predicted quite how important Coachella would eventually become.

\n

B. Six years later, in 1999, the same venue hosted its first weekend-long music festival. Although initially making a loss, this was blamed on the unbearably high temperatures and the lack of available campsite facilities. [[1]] What's more, it took only a few more years until its quality line-ups, from small bands to headliners, were attracting worldwide attention.

\n

C. \u00a0If one band is responsible for confirming Coachella's arrival on the world stage, it is Daft Punk's iconic appearance there in 2006.[[2]] As a direct result of the festival's success, promoters expanded it to a three-day event, and in 2009, Coachella presented its most mainstream line-up, including Paul McCartney, the Killers, and The Cure. The following year Jay-Z became the first rap headliner and by 2012 such was the popularity of Coachella that it had developed into two weekends of three-day shows.

\n

D. In an effort to attract America's impoverished younger generation to an expensive annual visit to the desert, the promoters made two clever decisions. One smart move was to get a much-missed band or singer such as Rage Against the Machine to reform every year. Most notable was a holographic representation of the late rapper 2Pac in 2012.[[3]] ln a stroke of genius, they decided to cater for the section of the audience who adored the music that used to be labelled electronic and who flocked to dance in big tents to their favourite DJs.

\n

E. By keeping its cool musical reputation, the festival would go from strength to strength. In 2016, half a million fans bought their tickets in under 20 minutes, and each year around 100,000 attendees a day now splash out around $375 on admission. Of course, the costs don't stop there. [[4]]It is now the most profitable festival in the world.

\n

F. Just two hours from Los Angeles, Coachella swiftly became the place to see and be seen. [[5]]The presence of models and other celebrities soon began to attract style bloggers, drawn by the fashion rather than the music. Which, in turn, has made Coachella irresistible to fashion houses, beauty companies and other lifestyle labels.

\n

G. Although for several years luxury brands have been hosting free concerts and pool parties for invited guests and photographing Instagram stars modelling designer clothes, this has until recently been outside festival hours. [[6]]As a result, they are now effectively separate events, to the point that 'No-chella' as it has become known, is, in the opinion of some, in danger of overshadowing the 'real' festival.

\n

Coachella has certainly come a long way from the original anti-establishment Pearl Jam gig.

" - ], - "bfile": [] - }, - "_remarks": { - "formatting": "html", - "_text": [ - "" - ], - "bfile": [] - }, - "_feedbacks": { - "100.0": { - "formatting": "html", - "_text": [ - "

Your answer is correct.

" - ], - "bfile": [] - }, - "50.0": { - "formatting": "html", - "_text": [ - "

Your answer is partially correct.

" - ], - "bfile": [] - }, - "0.0": { - "formatting": "html", - "_text": [ - "

Your answer is incorrect.

" - ], - "bfile": [] - } - }, - "_tags": [], - "_free_hints": [], - "max_tries": 3, - "_fail_hints": [], - "_options": [ - { - "number": 0, - "text": "E. Fortunately, these issues were soon resolved.", - "no_of_drags": 1, - "group": "1" - }, - { - "number": 0, - "text": "C. Fear of missing out on another such memorable performance caused huge demand for tickets the following year.", - "no_of_drags": 1, - "group": "1" - }, - { - "number": 0, - "text": "G. Their other idea was even more brilliant.", - "no_of_drags": 1, - "group": "1" - }, - { - "number": 0, - "text": "B. When refreshments, merchandise, transport and accommodation are taken into account, the expense of attending rises dramatically.", - "no_of_drags": 1, - "group": "1" - }, - { - "number": 0, - "text": "A. The appeal of its location - palm trees, guaranteed sunshine, warm temperatures - is not difficult to understand.", - "no_of_drags": 1, - "group": "1" - }, - { - "number": 0, - "text": "D. Lately, however, increasingly extravagant marketing by the fashion industry means that attendees are now preferring to stay away from the music concert itself.", - "no_of_drags": 1, - "group": "1" - }, - { - "number": 0, - "text": "F. On this occasion, medical professionals treated numerous audience members for heatstroke.", - "no_of_drags": 1, - "group": "1" - } - ], - "ordered": true, - "show_ans": true, - "shuffle": true, - "__clsname__": "QDaDText" - }, - { - "name": "Drag and drop markers test", - "default_grade": 1.0, - "time_lim": 60, - "dbid": null, - "notes": "", - "_question": { - "formatting": "html", - "_text": [ - "

This is a simple test

" - ], - "bfile": [] - }, - "_remarks": { - "formatting": "html", - "_text": [ - "

general feedback test

" - ], - "bfile": [] - }, - "_feedbacks": { - "100.0": { - "formatting": "html", - "_text": [ - "Your answer is correct." - ], - "bfile": [] - }, - "50.0": { - "formatting": "html", - "_text": [ - "Your answer is partially correct." - ], - "bfile": [] - }, - "0.0": { - "formatting": "html", - "_text": [ - "Your answer is incorrect." - ], - "bfile": [] - } - }, - "_tags": [ - "Advanced" - ], - "_free_hints": [], - "max_tries": 3, - "_fail_hints": [ - { - "formatting": "html", - "text": "

Hint number 1

", - "show_correct": true, - "clear_wrong": false, - "state_incorrect": true - }, - { - "formatting": "html", - "text": "

Hint number 2

", - "show_correct": false, - "clear_wrong": true, - "state_incorrect": false - } - ], - "_options": [ - { - "number": 1, - "text": "Marker1", - "no_of_drags": -1 - }, - { - "number": 2, - "text": "Marker2", - "no_of_drags": 1 - }, - { - "number": 3, - "text": "Marker3", - "no_of_drags": 2 - } - ], - "ordered": true, - "show_ans": true, - "shuffle": false, - "background": { - "data": "iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAAACXBIWXMAAAsTAAALEwEAmpwYAAA542lUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4KPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNS41LWMwMjEgNzkuMTU1NzcyLCAyMDE0LzAxLzEzLTE5OjQ0OjAwICAgICAgICAiPgogICA8cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPgogICAgICA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIgogICAgICAgICAgICB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iCiAgICAgICAgICAgIHhtbG5zOmRjPSJodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xLyIKICAgICAgICAgICAgeG1sbnM6cGhvdG9zaG9wPSJodHRwOi8vbnMuYWRvYmUuY29tL3Bob3Rvc2hvcC8xLjAvIgogICAgICAgICAgICB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIKICAgICAgICAgICAgeG1sbnM6c3RFdnQ9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZUV2ZW50IyIKICAgICAgICAgICAgeG1sbnM6dGlmZj0iaHR0cDovL25zLmFkb2JlLmNvbS90aWZmLzEuMC8iCiAgICAgICAgICAgIHhtbG5zOmV4aWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20vZXhpZi8xLjAvIj4KICAgICAgICAgPHhtcDpDcmVhdG9yVG9vbD5BZG9iZSBQaG90b3Nob3AgQ0MgMjAxNCAoV2luZG93cyk8L3htcDpDcmVhdG9yVG9vbD4KICAgICAgICAgPHhtcDpDcmVhdGVEYXRlPjIwMTctMDUtMjNUMTQ6NDk6MDctMDM6MDA8L3htcDpDcmVhdGVEYXRlPgogICAgICAgICA8eG1wOk1vZGlmeURhdGU+MjAxNy0wNS0yM1QxNDo1Mi0wMzowMDwveG1wOk1vZGlmeURhdGU+CiAgICAgICAgIDx4bXA6TWV0YWRhdGFEYXRlPjIwMTctMDUtMjNUMTQ6NTItMDM6MDA8L3htcDpNZXRhZGF0YURhdGU+CiAgICAgICAgIDxkYzpmb3JtYXQ+aW1hZ2UvcG5nPC9kYzpmb3JtYXQ+CiAgICAgICAgIDxwaG90b3Nob3A6Q29sb3JNb2RlPjM8L3Bob3Rvc2hvcDpDb2xvck1vZGU+CiAgICAgICAgIDx4bXBNTTpJbnN0YW5jZUlEPnhtcC5paWQ6N2EzZjljYmEtMGE0Ny1jYjQ4LTlmNzEtMTdiYjNhODljNzJiPC94bXBNTTpJbnN0YW5jZUlEPgogICAgICAgICA8eG1wTU06RG9jdW1lbnRJRD5hZG9iZTpkb2NpZDpwaG90b3Nob3A6N2MzZWRlMmItM2ZlMC0xMWU3LWJkZTQtZTE1MWMwYjZjNzcwPC94bXBNTTpEb2N1bWVudElEPgogICAgICAgICA8eG1wTU06T3JpZ2luYWxEb2N1bWVudElEPnhtcC5kaWQ6Nzc0MDI4NDgtNTI2MC05YTQ4LWI2M2MtNjhmNGQzYWUwNDEzPC94bXBNTTpPcmlnaW5hbERvY3VtZW50SUQ+CiAgICAgICAgIDx4bXBNTTpIaXN0b3J5PgogICAgICAgICAgICA8cmRmOlNlcT4KICAgICAgICAgICAgICAgPHJkZjpsaSByZGY6cGFyc2VUeXBlPSJSZXNvdXJjZSI+CiAgICAgICAgICAgICAgICAgIDxzdEV2dDphY3Rpb24+Y3JlYXRlZDwvc3RFdnQ6YWN0aW9uPgogICAgICAgICAgICAgICAgICA8c3RFdnQ6aW5zdGFuY2VJRD54bXAuaWlkOjc3NDAyODQ4LTUyNjAtOWE0OC1iNjNjLTY4ZjRkM2FlMDQxMzwvc3RFdnQ6aW5zdGFuY2VJRD4KICAgICAgICAgICAgICAgICAgPHN0RXZ0OndoZW4+MjAxNy0wNS0yM1QxNDo0OTowNy0wMzowMDwvc3RFdnQ6d2hlbj4KICAgICAgICAgICAgICAgICAgPHN0RXZ0OnNvZnR3YXJlQWdlbnQ+QWRvYmUgUGhvdG9zaG9wIENDIDIwMTQgKFdpbmRvd3MpPC9zdEV2dDpzb2Z0d2FyZUFnZW50PgogICAgICAgICAgICAgICA8L3JkZjpsaT4KICAgICAgICAgICAgICAgPHJkZjpsaSByZGY6cGFyc2VUeXBlPSJSZXNvdXJjZSI+CiAgICAgICAgICAgICAgICAgIDxzdEV2dDphY3Rpb24+c2F2ZWQ8L3N0RXZ0OmFjdGlvbj4KICAgICAgICAgICAgICAgICAgPHN0RXZ0Omluc3RhbmNlSUQ+eG1wLmlpZDo3YTNmOWNiYS0wYTQ3LWNiNDgtOWY3MS0xN2JiM2E4OWM3MmI8L3N0RXZ0Omluc3RhbmNlSUQ+CiAgICAgICAgICAgICAgICAgIDxzdEV2dDp3aGVuPjIwMTctMDUtMjNUMTQ6NTItMDM6MDA8L3N0RXZ0OndoZW4+CiAgICAgICAgICAgICAgICAgIDxzdEV2dDpzb2Z0d2FyZUFnZW50PkFkb2JlIFBob3Rvc2hvcCBDQyAyMDE0IChXaW5kb3dzKTwvc3RFdnQ6c29mdHdhcmVBZ2VudD4KICAgICAgICAgICAgICAgICAgPHN0RXZ0OmNoYW5nZWQ+Lzwvc3RFdnQ6Y2hhbmdlZD4KICAgICAgICAgICAgICAgPC9yZGY6bGk+CiAgICAgICAgICAgIDwvcmRmOlNlcT4KICAgICAgICAgPC94bXBNTTpIaXN0b3J5PgogICAgICAgICA8dGlmZjpPcmllbnRhdGlvbj4xPC90aWZmOk9yaWVudGF0aW9uPgogICAgICAgICA8dGlmZjpYUmVzb2x1dGlvbj43MjAwMDAvMTAwMDA8L3RpZmY6WFJlc29sdXRpb24+CiAgICAgICAgIDx0aWZmOllSZXNvbHV0aW9uPjcyMDAwMC8xMDAwMDwvdGlmZjpZUmVzb2x1dGlvbj4KICAgICAgICAgPHRpZmY6UmVzb2x1dGlvblVuaXQ+MjwvdGlmZjpSZXNvbHV0aW9uVW5pdD4KICAgICAgICAgPGV4aWY6Q29sb3JTcGFjZT42NTUzNTwvZXhpZjpDb2xvclNwYWNlPgogICAgICAgICA8ZXhpZjpQaXhlbFhEaW1lbnNpb24+NjQ8L2V4aWY6UGl4ZWxYRGltZW5zaW9uPgogICAgICAgICA8ZXhpZjpQaXhlbFlEaW1lbnNpb24+NjQ8L2V4aWY6UGl4ZWxZRGltZW5zaW9uPgogICAgICA8L3JkZjpEZXNjcmlwdGlvbj4KICAgPC9yZGY6UkRGPgo8L3g6eG1wbWV0YT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAKPD94cGFja2V0IGVuZD0idyI/PihLbGEAAAAgY0hSTQAAeiUAAICDAAD5/wAAgOkAAHUwAADqYAAAOpgAABdvkl/FRgAAAv5JREFUeNrsmz1oFEEUgL+Nd0Y0OWPwjyCCkAQMWMVWECGVNoIaLATBRsHTQkE4UEkheLWQLhEtLEQbEaxEEM8iwTKCl0JFRG0s7i5Ro2EsMgeXvc3u7O7d7s7uDCzcHW8f+76dee/Ne3OWEIIsjx4yPgwAA8AAMAAMgCyPnP0Hy7IAJoEbwHBK7FwEysDjtrxHCLHuAk4DIqXXqTZ7HQAsphhA1W6vZZ8SlmX9ATbbplBd06nfb/u+IoTodfUBwF8bgDJwR1MAt4FrNts8fUCtZcosae788sBKiz01u71eYfAfsEVjAH3ShsB5gCUpJnFt9yuGeStNidBVoAJ8lVcFuBJKo4cPqCmS7vbYC8y7hLd5KWMfu4BlNx+gA4Ac8F4hxi8Am2z37vQCoMMSuAwcVJAbk7Kp2wyd75KsFgC2AqM+5EflPWY73PTxugNYBj74kK/Ke5Qh6DADHviQvZ/UPGA7UAgRBhcChsFBuZ+JNQ+YBhpS180QidCci/FzGyRCsQN46PCw5RD6isAb+Vw1+bnoIh8rgJLLGytFtBmKDcBJhTV7MQIHGguAMWBVsUY32WUAO6IGUAC+4a9QOaH4JgcDAmhECaCC/0rtKnDYRecl1oqyS8CFJAOYIXi5ug6MOOi85yB7zgeAgagAXCd8zf4HMC71DQEvXGRPJAnAcTrbvHgL/FSQO5IEAMOsLztHef0GDimk4I1uVYS2Aa9irBr3Aq+BA2GUhAHwHNgX805xQKbDu4PWBIICmAaOJmS7PCQh9AUrmfj3AUWS2fl9R3uvsyBDbMec4ATJbn+/9AtAZQk0W0v7gWcJrx4dA576WuI+usMf0ecgxEzLywvVGfoiFT1Cv9Mgt+Szf3cDkPOYIL+AWeCshiXxKRkZ6sCeDde3wxGZpDREO9kbaPqxuhCioFtZPOxI1fmAjg8DwADIFpQeFWPzKQaQVwHwOcUAPqkAKKUYQEklEQI4w9px+ZGUGF4F7gJP2uw1/xs0YdAAMAAMAAPAAMjs+D8A/yy4+E330/QAAAAASUVORK5CYII=", - "metadata": {}, - "_type": "Embedded", - "path": "portrait (1).png", - "_media": "Image" - }, - "_zones": [ - { - "shape": "circle", - "coord_x": 15, - "coord_y": 15, - "points": "15", - "text": null, - "choice": 1, - "number": 1 - }, - { - "shape": "polygon", - "coord_x": 10, - "coord_y": 10, - "points": "40,10;10,40", - "text": null, - "choice": 2, - "number": 2 - }, - { - "shape": "rectangle", - "coord_x": 0, - "coord_y": 0, - "points": "30,30", - "text": null, - "choice": 3, - "number": 3 - } - ], - "highlight": true, - "__clsname__": "QDaDMarker" - } - ], - "_Category__categories": { - "second_cat": { - "_Category__questions": [ - { - "name": "Essai2", - "default_grade": 1.2, - "time_lim": 60, - "dbid": null, - "notes": "", - "_question": { - "formatting": "html", - "_text": [ - "Explain in few words the aim of this course.
" - ], - "bfile": [] - }, - "_remarks": { - "formatting": "html", - "_text": [ - "" - ], - "bfile": [] - }, - "_feedbacks": {}, - "_tags": [], - "_free_hints": [], - "rsp_format": "editor", - "rsp_required": true, - "lines": 3, - "min_words": null, - "max_words": null, - "attachments": 0, - "atts_required": false, - "max_bytes": 0, - "file_types": "", - "grader_info": { - "formatting": "html", - "_text": [ - "" - ], - "bfile": [] - }, - "template": { - "formatting": "html", - "_text": [ - "" - ], - "bfile": [] - }, - "__clsname__": "QEssay" - }, - { - "name": "html layout", - "default_grade": 1.3, - "time_lim": 60, - "dbid": null, - "notes": "", - "_question": { - "formatting": "html", - "_text": [ - "

a link here and an image \"\"and an equation \\( \\int_{2\\pi} x^2 \\mathrm{d} x \\)

centered text

flush left text

flush right text

In moodle editor, there is also exponent and indice and that

and svg file \"escargot\"

" - ], - "bfile": [] - }, - "_remarks": { - "formatting": "html", - "_text": [ - "" - ], - "bfile": [] - }, - "_feedbacks": { - "100.0": { - "formatting": "html", - "_text": [ - "Votre r\u00e9ponse est correcte." - ], - "bfile": [] - }, - "50.0": { - "formatting": "html", - "_text": [ - "Votre r\u00e9ponse est partiellement correcte." - ], - "bfile": [] - }, - "0.0": { - "formatting": "html", - "_text": [ - "Votre r\u00e9ponse est incorrecte." - ], - "bfile": [] - } - }, - "_tags": [], - "_free_hints": [], - "max_tries": 3, - "_fail_hints": [], - "_options": [ - { - "fraction": 100.0, - "formatting": "html", - "text": "

This is the good underlined answer.

", - "_feedback": { - "formatting": "html", - "_text": [ - "" - ], - "bfile": [] - } - }, - { - "fraction": 0.0, - "formatting": "html", - "text": "

This is one italic wrong answer.

", - "_feedback": { - "formatting": "html", - "_text": [ - "" - ], - "bfile": [] - } - }, - { - "fraction": 0.0, - "formatting": "html", - "text": "

This a wrong bold answer.

", - "_feedback": { - "formatting": "html", - "_text": [ - "" - ], - "bfile": [] - } - }, - { - "fraction": 0.0, - "formatting": "html", - "text": "

This a wrong strong answer.

", - "_feedback": { - "formatting": "html", - "_text": [ - "" - ], - "bfile": [] - } - }, - { - "fraction": 0.0, - "formatting": "html", - "text": "

This a wrong emphasis answer.

", - "_feedback": { - "formatting": "html", - "_text": [ - "" - ], - "bfile": [] - } - } - ], - "ordered": true, - "show_ans": true, - "shuffle": true, - "single": true, - "show_instr": false, - "numbering": "abc", - "use_dropdown": false, - "__clsname__": "QMultichoice" - }, - { - "name": "table", - "default_grade": 1.4, - "time_lim": 60, - "dbid": null, - "notes": "", - "_question": { - "formatting": "html", - "_text": [ - "

Test html table conversion to tex


\n

\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
table legend

weightwidthlength
sys11 kg
0.35 m
1 m
sys22 kg
-1.5 m
\n

\n

\n

" - ], - "bfile": [] - }, - "_remarks": { - "formatting": "html", - "_text": [ - "

global feedback

" - ], - "bfile": [] - }, - "_feedbacks": { - "100.0": { - "formatting": "html", - "_text": [ - "Votre r\u00e9ponse est correcte." - ], - "bfile": [] - }, - "50.0": { - "formatting": "html", - "_text": [ - "Votre r\u00e9ponse est partiellement correcte." - ], - "bfile": [] - }, - "0.0": { - "formatting": "html", - "_text": [ - "Votre r\u00e9ponse est incorrecte." - ], - "bfile": [] - } - }, - "_tags": [], - "_free_hints": [], - "max_tries": 3, - "_fail_hints": [], - "_options": [ - { - "fraction": 0.0, - "formatting": "html", - "text": "

wrong answer

", - "_feedback": { - "formatting": "html", - "_text": [ - "

this the feedback of question 1

" - ], - "bfile": [] - } - }, - { - "fraction": 100.0, - "formatting": "html", - "text": "

the good answer is obviously a weird table
\n

\n \n \n \n \n \n \n \n \n \n \n \n \n \n
stuff1
stuff2
\\(x^2\\)
bold text
\n

", - "_feedback": { - "formatting": "html", - "_text": [ - "" - ], - "bfile": [] - } - }, - { - "fraction": 0.0, - "formatting": "html", - "text": "

an other table, more simple

\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
FirstnameLastnameAge
JillSmith50
EveJackson94
", - "_feedback": { - "formatting": "html", - "_text": [ - "" - ], - "bfile": [] - } - } - ], - "ordered": true, - "show_ans": true, - "shuffle": true, - "single": true, - "show_instr": false, - "numbering": "abc", - "use_dropdown": false, - "__clsname__": "QMultichoice" - }, - { - "name": "code", - "default_grade": 1.5, - "time_lim": 60, - "dbid": null, - "notes": "", - "_question": { - "formatting": "html", - "_text": [ - "

This is inline code x = sqrt(3) and here and code block\n

\n      a = 2\n      b = a + 3.14\n      \n      
\n In html, it is generally recommanded to use <code> is an inline tag and <pre><code> tag for blocks.\n

" - ], - "bfile": [] - }, - "_remarks": { - "formatting": "html", - "_text": [ - "

global feedback

" - ], - "bfile": [] - }, - "_feedbacks": { - "100.0": { - "formatting": "html", - "_text": [ - "Votre r\u00e9ponse est correcte." - ], - "bfile": [] - }, - "50.0": { - "formatting": "html", - "_text": [ - "Votre r\u00e9ponse est partiellement correcte." - ], - "bfile": [] - }, - "0.0": { - "formatting": "html", - "_text": [ - "Votre r\u00e9ponse est incorrecte." - ], - "bfile": [] - } - }, - "_tags": [], - "_free_hints": [], - "max_tries": 3, - "_fail_hints": [], - "_options": [ - { - "fraction": 0.0, - "formatting": "html", - "text": "

wrong answer

", - "_feedback": { - "formatting": "html", - "_text": [ - "

this the feedback of question 1

" - ], - "bfile": [] - } - }, - { - "fraction": 100.0, - "formatting": "html", - "text": "

the good answer

", - "_feedback": { - "formatting": "html", - "_text": [ - "" - ], - "bfile": [] - } - } - ], - "ordered": true, - "show_ans": true, - "shuffle": true, - "single": true, - "show_instr": false, - "numbering": "abc", - "use_dropdown": false, - "__clsname__": "QMultichoice" - }, - { - "name": "ProblemDescription", - "default_grade": 0.0, - "time_lim": 60, - "dbid": null, - "notes": "", - "_question": { - "formatting": "html", - "_text": [ - "Provide a description of a problem that can be common to several questions. It is useful to define notation, pictures, equations \\(\\int_0^1 x \\mathrm{d} x = 0\\)..." - ], - "bfile": [] - }, - "_remarks": { - "formatting": "html", - "_text": [ - "" - ], - "bfile": [] - }, - "_feedbacks": {}, - "_tags": [], - "_free_hints": [], - "__clsname__": "QProblem" - } - ], - "_Category__categories": {}, - "_Category__name": "second_cat", - "metadata": {}, - "resources": {}, - "info": "" - }, - "num": { - "_Category__questions": [ - { - "name": "num:int", - "default_grade": 1.0, - "time_lim": 60, - "dbid": null, - "notes": "", - "_question": { - "formatting": "html", - "_text": [ - "

Find \\(x\\) such \\(2x-300=0\\) ?

Here \\(x\\) is an integer, test for exact match, only.

" - ], - "bfile": [] - }, - "_remarks": { - "formatting": "html", - "_text": [ - "" - ], - "bfile": [] - }, - "_feedbacks": {}, - "_tags": [], - "_free_hints": [], - "max_tries": 3, - "_fail_hints": [], - "_options": [ - { - "fraction": 100.0, - "formatting": "auto", - "text": "150", - "_feedback": { - "formatting": "html", - "_text": [ - "" - ], - "bfile": [] - }, - "tolerance": 0.0 - } - ], - "ordered": true, - "show_ans": false, - "shuffle": false, - "grading_type": "0", - "unit_penalty": "0.1000000", - "show_unit": "0", - "left": false, - "units": [ - { - "unit_name": "cm", - "multiplier": 1.0 - }, - { - "unit_name": "mm", - "multiplier": 0.5 - }, - { - "unit_name": "m", - "multiplier": 0.5 - } - ], - "__clsname__": "QNumerical" - }, - { - "name": "num:float", - "default_grade": 1.0, - "time_lim": 60, - "dbid": null, - "notes": "", - "_question": { - "formatting": "html", - "_text": [ - "

Give an approximated value for \\(\\pi\\) up to 3 digits?

" - ], - "bfile": [] - }, - "_remarks": { - "formatting": "html", - "_text": [ - "" - ], - "bfile": [] - }, - "_feedbacks": {}, - "_tags": [], - "_free_hints": [], - "max_tries": 3, - "_fail_hints": [], - "_options": [ - { - "fraction": 100.0, - "formatting": "auto", - "text": "3.141592653589793", - "_feedback": { - "formatting": "html", - "_text": [ - "" - ], - "bfile": [] - }, - "tolerance": 0.001 - } - ], - "ordered": true, - "show_ans": false, - "shuffle": false, - "grading_type": "0", - "unit_penalty": "0.1000000", - "show_unit": "3", - "left": false, - "units": [], - "__clsname__": "QNumerical" - }, - { - "name": "num:2ans", - "default_grade": 1.0, - "time_lim": 60, - "dbid": null, - "notes": "", - "_question": { - "formatting": "html", - "_text": [ - "

Let \\(z=3+2\\mathrm{i}\\). What is the imaginary part ?

" - ], - "bfile": [] - }, - "_remarks": { - "formatting": "html", - "_text": [ - "" - ], - "bfile": [] - }, - "_feedbacks": {}, - "_tags": [], - "_free_hints": [], - "max_tries": 3, - "_fail_hints": [], - "_options": [ - { - "fraction": 100.0, - "formatting": "auto", - "text": "2", - "_feedback": { - "formatting": "html", - "_text": [ - "" - ], - "bfile": [] - }, - "tolerance": 0.0 - }, - { - "fraction": 0.0, - "formatting": "auto", - "text": "3", - "_feedback": { - "formatting": "html", - "_text": [ - "

No, this is the real part

" - ], - "bfile": [] - }, - "tolerance": 0.0 - } - ], - "ordered": true, - "show_ans": false, - "shuffle": false, - "grading_type": "0", - "unit_penalty": "0.1000000", - "show_unit": "3", - "left": false, - "units": [], - "__clsname__": "QNumerical" - }, - { - "name": "num:2rounding", - "default_grade": 1.0, - "time_lim": 60, - "dbid": null, - "notes": "", - "_question": { - "formatting": "html", - "_text": [ - "

Give an approximated value for \\(\\sqrt{2}\\) up to 3 digits ?

" - ], - "bfile": [] - }, - "_remarks": { - "formatting": "html", - "_text": [ - "" - ], - "bfile": [] - }, - "_feedbacks": {}, - "_tags": [], - "_free_hints": [], - "max_tries": 3, - "_fail_hints": [], - "_options": [ - { - "fraction": 100.0, - "formatting": "auto", - "text": "1.4142135623730951", - "_feedback": { - "formatting": "html", - "_text": [ - "" - ], - "bfile": [] - }, - "tolerance": 0.001 - }, - { - "fraction": 50.0, - "formatting": "auto", - "text": "1.4142135623730951", - "_feedback": { - "formatting": "html", - "_text": [ - "

Be careful with rounding.

" - ], - "bfile": [] - }, - "tolerance": 0.1 - } - ], - "ordered": true, - "show_ans": false, - "shuffle": false, - "grading_type": "0", - "unit_penalty": "0.1000000", - "show_unit": "3", - "left": false, - "units": [], - "__clsname__": "QNumerical" - } - ], - "_Category__categories": {}, - "_Category__name": "num", - "metadata": {}, - "resources": {}, - "info": "" - }, - "calculated": { - "_Category__questions": [ - { - "name": "Calculated", - "default_grade": 1.6, - "time_lim": 60, - "dbid": null, - "notes": "", - "_question": { - "formatting": "html", - "_text": [ - "

This is an example of a calculated question. What you see varies from student to student but the equation itself is the same.

\n

In this equation, solve for x:

\n

{cof}x + {add} = {ans}

" - ], - "bfile": [] - }, - "_remarks": { - "formatting": "html", - "_text": [ - "" - ], - "bfile": [] - }, - "_feedbacks": {}, - "_tags": [], - "_free_hints": [], - "max_tries": 3, - "_fail_hints": [], - "_options": [ - { - "fraction": 100.0, - "formatting": "auto", - "text": "({ans} - {add})/{cof}", - "_feedback": { - "formatting": "html", - "_text": [ - "" - ], - "bfile": [] - }, - "tolerance": 0.05, - "ttype": "1", - "aformat": "1", - "alength": 2 - } - ], - "ordered": true, - "show_ans": false, - "shuffle": false, - "grading_type": "0", - "unit_penalty": "0.1000000", - "show_unit": "3", - "left": false, - "synchronize": "0", - "units": [], - "datasets": [ - { - "status": "private", - "name": "ans", - "ctype": "calculated", - "distribution": "uniform", - "minimum": "10", - "maximum": "20", - "decimals": "0", - "items": { - "1": 15.0, - "2": 11.0, - "3": 14.0, - "4": 17.0, - "5": 15.0, - "6": 15.0, - "7": 12.0, - "8": 14.0, - "9": 19.0, - "10": 11.0, - "11": 15.0, - "12": 11.0, - "13": 16.0, - "14": 12.0, - "15": 13.0, - "16": 14.0, - "17": 13.0, - "18": 17.0, - "19": 11.0, - "20": 14.0, - "21": 16.0, - "22": 17.0, - "23": 14.0, - "24": 12.0, - "25": 15.0, - "26": 18.0, - "27": 12.0, - "28": 20.0, - "29": 12.0, - "30": 16.0, - "31": 11.0, - "32": 15.0, - "33": 15.0, - "34": 11.0, - "35": 19.0, - "36": 12.0, - "37": 14.0, - "38": 19.0, - "39": 14.0, - "40": 20.0, - "41": 20.0, - "42": 16.0, - "43": 11.0, - "44": 13.0, - "45": 16.0, - "46": 19.0, - "47": 16.0, - "48": 10.0, - "49": 16.0, - "50": 15.0, - "51": 17.0, - "52": 19.0, - "53": 15.0, - "54": 18.0, - "55": 20.0, - "56": 14.0, - "57": 13.0, - "58": 20.0, - "59": 15.0, - "60": 10.0, - "61": 18.0, - "62": 18.0, - "63": 12.0, - "64": 16.0, - "65": 14.0, - "66": 12.0, - "67": 16.0, - "68": 14.0, - "69": 19.0, - "70": 17.0, - "71": 16.0, - "72": 19.0, - "73": 15.0, - "74": 10.0, - "75": 11.0, - "76": 12.0, - "77": 18.0, - "78": 15.0, - "79": 16.0, - "80": 17.0, - "81": 15.0, - "82": 17.0, - "83": 17.0, - "84": 11.0, - "85": 12.0, - "86": 13.0, - "87": 10.0, - "88": 13.0, - "89": 17.0, - "90": 14.0, - "91": 14.0, - "92": 20.0, - "93": 18.0, - "94": 17.0, - "95": 11.0, - "96": 11.0, - "97": 13.0, - "98": 17.0, - "99": 16.0, - "100": 18.0 - } - }, - { - "status": "private", - "name": "add", - "ctype": "calculated", - "distribution": "uniform", - "minimum": "1", - "maximum": "10", - "decimals": "0", - "items": { - "1": 4.1, - "2": 2.9, - "3": 4.9, - "4": 1.2, - "5": 3.3, - "6": 7.2, - "7": 7.7, - "8": 4.9, - "9": 3.7, - "10": 5.0, - "11": 6.4, - "12": 5.9, - "13": 4.4, - "14": 6.7, - "15": 9.1, - "16": 1.6, - "17": 6.0, - "18": 1.2, - "19": 7.3, - "20": 4.8, - "21": 1.2, - "22": 7.5, - "23": 7.9, - "24": 8.0, - "25": 6.8, - "26": 4.8, - "27": 9.4, - "28": 1.9, - "29": 2.6, - "30": 4.9, - "31": 3.2, - "32": 4.3, - "33": 5.3, - "34": 2.6, - "35": 6.4, - "36": 4.5, - "37": 3.8, - "38": 2.1, - "39": 6.6, - "40": 8.4, - "41": 8.7, - "42": 7.5, - "43": 3.5, - "44": 3.8, - "45": 3.1, - "46": 3.5, - "47": 1.4, - "48": 9.5, - "49": 6.5, - "50": 7.2, - "51": 9.2, - "52": 5.9, - "53": 1.3, - "54": 10.0, - "55": 1.7, - "56": 5.1, - "57": 2.7, - "58": 9.5, - "59": 8.9, - "60": 8.6, - "61": 4.5, - "62": 2.4, - "63": 8.0, - "64": 8.4, - "65": 2.2, - "66": 1.1, - "67": 4.9, - "68": 3.3, - "69": 1.2, - "70": 3.8, - "71": 9.0, - "72": 8.3, - "73": 9.9, - "74": 2.7, - "75": 6.4, - "76": 5.7, - "77": 1.4, - "78": 3.6, - "79": 2.1, - "80": 7.7, - "81": 6.7, - "82": 5.6, - "83": 8.7, - "84": 3.1, - "85": 3.3, - "86": 9.9, - "87": 1.9, - "88": 5.4, - "89": 7.6, - "90": 3.6, - "91": 1.1, - "92": 3.7, - "93": 1.1, - "94": 8.8, - "95": 9.7, - "96": 2.8, - "97": 1.2, - "98": 7.7, - "99": 3.9, - "100": 8.7 - } - }, - { - "status": "private", - "name": "cof", - "ctype": "calculated", - "distribution": "uniform", - "minimum": "1", - "maximum": "10", - "decimals": "0", - "items": { - "1": 8.0, - "2": 10.0, - "3": 4.0, - "4": 3.0, - "5": 5.0, - "6": 6.0, - "7": 7.0, - "8": 9.0, - "9": 8.0, - "10": 4.0, - "11": 1.0, - "12": 7.0, - "13": 2.0, - "14": 2.0, - "15": 1.0, - "16": 8.0, - "17": 3.0, - "18": 9.0, - "19": 4.0, - "20": 9.0, - "21": 1.0, - "22": 9.0, - "23": 6.0, - "24": 2.0, - "25": 3.0, - "26": 7.0, - "27": 4.0, - "28": 2.0, - "29": 8.0, - "30": 10.0, - "31": 4.0, - "32": 2.0, - "33": 3.0, - "34": 7.0, - "35": 8.0, - "36": 4.0, - "37": 10.0, - "38": 3.0, - "39": 1.0, - "40": 6.0, - "41": 3.0, - "42": 2.0, - "43": 5.0, - "44": 5.0, - "45": 5.0, - "46": 8.0, - "47": 6.0, - "48": 4.0, - "49": 3.0, - "50": 2.0, - "51": 5.0, - "52": 3.0, - "53": 3.0, - "54": 9.0, - "55": 5.0, - "56": 6.0, - "57": 1.0, - "58": 2.0, - "59": 8.0, - "60": 8.0, - "61": 3.0, - "62": 4.0, - "63": 4.0, - "64": 2.0, - "65": 6.0, - "66": 7.0, - "67": 9.0, - "68": 7.0, - "69": 9.0, - "70": 5.0, - "71": 3.0, - "72": 10.0, - "73": 9.0, - "74": 6.0, - "75": 10.0, - "76": 10.0, - "77": 8.0, - "78": 6.0, - "79": 7.0, - "80": 9.0, - "81": 6.0, - "82": 9.0, - "83": 9.0, - "84": 7.0, - "85": 2.0, - "86": 10.0, - "87": 8.0, - "88": 5.0, - "89": 3.0, - "90": 4.0, - "91": 5.0, - "92": 3.0, - "93": 3.0, - "94": 6.0, - "95": 3.0, - "96": 3.0, - "97": 7.0, - "98": 8.0, - "99": 3.0, - "100": 4.0 - } - } - ], - "__clsname__": "QCalculated" - }, - { - "name": "Calcul\u00e9e", - "default_grade": 1.7, - "time_lim": 60, - "dbid": null, - "notes": "", - "_question": { - "formatting": "html", - "_text": [ - "

Quelle est l'aire d'un rectangle de longueur {a} et de largeur {b} ?

Formula in the text {={a}*{b}}. It is also possible to use float {={a}*({b}+2.3)/10.0}.

Accolade should not be used for number {=2.5*2.2}


" - ], - "bfile": [] - }, - "_remarks": { - "formatting": "html", - "_text": [ - "" - ], - "bfile": [] - }, - "_feedbacks": { - "100.0": { - "formatting": "html", - "_text": [ - "Votre r\u00e9ponse est correcte." - ], - "bfile": [] - }, - "50.0": { - "formatting": "html", - "_text": [ - "Votre r\u00e9ponse est partiellement correcte." - ], - "bfile": [] - }, - "0.0": { - "formatting": "html", - "_text": [ - "Votre r\u00e9ponse est incorrecte." - ], - "bfile": [] - } - }, - "_tags": [], - "_free_hints": [], - "max_tries": 3, - "_fail_hints": [], - "_options": [ - { - "fraction": 100.0, - "formatting": "auto", - "text": "{={a}*{b}}", - "_feedback": { - "formatting": "html", - "_text": [ - "

Well done!

" - ], - "bfile": [] - }, - "tolerance": 0.01, - "ttype": "1", - "aformat": "1", - "alength": 2 - }, - { - "fraction": 0.0, - "formatting": "auto", - "text": "{={a}+{b}}", - "_feedback": { - "formatting": "html", - "_text": [ - "" - ], - "bfile": [] - }, - "tolerance": 0.01, - "ttype": "1", - "aformat": "1", - "alength": 2 - } - ], - "ordered": true, - "show_ans": false, - "shuffle": true, - "synchronize": "0", - "single": true, - "numbering": "abc", - "datasets": [ - { - "status": "private", - "name": "a", - "ctype": "calculatedsimple", - "distribution": "uniform", - "minimum": "1", - "maximum": "10", - "decimals": "1", - "items": { - "1": 6.7, - "2": 5.6, - "3": 6.5 - } - }, - { - "status": "private", - "name": "b", - "ctype": "calculatedsimple", - "distribution": "uniform", - "minimum": "1", - "maximum": "10", - "decimals": "1", - "items": { - "1": 8.8, - "2": 3.2, - "3": 4.3, - "11": 5.4 - } - } - ], - "__clsname__": "QCalculatedMC" - }, - { - "name": "CheckComputation", - "default_grade": 1.8, - "time_lim": 60, - "dbid": null, - "notes": "", - "_question": { - "formatting": "html", - "_text": [ - "

Moodle and fp latex package syntax is not always equivalent. Here some test for pathological cases.

Let {x} and {y} some real number.

  • argument of 'pow' function are in a different order \"pow({x},2)\" = {=pow({x},2)}
  • the 'sqrt' function doesn't exist, need 'root(nth, x)' in fp, \"sqrt(({x}-{y})*({x}+{y}))\" = {=sqrt(({x}-{y})*({x}+{y}))}
  • 'pi' is a function in moodle, \"sin(1.5*pi())\" = {=sin(1.5*pi())}
  • test with '- unary' expression \"-{x}+(-{y}+2)\" = {=-{x}+(-{y}+2)}
  • test min-max \"max({x},{y})\" = {=max({x},{y})}
  • test nested \"log(log({y}+{x})/log({y}+{x}))\" = {=log(log({y}+{x})/log({y}+{x}))}

test formatting on variable {x}

" - ], - "bfile": [] - }, - "_remarks": { - "formatting": "html", - "_text": [ - "" - ], - "bfile": [] - }, - "_feedbacks": { - "100.0": { - "formatting": "html", - "_text": [ - "Votre r\u00e9ponse est correcte." - ], - "bfile": [] - }, - "50.0": { - "formatting": "html", - "_text": [ - "Votre r\u00e9ponse est partiellement correcte." - ], - "bfile": [] - }, - "0.0": { - "formatting": "html", - "_text": [ - "Votre r\u00e9ponse est incorrecte." - ], - "bfile": [] - } - }, - "_tags": [], - "_free_hints": [], - "max_tries": 3, - "_fail_hints": [], - "_options": [ - { - "fraction": 100.0, - "formatting": "auto", - "text": "{={x}}", - "_feedback": { - "formatting": "html", - "_text": [ - "" - ], - "bfile": [] - }, - "tolerance": 0.01, - "ttype": "1", - "aformat": "1", - "alength": 2 - }, - { - "fraction": 0.0, - "formatting": "auto", - "text": "{=({y}+{x})/({y}+{x})}", - "_feedback": { - "formatting": "html", - "_text": [ - "" - ], - "bfile": [] - }, - "tolerance": 0.01, - "ttype": "1", - "aformat": "1", - "alength": 2 - }, - { - "fraction": 0.0, - "formatting": "auto", - "text": "{=log({y}+{x})/log({y}+{x})}", - "_feedback": { - "formatting": "html", - "_text": [ - "" - ], - "bfile": [] - }, - "tolerance": 0.01, - "ttype": "1", - "aformat": "1", - "alength": 2 - } - ], - "ordered": true, - "show_ans": false, - "shuffle": true, - "synchronize": "0", - "single": true, - "numbering": "abc", - "datasets": [ - { - "status": "private", - "name": "x", - "ctype": "calculatedsimple", - "distribution": "uniform", - "minimum": "1", - "maximum": "10", - "decimals": "1", - "items": { - "1": 5.7 - } - }, - { - "status": "private", - "name": "y", - "ctype": "calculatedsimple", - "distribution": "uniform", - "minimum": "1", - "maximum": "10", - "decimals": "1", - "items": { - "1": 5.5 - } - } - ], - "__clsname__": "QCalculatedMC" - }, - { - "name": "Simple calculated question", - "default_grade": 1.9, - "time_lim": 60, - "dbid": null, - "notes": "", - "_question": { - "formatting": "html", - "_text": [ - "

This is an example of a simple calculated question. It's similar to the calculated question but with fewer settings :)

\n

You won a cool Moodle cooler box at a Moodle Moot and wonder how much it will hold. What is the volume of your cooler box if its height is {h} its length is {l} and its width is {w}?

" - ], - "bfile": [] - }, - "_remarks": { - "formatting": "html", - "_text": [ - "" - ], - "bfile": [] - }, - "_feedbacks": {}, - "_tags": [], - "_free_hints": [], - "max_tries": 0, - "_fail_hints": [ - { - "formatting": "html", - "text": "

Go back to basic mathematics. How do you calculate the volume? You could always google it and come back!

", - "show_correct": false, - "clear_wrong": false, - "state_incorrect": false - }, - { - "formatting": "html", - "text": "

Ok -try multiplying them together.

", - "show_correct": false, - "clear_wrong": false, - "state_incorrect": false - } - ], - "_options": [ - { - "fraction": 100.0, - "formatting": "auto", - "text": "{l}*{w}*{h}", - "_feedback": { - "formatting": "html", - "_text": [ - "

Yes! You calculated the volume by multiplying them together. So will it hold all your Moodle mojitos?

" - ], - "bfile": [] - }, - "tolerance": 0.0, - "ttype": "1", - "aformat": "1", - "alength": 0 - }, - { - "fraction": 0.0, - "formatting": "auto", - "text": "*", - "_feedback": { - "formatting": "html", - "_text": [ - "

Do you know how to work out the volume?

" - ], - "bfile": [] - }, - "tolerance": 0.0, - "ttype": "1", - "aformat": "1", - "alength": 0 - } - ], - "ordered": true, - "show_ans": false, - "shuffle": false, - "grading_type": "0", - "unit_penalty": "0.1000000", - "show_unit": "2", - "left": false, - "synchronize": "0", - "units": [ - { - "unit_name": "mm", - "multiplier": 1.0 - }, - { - "unit_name": "cm", - "multiplier": 0.5 - }, - { - "unit_name": "dm", - "multiplier": 0.4 - }, - { - "unit_name": "m", - "multiplier": 0.2 - }, - { - "unit_name": "km", - "multiplier": 0.1 - } - ], - "datasets": [ - { - "status": "private", - "name": "l", - "ctype": "calculatedsimple", - "distribution": "uniform", - "minimum": "1.0", - "maximum": "10.0", - "decimals": "1", - "items": { - "1": 2.5, - "2": 5.4, - "3": 2.0, - "4": 2.9, - "5": 3.6, - "6": 4.0, - "7": 4.4, - "8": 6.4, - "9": 4.0, - "10": 1.9, - "11": 7.6, - "12": 9.9, - "13": 9.2, - "14": 2.3, - "15": 3.9, - "16": 9.0, - "17": 2.0, - "18": 8.2, - "19": 2.2, - "20": 8.5 - } - }, - { - "status": "private", - "name": "w", - "ctype": "calculatedsimple", - "distribution": "uniform", - "minimum": "1.0", - "maximum": "10.0", - "decimals": "1", - "items": { - "1": 7.5, - "2": 2.3, - "3": 3.0, - "4": 6.2, - "5": 5.5, - "6": 3.0, - "7": 5.7, - "8": 5.9, - "9": 9.7, - "10": 2.0, - "11": 6.7, - "12": 7.0, - "13": 9.9, - "14": 7.0, - "15": 1.2, - "16": 4.7, - "17": 8.0, - "18": 5.0, - "19": 2.3, - "20": 1.6 - } - }, - { - "status": "private", - "name": "h", - "ctype": "calculatedsimple", - "distribution": "uniform", - "minimum": "1.0", - "maximum": "10.0", - "decimals": "1", - "items": { - "1": 2.3, - "2": 2.0, - "3": 5.2, - "4": 5.6, - "5": 6.9, - "6": 6.3, - "7": 6.9, - "8": 5.4, - "9": 4.6, - "10": 2.9, - "11": 9.2, - "12": 6.4, - "13": 6.7, - "14": 6.2, - "15": 9.3, - "16": 3.8, - "17": 7.3, - "18": 8.5, - "19": 1.8, - "20": 7.8 - } - } - ], - "__clsname__": "QCalculated" - }, - { - "name": "Cloze", - "default_grade": 1.0, - "time_lim": 60, - "dbid": null, - "notes": "", - "_question": { - "formatting": "html", - "_text": [ - "

This is an example of an embedded answers (Cloze) type question. This is a multiple choice question but there are other types you can use too.

\n

The first Moodle Research conference was held in ", - { - "cformat": "MULTICHOICE", - "grade": 1, - "opts": [ - { - "fraction": 0.0, - "formatting": "plain_text", - "text": "Sousse, Tunisia", - "_feedback": { - "formatting": "plain_text", - "_text": [ - "That was the second" - ], - "bfile": [] - } - }, - { - "fraction": 0.0, - "formatting": "plain_text", - "text": "California, USA", - "_feedback": { - "formatting": "plain_text", - "_text": [ - "That was the third" - ], - "bfile": [] - } - }, - { - "fraction": 100.0, - "formatting": "plain_text", - "text": "Crete, Greece", - "_feedback": { - "formatting": "plain_text", - "_text": [ - "Correct!" - ], - "bfile": [] - } - }, - { - "fraction": 50.0, - "formatting": "plain_text", - "text": "Greece", - "_feedback": { - "formatting": "plain_text", - "_text": [ - "Yes but not close enough so you only get half the credit." - ], - "bfile": [] - } - } - ] - }, - "

" - ], - "bfile": [] - }, - "_remarks": { - "formatting": "html", - "_text": [ - "" - ], - "bfile": [] - }, - "_feedbacks": {}, - "_tags": [], - "_free_hints": [], - "max_tries": 3, - "_fail_hints": [], - "_options": [ - { - "cformat": "MULTICHOICE", - "grade": 1, - "opts": [ - { - "fraction": 0.0, - "formatting": "plain_text", - "text": "Sousse, Tunisia", - "_feedback": { - "formatting": "plain_text", - "_text": [ - "That was the second" - ], - "bfile": [] - } - }, - { - "fraction": 0.0, - "formatting": "plain_text", - "text": "California, USA", - "_feedback": { - "formatting": "plain_text", - "_text": [ - "That was the third" - ], - "bfile": [] - } - }, - { - "fraction": 100.0, - "formatting": "plain_text", - "text": "Crete, Greece", - "_feedback": { - "formatting": "plain_text", - "_text": [ - "Correct!" - ], - "bfile": [] - } - }, - { - "fraction": 50.0, - "formatting": "plain_text", - "text": "Greece", - "_feedback": { - "formatting": "plain_text", - "_text": [ - "Yes but not close enough so you only get half the credit." - ], - "bfile": [] - } - } - ] - } - ], - "ordered": true, - "show_ans": false, - "shuffle": false, - "__clsname__": "QEmbedded" - } - ], - "_Category__categories": {}, - "_Category__name": "calculated", - "metadata": {}, - "resources": {}, - "info": "" - }, - "alternative-format": { - "_Category__questions": [ - { - "name": "markdown", - "default_grade": 1.0, - "time_lim": 60, - "dbid": null, - "notes": "", - "_question": { - "formatting": "markdown", - "_text": [ - "Go to your editor preferences (via the user menu) and select 'Plain text area',\n then in the question box, select Markdown format.\n\n # Main title\n\n ## Basic text formatting\n\n a *single* word\n ***a sequence of words***\n in**distinguish**able\n\n - top level bullet one\n * sub-bullet \n * sub-bullet 2 \n - top level bullet two\n\n Now numbered list\n 1. numbered point one\n 2. numbered point two\n\n ## More advanced features\n test for link [here](https://docs.moodle.org/310/en/Markdown)\n\n Are table supported ?\n\n Markdown | Less | Pretty\n --- | --- | ---\n *Still* | `renders` | **nicely**\n 1 | 2 | 3\n\n > Blockquotes are very handy in email to emulate reply text.\n > This line is part of the same quote.\n\n ```python\n import markdown\n markdown.markdown(text, extensions=['extra'])\n ```" - ], - "bfile": [] - }, - "_remarks": { - "formatting": "auto", - "_text": [ - "" - ], - "bfile": [] - }, - "_feedbacks": { - "100.0": { - "formatting": "html", - "_text": [ - "Your answer is correct." - ], - "bfile": [] - }, - "50.0": { - "formatting": "html", - "_text": [ - "Your answer is partially correct." - ], - "bfile": [] - }, - "0.0": { - "formatting": "html", - "_text": [ - "Your answer is incorrect." - ], - "bfile": [] - } - }, - "_tags": [], - "_free_hints": [], - "max_tries": 3, - "_fail_hints": [], - "_options": [ - { - "fraction": 0.0, - "formatting": "markdown", - "text": "**yes**", - "_feedback": { - "formatting": "html", - "_text": [ - "" - ], - "bfile": [] - } - }, - { - "fraction": 0.0, - "formatting": "html", - "text": "non", - "_feedback": { - "formatting": "html", - "_text": [ - "" - ], - "bfile": [] - } - }, - { - "fraction": 100.0, - "formatting": "html", - "text": "perhaps", - "_feedback": { - "formatting": "html", - "_text": [ - "" - ], - "bfile": [] - } - } - ], - "ordered": true, - "show_ans": true, - "shuffle": true, - "single": true, - "show_instr": false, - "numbering": "abc", - "use_dropdown": false, - "__clsname__": "QMultichoice" - }, - { - "name": "plain text", - "default_grade": 1.0, - "time_lim": 60, - "dbid": null, - "notes": "", - "_question": { - "formatting": "plain_text", - "_text": [ - "Nothing but plain text" - ], - "bfile": [] - }, - "_remarks": { - "formatting": "plain_text", - "_text": [ - "" - ], - "bfile": [] - }, - "_feedbacks": { - "100.0": { - "formatting": "html", - "_text": [ - "Your answer is correct." - ], - "bfile": [] - }, - "50.0": { - "formatting": "html", - "_text": [ - "Your answer is partially correct." - ], - "bfile": [] - }, - "0.0": { - "formatting": "html", - "_text": [ - "Your answer is incorrect." - ], - "bfile": [] - } - }, - "_tags": [], - "_free_hints": [], - "max_tries": 3, - "_fail_hints": [], - "_options": [ - { - "fraction": 100.0, - "formatting": "plain_text", - "text": "yes", - "_feedback": { - "formatting": "html", - "_text": [ - "" - ], - "bfile": [] - } - }, - { - "fraction": 0.0, - "formatting": "markdown", - "text": "**no**", - "_feedback": { - "formatting": "html", - "_text": [ - "" - ], - "bfile": [] - } - }, - { - "fraction": 0.0, - "formatting": "html", - "text": "no in html", - "_feedback": { - "formatting": "html", - "_text": [ - "" - ], - "bfile": [] - } - } - ], - "ordered": true, - "show_ans": true, - "shuffle": true, - "single": true, - "show_instr": false, - "numbering": "abc", - "use_dropdown": false, - "__clsname__": "QMultichoice" - }, - { - "name": "h1", - "default_grade": 1.11, - "time_lim": 60, - "dbid": null, - "notes": "", - "_question": { - "formatting": "html", - "_text": [ - "

Match the cool Moodle features with the version in which they first appeared:

" - ], - "bfile": [] - }, - "_remarks": { - "formatting": "html", - "_text": [ - "" - ], - "bfile": [] - }, - "_feedbacks": { - "100.0": { - "formatting": "html", - "_text": [ - "

Your answer is correct.

" - ], - "bfile": [] - }, - "50.0": { - "formatting": "html", - "_text": [ - "

Your answer is partially correct.

" - ], - "bfile": [] - }, - "0.0": { - "formatting": "html", - "_text": [ - "

Your answer is incorrect.

" - ], - "bfile": [] - } - }, - "_tags": [], - "_free_hints": [], - "max_tries": 3, - "_fail_hints": [], - "_options": [ - { - "text": "

Drag and drop files

", - "answer": "Moodle 2.3", - "formatting": "html" - }, - { - "text": "

Groupings

", - "answer": "Moodle 1.9", - "formatting": "html" - }, - { - "text": "

Repositories

", - "answer": "Moodle 2.0", - "formatting": "html" - }, - { - "text": "", - "answer": "Moodle 2.5", - "formatting": "html" - } - ], - "ordered": true, - "show_ans": true, - "shuffle": true, - "__clsname__": "QMatching" - }, - { - "name": "h3", - "default_grade": 1.12, - "time_lim": 60, - "dbid": null, - "notes": "", - "_question": { - "formatting": "html", - "_text": [ - "

Type in the name of the ISLAND where the first ever Moodle Research conference was held.

" - ], - "bfile": [] - }, - "_remarks": { - "formatting": "html", - "_text": [ - "" - ], - "bfile": [] - }, - "_feedbacks": {}, - "_tags": [], - "_free_hints": [], - "max_tries": 3, - "_fail_hints": [], - "_options": [ - { - "fraction": 100.0, - "formatting": "auto", - "text": "Crete", - "_feedback": { - "formatting": "html", - "_text": [ - "

Correct. Well done! More information on Moodle Research conferences on the Moodle Research site.

" - ], - "bfile": [] - } - }, - { - "fraction": 0.0, - "formatting": "auto", - "text": "Greece", - "_feedback": { - "formatting": "html", - "_text": [ - "

That is the correct country, but we want the island.

" - ], - "bfile": [] - } - } - ], - "ordered": true, - "show_ans": false, - "shuffle": false, - "use_case": "0", - "__clsname__": "QShortAnswer" - }, - { - "name": "QName", - "default_grade": 1.0, - "time_lim": 60, - "dbid": null, - "notes": "", - "_question": { - "formatting": "html", - "_text": [ - "

Complete test

" - ], - "bfile": [] - }, - "_remarks": { - "formatting": "html", - "_text": [ - "

feeds

" - ], - "bfile": [] - }, - "_feedbacks": { - "100.0": { - "formatting": "html", - "_text": [ - "Your answer is correct." - ], - "bfile": [] - }, - "50.0": { - "formatting": "html", - "_text": [ - "Your answer is partially correct." - ], - "bfile": [] - }, - "0.0": { - "formatting": "html", - "_text": [ - "Your answer is incorrect." - ], - "bfile": [] - } - }, - "_tags": [], - "_free_hints": [], - "max_tries": 3, - "_fail_hints": [], - "_options": [ - { - "number": 1, - "text": "", - "no_of_drags": 1, - "group": 1, - "image": { - "data": "iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAAACXBIWXMAAAjzAAAI8wF7DtCyAAA57GlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4KPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNS41LWMwMjEgNzkuMTU1NzcyLCAyMDE0LzAxLzEzLTE5OjQ0OjAwICAgICAgICAiPgogICA8cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPgogICAgICA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIgogICAgICAgICAgICB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iCiAgICAgICAgICAgIHhtbG5zOmRjPSJodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xLyIKICAgICAgICAgICAgeG1sbnM6cGhvdG9zaG9wPSJodHRwOi8vbnMuYWRvYmUuY29tL3Bob3Rvc2hvcC8xLjAvIgogICAgICAgICAgICB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIKICAgICAgICAgICAgeG1sbnM6c3RFdnQ9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZUV2ZW50IyIKICAgICAgICAgICAgeG1sbnM6dGlmZj0iaHR0cDovL25zLmFkb2JlLmNvbS90aWZmLzEuMC8iCiAgICAgICAgICAgIHhtbG5zOmV4aWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20vZXhpZi8xLjAvIj4KICAgICAgICAgPHhtcDpDcmVhdG9yVG9vbD5BZG9iZSBQaG90b3Nob3AgQ0MgMjAxNCAoV2luZG93cyk8L3htcDpDcmVhdG9yVG9vbD4KICAgICAgICAgPHhtcDpDcmVhdGVEYXRlPjIwMTctMDUtMjFUMTM6MzM6MDUtMDM6MDA8L3htcDpDcmVhdGVEYXRlPgogICAgICAgICA8eG1wOk1vZGlmeURhdGU+MjAxNy0wNS0yMVQxMzo1NTo1NS0wMzowMDwveG1wOk1vZGlmeURhdGU+CiAgICAgICAgIDx4bXA6TWV0YWRhdGFEYXRlPjIwMTctMDUtMjFUMTM6NTU6NTUtMDM6MDA8L3htcDpNZXRhZGF0YURhdGU+CiAgICAgICAgIDxkYzpmb3JtYXQ+aW1hZ2UvcG5nPC9kYzpmb3JtYXQ+CiAgICAgICAgIDxwaG90b3Nob3A6Q29sb3JNb2RlPjM8L3Bob3Rvc2hvcDpDb2xvck1vZGU+CiAgICAgICAgIDx4bXBNTTpJbnN0YW5jZUlEPnhtcC5paWQ6MjM3MTg3NTItYzdmMi0yNzQwLTg5Y2QtNGQ3YWI2ODBjZWJjPC94bXBNTTpJbnN0YW5jZUlEPgogICAgICAgICA8eG1wTU06RG9jdW1lbnRJRD5hZG9iZTpkb2NpZDpwaG90b3Nob3A6NGU1MGNmNDEtM2U0Ni0xMWU3LTliMDQtYjY3NjhiODQyYmJmPC94bXBNTTpEb2N1bWVudElEPgogICAgICAgICA8eG1wTU06T3JpZ2luYWxEb2N1bWVudElEPnhtcC5kaWQ6MGI2YmZhOGItZTYzOS00MzRhLWI1ZDMtODZhZGQyZDJiZDdlPC94bXBNTTpPcmlnaW5hbERvY3VtZW50SUQ+CiAgICAgICAgIDx4bXBNTTpIaXN0b3J5PgogICAgICAgICAgICA8cmRmOlNlcT4KICAgICAgICAgICAgICAgPHJkZjpsaSByZGY6cGFyc2VUeXBlPSJSZXNvdXJjZSI+CiAgICAgICAgICAgICAgICAgIDxzdEV2dDphY3Rpb24+Y3JlYXRlZDwvc3RFdnQ6YWN0aW9uPgogICAgICAgICAgICAgICAgICA8c3RFdnQ6aW5zdGFuY2VJRD54bXAuaWlkOjBiNmJmYThiLWU2MzktNDM0YS1iNWQzLTg2YWRkMmQyYmQ3ZTwvc3RFdnQ6aW5zdGFuY2VJRD4KICAgICAgICAgICAgICAgICAgPHN0RXZ0OndoZW4+MjAxNy0wNS0yMVQxMzozMzowNS0wMzowMDwvc3RFdnQ6d2hlbj4KICAgICAgICAgICAgICAgICAgPHN0RXZ0OnNvZnR3YXJlQWdlbnQ+QWRvYmUgUGhvdG9zaG9wIENDIDIwMTQgKFdpbmRvd3MpPC9zdEV2dDpzb2Z0d2FyZUFnZW50PgogICAgICAgICAgICAgICA8L3JkZjpsaT4KICAgICAgICAgICAgICAgPHJkZjpsaSByZGY6cGFyc2VUeXBlPSJSZXNvdXJjZSI+CiAgICAgICAgICAgICAgICAgIDxzdEV2dDphY3Rpb24+c2F2ZWQ8L3N0RXZ0OmFjdGlvbj4KICAgICAgICAgICAgICAgICAgPHN0RXZ0Omluc3RhbmNlSUQ+eG1wLmlpZDoyMzcxODc1Mi1jN2YyLTI3NDAtODljZC00ZDdhYjY4MGNlYmM8L3N0RXZ0Omluc3RhbmNlSUQ+CiAgICAgICAgICAgICAgICAgIDxzdEV2dDp3aGVuPjIwMTctMDUtMjFUMTM6NTU6NTUtMDM6MDA8L3N0RXZ0OndoZW4+CiAgICAgICAgICAgICAgICAgIDxzdEV2dDpzb2Z0d2FyZUFnZW50PkFkb2JlIFBob3Rvc2hvcCBDQyAyMDE0IChXaW5kb3dzKTwvc3RFdnQ6c29mdHdhcmVBZ2VudD4KICAgICAgICAgICAgICAgICAgPHN0RXZ0OmNoYW5nZWQ+Lzwvc3RFdnQ6Y2hhbmdlZD4KICAgICAgICAgICAgICAgPC9yZGY6bGk+CiAgICAgICAgICAgIDwvcmRmOlNlcT4KICAgICAgICAgPC94bXBNTTpIaXN0b3J5PgogICAgICAgICA8dGlmZjpPcmllbnRhdGlvbj4xPC90aWZmOk9yaWVudGF0aW9uPgogICAgICAgICA8dGlmZjpYUmVzb2x1dGlvbj41ODE5MTQvMTAwMDA8L3RpZmY6WFJlc29sdXRpb24+CiAgICAgICAgIDx0aWZmOllSZXNvbHV0aW9uPjU4MTkxNC8xMDAwMDwvdGlmZjpZUmVzb2x1dGlvbj4KICAgICAgICAgPHRpZmY6UmVzb2x1dGlvblVuaXQ+MjwvdGlmZjpSZXNvbHV0aW9uVW5pdD4KICAgICAgICAgPGV4aWY6Q29sb3JTcGFjZT42NTUzNTwvZXhpZjpDb2xvclNwYWNlPgogICAgICAgICA8ZXhpZjpQaXhlbFhEaW1lbnNpb24+NjQ8L2V4aWY6UGl4ZWxYRGltZW5zaW9uPgogICAgICAgICA8ZXhpZjpQaXhlbFlEaW1lbnNpb24+NjQ8L2V4aWY6UGl4ZWxZRGltZW5zaW9uPgogICAgICA8L3JkZjpEZXNjcmlwdGlvbj4KICAgPC9yZGY6UkRGPgo8L3g6eG1wbWV0YT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAKPD94cGFja2V0IGVuZD0idyI/PqOlfggAAAAgY0hSTQAAeiUAAICDAAD5/wAAgOkAAHUwAADqYAAAOpgAABdvkl/FRgAAA5xJREFUeNrs201oXFUUB/DfTQsGI1jUTcV2J63VnWL9WKhJjboobrSKiroQBBdSu3RVKAiCFkVUGiyI+LUQQdxZNIKUWHTlpsVYP6hgVdRSrDZtzHMxdxaOybw3MzeZd2fmD2cz8+a9e/5z7j2fLxRFYZgxZsgxImBEQCYIISwnkyGEAyGE+RDCQpT5+NnUcr/5H4qiyEJasBWzKEpkNl67or6dPLQuuAWnKyjflNPxNwNBwFac6kD5ppxqWkLOBATMdaF8U+YQciZgRw/KN2VHq465eIGAJxPcZ1dHXqAmuBbP41wCC/gmly0QsAX7cAyLCZQvsNCq4/oamvpGPIAHcQ2rvMYaWcAleARHEv7jrXK8jhZwGSbxEKZxwUr/VbSQXnC4ThYwjp34oMIBdwxvJ7CA6TocgmO4Ea/gZMmCv8cL2D4ogdD12I/5ksX+gtdj8DOeKBS+qp+h8BbsxdGShZ7FO7gLGwYhGdqMPfiywj6fje7v4opJ0VxFs+9LOnwpHsbH+KvNAs/Hk/lxXN5FzDCNGRyPBP8ZrWwmfhfKDv1uCJjEgbiPF6LMx8924n4cwpk2ii/Gk31PdIN9iXM6JaBqFeafCif7fmxbiyAjFQGdHjzLyYno+m5eyygrBQHdup6m/ISDuK0fYWavBPQafPyGuzHRrzi7jICygsgUbugxwTkTJcu+wK5VqcLUCSVb4KQEVZi66lcURSM5aNONWUqQgp5rk+KuCQG9bIGBRxkBPyd4xo85E3AowTMO50zAWwme8WbOBHyEz3u4/68xWVqXqxtMEQp/i+diNSi7UDhVMrQUU+ZncHWOBHRShSlKCiBf4WlckRsBVaow9+IJfBH3/kpE/B3PlkdxUU4EVMUmPKXR5TlfUrD8EPe1KYK2Q7vq1FQVQla7KLpNo8F5tKRStIj3cScurFgUzWpGaDtexHclC/4dL8frJwahLN6KW/FaLI+Vuc6XcFNLMjYQM0LjGo2Pd/GH8p7gXo2uzsDNCG3Q6B18WiGGOIJXrcKMUB3mAzbjMXxWsvgUMwMzdR6R2Yjd+NrqDEdkMSO0Dlfi2RhoLSUmYCGXIakxXBc9wQ/Ku00DR0AT66PrPFgSUXY9I5TLpOgEPklAwBs5j8reYUBmhLrF0A9L9xoK93VGKCXWLhmq+SszSWaEQi4vTi7zwlPA7bgnFj82xQrViRhWvxf7GkUrAf+5yejN0SHHiIARASMChhv/DgCyvb90JKuuzQAAAABJRU5ErkJggg==", - "metadata": {}, - "_type": "Embedded", - "path": "add_curve.png", - "_media": "Image" - } - }, - { - "number": 2, - "text": "", - "no_of_drags": -1, - "group": 1, - "image": { - "data": "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", - "metadata": {}, - "_type": "Embedded", - "path": "axes.png", - "_media": "Image" - } - }, - { - "number": 3, - "text": "test_text_drag", - "no_of_drags": 1, - "group": 1, - "image": null - } - ], - "ordered": true, - "show_ans": true, - "shuffle": false, - "background": { - "data": "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GANpZuvFAH1J8cv+CivwX+BrXFnc+I4vEetw5U6bobrcOrY+67A7U/Hp6V+eXxw/4LCfFDxyJ7DwJY2HgXS3yBciP7TfEf775QfggPvXwr4g8N6t4T1SbTda0y70nUITtktb2FopFPurAGs2qsB0fjf4jeKfiTq8uqeKfEGo6/fync01/ctKemOATgDHYYFc5RRTAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAq1puqXujXaXWn3k9jdIcrPbStG6/RgQRVWigD69+Cn/BUb43/CSWG31DWYfG+jrgNaeIIjLIF/2ZlKvn/eLD2r9B/gb/AMFaPhJ8TEt7PxWZfAWruMN9vbfaE+0uBjPuPxr8O6fDDJcSrHEjSSOcKiDJJ9AKVgP6ktC8QaX4n02HUdH1G11SwmG6O5s5lljceoZSQa0K/D/9ir9kb9py816x1/whd6l8MtDlYPLqeo3DW6TJ3H2fO+TI6ZTbnHI61+0vgnStY0Twtp1lr+sDX9YhiC3OoiBYPOb12LwKkDbooooAP50UUUAHNFGKKAFooooASilrj/ip8WvCvwV8KN4l8ZaoNH0NbiO2e8aJ5FR5DhchFJxnvjigDsKSsXwh438P+P8ARodW8Na1Ya7pkyhkutPuFmQ591JwfY8itqgDzL4z/s2/Dr4/aLJp3jTw3a6kWQrHeKvl3MJ/vJIOQQeecj2r81f2hf8AgjXr3h8T6r8KNf8A+EgswS39jauBHdIOfuyr8r9uNq1+vFFAH8v3jz4b+KPhjrk2j+KtDvdD1GI4aC8hKH6jPWuar+nf4k/CHwX8YNFbSvGnhjTPElkQQqahbLI0ee6MRuQ+6kGvzp/aK/4I12VzHPqvwg1g2kw+b+wtWlLIRzxHKec9PvnHvTuB+T1FehfFv9n/AOIfwL1ZtP8AHHhPUtAcHCTzwk28vuky5R/+Asa89qgCiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKK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", - "metadata": {}, - "_type": "Embedded", - "path": "cube2.jpg", - "_media": "Image" - }, - "_zones": [ - { - "shape": "rectangle", - "coord_x": 0, - "coord_y": 0, - "points": null, - "text": "hihi", - "choice": 2, - "number": 1 - } - ], - "__clsname__": "QDaDImage" - }, - { - "name": "Random short-answer matching", - "default_grade": 1.13, - "time_lim": 60, - "dbid": null, - "notes": "", - "_question": { - "formatting": "html", - "_text": [ - "

This is an example of the Random short-answer matching question type, which draws from short answer questions in the question bank.

" - ], - "bfile": [] - }, - "_remarks": { - "formatting": "html", - "_text": [ - "" - ], - "bfile": [] - }, - "_feedbacks": { - "100.0": { - "formatting": "html", - "_text": [ - "

Your answer is correct.

" - ], - "bfile": [] - }, - "50.0": { - "formatting": "html", - "_text": [ - "

Your answer is partially correct.

" - ], - "bfile": [] - }, - "0.0": { - "formatting": "html", - "_text": [ - "

Your answer is incorrect.

" - ], - "bfile": [] - } - }, - "_tags": [], - "_free_hints": [], - "max_tries": 0, - "_fail_hints": [ - { - "formatting": "html", - "text": "

How about looking in the Moodle announcements on the front page of Moodle.org?

", - "show_correct": false, - "clear_wrong": false, - "state_incorrect": false - } - ], - "ordered": true, - "show_ans": true, - "choose": 3, - "subcats": false, - "__clsname__": "QRandomMatching" - }, - { - "name": "tf", - "default_grade": 1.14, - "time_lim": 60, - "dbid": null, - "notes": "", - "_question": { - "formatting": "html", - "_text": [ - "This is an example of a True/False question type.\n\n This picture represents the release of Moodle 2.1. True or false?
\"\"
" - ], - "bfile": [] - }, - "_remarks": { - "formatting": "html", - "_text": [ - "" - ], - "bfile": [] - }, - "_feedbacks": {}, - "_tags": [], - "_free_hints": [], - "correct": false, - "_true_feedback": { - "formatting": "html", - "_text": [ - "Yes. Did you just know? Or did you know the secret signs? Each new version of Moodle until Moodle 3.5  brought a new photo of Martin's children.\n\n The correct answer is 'True'." - ], - "bfile": [] - }, - "_false_feedback": { - "formatting": "html", - "_text": [ - "Each new version of Moodle until Moodle 3.5  brought a new photo of Martin's children. The correct answer is 'True'." - ], - "bfile": [] - }, - "__clsname__": "QTrueFalse" - }, - { - "name": "MW Test", - "default_grade": 1.0, - "time_lim": 60, - "dbid": null, - "notes": "", - "_question": { - "formatting": "html", - "_text": [ - "

This is a [[1]] kind of question

" - ], - "bfile": [] - }, - "_remarks": { - "formatting": "html", - "_text": [ - "

Generic feedback

" - ], - "bfile": [] - }, - "_feedbacks": { - "100.0": { - "formatting": "html", - "_text": [ - "Your answer is correct." - ], - "bfile": [] - }, - "50.0": { - "formatting": "html", - "_text": [ - "Your answer is partially correct." - ], - "bfile": [] - }, - "0.0": { - "formatting": "html", - "_text": [ - "Your answer is incorrect." - ], - "bfile": [] - } - }, - "_tags": [], - "_free_hints": [], - "max_tries": 3, - "_fail_hints": [ - { - "formatting": "html", - "text": "

A hint

", - "show_correct": false, - "clear_wrong": true, - "state_incorrect": false - }, - { - "formatting": "html", - "text": "", - "show_correct": true, - "clear_wrong": false, - "state_incorrect": false - } - ], - "_options": [ - { - "text": "Missing Word", - "group": "1" - }, - { - "text": "Not Missing Word", - "group": "1" - }, - { - "text": "Another thing", - "group": "1" - }, - { - "text": "And a Test", - "group": "1" - } - ], - "ordered": true, - "show_ans": true, - "shuffle": true, - "__clsname__": "QMissingWord" - } - ], - "_Category__categories": {}, - "_Category__name": "alternative-format", - "metadata": {}, - "resources": {}, - "info": "" - } - }, - "_Category__name": "qas_editor", - "metadata": {}, - "resources": {}, - "info": "" - } - }, - "_Category__name": "$course$", - "metadata": {}, - "resources": {}, - "info": "" -} \ No newline at end of file diff --git a/test/datasets/json/qcalculated.json b/test/datasets/json/qcalculated.json deleted file mode 100644 index 02b278c..0000000 --- a/test/datasets/json/qcalculated.json +++ /dev/null @@ -1,129 +0,0 @@ -{ - "_Category__questions": [ - { - "name": "Calcul\u00e9e", - "default_grade": 1.7, - "time_lim": 60, - "dbid": null, - "notes": "", - "_question": { - "formatting": "html", - "_text": [ - "

Quelle est l'aire d'un rectangle de longueur {a} et de largeur {b} ?

Formula in the text {={a}*{b}}. It is also possible to use float {={a}*({b}+2.3)/10.0}.

Accolade should not be used for number {=2.5*2.2}


" - ], - "bfile": [] - }, - "_remarks": { - "formatting": "html", - "_text": [ - "" - ], - "bfile": [] - }, - "_feedbacks": { - "100.0": { - "formatting": "html", - "_text": [ - "Votre r\u00e9ponse est correcte." - ], - "bfile": [] - }, - "50.0": { - "formatting": "html", - "_text": [ - "Votre r\u00e9ponse est partiellement correcte." - ], - "bfile": [] - }, - "0.0": { - "formatting": "html", - "_text": [ - "Votre r\u00e9ponse est incorrecte." - ], - "bfile": [] - } - }, - "_tags": [], - "_free_hints": [], - "max_tries": 3, - "_fail_hints": [], - "_options": [ - { - "fraction": 100.0, - "formatting": "auto", - "text": "{={a}*{b}}", - "_feedback": { - "formatting": "html", - "_text": [ - "

Well done!

" - ], - "bfile": [] - }, - "tolerance": 0.01, - "ttype": "1", - "aformat": "1", - "alength": 2 - }, - { - "fraction": 0.0, - "formatting": "auto", - "text": "{={a}+{b}}", - "_feedback": { - "formatting": "html", - "_text": [ - "" - ], - "bfile": [] - }, - "tolerance": 0.01, - "ttype": "1", - "aformat": "1", - "alength": 2 - } - ], - "ordered": true, - "show_ans": false, - "shuffle": true, - "synchronize": "0", - "single": true, - "numbering": "abc", - "datasets": [ - { - "status": "private", - "name": "a", - "ctype": "calculatedsimple", - "distribution": "uniform", - "minimum": "1", - "maximum": "10", - "decimals": "1", - "items": { - "1": 6.7, - "2": 5.6, - "3": 6.5 - } - }, - { - "status": "private", - "name": "b", - "ctype": "calculatedsimple", - "distribution": "uniform", - "minimum": "1", - "maximum": "10", - "decimals": "1", - "items": { - "1": 8.8, - "2": 3.2, - "3": 4.3, - "11": 5.4 - } - } - ], - "__clsname__": "QCalculatedMC" - } - ], - "_Category__categories": {}, - "_Category__name": "$course$", - "metadata": {}, - "resources": {}, - "info": "" -} \ No newline at end of file diff --git a/test/datasets/json/qcalculatedmc.json b/test/datasets/json/qcalculatedmc.json deleted file mode 100644 index 02b278c..0000000 --- a/test/datasets/json/qcalculatedmc.json +++ /dev/null @@ -1,129 +0,0 @@ -{ - "_Category__questions": [ - { - "name": "Calcul\u00e9e", - "default_grade": 1.7, - "time_lim": 60, - "dbid": null, - "notes": "", - "_question": { - "formatting": "html", - "_text": [ - "

Quelle est l'aire d'un rectangle de longueur {a} et de largeur {b} ?

Formula in the text {={a}*{b}}. It is also possible to use float {={a}*({b}+2.3)/10.0}.

Accolade should not be used for number {=2.5*2.2}


" - ], - "bfile": [] - }, - "_remarks": { - "formatting": "html", - "_text": [ - "" - ], - "bfile": [] - }, - "_feedbacks": { - "100.0": { - "formatting": "html", - "_text": [ - "Votre r\u00e9ponse est correcte." - ], - "bfile": [] - }, - "50.0": { - "formatting": "html", - "_text": [ - "Votre r\u00e9ponse est partiellement correcte." - ], - "bfile": [] - }, - "0.0": { - "formatting": "html", - "_text": [ - "Votre r\u00e9ponse est incorrecte." - ], - "bfile": [] - } - }, - "_tags": [], - "_free_hints": [], - "max_tries": 3, - "_fail_hints": [], - "_options": [ - { - "fraction": 100.0, - "formatting": "auto", - "text": "{={a}*{b}}", - "_feedback": { - "formatting": "html", - "_text": [ - "

Well done!

" - ], - "bfile": [] - }, - "tolerance": 0.01, - "ttype": "1", - "aformat": "1", - "alength": 2 - }, - { - "fraction": 0.0, - "formatting": "auto", - "text": "{={a}+{b}}", - "_feedback": { - "formatting": "html", - "_text": [ - "" - ], - "bfile": [] - }, - "tolerance": 0.01, - "ttype": "1", - "aformat": "1", - "alength": 2 - } - ], - "ordered": true, - "show_ans": false, - "shuffle": true, - "synchronize": "0", - "single": true, - "numbering": "abc", - "datasets": [ - { - "status": "private", - "name": "a", - "ctype": "calculatedsimple", - "distribution": "uniform", - "minimum": "1", - "maximum": "10", - "decimals": "1", - "items": { - "1": 6.7, - "2": 5.6, - "3": 6.5 - } - }, - { - "status": "private", - "name": "b", - "ctype": "calculatedsimple", - "distribution": "uniform", - "minimum": "1", - "maximum": "10", - "decimals": "1", - "items": { - "1": 8.8, - "2": 3.2, - "3": 4.3, - "11": 5.4 - } - } - ], - "__clsname__": "QCalculatedMC" - } - ], - "_Category__categories": {}, - "_Category__name": "$course$", - "metadata": {}, - "resources": {}, - "info": "" -} \ No newline at end of file diff --git a/test/datasets/json/qdadimage.json b/test/datasets/json/qdadimage.json deleted file mode 100644 index 3028432..0000000 --- a/test/datasets/json/qdadimage.json +++ /dev/null @@ -1,114 +0,0 @@ -{ - "_Category__questions": [ - { - "name": "QName", - "default_grade": 1.0, - "time_lim": 60, - "dbid": null, - "notes": "", - "_question": { - "formatting": "html", - "_text": [ - "

Complete test

" - ], - "bfile": [] - }, - "_remarks": { - "formatting": "html", - "_text": [ - "

feeds

" - ], - "bfile": [] - }, - "_feedbacks": { - "100.0": { - "formatting": "html", - "_text": [ - "Your answer is correct." - ], - "bfile": [] - }, - "50.0": { - "formatting": "html", - "_text": [ - "Your answer is partially correct." - ], - "bfile": [] - }, - "0.0": { - "formatting": "html", - "_text": [ - "Your answer is incorrect." - ], - "bfile": [] - } - }, - "_tags": [], - "_free_hints": [], - "max_tries": 3, - "_fail_hints": [], - "_options": [ - { - "number": 1, - "text": "", - "no_of_drags": 1, - "group": 1, - "image": { - "data": "iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAAACXBIWXMAAAjzAAAI8wF7DtCyAAA57GlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4KPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNS41LWMwMjEgNzkuMTU1NzcyLCAyMDE0LzAxLzEzLTE5OjQ0OjAwICAgICAgICAiPgogICA8cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPgogICAgICA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIgogICAgICAgICAgICB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iCiAgICAgICAgICAgIHhtbG5zOmRjPSJodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xLyIKICAgICAgICAgICAgeG1sbnM6cGhvdG9zaG9wPSJodHRwOi8vbnMuYWRvYmUuY29tL3Bob3Rvc2hvcC8xLjAvIgogICAgICAgICAgICB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIKICAgICAgICAgICAgeG1sbnM6c3RFdnQ9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZUV2ZW50IyIKICAgICAgICAgICAgeG1sbnM6dGlmZj0iaHR0cDovL25zLmFkb2JlLmNvbS90aWZmLzEuMC8iCiAgICAgICAgICAgIHhtbG5zOmV4aWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20vZXhpZi8xLjAvIj4KICAgICAgICAgPHhtcDpDcmVhdG9yVG9vbD5BZG9iZSBQaG90b3Nob3AgQ0MgMjAxNCAoV2luZG93cyk8L3htcDpDcmVhdG9yVG9vbD4KICAgICAgICAgPHhtcDpDcmVhdGVEYXRlPjIwMTctMDUtMjFUMTM6MzM6MDUtMDM6MDA8L3htcDpDcmVhdGVEYXRlPgogICAgICAgICA8eG1wOk1vZGlmeURhdGU+MjAxNy0wNS0yMVQxMzo1NTo1NS0wMzowMDwveG1wOk1vZGlmeURhdGU+CiAgICAgICAgIDx4bXA6TWV0YWRhdGFEYXRlPjIwMTctMDUtMjFUMTM6NTU6NTUtMDM6MDA8L3htcDpNZXRhZGF0YURhdGU+CiAgICAgICAgIDxkYzpmb3JtYXQ+aW1hZ2UvcG5nPC9kYzpmb3JtYXQ+CiAgICAgICAgIDxwaG90b3Nob3A6Q29sb3JNb2RlPjM8L3Bob3Rvc2hvcDpDb2xvck1vZGU+CiAgICAgICAgIDx4bXBNTTpJbnN0YW5jZUlEPnhtcC5paWQ6MjM3MTg3NTItYzdmMi0yNzQwLTg5Y2QtNGQ3YWI2ODBjZWJjPC94bXBNTTpJbnN0YW5jZUlEPgogICAgICAgICA8eG1wTU06RG9jdW1lbnRJRD5hZG9iZTpkb2NpZDpwaG90b3Nob3A6NGU1MGNmNDEtM2U0Ni0xMWU3LTliMDQtYjY3NjhiODQyYmJmPC94bXBNTTpEb2N1bWVudElEPgogICAgICAgICA8eG1wTU06T3JpZ2luYWxEb2N1bWVudElEPnhtcC5kaWQ6MGI2YmZhOGItZTYzOS00MzRhLWI1ZDMtODZhZGQyZDJiZDdlPC94bXBNTTpPcmlnaW5hbERvY3VtZW50SUQ+CiAgICAgICAgIDx4bXBNTTpIaXN0b3J5PgogICAgICAgICAgICA8cmRmOlNlcT4KICAgICAgICAgICAgICAgPHJkZjpsaSByZGY6cGFyc2VUeXBlPSJSZXNvdXJjZSI+CiAgICAgICAgICAgICAgICAgIDxzdEV2dDphY3Rpb24+Y3JlYXRlZDwvc3RFdnQ6YWN0aW9uPgogICAgICAgICAgICAgICAgICA8c3RFdnQ6aW5zdGFuY2VJRD54bXAuaWlkOjBiNmJmYThiLWU2MzktNDM0YS1iNWQzLTg2YWRkMmQyYmQ3ZTwvc3RFdnQ6aW5zdGFuY2VJRD4KICAgICAgICAgICAgICAgICAgPHN0RXZ0OndoZW4+MjAxNy0wNS0yMVQxMzozMzowNS0wMzowMDwvc3RFdnQ6d2hlbj4KICAgICAgICAgICAgICAgICAgPHN0RXZ0OnNvZnR3YXJlQWdlbnQ+QWRvYmUgUGhvdG9zaG9wIENDIDIwMTQgKFdpbmRvd3MpPC9zdEV2dDpzb2Z0d2FyZUFnZW50PgogICAgICAgICAgICAgICA8L3JkZjpsaT4KICAgICAgICAgICAgICAgPHJkZjpsaSByZGY6cGFyc2VUeXBlPSJSZXNvdXJjZSI+CiAgICAgICAgICAgICAgICAgIDxzdEV2dDphY3Rpb24+c2F2ZWQ8L3N0RXZ0OmFjdGlvbj4KICAgICAgICAgICAgICAgICAgPHN0RXZ0Omluc3RhbmNlSUQ+eG1wLmlpZDoyMzcxODc1Mi1jN2YyLTI3NDAtODljZC00ZDdhYjY4MGNlYmM8L3N0RXZ0Omluc3RhbmNlSUQ+CiAgICAgICAgICAgICAgICAgIDxzdEV2dDp3aGVuPjIwMTctMDUtMjFUMTM6NTU6NTUtMDM6MDA8L3N0RXZ0OndoZW4+CiAgICAgICAgICAgICAgICAgIDxzdEV2dDpzb2Z0d2FyZUFnZW50PkFkb2JlIFBob3Rvc2hvcCBDQyAyMDE0IChXaW5kb3dzKTwvc3RFdnQ6c29mdHdhcmVBZ2VudD4KICAgICAgICAgICAgICAgICAgPHN0RXZ0OmNoYW5nZWQ+Lzwvc3RFdnQ6Y2hhbmdlZD4KICAgICAgICAgICAgICAgPC9yZGY6bGk+CiAgICAgICAgICAgIDwvcmRmOlNlcT4KICAgICAgICAgPC94bXBNTTpIaXN0b3J5PgogICAgICAgICA8dGlmZjpPcmllbnRhdGlvbj4xPC90aWZmOk9yaWVudGF0aW9uPgogICAgICAgICA8dGlmZjpYUmVzb2x1dGlvbj41ODE5MTQvMTAwMDA8L3RpZmY6WFJlc29sdXRpb24+CiAgICAgICAgIDx0aWZmOllSZXNvbHV0aW9uPjU4MTkxNC8xMDAwMDwvdGlmZjpZUmVzb2x1dGlvbj4KICAgICAgICAgPHRpZmY6UmVzb2x1dGlvblVuaXQ+MjwvdGlmZjpSZXNvbHV0aW9uVW5pdD4KICAgICAgICAgPGV4aWY6Q29sb3JTcGFjZT42NTUzNTwvZXhpZjpDb2xvclNwYWNlPgogICAgICAgICA8ZXhpZjpQaXhlbFhEaW1lbnNpb24+NjQ8L2V4aWY6UGl4ZWxYRGltZW5zaW9uPgogICAgICAgICA8ZXhpZjpQaXhlbFlEaW1lbnNpb24+NjQ8L2V4aWY6UGl4ZWxZRGltZW5zaW9uPgogICAgICA8L3JkZjpEZXNjcmlwdGlvbj4KICAgPC9yZGY6UkRGPgo8L3g6eG1wbWV0YT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAKPD94cGFja2V0IGVuZD0idyI/PqOlfggAAAAgY0hSTQAAeiUAAICDAAD5/wAAgOkAAHUwAADqYAAAOpgAABdvkl/FRgAAA5xJREFUeNrs201oXFUUB/DfTQsGI1jUTcV2J63VnWL9WKhJjboobrSKiroQBBdSu3RVKAiCFkVUGiyI+LUQQdxZNIKUWHTlpsVYP6hgVdRSrDZtzHMxdxaOybw3MzeZd2fmD2cz8+a9e/5z7j2fLxRFYZgxZsgxImBEQCYIISwnkyGEAyGE+RDCQpT5+NnUcr/5H4qiyEJasBWzKEpkNl67or6dPLQuuAWnKyjflNPxNwNBwFac6kD5ppxqWkLOBATMdaF8U+YQciZgRw/KN2VHq465eIGAJxPcZ1dHXqAmuBbP41wCC/gmly0QsAX7cAyLCZQvsNCq4/oamvpGPIAHcQ2rvMYaWcAleARHEv7jrXK8jhZwGSbxEKZxwUr/VbSQXnC4ThYwjp34oMIBdwxvJ7CA6TocgmO4Ea/gZMmCv8cL2D4ogdD12I/5ksX+gtdj8DOeKBS+qp+h8BbsxdGShZ7FO7gLGwYhGdqMPfiywj6fje7v4opJ0VxFs+9LOnwpHsbH+KvNAs/Hk/lxXN5FzDCNGRyPBP8ZrWwmfhfKDv1uCJjEgbiPF6LMx8924n4cwpk2ii/Gk31PdIN9iXM6JaBqFeafCif7fmxbiyAjFQGdHjzLyYno+m5eyygrBQHdup6m/ISDuK0fYWavBPQafPyGuzHRrzi7jICygsgUbugxwTkTJcu+wK5VqcLUCSVb4KQEVZi66lcURSM5aNONWUqQgp5rk+KuCQG9bIGBRxkBPyd4xo85E3AowTMO50zAWwme8WbOBHyEz3u4/68xWVqXqxtMEQp/i+diNSi7UDhVMrQUU+ZncHWOBHRShSlKCiBf4WlckRsBVaow9+IJfBH3/kpE/B3PlkdxUU4EVMUmPKXR5TlfUrD8EPe1KYK2Q7vq1FQVQla7KLpNo8F5tKRStIj3cScurFgUzWpGaDtexHclC/4dL8frJwahLN6KW/FaLI+Vuc6XcFNLMjYQM0LjGo2Pd/GH8p7gXo2uzsDNCG3Q6B18WiGGOIJXrcKMUB3mAzbjMXxWsvgUMwMzdR6R2Yjd+NrqDEdkMSO0Dlfi2RhoLSUmYCGXIakxXBc9wQ/Ku00DR0AT66PrPFgSUXY9I5TLpOgEPklAwBs5j8reYUBmhLrF0A9L9xoK93VGKCXWLhmq+SszSWaEQi4vTi7zwlPA7bgnFj82xQrViRhWvxf7GkUrAf+5yejN0SHHiIARASMChhv/DgCyvb90JKuuzQAAAABJRU5ErkJggg==", - "metadata": {}, - "_type": "Embedded", - "path": "add_curve.png", - "_media": "Image" - } - }, - { - "number": 2, - "text": "", - "no_of_drags": -1, - "group": 1, - "image": { - "source": "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", - "metadata": {}, - "_type": "Embedded", - "path": "axes.png", - "_media": "Image" - } - }, - { - "number": 3, - "text": "test_text_drag", - "no_of_drags": 1, - "group": 1, - "image": null - } - ], - "ordered": true, - "show_ans": true, - "shuffle": false, - "background": { - "source": "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GANpZuvFAH1J8cv+CivwX+BrXFnc+I4vEetw5U6bobrcOrY+67A7U/Hp6V+eXxw/4LCfFDxyJ7DwJY2HgXS3yBciP7TfEf775QfggPvXwr4g8N6t4T1SbTda0y70nUITtktb2FopFPurAGs2qsB0fjf4jeKfiTq8uqeKfEGo6/fync01/ctKemOATgDHYYFc5RRTAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAq1puqXujXaXWn3k9jdIcrPbStG6/RgQRVWigD69+Cn/BUb43/CSWG31DWYfG+jrgNaeIIjLIF/2ZlKvn/eLD2r9B/gb/AMFaPhJ8TEt7PxWZfAWruMN9vbfaE+0uBjPuPxr8O6fDDJcSrHEjSSOcKiDJJ9AKVgP6ktC8QaX4n02HUdH1G11SwmG6O5s5lljceoZSQa0K/D/9ir9kb9py816x1/whd6l8MtDlYPLqeo3DW6TJ3H2fO+TI6ZTbnHI61+0vgnStY0Twtp1lr+sDX9YhiC3OoiBYPOb12LwKkDbooooAP50UUUAHNFGKKAFooooASilrj/ip8WvCvwV8KN4l8ZaoNH0NbiO2e8aJ5FR5DhchFJxnvjigDsKSsXwh438P+P8ARodW8Na1Ya7pkyhkutPuFmQ591JwfY8itqgDzL4z/s2/Dr4/aLJp3jTw3a6kWQrHeKvl3MJ/vJIOQQeecj2r81f2hf8AgjXr3h8T6r8KNf8A+EgswS39jauBHdIOfuyr8r9uNq1+vFFAH8v3jz4b+KPhjrk2j+KtDvdD1GI4aC8hKH6jPWuar+nf4k/CHwX8YNFbSvGnhjTPElkQQqahbLI0ee6MRuQ+6kGvzp/aK/4I12VzHPqvwg1g2kw+b+wtWlLIRzxHKec9PvnHvTuB+T1FehfFv9n/AOIfwL1ZtP8AHHhPUtAcHCTzwk28vuky5R/+Asa89qgCiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKK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", - "metadata": {}, - "_type": "Embedded", - "path": "cube2.jpg", - "_media": "Image" - }, - "_zones": [ - { - "shape": "rectangle", - "coord_x": 0, - "coord_y": 0, - "points": null, - "text": "hihi", - "choice": 2, - "number": 1 - } - ], - "__clsname__": "QDaDImage" - } - ], - "_Category__categories": {}, - "_Category__name": "$course$", - "metadata": {}, - "resources": {}, - "info": "" -} \ No newline at end of file diff --git a/test/datasets/json/qdadmarker.json b/test/datasets/json/qdadmarker.json deleted file mode 100644 index 7790569..0000000 --- a/test/datasets/json/qdadmarker.json +++ /dev/null @@ -1,132 +0,0 @@ -{ - "_Category__questions": [ - { - "name": "Drag and drop markers test", - "default_grade": 1.0, - "time_lim": 60, - "dbid": null, - "notes": "", - "_question": { - "formatting": "html", - "_text": [ - "

This is a simple test

" - ], - "bfile": [] - }, - "_remarks": { - "formatting": "html", - "_text": [ - "

general feedback test

" - ], - "bfile": [] - }, - "_feedbacks": { - "100.0": { - "formatting": "html", - "_text": [ - "Your answer is correct." - ], - "bfile": [] - }, - "50.0": { - "formatting": "html", - "_text": [ - "Your answer is partially correct." - ], - "bfile": [] - }, - "0.0": { - "formatting": "html", - "_text": [ - "Your answer is incorrect." - ], - "bfile": [] - } - }, - "_tags": [ - "Advanced" - ], - "_free_hints": [], - "max_tries": 3, - "_fail_hints": [ - { - "formatting": "html", - "text": "

Hint number 1

", - "show_correct": true, - "clear_wrong": false, - "state_incorrect": true - }, - { - "formatting": "html", - "text": "

Hint number 2

", - "show_correct": false, - "clear_wrong": true, - "state_incorrect": false - } - ], - "_options": [ - { - "number": 1, - "text": "Marker1", - "no_of_drags": -1 - }, - { - "number": 2, - "text": "Marker2", - "no_of_drags": 1 - }, - { - "number": 3, - "text": "Marker3", - "no_of_drags": 2 - } - ], - "ordered": true, - "show_ans": true, - "shuffle": false, - "background": { - "source": "iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAAACXBIWXMAAAsTAAALEwEAmpwYAAA542lUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4KPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNS41LWMwMjEgNzkuMTU1NzcyLCAyMDE0LzAxLzEzLTE5OjQ0OjAwICAgICAgICAiPgogICA8cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPgogICAgICA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIgogICAgICAgICAgICB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iCiAgICAgICAgICAgIHhtbG5zOmRjPSJodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xLyIKICAgICAgICAgICAgeG1sbnM6cGhvdG9zaG9wPSJodHRwOi8vbnMuYWRvYmUuY29tL3Bob3Rvc2hvcC8xLjAvIgogICAgICAgICAgICB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIKICAgICAgICAgICAgeG1sbnM6c3RFdnQ9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZUV2ZW50IyIKICAgICAgICAgICAgeG1sbnM6dGlmZj0iaHR0cDovL25zLmFkb2JlLmNvbS90aWZmLzEuMC8iCiAgICAgICAgICAgIHhtbG5zOmV4aWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20vZXhpZi8xLjAvIj4KICAgICAgICAgPHhtcDpDcmVhdG9yVG9vbD5BZG9iZSBQaG90b3Nob3AgQ0MgMjAxNCAoV2luZG93cyk8L3htcDpDcmVhdG9yVG9vbD4KICAgICAgICAgPHhtcDpDcmVhdGVEYXRlPjIwMTctMDUtMjNUMTQ6NDk6MDctMDM6MDA8L3htcDpDcmVhdGVEYXRlPgogICAgICAgICA8eG1wOk1vZGlmeURhdGU+MjAxNy0wNS0yM1QxNDo1Mi0wMzowMDwveG1wOk1vZGlmeURhdGU+CiAgICAgICAgIDx4bXA6TWV0YWRhdGFEYXRlPjIwMTctMDUtMjNUMTQ6NTItMDM6MDA8L3htcDpNZXRhZGF0YURhdGU+CiAgICAgICAgIDxkYzpmb3JtYXQ+aW1hZ2UvcG5nPC9kYzpmb3JtYXQ+CiAgICAgICAgIDxwaG90b3Nob3A6Q29sb3JNb2RlPjM8L3Bob3Rvc2hvcDpDb2xvck1vZGU+CiAgICAgICAgIDx4bXBNTTpJbnN0YW5jZUlEPnhtcC5paWQ6N2EzZjljYmEtMGE0Ny1jYjQ4LTlmNzEtMTdiYjNhODljNzJiPC94bXBNTTpJbnN0YW5jZUlEPgogICAgICAgICA8eG1wTU06RG9jdW1lbnRJRD5hZG9iZTpkb2NpZDpwaG90b3Nob3A6N2MzZWRlMmItM2ZlMC0xMWU3LWJkZTQtZTE1MWMwYjZjNzcwPC94bXBNTTpEb2N1bWVudElEPgogICAgICAgICA8eG1wTU06T3JpZ2luYWxEb2N1bWVudElEPnhtcC5kaWQ6Nzc0MDI4NDgtNTI2MC05YTQ4LWI2M2MtNjhmNGQzYWUwNDEzPC94bXBNTTpPcmlnaW5hbERvY3VtZW50SUQ+CiAgICAgICAgIDx4bXBNTTpIaXN0b3J5PgogICAgICAgICAgICA8cmRmOlNlcT4KICAgICAgICAgICAgICAgPHJkZjpsaSByZGY6cGFyc2VUeXBlPSJSZXNvdXJjZSI+CiAgICAgICAgICAgICAgICAgIDxzdEV2dDphY3Rpb24+Y3JlYXRlZDwvc3RFdnQ6YWN0aW9uPgogICAgICAgICAgICAgICAgICA8c3RFdnQ6aW5zdGFuY2VJRD54bXAuaWlkOjc3NDAyODQ4LTUyNjAtOWE0OC1iNjNjLTY4ZjRkM2FlMDQxMzwvc3RFdnQ6aW5zdGFuY2VJRD4KICAgICAgICAgICAgICAgICAgPHN0RXZ0OndoZW4+MjAxNy0wNS0yM1QxNDo0OTowNy0wMzowMDwvc3RFdnQ6d2hlbj4KICAgICAgICAgICAgICAgICAgPHN0RXZ0OnNvZnR3YXJlQWdlbnQ+QWRvYmUgUGhvdG9zaG9wIENDIDIwMTQgKFdpbmRvd3MpPC9zdEV2dDpzb2Z0d2FyZUFnZW50PgogICAgICAgICAgICAgICA8L3JkZjpsaT4KICAgICAgICAgICAgICAgPHJkZjpsaSByZGY6cGFyc2VUeXBlPSJSZXNvdXJjZSI+CiAgICAgICAgICAgICAgICAgIDxzdEV2dDphY3Rpb24+c2F2ZWQ8L3N0RXZ0OmFjdGlvbj4KICAgICAgICAgICAgICAgICAgPHN0RXZ0Omluc3RhbmNlSUQ+eG1wLmlpZDo3YTNmOWNiYS0wYTQ3LWNiNDgtOWY3MS0xN2JiM2E4OWM3MmI8L3N0RXZ0Omluc3RhbmNlSUQ+CiAgICAgICAgICAgICAgICAgIDxzdEV2dDp3aGVuPjIwMTctMDUtMjNUMTQ6NTItMDM6MDA8L3N0RXZ0OndoZW4+CiAgICAgICAgICAgICAgICAgIDxzdEV2dDpzb2Z0d2FyZUFnZW50PkFkb2JlIFBob3Rvc2hvcCBDQyAyMDE0IChXaW5kb3dzKTwvc3RFdnQ6c29mdHdhcmVBZ2VudD4KICAgICAgICAgICAgICAgICAgPHN0RXZ0OmNoYW5nZWQ+Lzwvc3RFdnQ6Y2hhbmdlZD4KICAgICAgICAgICAgICAgPC9yZGY6bGk+CiAgICAgICAgICAgIDwvcmRmOlNlcT4KICAgICAgICAgPC94bXBNTTpIaXN0b3J5PgogICAgICAgICA8dGlmZjpPcmllbnRhdGlvbj4xPC90aWZmOk9yaWVudGF0aW9uPgogICAgICAgICA8dGlmZjpYUmVzb2x1dGlvbj43MjAwMDAvMTAwMDA8L3RpZmY6WFJlc29sdXRpb24+CiAgICAgICAgIDx0aWZmOllSZXNvbHV0aW9uPjcyMDAwMC8xMDAwMDwvdGlmZjpZUmVzb2x1dGlvbj4KICAgICAgICAgPHRpZmY6UmVzb2x1dGlvblVuaXQ+MjwvdGlmZjpSZXNvbHV0aW9uVW5pdD4KICAgICAgICAgPGV4aWY6Q29sb3JTcGFjZT42NTUzNTwvZXhpZjpDb2xvclNwYWNlPgogICAgICAgICA8ZXhpZjpQaXhlbFhEaW1lbnNpb24+NjQ8L2V4aWY6UGl4ZWxYRGltZW5zaW9uPgogICAgICAgICA8ZXhpZjpQaXhlbFlEaW1lbnNpb24+NjQ8L2V4aWY6UGl4ZWxZRGltZW5zaW9uPgogICAgICA8L3JkZjpEZXNjcmlwdGlvbj4KICAgPC9yZGY6UkRGPgo8L3g6eG1wbWV0YT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAKPD94cGFja2V0IGVuZD0idyI/PihLbGEAAAAgY0hSTQAAeiUAAICDAAD5/wAAgOkAAHUwAADqYAAAOpgAABdvkl/FRgAAAv5JREFUeNrsmz1oFEEUgL+Nd0Y0OWPwjyCCkAQMWMVWECGVNoIaLATBRsHTQkE4UEkheLWQLhEtLEQbEaxEEM8iwTKCl0JFRG0s7i5Ro2EsMgeXvc3u7O7d7s7uDCzcHW8f+76dee/Ne3OWEIIsjx4yPgwAA8AAMAAMgCyPnP0Hy7IAJoEbwHBK7FwEysDjtrxHCLHuAk4DIqXXqTZ7HQAsphhA1W6vZZ8SlmX9ATbbplBd06nfb/u+IoTodfUBwF8bgDJwR1MAt4FrNts8fUCtZcosae788sBKiz01u71eYfAfsEVjAH3ShsB5gCUpJnFt9yuGeStNidBVoAJ8lVcFuBJKo4cPqCmS7vbYC8y7hLd5KWMfu4BlNx+gA4Ac8F4hxi8Am2z37vQCoMMSuAwcVJAbk7Kp2wyd75KsFgC2AqM+5EflPWY73PTxugNYBj74kK/Ke5Qh6DADHviQvZ/UPGA7UAgRBhcChsFBuZ+JNQ+YBhpS180QidCci/FzGyRCsQN46PCw5RD6isAb+Vw1+bnoIh8rgJLLGytFtBmKDcBJhTV7MQIHGguAMWBVsUY32WUAO6IGUAC+4a9QOaH4JgcDAmhECaCC/0rtKnDYRecl1oqyS8CFJAOYIXi5ug6MOOi85yB7zgeAgagAXCd8zf4HMC71DQEvXGRPJAnAcTrbvHgL/FSQO5IEAMOsLztHef0GDimk4I1uVYS2Aa9irBr3Aq+BA2GUhAHwHNgX805xQKbDu4PWBIICmAaOJmS7PCQh9AUrmfj3AUWS2fl9R3uvsyBDbMec4ATJbn+/9AtAZQk0W0v7gWcJrx4dA576WuI+usMf0ecgxEzLywvVGfoiFT1Cv9Mgt+Szf3cDkPOYIL+AWeCshiXxKRkZ6sCeDde3wxGZpDREO9kbaPqxuhCioFtZPOxI1fmAjg8DwADIFpQeFWPzKQaQVwHwOcUAPqkAKKUYQEklEQI4w9px+ZGUGF4F7gJP2uw1/xs0YdAAMAAMAAPAAMjs+D8A/yy4+E330/QAAAAASUVORK5CYII=", - "metadata": {}, - "_type": "Embedded", - "path": "portrait (1).png", - "_media": "Image" - }, - "_zones": [ - { - "shape": "circle", - "coord_x": 15, - "coord_y": 15, - "points": "15", - "text": null, - "choice": 1, - "number": 1 - }, - { - "shape": "polygon", - "coord_x": 10, - "coord_y": 10, - "points": "40,10;10,40", - "text": null, - "choice": 2, - "number": 2 - }, - { - "shape": "rectangle", - "coord_x": 0, - "coord_y": 0, - "points": "30,30", - "text": null, - "choice": 3, - "number": 3 - } - ], - "highlight": true, - "__clsname__": "QDaDMarker" - } - ], - "_Category__categories": {}, - "_Category__name": "$course$", - "metadata": {}, - "resources": {}, - "info": "" -} \ No newline at end of file diff --git a/test/datasets/json/qdadtext.json b/test/datasets/json/qdadtext.json deleted file mode 100644 index 05024bd..0000000 --- a/test/datasets/json/qdadtext.json +++ /dev/null @@ -1,81 +0,0 @@ -{ - "_Category__questions": [ - { - "name": "Drag and Drop Text and Image", - "_question": { - "_text": "

Six sentences have been removed from the article. Choose from sentences A - G the one which first each gap. There is one extra sentence which you do not need to use.

\n

How a music festival turned into a money-making monster

\n

A. When the American 90s rock band Pearl Jam put on a concert in the dried-up, baking-hot Coachella Valley in California, it was an attempt to prove that they could break away from the monopoly of the concert giant TicketMaster, who, they believed, was using its considerable power to exploit music fans by continually increasing prices. Their concert was well attended and inspired the idea for a future, more ambitious event. Naturally, nobody could have predicted quite how important Coachella would eventually become.

\n

B. Six years later, in 1999, the same venue hosted its first weekend-long music festival. Although initially making a loss, this was blamed on the unbearably high temperatures and the lack of available campsite facilities. [[1]] What's more, it took only a few more years until its quality line-ups, from small bands to headliners, were attracting worldwide attention.

\n

C. \u00a0If one band is responsible for confirming Coachella's arrival on the world stage, it is Daft Punk's iconic appearance there in 2006.\u00a0[[2]] As a direct result of the festival's success, promoters expanded it to a three-day event, and in 2009, Coachella presented its most mainstream line-up, including Paul McCartney, the Killers, and The Cure. The following year Jay-Z became the first rap headliner and by 2012 such was the popularity of Coachella that it had developed into two weekends of three-day shows.

\n

D. In an effort to attract America's impoverished younger generation to an expensive annual visit to the desert, the promoters made two clever decisions. One smart move was to get a much-missed band or singer such as Rage Against the Machine to reform every year. Most notable was a holographic representation of the late rapper 2Pac in 2012.\u00a0[[3]] ln a stroke of genius, they decided to cater for the section of the audience who adored the music that used to be labelled electronic and who flocked to dance in big tents to their favourite DJs.

\n

E. By keeping its cool musical reputation, the festival would go from strength to strength. In 2016, half a million fans bought their tickets in under 20 minutes, and each year around 100,000 attendees a day now splash out around $375 on admission. Of course, the costs don't stop there. [[4]]\u00a0It is now the most profitable festival in the world.

\n

F. Just two hours from Los Angeles, Coachella swiftly became the place to see and be seen. [[5]]\u00a0The presence of models and other celebrities soon began to attract style bloggers, drawn by the fashion rather than the music. Which, in turn, has made Coachella irresistible to fashion houses, beauty companies and other lifestyle labels.

\n

G. Although for several years luxury brands have been hosting free concerts and pool parties for invited guests and photographing Instagram stars modelling designer clothes, this has until recently been outside festival hours. [[6]]\u00a0As a result, they are now effectively separate events, to the point that 'No-chella' as it has become known, is, in the opinion of some, in danger of overshadowing the 'real' festival.

\n

Coachella has certainly come a long way from the original anti-establishment Pearl Jam gig.

", - "formatting": "html", - "bfile": [] - }, - "default_grade": 6.0, - "dbid": null, - "shuffle": true, - "tags": null, - "_remarks": { - "_text": "", - "formatting": "html", - "bfile": [] - }, - "_fail_hints": [], - "_feedbacks": { - "100": { - "text": "

Your answer is correct.

", - "formatting": "html", - "bfile": [] - }, - "50": { - "text": "

Your answer is partially correct.

", - "formatting": "html", - "bfile": [] - }, - "0": { - "text": "

Your answer is incorrect.

", - "formatting": "html", - "bfile": [] - } - }, - "show_ans": true, - "max_tries": 3, - "_options": [ - { - "text": "E. Fortunately, these issues were soon resolved.", - "group": 1, - "no_of_drags": 1 - }, - { - "text": "C. Fear of missing out on another such memorable performance caused huge demand for tickets the following year.", - "group": 1, - "no_of_drags": 1 - }, - { - "text": "G. Their other idea was even more brilliant.", - "group": 1, - "no_of_drags": 1 - }, - { - "text": "B. When refreshments, merchandise, transport and accommodation are taken into account, the expense of attending rises dramatically.", - "group": 1, - "no_of_drags": 1 - }, - { - "text": "A. The appeal of its location - palm trees, guaranteed sunshine, warm temperatures - is not difficult to understand.", - "group": 1, - "no_of_drags": 1 - }, - { - "text": "D. Lately, however, increasingly extravagant marketing by the fashion industry means that attendees are now preferring to stay away from the music concert itself.", - "group": 1, - "no_of_drags": 1 - }, - { - "text": "F. On this occasion, medical professionals treated numerous audience members for heatstroke.", - "group": 1, - "no_of_drags": 1 - } - ], - "__clsname__": "QDaDText" - } - ], - "_Category__categories": {}, - "_Category__name": "$course$" -} \ No newline at end of file diff --git a/test/datasets/json/qembedded.json b/test/datasets/json/qembedded.json deleted file mode 100644 index edf3ffb..0000000 --- a/test/datasets/json/qembedded.json +++ /dev/null @@ -1,150 +0,0 @@ -{ - "_Category__questions": [ - { - "name": "Cloze", - "default_grade": 1.0, - "time_lim": 60, - "dbid": null, - "notes": "", - "_question": { - "formatting": "html", - "_text": [ - "

This is an example of an embedded answers (Cloze) type question. This is a multiple choice question but there are other types you can use too.

\n

The first Moodle Research conference was held in ", - { - "cformat": "MULTICHOICE", - "grade": 1, - "opts": [ - { - "fraction": 0.0, - "formatting": "plain_text", - "text": "Sousse, Tunisia", - "_feedback": { - "formatting": "plain_text", - "_text": [ - "That was the second" - ], - "bfile": [] - } - }, - { - "fraction": 0.0, - "formatting": "plain_text", - "text": "California, USA", - "_feedback": { - "formatting": "plain_text", - "_text": [ - "That was the third" - ], - "bfile": [] - } - }, - { - "fraction": 100.0, - "formatting": "plain_text", - "text": "Crete, Greece", - "_feedback": { - "formatting": "plain_text", - "_text": [ - "Correct!" - ], - "bfile": [] - } - }, - { - "fraction": 50.0, - "formatting": "plain_text", - "text": "Greece", - "_feedback": { - "formatting": "plain_text", - "_text": [ - "Yes but not close enough so you only get half the credit." - ], - "bfile": [] - } - } - ] - }, - "

" - ], - "bfile": [] - }, - "_remarks": { - "formatting": "html", - "_text": [ - "" - ], - "bfile": [] - }, - "_feedbacks": {}, - "_tags": [], - "_free_hints": [], - "max_tries": 3, - "_fail_hints": [], - "_options": [ - { - "cformat": "MULTICHOICE", - "grade": 1, - "opts": [ - { - "fraction": 0.0, - "formatting": "plain_text", - "text": "Sousse, Tunisia", - "_feedback": { - "formatting": "plain_text", - "_text": [ - "That was the second" - ], - "bfile": [] - } - }, - { - "fraction": 0.0, - "formatting": "plain_text", - "text": "California, USA", - "_feedback": { - "formatting": "plain_text", - "_text": [ - "That was the third" - ], - "bfile": [] - } - }, - { - "fraction": 100.0, - "formatting": "plain_text", - "text": "Crete, Greece", - "_feedback": { - "formatting": "plain_text", - "_text": [ - "Correct!" - ], - "bfile": [] - } - }, - { - "fraction": 50.0, - "formatting": "plain_text", - "text": "Greece", - "_feedback": { - "formatting": "plain_text", - "_text": [ - "Yes but not close enough so you only get half the credit." - ], - "bfile": [] - } - } - ] - } - ], - "ordered": true, - "show_ans": false, - "shuffle": false, - "__clsname__": "QEmbedded" - } - ], - "_Category__categories": {}, - "_Category__name": "$course$", - "metadata": {}, - "resources": {}, - "info": "" -} \ No newline at end of file diff --git a/test/datasets/json/qessay.json b/test/datasets/json/qessay.json deleted file mode 100644 index f9e43a3..0000000 --- a/test/datasets/json/qessay.json +++ /dev/null @@ -1,42 +0,0 @@ -{ - "_Category__questions": [ - { - "name": "Essai1", - "_question": { - "_text": "Explain in few words the aim of this course.
", - "formatting": "html", - "bfile": [] - }, - "default_grade": 1.1, - "_remarks": { - "_text": "", - "formatting": "html", - "bfile": [] - }, - "dbid": null, - "_tags": [], - "rsp_format": "editor", - "rsp_required": true, - "lines": 3, - "attachments": 0, - "atts_required": false, - "max_bytes": 0, - "file_types": "", - "grader_info": { - "_text": "", - "formatting": "html", - "bfile": [] - }, - "template": { - "_text": "", - "formatting": "html", - "bfile": [] - }, - "_feedbacks": {}, - "_free_hints": [], - "__clsname__": "QEssay" - } - ], - "_Category__categories": {}, - "_Category__name": "$course$" -} \ No newline at end of file diff --git a/test/datasets/json/qmatching.json b/test/datasets/json/qmatching.json deleted file mode 100644 index 933b29b..0000000 --- a/test/datasets/json/qmatching.json +++ /dev/null @@ -1,83 +0,0 @@ -{ - "_Category__questions": [ - { - "name": "h1", - "default_grade": 1.11, - "time_lim": 60, - "dbid": null, - "notes": "", - "_question": { - "formatting": "html", - "_text": [ - "

Match the cool Moodle features with the version in which they first appeared:

" - ], - "bfile": [] - }, - "_remarks": { - "formatting": "html", - "_text": [ - "" - ], - "bfile": [] - }, - "_feedbacks": { - "100.0": { - "formatting": "html", - "_text": [ - "

Your answer is correct.

" - ], - "bfile": [] - }, - "50.0": { - "formatting": "html", - "_text": [ - "

Your answer is partially correct.

" - ], - "bfile": [] - }, - "0.0": { - "formatting": "html", - "_text": [ - "

Your answer is incorrect.

" - ], - "bfile": [] - } - }, - "_tags": [], - "_free_hints": [], - "max_tries": 3, - "_fail_hints": [], - "_options": [ - { - "text": "

Drag and drop files

", - "answer": "Moodle 2.3", - "formatting": "html" - }, - { - "text": "

Groupings

", - "answer": "Moodle 1.9", - "formatting": "html" - }, - { - "text": "

Repositories

", - "answer": "Moodle 2.0", - "formatting": "html" - }, - { - "text": "", - "answer": "Moodle 2.5", - "formatting": "html" - } - ], - "ordered": true, - "show_ans": true, - "shuffle": true, - "__clsname__": "QMatching" - } - ], - "_Category__categories": {}, - "_Category__name": "$course$", - "metadata": {}, - "resources": {}, - "info": "" -} \ No newline at end of file diff --git a/test/datasets/json/qmissingword.json b/test/datasets/json/qmissingword.json deleted file mode 100644 index bb16231..0000000 --- a/test/datasets/json/qmissingword.json +++ /dev/null @@ -1,94 +0,0 @@ -{ - "_Category__questions": [ - { - "name": "MW Test", - "default_grade": 1.0, - "time_lim": 60, - "dbid": null, - "notes": "", - "_question": { - "formatting": "html", - "_text": [ - "

This is a [[1]] kind of question

" - ], - "bfile": [] - }, - "_remarks": { - "formatting": "html", - "_text": [ - "

Generic feedback

" - ], - "bfile": [] - }, - "_feedbacks": { - "100.0": { - "formatting": "html", - "_text": [ - "Your answer is correct." - ], - "bfile": [] - }, - "50.0": { - "formatting": "html", - "_text": [ - "Your answer is partially correct." - ], - "bfile": [] - }, - "0.0": { - "formatting": "html", - "_text": [ - "Your answer is incorrect." - ], - "bfile": [] - } - }, - "_tags": [], - "_free_hints": [], - "max_tries": 3, - "_fail_hints": [ - { - "formatting": "html", - "text": "

A hint

", - "show_correct": false, - "clear_wrong": true, - "state_incorrect": false - }, - { - "formatting": "html", - "text": "", - "show_correct": true, - "clear_wrong": false, - "state_incorrect": false - } - ], - "_options": [ - { - "text": "Missing Word", - "group": "1" - }, - { - "text": "Not Missing Word", - "group": "1" - }, - { - "text": "Another thing", - "group": "1" - }, - { - "text": "And a Test", - "group": "1" - } - ], - "ordered": true, - "show_ans": true, - "shuffle": true, - "__clsname__": "QMissingWord" - } - ], - "_Category__categories": {}, - "_Category__name": "$course$", - "metadata": {}, - "resources": {}, - "info": "" -} \ No newline at end of file diff --git a/test/datasets/json/qmultichoice.json b/test/datasets/json/qmultichoice.json deleted file mode 100644 index 91f2708..0000000 --- a/test/datasets/json/qmultichoice.json +++ /dev/null @@ -1,127 +0,0 @@ -{ - "_Category__questions": [ - { - "name": "html layout", - "default_grade": 1.3, - "time_lim": 60, - "dbid": null, - "notes": "", - "_question": { - "formatting": "html", - "_text": [ - "

a link here and an image \"\"and an equation \\( \\int_{2\\pi} x^2 \\mathrm{d} x \\)

centered text

flush left text

flush right text

In moodle editor, there is also exponent and indice and that

and svg file \"escargot\"

" - ], - "bfile": [] - }, - "_remarks": { - "formatting": "html", - "_text": [ - "" - ], - "bfile": [] - }, - "_feedbacks": { - "100.0": { - "formatting": "html", - "_text": [ - "Votre r\u00e9ponse est correcte." - ], - "bfile": [] - }, - "50.0": { - "formatting": "html", - "_text": [ - "Votre r\u00e9ponse est partiellement correcte." - ], - "bfile": [] - }, - "0.0": { - "formatting": "html", - "_text": [ - "Votre r\u00e9ponse est incorrecte." - ], - "bfile": [] - } - }, - "_tags": [], - "_free_hints": [], - "max_tries": 3, - "_fail_hints": [], - "_options": [ - { - "fraction": 100.0, - "formatting": "html", - "text": "

This is the good underlined answer.

", - "_feedback": { - "formatting": "html", - "_text": [ - "" - ], - "bfile": [] - } - }, - { - "fraction": 0.0, - "formatting": "html", - "text": "

This is one italic wrong answer.

", - "_feedback": { - "formatting": "html", - "_text": [ - "" - ], - "bfile": [] - } - }, - { - "fraction": 0.0, - "formatting": "html", - "text": "

This a wrong bold answer.

", - "_feedback": { - "formatting": "html", - "_text": [ - "" - ], - "bfile": [] - } - }, - { - "fraction": 0.0, - "formatting": "html", - "text": "

This a wrong strong answer.

", - "_feedback": { - "formatting": "html", - "_text": [ - "" - ], - "bfile": [] - } - }, - { - "fraction": 0.0, - "formatting": "html", - "text": "

This a wrong emphasis answer.

", - "_feedback": { - "formatting": "html", - "_text": [ - "" - ], - "bfile": [] - } - } - ], - "ordered": true, - "show_ans": true, - "shuffle": true, - "single": true, - "show_instr": false, - "numbering": "abc", - "use_dropdown": false, - "__clsname__": "QMultichoice" - } - ], - "_Category__categories": {}, - "_Category__name": "$course$", - "metadata": {}, - "resources": {}, - "info": "" -} \ No newline at end of file diff --git a/test/datasets/json/qnumerical.json b/test/datasets/json/qnumerical.json deleted file mode 100644 index a262e7c..0000000 --- a/test/datasets/json/qnumerical.json +++ /dev/null @@ -1,72 +0,0 @@ -{ - "_Category__questions": [ - { - "name": "num:int", - "default_grade": 1.0, - "time_lim": 60, - "dbid": null, - "notes": "", - "_question": { - "formatting": "html", - "_text": [ - "

Find \\(x\\) such \\(2x-300=0\\) ?

Here \\(x\\) is an integer, test for exact match, only.

" - ], - "bfile": [] - }, - "_remarks": { - "formatting": "html", - "_text": [ - "" - ], - "bfile": [] - }, - "_feedbacks": {}, - "_tags": [], - "_free_hints": [], - "max_tries": 3, - "_fail_hints": [], - "_options": [ - { - "fraction": 100.0, - "formatting": "auto", - "text": "150", - "_feedback": { - "formatting": "html", - "_text": [ - "" - ], - "bfile": [] - }, - "tolerance": 0.0 - } - ], - "ordered": true, - "show_ans": false, - "shuffle": false, - "grading_type": "0", - "unit_penalty": "0.1000000", - "show_unit": "0", - "left": false, - "units": [ - { - "unit_name": "cm", - "multiplier": 1.0 - }, - { - "unit_name": "mm", - "multiplier": 0.5 - }, - { - "unit_name": "m", - "multiplier": 0.5 - } - ], - "__clsname__": "QNumerical" - } - ], - "_Category__categories": {}, - "_Category__name": "$course$", - "metadata": {}, - "resources": {}, - "info": "" -} \ No newline at end of file diff --git a/test/datasets/json/qshortanswer.json b/test/datasets/json/qshortanswer.json deleted file mode 100644 index 2972fed..0000000 --- a/test/datasets/json/qshortanswer.json +++ /dev/null @@ -1,66 +0,0 @@ -{ - "_Category__questions": [ - { - "name": "h3", - "default_grade": 1.12, - "time_lim": 60, - "dbid": null, - "notes": "", - "_question": { - "formatting": "html", - "_text": [ - "

Type in the name of the ISLAND where the first ever Moodle Research conference was held.

" - ], - "bfile": [] - }, - "_remarks": { - "formatting": "html", - "_text": [ - "" - ], - "bfile": [] - }, - "_feedbacks": {}, - "_tags": [], - "_free_hints": [], - "max_tries": 3, - "_fail_hints": [], - "_options": [ - { - "fraction": 100.0, - "formatting": "auto", - "text": "Crete", - "_feedback": { - "formatting": "html", - "_text": [ - "

Correct. Well done! More information on Moodle Research conferences on the Moodle Research site.

" - ], - "bfile": [] - } - }, - { - "fraction": 0.0, - "formatting": "auto", - "text": "Greece", - "_feedback": { - "formatting": "html", - "_text": [ - "

That is the correct country, but we want the island.

" - ], - "bfile": [] - } - } - ], - "ordered": true, - "show_ans": false, - "shuffle": false, - "use_case": "0", - "__clsname__": "QShortAnswer" - } - ], - "_Category__categories": {}, - "_Category__name": "$course$", - "metadata": {}, - "resources": {}, - "info": "" -} \ No newline at end of file diff --git a/test/datasets/json/qtruefalse.json b/test/datasets/json/qtruefalse.json deleted file mode 100644 index 3fa7bcf..0000000 --- a/test/datasets/json/qtruefalse.json +++ /dev/null @@ -1,49 +0,0 @@ -{ - "_Category__questions": [ - { - "name": "tf", - "default_grade": 1.14, - "time_lim": 60, - "dbid": null, - "notes": "", - "_question": { - "formatting": "html", - "_text": [ - "This is an example of a True/False question type.\n\n This picture represents the release of Moodle 2.1. True or false?
\"\"
" - ], - "bfile": [] - }, - "_remarks": { - "formatting": "html", - "_text": [ - "" - ], - "bfile": [] - }, - "_feedbacks": {}, - "_tags": [], - "_free_hints": [], - "correct": false, - "_true_feedback": { - "formatting": "html", - "_text": [ - "Yes. Did you just know? Or did you know the secret signs? Each new version of Moodle until Moodle 3.5  brought a new photo of Martin's children.\n\n The correct answer is 'True'." - ], - "bfile": [] - }, - "_false_feedback": { - "formatting": "html", - "_text": [ - "Each new version of Moodle until Moodle 3.5  brought a new photo of Martin's children. The correct answer is 'True'." - ], - "bfile": [] - }, - "__clsname__": "QTrueFalse" - } - ], - "_Category__categories": {}, - "_Category__name": "$course$", - "metadata": {}, - "resources": {}, - "info": "" -} \ No newline at end of file diff --git a/test/datasets/olx/library.tar.xz b/test/datasets/olx/library.tar.xz new file mode 100644 index 0000000000000000000000000000000000000000..04feef75d62ff1dfa2d4480fc9e8a63992bb7fba GIT binary patch literal 1888 zcmV-m2cP);H+ooF000E$*0e?f03iVu0001VFXf})VgCmmT>v&3NNZF-RpMdJi6*Fs zd2|xD_+uLZgg5{;EcOEWf1eq$&U`;i3Z1&3hzlgIcad=j!r}4ByzXzCjQj?_E4PBp zp2!fXL*;IT42r#bnoJK%}CuoRde0LiRs_qSU?p|6Jd zY`00=Zb0|uVc6p5MFn8%5k;0}bwiPi7w;#dW2m@2H=CHvs?Vb+8V70 zdl|HkZY*GOTWn~zHTby(o`u}}=%PUmU}Ev!O?IdEqiLKwRYld<*Cs&Y_`xm#Ug)k< zQ^e39N7SgYq^H3*Xlb`-L_;ErdbxOwuIn-;EFIURpuDlap#V&t&@RCpZC;TpD)lr> z;`;V(5*4HgZF`EZN=c1*kn?R%5QhIoL0Ee&>1gPKw(h-bByZf!fv*f&`y?lG#T;U$ z;$fZNF?%=!3SFtMl{#t$CKH;csw!5VM{{$9XEf5+5pYe4Wn(Obczw~)(PkA*4}yjY zR|Q=Q6|4T(lW(vUZEJb#;$W%GUuo@t+N_Qb>@GXPmqE%gUWq+8{GbewbQFg+EysMZ zMIcc}gBe8aivScU77;Pod2YWBsQ`ylhb#e1C+-Nud6uTnz&65{4Db$af~!OkBQ{^z#;pr)PK;gv< z07E}{_624khX!*c9*eiF$@mfv-C;x#)f_=>4;)B9dQYVcXG?CP$F)dWjzV5fY$DtI zl%d=(KQ!!rC4lz|4A1!nf1n*g`H3f#+)D(z{{7X;sgUPZe_fe*>jv$403*v+X0}2t zQaTjZeVK(C&6?bs)JT02Q?V=#^2{F=#@hp;W0Ph3f2{^DACxgsCFXBiXUDMk@eEMM zgkYtLnk$C8d85!1c20RW!Z@&{mSe;@KO96!L^cDSAF`)uC=g$*>fZpSgp@}N8M;bl z0k%AEBw{3!*jYGOwtI1tqOs^xEU~26C@!swrZE%9#0qN;31?9*PBHI=Ld7`B<-@Mt z0b!Gv07mPduh>V_Wg%)uDt&7}j}k^RvMlLW@GB2vV^EmCx+}$?H_}c*jX$;naWK?& ziA)dx&9H(N(ZxfdW7`C6;f0;nkryqpOoY!!eiBk!*^Xqr=zj-MSo_r+`OeWNHKU5U z`LHSG-Y!U>VfW=d-S7m>W(~+3kwhc0#Ao{g000001X)@xgpi#8 literal 0 HcmV?d00001 diff --git a/test/datasets/olx/test-problem-bank.tar.xz b/test/datasets/olx/test-problem-bank.tar.xz deleted file mode 100644 index 57b5e6f57ee7d3b791d266c31c74a10c1a269fe8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1900 zcmV-y2b1{yH+ooF000E$*0e?f03iVu0001VFXf})WB&&%T>v^6O3odAB|Dhmifj(x zZCRf#rwY6am+S6JJ$N1?H2Jm{Y3_?(yVv1cvx`Dv{-0%VKQ45fHUVg7rK3sjncY=C zSxI_>BUG?)wXoSA8@54>i?Y{m8=g~;)7vy(O`{p^+3EpH9N$LPL#%B^V%)mZFGJZu z_|S%jmu$9nHXJFbP?5$?`O)a}y-O|vi8GH)r&wD{ck}9=9iggsmU_>6KUkc%y5l9c z;zkHSi@_IK>2o8xraHCwwm`Vse#BeX{z*5m-ZJ<%ji<`D4nQm1^x8#zEw#ewThz?^ z-&8X9`tQd zn90iXaZPxDGtt)D+m(cOuqGc8zHl4Ki}I~CjywiR&=+rt0!;OJ&`1&~2|WSF_;!wQ zLO93l;wXDduqTe$uoHTkHy7`7C*I!6wId-6Lt)BL6UNn>xB@kedv8THC|+2^g`TPB z_SX2TF04)M2g4nA?#_l7`%ogiyi4~7D7&C4Md_WNbE@ofADDLlu7=2w4j2F+$ea?7#;T(rwa%icwOd)g zXUoth()OeEdj-J6x}u9in=ii*9(Kn1|NPcClLAmqT^SaPHp|ymuQmyRMGMwph`sK4 zaf0Y;Fj{T-s4)ed{iMjkE{IJ{H~eq{(<;TmATV~*&(FCfnSZ#6=c7Ftn$mgY^>JI7 z?XJ3u_oHAv-;!yXzOmVJdCc~ zxR_o-CnjCf#H^|0XnW8UH~VD|7To`G!PGXJA6P(bo0g4+l~9h9QSMlX|Jn0HPbP=( zj=)bN+hWEVf`8WS{92XR8f(baUbODD+Mu>#y|kn2IxnL#>L&^q_sfCW4H25& zecc{SOa)kUzTtAp=gGD#_T95zuTA%IFQiGAB`gvhq;-EA;!Oql>=KL+j(|%4bc>%3 zI#?i0Ee=RMM=$m{=eTXZZM{cX{HZRB8==KbJhrd~)xXqEV&Ag3OMN!(7sY57b-^SIFrXWYx#Mt#b4K8_Ts6+y&esRsB1i4Tcc zA)5}pLL6>2^m4~!ZlrmrkR}g-O?jtE(~6V21~g;?HpDCSC3pxcJ13YN_W3~}7||jr zPG3||b;YL1I_=a+B`su&E_5|k5v-^=y&^BcrU?<^RCk~IhDM_!a~BbZ4$ye{Nmgkk z2e*2a0O8!8)*>0i7Yf01A^6Z1u^h(mCC^o9Y3!J8q19vpmlW!iY(HoxY;^_-jt;z{ z#PFFk@j>IxdlP3lGs()|+6|2;WEV4Bqn?E&jdm?J43nu)5hM3Bo2zI_ba68xxUPjJ z&#h|FI0tI2Pi>_56Ue)#emuJffX+10`XEI%%t_mHv$Fov5+a17eL2-Z8$>2tI1TDO z?@q4$`iY0TSvaxyEII;>`d6CaLV;#WBY%k+bAPtPKiyR7A2CDm8wSuGEy$-sJuCkc zpf*#=xyUs|NkYnNC0#3qPQ6+5oGwBP7=2;%s)87rWekKZ{kymTkc^uW04os%?Y41+ zA9}1i|1H%+=s{T~wTWPtjV<9tH$o;_;~4ZAkEsFJ+ooo3(og~PPubi@SfV;Oux mP-Xy2>iG2Zd`Wl!0mu%3$N>Q7wjk=U#Ao{g000001X)@kvZ?$4 diff --git a/test/test_parser/test_aiken.py b/test/test_parser/test_aiken.py index f193255..4c6a386 100644 --- a/test/test_parser/test_aiken.py +++ b/test/test_parser/test_aiken.py @@ -23,17 +23,16 @@ def test_read(): - EXAMPLE = f"{TEST_PATH}/datasets/aiken/aiken_1.txt" - control = category.Category.read_aiken(EXAMPLE) + example = f"{TEST_PATH}/datasets/aiken/aiken_1.txt" + control = category.Category.read_aiken(example) assert control.get_size() == 5 question = control.get_question(1) - assert question.QNAME == 'Multichoice' - assert question.default_grade == 1.0 + assert question.tags == [] assert question.name == 'aiken_1' - assert question.question.get() == ("During the month of September 2013, " + assert question.body.get() == ("During the month of September 2013, " "Moodle ran a successful MOOC for teachers new " "to Moodle. What was the name of the course?") - assert len(question.options) == 3 + assert len(question.body) == 3 assert question.options[0].text == 'Teaching with Moodle' assert question.options[0].fraction == 100 assert question.options[1].fraction == 0 diff --git a/test/test_parser/test_latex.py b/test/test_parser/test_latex.py index 54d4366..d4c3504 100644 --- a/test/test_parser/test_latex.py +++ b/test/test_parser/test_latex.py @@ -19,7 +19,7 @@ from io import StringIO import os from qas_editor.category import Category -from qas_editor._parsers import latex +from qas_editor.parsers import latex TEST_PATH = os.path.dirname(os.path.dirname(__file__)) diff --git a/test/test_parser/test_moodle.py b/test/test_parser/test_moodle.py index 53fb788..304a61b 100644 --- a/test/test_parser/test_moodle.py +++ b/test/test_parser/test_moodle.py @@ -18,7 +18,7 @@ import os from qas_editor import category -from qas_editor._parsers import moodle +from qas_editor.parsers import moodle TEST_PATH = os.path.dirname(os.path.dirname(__file__)) diff --git a/test/test_parser/test_olx.py b/test/test_parser/test_olx.py index 823401e..ee8d05a 100644 --- a/test/test_parser/test_olx.py +++ b/test/test_parser/test_olx.py @@ -17,6 +17,8 @@ """ import os +from qas_editor.category import Category +from qas_editor.parsers import olx TEST_PATH = os.path.dirname(os.path.dirname(__file__)) @@ -25,5 +27,7 @@ # https://github.com/mitodl/openedx-course-test DOCKER = "docker run -i -t -v \"/path/to/course_dir\":\"/course\" -w /test_course mitodl/openedx-course-test bash -e test_course" -def test_read(): - pass \ No newline at end of file +def test_read_course(): + EXAMPLE = f"{TEST_PATH}/datasets/olx/course.tar.xz" + tmp = olx.read_olx(Category, EXAMPLE) + raise tmp \ No newline at end of file diff --git a/test/test_parser/test_qti.py b/test/test_parser/test_qti.py index 2534eca..c640410 100644 --- a/test/test_parser/test_qti.py +++ b/test/test_parser/test_qti.py @@ -18,7 +18,7 @@ import os import shutil import pytest -from qas_editor._parsers.ims import qti1v2, bb, IMS, canvas +from qas_editor.parsers.ims import bb, IMS, canvas from qas_editor.category import Category TEST_PATH = os.path.dirname(os.path.dirname(__file__)) @@ -31,6 +31,7 @@ def all_question_types(): yield IMS(EXAMPLE, TMP) shutil.rmtree(TMP) + def test_read_manifest(all_question_types: IMS): all_question_types.get_manifest() @@ -42,10 +43,13 @@ def test_read_canvas(): shutil.rmtree(TMP, ignore_errors=True) canvas.read_cc_canvas(cat, EXAMPLE) -def test_read(): - EXAMPLE = f"{TEST_PATH}/datasets/qti1v2/item.zip" - parser = qti1v2.QTIParser1v2() - parser.read(EXAMPLE) + +def test_read_bb8(): + EXAMPLE = f"{TEST_PATH}/datasets/ims/bb8.imscc" + TMP = f"{TEST_PATH}/datasets/ims/bb8_tmp" + cat = Category() + shutil.rmtree(TMP, ignore_errors=True) + bb.read_bb8(cat, EXAMPLE) def test_write_bb():