Spaces:
Sleeping
Sleeping
Samarth Naik commited on
Commit ·
5e753f2
1
Parent(s): 02c7868
Project 2
Browse files- .gitignore +11 -41
- Dockerfile +12 -0
- LICENSE +21 -0
- README.md +51 -57
- helpers/helper_functions.py +0 -228
- recieved_data/quiz_1.html +0 -25
- recieved_data/viewform.html +0 -1
- requirements.txt +8 -1
- server.py +29 -0
- solver/__init__.py +3 -0
- solver/browser.py +12 -0
- solver/quiz_solver.py +80 -0
- solver/utils.py +26 -0
- src/main.py +0 -63
.gitignore
CHANGED
|
@@ -1,46 +1,16 @@
|
|
| 1 |
-
# Python
|
| 2 |
__pycache__/
|
| 3 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
| 4 |
*.pyo
|
| 5 |
*.pyd
|
| 6 |
-
*.env
|
| 7 |
-
.env
|
| 8 |
-
venv/
|
| 9 |
-
ENV/
|
| 10 |
-
*.egg-info/
|
| 11 |
-
*.sqlite3
|
| 12 |
-
|
| 13 |
-
# macOS
|
| 14 |
-
.DS_Store
|
| 15 |
-
.AppleDouble
|
| 16 |
-
.LSOverride
|
| 17 |
-
|
| 18 |
-
# VS Code
|
| 19 |
-
.vscode/
|
| 20 |
-
|
| 21 |
-
# Jupyter
|
| 22 |
-
.ipynb_checkpoints/
|
| 23 |
-
|
| 24 |
-
# Logs
|
| 25 |
-
*.log
|
| 26 |
-
|
| 27 |
-
# Data
|
| 28 |
-
recieved_data/*.csv
|
| 29 |
-
recieved_data/*.xlsx
|
| 30 |
-
recieved_data/*.tsv
|
| 31 |
-
recieved_data/*.json
|
| 32 |
-
recieved_data/*.tmp
|
| 33 |
-
|
| 34 |
-
# Misc
|
| 35 |
-
*.bak
|
| 36 |
*.swp
|
| 37 |
-
|
| 38 |
-
|
| 39 |
-
# Test outputs
|
| 40 |
htmlcov/
|
| 41 |
-
|
| 42 |
-
|
| 43 |
-
|
| 44 |
-
|
| 45 |
-
Thumbs.db
|
| 46 |
-
Desktop.ini
|
|
|
|
|
|
|
| 1 |
__pycache__/
|
| 2 |
+
.pytest_cache/
|
| 3 |
+
.venv/
|
| 4 |
+
venv/
|
| 5 |
+
env/
|
| 6 |
+
*.pyc
|
| 7 |
*.pyo
|
| 8 |
*.pyd
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 9 |
*.swp
|
| 10 |
+
.DS_Store
|
| 11 |
+
coverage/
|
|
|
|
| 12 |
htmlcov/
|
| 13 |
+
dist/
|
| 14 |
+
build/
|
| 15 |
+
*.egg-info/
|
| 16 |
+
.env
|
|
|
|
|
|
Dockerfile
ADDED
|
@@ -0,0 +1,12 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
FROM mcr.microsoft.com/playwright/python:v1.45.0-jammy
|
| 2 |
+
|
| 3 |
+
WORKDIR /app
|
| 4 |
+
|
| 5 |
+
COPY requirements.txt .
|
| 6 |
+
RUN pip install -r requirements.txt
|
| 7 |
+
|
| 8 |
+
COPY . .
|
| 9 |
+
|
| 10 |
+
EXPOSE 8000
|
| 11 |
+
|
| 12 |
+
CMD ["uvicorn", "server:app", "--host", "0.0.0.0", "--port", "8000"]
|
LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
MIT License
|
| 2 |
+
|
| 3 |
+
Copyright (c) 2025 samarthnaikk
|
| 4 |
+
|
| 5 |
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
| 6 |
+
of this software and associated documentation files (the "Software"), to deal
|
| 7 |
+
in the Software without restriction, including without limitation the rights
|
| 8 |
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
| 9 |
+
copies of the Software, and to permit persons to whom the Software is
|
| 10 |
+
furnished to do so, subject to the following conditions:
|
| 11 |
+
|
| 12 |
+
The above copyright notice and this permission notice shall be included in all
|
| 13 |
+
copies or substantial portions of the Software.
|
| 14 |
+
|
| 15 |
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
| 16 |
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
| 17 |
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
| 18 |
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
| 19 |
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
| 20 |
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
| 21 |
+
SOFTWARE.
|
README.md
CHANGED
|
@@ -1,64 +1,58 @@
|
|
| 1 |
-
#
|
| 2 |
-
|
| 3 |
-
##
|
| 4 |
-
|
| 5 |
-
|
| 6 |
-
|
| 7 |
-
|
| 8 |
-
|
| 9 |
-
|
| 10 |
-
|
| 11 |
-
|
| 12 |
-
|
| 13 |
-
|
| 14 |
-
|
| 15 |
-
|
| 16 |
-
|
| 17 |
-
|
| 18 |
-
|
| 19 |
-
|
| 20 |
-
|
| 21 |
-
|
| 22 |
-
|
| 23 |
-
|
| 24 |
-
|
| 25 |
-
|
| 26 |
-
|
| 27 |
-
|
| 28 |
-
|
| 29 |
-
|
| 30 |
-
|
| 31 |
-
|
| 32 |
-
|
| 33 |
-
|
| 34 |
-
|
| 35 |
-
3. Run the script with your email, secret, and quiz URL.
|
| 36 |
-
|
| 37 |
-
## Example
|
| 38 |
-
To test your endpoint, send a POST request to the demo endpoint:
|
| 39 |
-
```json
|
| 40 |
-
{
|
| 41 |
-
"email": "your email",
|
| 42 |
-
"secret": "your secret",
|
| 43 |
-
"url": "https://tds-llm-analysis.s-anand.net/demo"
|
| 44 |
-
}
|
| 45 |
```
|
| 46 |
|
| 47 |
-
|
| 48 |
-
|
| 49 |
-
|
| 50 |
-
|
| 51 |
-
|
| 52 |
|
| 53 |
-
## Running the Script
|
| 54 |
```bash
|
| 55 |
-
|
|
|
|
| 56 |
```
|
| 57 |
|
| 58 |
-
|
| 59 |
-
|
| 60 |
-
|
| 61 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 62 |
|
| 63 |
-
|
| 64 |
-
MIT
|
|
|
|
| 1 |
+
# TDS Quiz Solver Service
|
| 2 |
+
|
| 3 |
+
## Overview
|
| 4 |
+
|
| 5 |
+
This repository provides a small asynchronous quiz solver service built with FastAPI, Playwright, and httpx. The service accepts POST requests from a TDS-style quiz system, then launches a background asynchronous solver that navigates pages with Playwright, extracts questions (or Base64 payloads), computes placeholder answers, and submits them to the quiz system until no next URL is returned.
|
| 6 |
+
|
| 7 |
+
## How TDS triggers the solver
|
| 8 |
+
|
| 9 |
+
The TDS quiz system should send a POST request to `/` with a JSON body containing `email`, `secret`, and `url`. The server validates the JSON and the `secret`, then immediately starts the solver in a background asyncio task and returns a quick acknowledgement.
|
| 10 |
+
|
| 11 |
+
The `secret` in this repository is `supersecret123`. Change it in `server.py` for production.
|
| 12 |
+
|
| 13 |
+
## How the solver works
|
| 14 |
+
|
| 15 |
+
- `solver/browser.py` launches Playwright Chromium (headless) and provides a page and context (`accept_downloads=True`).
|
| 16 |
+
- `solver/quiz_solver.py` implements `solve_quiz(email, secret, start_url)`: it navigates to the `start_url`, extracts question text or Base64 blocks, finds a submit URL on the page, computes an answer (placeholder), submits the answer via `httpx.AsyncClient`, and follows any returned `url` in the JSON response until no further URL is provided.
|
| 17 |
+
|
| 18 |
+
The compute logic is a placeholder; replace `compute_answer` in `solver/quiz_solver.py` with real answering logic.
|
| 19 |
+
|
| 20 |
+
## Local run instructions
|
| 21 |
+
|
| 22 |
+
1. Install dependencies (preferably inside a virtualenv):
|
| 23 |
+
|
| 24 |
+
```bash
|
| 25 |
+
python -m venv .venv
|
| 26 |
+
source .venv/bin/activate
|
| 27 |
+
pip install -r requirements.txt
|
| 28 |
+
playwright install
|
| 29 |
+
```
|
| 30 |
+
|
| 31 |
+
2. Run the server with uvicorn:
|
| 32 |
+
|
| 33 |
+
```bash
|
| 34 |
+
uvicorn server:app --host 0.0.0.0 --port 8000
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 35 |
```
|
| 36 |
|
| 37 |
+
3. Send a POST request to `http://localhost:8000/` with the JSON shown above.
|
| 38 |
+
|
| 39 |
+
## Docker build + run
|
| 40 |
+
|
| 41 |
+
Build the Docker image and run:
|
| 42 |
|
|
|
|
| 43 |
```bash
|
| 44 |
+
docker build -t tds-solver:latest .
|
| 45 |
+
docker run -p 8000:8000 tds-solver:latest
|
| 46 |
```
|
| 47 |
|
| 48 |
+
The image uses the official Playwright Python image which includes browser dependencies.
|
| 49 |
+
|
| 50 |
+
## Render deployment instructions
|
| 51 |
+
|
| 52 |
+
1. Create a new Web Service on Render.
|
| 53 |
+
2. Choose your repository and select "Dockerfile" as the build method.
|
| 54 |
+
3. No start command is required; Render will use the Dockerfile's default `CMD`.
|
| 55 |
+
|
| 56 |
+
## Example test
|
| 57 |
|
| 58 |
+
You can use the demo site to test the solver by sending a POST to the server with `url` set to `https://tds-llm-analysis.s-anand.net/demo` and `secret` set to `supersecret123`.
|
|
|
helpers/helper_functions.py
DELETED
|
@@ -1,228 +0,0 @@
|
|
| 1 |
-
def find_answers_with_gemini(questions: list) -> list:
|
| 2 |
-
"""
|
| 3 |
-
Uses Google Generative AI (Gemini) to find answers for a list of questions.
|
| 4 |
-
Requires google-generativeai installed and API key in .env as GOOGLE_API_KEY.
|
| 5 |
-
Returns a list of answers (one per question).
|
| 6 |
-
"""
|
| 7 |
-
import os
|
| 8 |
-
import google.generativeai as genai
|
| 9 |
-
from dotenv import load_dotenv
|
| 10 |
-
|
| 11 |
-
load_dotenv()
|
| 12 |
-
api_key = os.getenv("GOOGLE_API_KEY")
|
| 13 |
-
if not api_key:
|
| 14 |
-
raise RuntimeError("GOOGLE_API_KEY not found in .env")
|
| 15 |
-
genai.configure(api_key=api_key)
|
| 16 |
-
model = genai.GenerativeModel('gemini-2.5-flash')
|
| 17 |
-
answers = []
|
| 18 |
-
for q in questions:
|
| 19 |
-
try:
|
| 20 |
-
response = model.generate_content(q)
|
| 21 |
-
answers.append(response.text.strip())
|
| 22 |
-
except Exception as e:
|
| 23 |
-
answers.append(f"Error: {e}")
|
| 24 |
-
return answers
|
| 25 |
-
import re
|
| 26 |
-
import string
|
| 27 |
-
|
| 28 |
-
def extract_likely_questions(file_path: str) -> list:
|
| 29 |
-
"""
|
| 30 |
-
Extract likely questions from any HTML file using heuristics and basic NLP.
|
| 31 |
-
- Finds text nodes ending with '?' or containing interrogative words.
|
| 32 |
-
- Ignores navigation, boilerplate, and very short texts.
|
| 33 |
-
Returns a list of question strings.
|
| 34 |
-
"""
|
| 35 |
-
from bs4 import BeautifulSoup
|
| 36 |
-
with open(file_path, 'r', encoding='utf-8') as f:
|
| 37 |
-
html = f.read()
|
| 38 |
-
soup = BeautifulSoup(html, 'html.parser')
|
| 39 |
-
|
| 40 |
-
interrogatives = {'what', 'which', 'who', 'whom', 'whose', 'when', 'where', 'why', 'how', 'describe', 'explain', 'give', 'list', 'select', 'choose'}
|
| 41 |
-
candidates = set()
|
| 42 |
-
|
| 43 |
-
# Get all visible text nodes
|
| 44 |
-
for el in soup.find_all(text=True):
|
| 45 |
-
txt = el.strip()
|
| 46 |
-
if not txt or len(txt) < 8:
|
| 47 |
-
continue
|
| 48 |
-
# Remove excessive whitespace and punctuation
|
| 49 |
-
txt_clean = txt.translate(str.maketrans('', '', string.punctuation)).strip()
|
| 50 |
-
words = set(w.lower() for w in txt_clean.split())
|
| 51 |
-
# Filter out JSON/config blobs and technical metadata
|
| 52 |
-
if re.match(r'^[\[{].*[\]}]$', txt) or re.search(r'(docs_flag_initialData|info_params|docs-|true|false|null|\{.*\}|\[.*\])', txt):
|
| 53 |
-
continue
|
| 54 |
-
# Heuristic: ends with '?' or contains interrogative word
|
| 55 |
-
if txt.endswith('?') or interrogatives.intersection(words):
|
| 56 |
-
# Ignore boilerplate (navigation, copyright, etc.)
|
| 57 |
-
if len(txt) > 8 and not re.search(r'(copyright|submit|next|previous|back|home|menu|login|logout)', txt, re.I):
|
| 58 |
-
candidates.add(txt)
|
| 59 |
-
# Also: long sentences with numbers or data requests
|
| 60 |
-
elif len(txt) > 30 and re.search(r'(sum|total|average|mean|count|find|compute|calculate|show|enter|answer)', txt, re.I):
|
| 61 |
-
candidates.add(txt)
|
| 62 |
-
|
| 63 |
-
return sorted(candidates)
|
| 64 |
-
# Helper functions for DoMyDA quiz solver
|
| 65 |
-
|
| 66 |
-
def verify_secret(secret: str, expected_secret: str) -> bool:
|
| 67 |
-
"""Verify if the provided secret matches the expected secret."""
|
| 68 |
-
return secret == expected_secret
|
| 69 |
-
|
| 70 |
-
import os
|
| 71 |
-
from bs4 import BeautifulSoup
|
| 72 |
-
|
| 73 |
-
def parse_quiz_html(file_path: str) -> str:
|
| 74 |
-
"""
|
| 75 |
-
General parser for quiz HTML files. Extracts questions and answers in a readable format.
|
| 76 |
-
Handles static and dynamically rendered content (e.g., in <div id='result'>).
|
| 77 |
-
"""
|
| 78 |
-
import base64
|
| 79 |
-
import re
|
| 80 |
-
with open(file_path, 'r', encoding='utf-8') as f:
|
| 81 |
-
html = f.read()
|
| 82 |
-
soup = BeautifulSoup(html, 'html.parser')
|
| 83 |
-
|
| 84 |
-
# Extract questions from headings
|
| 85 |
-
questions = []
|
| 86 |
-
for tag in ['h1', 'h2', 'h3']:
|
| 87 |
-
for q in soup.find_all(tag):
|
| 88 |
-
questions.append(q.get_text(strip=True))
|
| 89 |
-
|
| 90 |
-
# Try to extract question/answer from <div id='result'> (may be rendered via JS)
|
| 91 |
-
result_div = soup.find('div', id='result')
|
| 92 |
-
if result_div:
|
| 93 |
-
# Look for atob in script
|
| 94 |
-
scripts = soup.find_all('script')
|
| 95 |
-
for script in scripts:
|
| 96 |
-
m = re.search(r"atob\(`([A-Za-z0-9+/=\n]+)`\)", script.text)
|
| 97 |
-
if m:
|
| 98 |
-
b64 = m.group(1).replace('\n', '')
|
| 99 |
-
try:
|
| 100 |
-
decoded = base64.b64decode(b64).decode('utf-8')
|
| 101 |
-
# Try to extract question and answer from decoded text
|
| 102 |
-
# If JSON, pretty print
|
| 103 |
-
if decoded.strip().startswith('{'):
|
| 104 |
-
import json
|
| 105 |
-
try:
|
| 106 |
-
obj = json.loads(decoded)
|
| 107 |
-
questions.append(f"Decoded JSON: {json.dumps(obj, indent=2)}")
|
| 108 |
-
except Exception:
|
| 109 |
-
questions.append(f"Decoded: {decoded}")
|
| 110 |
-
else:
|
| 111 |
-
questions.append(f"Decoded: {decoded}")
|
| 112 |
-
except Exception:
|
| 113 |
-
questions.append("Could not decode base64 content.")
|
| 114 |
-
|
| 115 |
-
if not questions:
|
| 116 |
-
questions.append("Question not found.")
|
| 117 |
-
|
| 118 |
-
# Format output
|
| 119 |
-
output = ""
|
| 120 |
-
for i, q in enumerate(questions):
|
| 121 |
-
output += f"Question/Info {i+1}: {q}\n"
|
| 122 |
-
return output.strip()
|
| 123 |
-
|
| 124 |
-
|
| 125 |
-
def list_received_files(received_dir: str) -> list:
|
| 126 |
-
"""Return a list of file paths in `received_dir` (non-recursive).
|
| 127 |
-
|
| 128 |
-
Only returns regular files (no directories).
|
| 129 |
-
"""
|
| 130 |
-
received_dir = os.path.abspath(received_dir)
|
| 131 |
-
if not os.path.isdir(received_dir):
|
| 132 |
-
return []
|
| 133 |
-
files = []
|
| 134 |
-
for name in os.listdir(received_dir):
|
| 135 |
-
path = os.path.join(received_dir, name)
|
| 136 |
-
if os.path.isfile(path):
|
| 137 |
-
files.append(path)
|
| 138 |
-
return sorted(files)
|
| 139 |
-
|
| 140 |
-
|
| 141 |
-
def file_contains_text(file_path: str, text: str) -> bool:
|
| 142 |
-
"""Return True if `text` appears in the file (case-sensitive)."""
|
| 143 |
-
try:
|
| 144 |
-
with open(file_path, 'r', encoding='utf-8') as f:
|
| 145 |
-
data = f.read()
|
| 146 |
-
return text in data
|
| 147 |
-
except Exception:
|
| 148 |
-
return False
|
| 149 |
-
|
| 150 |
-
|
| 151 |
-
def find_files_matching_url(received_dir: str, url: str, exts=None) -> list:
|
| 152 |
-
"""Find files in `received_dir` that likely correspond to the given `url`.
|
| 153 |
-
|
| 154 |
-
Matching strategy (best-effort):
|
| 155 |
-
- If `url` is a substring of the file contents, it's a match.
|
| 156 |
-
- If the filename contains a segment of the URL path, it's a match.
|
| 157 |
-
- If `exts` is provided, restrict to those extensions (e.g., ['.html', '.js']).
|
| 158 |
-
Returns a list of file paths.
|
| 159 |
-
"""
|
| 160 |
-
if exts is None:
|
| 161 |
-
exts = ['.html', '.htm', '.js', '.json', '.txt']
|
| 162 |
-
url = url or ''
|
| 163 |
-
candidates = []
|
| 164 |
-
for path in list_received_files(received_dir):
|
| 165 |
-
if exts and not any(path.lower().endswith(e) for e in exts):
|
| 166 |
-
continue
|
| 167 |
-
matched = False
|
| 168 |
-
# check content
|
| 169 |
-
if url and file_contains_text(path, url):
|
| 170 |
-
matched = True
|
| 171 |
-
else:
|
| 172 |
-
# check filename tokens
|
| 173 |
-
fname = os.path.basename(path).lower()
|
| 174 |
-
# try last segment of url path
|
| 175 |
-
try:
|
| 176 |
-
seg = url.rstrip('/').split('/')[-1].lower()
|
| 177 |
-
except Exception:
|
| 178 |
-
seg = ''
|
| 179 |
-
if seg and seg in fname:
|
| 180 |
-
matched = True
|
| 181 |
-
if matched:
|
| 182 |
-
candidates.append(path)
|
| 183 |
-
return candidates
|
| 184 |
-
|
| 185 |
-
|
| 186 |
-
def read_file_text(file_path: str) -> str:
|
| 187 |
-
"""Return the text contents of a file; returns empty string on failure."""
|
| 188 |
-
try:
|
| 189 |
-
with open(file_path, 'r', encoding='utf-8') as f:
|
| 190 |
-
return f.read()
|
| 191 |
-
except Exception:
|
| 192 |
-
return ''
|
| 193 |
-
|
| 194 |
-
|
| 195 |
-
def download_quiz_files(url: str, received_dir: str) -> list:
|
| 196 |
-
"""
|
| 197 |
-
Download the HTML file from the given URL and save it in received_dir.
|
| 198 |
-
Returns a list of saved file paths (just the HTML for now).
|
| 199 |
-
"""
|
| 200 |
-
import requests
|
| 201 |
-
import re
|
| 202 |
-
import os
|
| 203 |
-
from urllib.parse import urlparse
|
| 204 |
-
|
| 205 |
-
if not os.path.isdir(received_dir):
|
| 206 |
-
os.makedirs(received_dir, exist_ok=True)
|
| 207 |
-
|
| 208 |
-
try:
|
| 209 |
-
resp = requests.get(url, timeout=10)
|
| 210 |
-
resp.raise_for_status()
|
| 211 |
-
html = resp.text
|
| 212 |
-
except Exception as e:
|
| 213 |
-
print(f"Error downloading {url}: {e}")
|
| 214 |
-
return []
|
| 215 |
-
|
| 216 |
-
# Save HTML file
|
| 217 |
-
# Use last segment of URL path for filename
|
| 218 |
-
parsed = urlparse(url)
|
| 219 |
-
fname = parsed.path.rstrip('/').split('/')[-1] or 'index'
|
| 220 |
-
# Remove query string for filename
|
| 221 |
-
fname = re.sub(r'[^a-zA-Z0-9_.-]', '_', fname)
|
| 222 |
-
html_path = os.path.join(received_dir, f'{fname}.html')
|
| 223 |
-
with open(html_path, 'w', encoding='utf-8') as f:
|
| 224 |
-
f.write(html)
|
| 225 |
-
|
| 226 |
-
# Optionally: parse for linked JS/CSS and download (not implemented yet)
|
| 227 |
-
# For now, just return the HTML file
|
| 228 |
-
return [html_path]
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
recieved_data/quiz_1.html
DELETED
|
@@ -1,25 +0,0 @@
|
|
| 1 |
-
<!doctype html>
|
| 2 |
-
<html lang="en">
|
| 3 |
-
<head>
|
| 4 |
-
<meta charset="utf-8" />
|
| 5 |
-
<title>Sample Quiz Page</title>
|
| 6 |
-
<style>
|
| 7 |
-
body { font-family: Arial, sans-serif; padding: 20px; }
|
| 8 |
-
pre { background: #f9f9f9; border: 1px solid #ddd; padding: 10px; }
|
| 9 |
-
</style>
|
| 10 |
-
</head>
|
| 11 |
-
<body>
|
| 12 |
-
<h2>Rendered Quiz Example</h2>
|
| 13 |
-
<div id="result">Loading…</div>
|
| 14 |
-
|
| 15 |
-
<script>
|
| 16 |
-
document.querySelector("#result").innerHTML = atob(`
|
| 17 |
-
UTgzNC4gRG93bmxvYWQgPGEgaHJlZj0iaHR0cHM6Ly9leGFtcGxlLmNvbS9kYXRhLXE4MzQucGRmIj5
|
| 18 |
-
maWxlPC9hPi4KV2hhdCBpcyB0aGUgc3VtIG9mIHRoZSAidmFsdWUiIGNvbHVtbiBpbiB0aGUgdGFibG
|
| 19 |
-
Ugb24gcGFnZSAyPwoKUG9zdCB5b3VyIGFuc3dlciB0byBodHRwczovL2V4YW1wbGUuY29tL3N1Ym1pd
|
| 20 |
-
CB3aXRoIHRoaXMgSlNPTiBwYXlsb2FkOgoKPHByZT4KewogICJlbWFpbCI6ICJ5b3VyLWVtYWlsIiwK
|
| 21 |
-
ICAic2VjcmV0IjogInlvdXIgc2VjcmV0IiwKICAidXJsIjogImh0dHBzOi8vZXhhbXBsZS5jb20vcXV
|
| 22 |
-
pei04MzQiLAogICJhbnN3ZXIiOiAxMjM0NSAgLy8gdGhlIGNvcnJlY3QgYW5zd2VyCn0KPC9wcmU+`);
|
| 23 |
-
</script>
|
| 24 |
-
</body>
|
| 25 |
-
</html>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
recieved_data/viewform.html
DELETED
|
@@ -1 +0,0 @@
|
|
| 1 |
-
<!DOCTYPE html><html lang="en" class="HB1eCd-UMrnmb PHOcVb"><head><link rel="shortcut icon" sizes="16x16" href="https://ssl.gstatic.com/docs/spreadsheets/forms/favicon_qp2.png"><link href="https://fonts.googleapis.com/icon?family=Material+Icons+Extended" rel="stylesheet" nonce="hp-vcAnqfIfiTVmFmtySuw"><title>Basic Knowledge and Math Quiz</title><link rel="stylesheet" href="https://www.gstatic.com/_/freebird/_/ss/k=freebird.v.3R7XuimNprQ.L.W.O/am=AAAG/d=1/rs=AMjVe6im8Ar0t2ZJ6sBiRPTSG00YTc-_sg" data-id="_cl" nonce="hp-vcAnqfIfiTVmFmtySuw"><link href="https://fonts.googleapis.com/css?family=Google+Sans_old:400,500|Roboto_old:300,400,400i,500,700&subset=latin,vietnamese,latin-ext,cyrillic,greek,cyrillic-ext,greek-ext" rel="stylesheet" nonce="hp-vcAnqfIfiTVmFmtySuw"><script nonce="sn9WhqAq5lIcj2A2Adc1wA">var DOCS_timing={}; DOCS_timing['pls']=new Date().getTime(); DOCS_timing['sl']=DOCS_timing['pls']; _docs_webfonts_json = {"fontMetadataMap":{},"unrecognizedFontFamilies":[],"weightedFontFamilyMap":{}}</script><link href="https://fonts.googleapis.com/css?family=Product+Sans&subset=latin,vietnamese,latin-ext,cyrillic,greek,cyrillic-ext,greek-ext" rel="stylesheet" type="text/css" nonce="hp-vcAnqfIfiTVmFmtySuw"><meta name="viewport" content="width=device-width, initial-scale=1"><meta name="referrer" content="origin"><script data-id="_gd" nonce="sn9WhqAq5lIcj2A2Adc1wA">window.WIZ_global_data = {"K1cgmc":"%.@.[null,null,null,[3,1,[1763017213,305047000],4],null,27]]","SpaT4e":"editors","TSDtV":"%.@.[[null,[[45681910,null,false,null,null,null,\"OKXfNb\"],[45734887,null,false,null,null,null,\"Q8lQIf\"],[45662509,null,false,null,null,null,\"fLCtnf\"],[45734741,null,false,null,null,null,\"gWu1Ue\"],[45713329,null,false,null,null,null,\"TzH3fe\"],[45657263,null,false,null,null,null,\"ByEExb\"],[45729830,null,false,null,null,null,\"DCV6If\"],[45712870,null,false,null,null,null,\"J04FPb\"],[45674978,null,false,null,null,null,\"x4QBkb\"],[45658679,null,false,null,null,null,\"qdTkee\"],[45720792,null,false,null,null,null,\"NFUw0c\"],[45727616,null,false,null,null,null,\"qNQRAf\"],[45644642,null,null,null,\"X-WS exp!\",null,\"rsrxGc\"],[45725154,null,false,null,null,null,\"WbzTGf\"],[45696305,null,false,null,null,null,\"Uujhbc\"],[45718464,null,true,null,null,null,\"MmyjKe\"],[45688879,null,false,null,null,null,\"xZC1Dc\"],[45679175,null,false,null,null,null,\"OETeme\"],[45730266,null,false,null,null,null,\"VughG\"],[45641838,null,false,null,null,null,\"fLPxhf\"],[45677009,null,false,null,null,null,\"JkUdKe\"],[45678187,null,false,null,null,null,\"OrvCpd\"],[45672203,null,true,null,null,null,\"jDBBvd\"],[45643359,null,false,null,null,null,\"GcxuKe\"],[45723104,null,false,null,null,null,\"EkiEee\"],[45672066,null,true,null,null,null,\"E1A5lb\"],[45737532,null,false,null,null,null,\"JmYEv\"],[45686662,null,true,null,null,null,\"go03Eb\"],[45670693,null,false,null,null,null,\"V7Wemb\"],[45730498,null,false,null,null,null,\"ZycXJf\"],[45717711,null,false,null,null,null,\"lhxHkd\"],[45724955,null,false,null,null,null,\"Lhvui\"],[45660690,null,false,null,null,null,\"ovKHsb\"],[45712967,null,false,null,null,null,\"rZW8ld\"],[45673686,null,false,null,null,null,\"TVdkuc\"],[45677461,null,null,null,null,null,\"qb66hd\",[\"[]\"]],[45673687,null,false,null,null,null,\"OQKgkd\"],[45681145,null,true,null,null,null,\"hV6kcd\"],[45678265,null,false,null,null,null,\"P7qpdc\"],[45725105,null,false,null,null,null,\"VQN2ac\"],[45672211,null,false,null,null,null,\"Wgtd8c\"],[45725110,null,false,null,null,null,\"ElheSd\"],[45701776,16,null,null,null,null,\"DHH5Gc\"],[45728785,null,false,null,null,null,\"UPAJB\"],[45729447,null,false,null,null,null,\"hjIR6e\"],[45660287,null,false,null,null,null,\"nIuPDe\"],[45686664,null,true,null,null,null,\"P0fSX\"],[45692064,null,false,null,null,null,\"wZ64Sb\"],[45714356,null,true,null,null,null,\"uJfQbe\"],[45686665,null,true,null,null,null,\"xGJelc\"],[45668197,null,true,null,null,null,\"pReYPb\"],[45676996,null,false,null,null,null,\"KFVYtf\"],[45706188,null,false,null,null,null,\"OF1zrd\"],[45714946,null,false,null,null,null,\"ZYrane\"],[45672205,null,true,null,null,null,\"E7dKkc\"],[45678908,null,false,null,null,null,\"V6Qvvf\"],[45699204,null,false,null,null,null,\"XWRwod\"],[45700150,null,false,null,null,null,\"RLRykc\"],[45678679,null,false,null,null,null,\"HbebVe\"],[45726544,null,false,null,null,null,\"hWjH1c\"],[45736179,null,false,null,null,null,\"LIe8ub\"],[45727546,null,false,null,null,null,\"wT569b\"],[45729690,null,false,null,null,null,\"AQMuhd\"],[45644640,42,null,null,null,null,\"xbuGR\"],[45673227,null,false,null,null,null,\"bRuCz\"],[45687747,null,true,null,null,null,\"n1Nom\"],[45715074,null,false,null,null,null,\"xxxPgb\"],[45708977,null,false,null,null,null,\"AxurIf\"],[45700770,null,false,null,null,null,\"Mk7a4d\"],[45681147,null,false,null,null,null,\"pgDArb\"],[45734892,null,false,null,null,null,\"oe7xAe\"],[45735097,null,false,null,null,null,\"ZYDWGf\"],[45677445,null,false,null,null,null,\"rPYk8\"],[45658949,null,false,null,null,null,\"NfShlf\"],[45676754,null,false,null,null,null,\"YwbU8\"],[45726852,null,false,null,null,null,\"qgjRgd\"],[45699702,null,false,null,null,null,\"Xo3sI\"],[45700504,null,false,null,null,null,\"u6ksOd\"],[45672085,null,true,null,null,null,\"FJbUAf\"],[45648275,null,false,null,null,null,\"X5yyz\"],[45737769,null,false,null,null,null,\"C4gACf\"],[45684108,null,false,null,null,null,\"IHwhDb\"],[45674285,null,false,null,null,null,\"zRoGXc\"],[45729467,null,false,null,null,null,\"kKLGLb\"],[45736482,null,false,null,null,null,\"DAnsv\"],[45684730,null,false,null,null,null,\"aW7Ggd\"],[45677444,null,false,null,null,null,\"WYEV9b\"],[45661802,null,false,null,null,null,\"I09lfd\"],[45697479,null,true,null,null,null,\"ScsHod\"],[45737207,null,false,null,null,null,\"Kw5UUd\"],[45639541,null,false,null,null,null,\"LHinid\"],[45736727,null,false,null,null,null,\"JJHfwf\"],[45724259,null,false,null,null,null,\"Sjqsdf\"],[45672206,null,false,null,null,null,\"qxTK9b\"],[45709238,null,false,null,null,null,\"jQTN0e\"],[45729422,null,false,null,null,null,\"OOSdib\"],[45719766,null,false,null,null,null,\"A3eSQd\"],[45723416,null,true,null,null,null,\"DgQqmc\"],[45681027,null,false,null,null,null,\"rqh9Yb\"],[45696085,null,false,null,null,null,\"g3Gc7d\"],[45731897,null,false,null,null,null,\"NK5elf\"],[45654291,null,false,null,null,null,\"rhP5uf\"],[45653421,null,false,null,null,null,\"K2C7od\"],[45737396,null,false,null,null,null,\"KJRJ6d\"],[45644639,null,true,null,null,null,\"GoJCRc\"],[45657471,null,null,null,null,null,\"kMR5pc\",[\"[]\"]],[45672202,null,false,null,null,null,\"CyvTSb\"],[45726382,null,false,null,null,null,\"QUY3\"],[45686667,null,false,null,null,null,\"ek81nf\"],[45658731,null,false,null,null,null,\"zMe6ub\"],[45621619,null,false,null,null,null,\"PfkIr\"],[45658716,null,false,null,null,null,\"Fa3cob\"],[45685754,null,true,null,null,null,\"OyPt5\"],[45661086,null,false,null,null,null,\"wfVdS\"],[45666088,null,false,null,null,null,\"MgfT5\"],[45735186,null,false,null,null,null,\"SIvvz\"],[45672213,null,true,null,null,null,\"BfWTle\"],[45658644,null,false,null,null,null,\"ZdwoD\"],[45696263,null,null,null,null,null,\"W12Bse\",[\"[]\"]],[45653615,null,null,null,null,null,\"lwF00d\",[\"[]\"]],[45658291,null,true,null,null,null,\"OSuRGd\"],[45735651,null,false,null,null,null,\"QEOLhc\"],[45730506,null,false,null,null,null,\"qhuWUc\"],[45681790,null,false,null,null,null,\"uPCxtc\"],[45647060,null,false,null,null,null,\"uYjPWb\"],[45720439,null,false,null,null,null,\"UFhFZb\"],[45736698,null,false,null,null,null,\"nhgo9c\"],[45686666,null,true,null,null,null,\"dZ9mjb\"],[45690176,null,false,null,null,null,\"qF6xVc\"],[45644641,null,null,3.14159,null,null,\"FX1FL\"],[45686663,null,true,null,null,null,\"KGh4Cc\"],[45694562,null,false,null,null,null,\"D50qNc\"],[45697234,null,false,null,null,null,\"cUoIXb\"],[45708298,null,false,null,null,null,\"T4IN0c\"],[45654169,null,false,null,null,null,\"HCu2yf\"],[45718842,null,false,null,null,null,\"Ywwwdb\"],[45696619,null,false,null,null,null,\"U7gqEe\"]],\"CAMSUB1J05T2NwOSpQ0DtAQDzC4D49MG2NEMA6+KBQN6A1EDKfkGA9qMBQPtQAOmBAPkwhYD0GID5p0FA5vDToKnAwPrixkDp7QKA9Lp6AMDwoM1\"]]]","eNnkwf":"1763053802","nQyAE":{},"pzJKf":1,"qymVe":"4e4Yo3b8tY57dmIUtfORxe1coYo","w2btAe":"%.@.null,null,\"\",true,null,null,null,false]"};</script><style id="WTVccd" nonce="hp-vcAnqfIfiTVmFmtySuw">.Iq2xPb .kaAt2 .KKHx9e {background-color: #3C4043;}.Iq2xPb .kaAt2.KKjvXb .KKHx9e {background-color: rgb(103, 58, 183);}.Iq2xPb .kaAt2.RDPZE .KKHx9e {background-color: #70757a;}.wGQFbe.N2RpBe:not(.RDPZE), .wGQFbe.B6Vhqe:not(.RDPZE) {border-color: rgb(103, 58, 183);}.wGQFbe.i9xfbb > .MbhUzd, .wGQFbe.u3bW4e > .MbhUzd {background-color: rgba(103, 58, 183, 0.15);}.wGQFbe.wGQFbe:hover > .MbhUzd {background-color: rgba(103, 58, 183, 0.04);}.wGQFbe.wGQFbe:focus > .MbhUzd {background-color: rgba(103, 58, 183, 0.15);}.BJHAP.N2RpBe.RDPZE, .BJHAP.B6Vhqe.RDPZE {border-color: rgb(103, 58, 183);}.BJHAP.RDPZE:not(.N2RpBe):not(.B6Vhqe) {border-color: #9AA0A6;}.da8bmd .BJHAP.N2RpBe.RDPZE, .da8bmd .BJHAP.B6Vhqe.RDPZE, .wMUAvd .BJHAP.RDPZE {border-color: #5F6368;}.aomaEc.N2RpBe:not(.RDPZE) .Id5V1, .aomaEc .nQOrEb {border-color: rgb(103, 58, 183);}.aomaEc .N2RpBe:not(.RDPZE) .Id5V1 {border-color: rgb(103, 58, 183);}.aomaEc.i9xfbb > .MbhUzd, .aomaEc.u3bW4e > .MbhUzd {background-color: rgba(103, 58, 183, 0.15);}.aomaEc :not(.RDPZE):hover > .MbhUzd {background-color: rgba(103, 58, 183, 0.04);}.aomaEc :not(.RDPZE):focus > .MbhUzd {background-color: rgba(103, 58, 183, 0.15);}.ECvBRb .N2RpBe.RDPZE .Id5V1, .ECvBRb .N2RpBe.RDPZE .nQOrEb {border-color: rgb(103, 58, 183);}.ECvBRb .RDPZE:not(.N2RpBe) .Id5V1 {border-color: #9AA0A6;}.da8bmd .ECvBRb .N2RpBe.RDPZE .Id5V1, .da8bmd .ECvBRb .N2RpBe.RDPZE .nQOrEb, .wMUAvd .ECvBRb .RDPZE .Id5V1 {border-color: #5F6368;}.aYSFK > :first-child {border-left: transparent solid 5px;}.aYSFK.N2RpBe {background-color: rgb(240, 235, 248);}.aYSFK.N2RpBe > :first-child {border-left-color: rgb(103, 58, 183);}.mhLiyf.KKjvXb.RDPZE {color: #5F6368;}.TFBnVe .MbhUzd {background-image: radial-gradient( circle farthest-side,rgba(103, 58, 183, 0.15),rgba(103, 58, 183, 0.15) 80%,rgba(103, 58, 183, 0) 100% );}.TFBnVe {color: rgb(103, 58, 183);}.TFBnVe.RDPZE {color: rgba(103, 58, 183, 0.5);}.TFBnVe.u3bW4e .CeoRYc {background-color: rgba(103, 58, 183, 0.15);}.RvMhje .MbhUzd {background-image: radial-gradient( circle farthest-side,rgba(255, 255, 255, .3),rgba(255, 255, 255, .3) 80%,rgba(255, 255, 255, 0) 100% );}.RvMhje {background-color: rgb(103, 58, 183); color: rgba(255, 255, 255, 1);}.RvMhje.RDPZE {color: rgba(255, 255, 255, 1); opacity: .54;}.RvMhje a .snByac {color: rgba(255, 255, 255, 1);}.RvMhje.u3bW4e .CeoRYc {background-color: rgba(255, 255, 255, .3);}.QvWxOd {background-color: rgb(103, 58, 183);}.QvWxOd .TpQm9d, .QvWxOd .TpQm9d:hover, .QvWxOd .TpQm9d:link, .QvWxOd .TpQm9d:visited {background-color: rgb(103, 58, 183);}.QvWxOd:hover {box-shadow: 0px 2px 1px -1px rgba(103, 58, 183, 0.2), 0px 1px 1px 0px rgba(103, 58, 183, 0.14), 0px 1px 3px 0px rgba(103, 58, 183, 0.12);}.QvWxOd.RDPZE:hover {box-shadow: none;}.QvWxOd.qs41qe.qs41qe {box-shadow: 0px 3px 5px -1px rgba(103, 58, 183, 0.2), 0px 6px 10px 0px rgba(103, 58, 183, 0.14), 0px 1px 18px 0px rgba(103, 58, 183, 0.12);}.ctEux {color: rgb(103, 58, 183);}.ctEux .CeoRYc {background-color: rgb(103, 58, 183);}.ctEux .MbhUzd {background-image: radial-gradient( circle farthest-side,rgba(103, 58, 183, 0.15),rgba(103, 58, 183, 0.15) 80%,rgba(103, 58, 183, 0) 100% );}.pRZhW {color: rgb(103, 109, 114);}.XTgocd {border-color: rgb(103, 109, 114);}.p6JeP .kaAt2 {color: rgb(103, 109, 114);}.p6JeP .kaAt2.KKjvXb {background-color: rgba(103, 58, 183, 0.15); color: rgb(103, 58, 183);}.p6JeP .kaAt2.KKjvXb.RDPZE {background-color: rgba(189, 189, 189, .38);; color: #9AA0A6;}.p6JeP .k6JGBb {fill: rgb(103, 109, 114);}.p6JeP .KKjvXb .k6JGBb {fill: rgb(103, 58, 183);}.p6JeP .RDPZE .k6JGBb, .p6JeP .KKjvXb.RDPZE.k6JGBb {fill: #9AA0A6;}.mfr8Qd .SKMfG {fill: rgb(103, 58, 183);}.Iq2xPb .s7bIcf {background-color: rgb(103, 58, 183);}@media screen and (forced-colors: active) {.Iq2xPb .s7bIcf {outline: 1px solid Highlight;}}.Iq2xPb .kaAt2 {color: #3C4043;}.Iq2xPb .kaAt2.KKjvXb {color: rgb(103, 58, 183);}.Iq2xPb .kaAt2.RDPZE {color: #70757a; cursor: default;}.Iq2xPb .RDPZE + .s7bIcf {background-color: #70757a;}.Iq2xPb .MbhUzd {background-image: radial-gradient( circle farthest-side,rgba(103, 58, 183, 0.15),rgba(103, 58, 183, 0.15) 80%,rgba(103, 58, 183, 0) 100% );}.Iq2xPb .PXrNBb {fill: #5F6368;}.Iq2xPb .KKjvXb .PXrNBb {fill: rgb(103, 58, 183);}.Iq2xPb RDPZE .PXrNBb, .Iq2xPb .KKjvXb.RDPZE.PXrNBb {fill: #9AA0A6;}.LKH0ge .cXrdqd {background-color: rgb(103, 58, 183);}.Yp9mw:focus-within {border-bottom-color: rgb(103, 58, 183);}.LKH0ge .Is7Fhb {color: rgb(103, 58, 183);}.LKH0ge.u3bW4e .snByac {color: rgb(103, 58, 183);}.LKH0ge.IYewr .oJeWuf.mIZh1c, .LKH0ge.IYewr .oJeWuf.cXrdqd {background-color: rgb(225, 216, 241);}.whsOnd:not([disabled]):focus ~ .AxOyFc.snByac, .u3bW4e > .oJeWuf >.fqp6hd.snByac, .u3bW4e.dm7YTc > .oJeWuf >.fqp6hd.snByac {color: rgb(103, 58, 183);}.HNgK9.RDPZE .zHQkBf[disabled] {color: rgba(0, 0, 0, .87);}.FlwNw.u3bW4e .oJeWuf:before {border-color: rgb(103, 58, 183);}.FlwNw .zHQkBf:not([disabled]):focus ~ .snByac {color: rgb(103, 58, 183);}.yqQS1 .cXrdqd {background-color: rgb(103, 58, 183);}.yqQS1 .Is7Fhb {color: rgb(103, 58, 183);}.yqQS1.IYewr .oJeWuf.mIZh1c, .yqQS1.IYewr .oJeWuf.cXrdqd {background-color: rgb(225, 216, 241);}.toT2u.RDPZE .zHQkBf[disabled] {color: rgba(0, 0, 0, .87);}.Y4klN.N2RpBe .espmsb {border-color: rgb(103, 58, 183); color: rgba(255, 255, 255, 1);}.Y4klN.N2RpBe > .MLPG7 {border-color: rgb(225, 216, 241);}.Y4klN.i9xfbb > .MbhUzd, .Y4klN.u3bW4e > .MbhUzd {background-color: rgba(103, 58, 183, 0.15);}.bvhls {border-color: rgb(103, 58, 183);}.bvhls.N2RpBe {background-color: rgb(103, 58, 183); color: rgba(255, 255, 255, 1);}.TCbR9b {display: none;}.IszBRc-Guievd-HLvlvd .TCbR9b {display: block;}.IszBRc-Guievd-HLvlvd .doKKyd {display: none;}.KHCwJ {display: none;}.naGohb {background-color: rgb(103, 58, 183);color: rgba(255, 255, 255, 1);}.b4wEpf {background-color: rgb(103, 58, 183);}.barETd .X1clqd, .barETd .qRUolc, .barETd .pPQgvf {color: #202124; fill: #5F6368;}.IszBRc-Guievd-JaPV2b .barETd {border: 2px solid white;}.IszBRc-Guievd-HLvlvd .barETd {border: 2px solid black;}.IOncP .HvOprf {color: rgb(103, 58, 183);}.IOncP .HvOprf .CeoRYc {background-color: rgb(103, 58, 183);}.IOncP .HvOprf .MbhUzd {background-image: radial-gradient( circle farthest-side,rgba(103, 58, 183, 0.15),rgba(103, 58, 183, 0.15) 80%,rgba(103, 58, 183, 0) 100% );}.IOncP .HvOprf:hover {border-color: rgb(225, 216, 241);}.IOncP .HvOprf.RDPZE {color: rgba(103, 58, 183, 0.5);}.IOncP .HvOprf.RDPZE:hover {box-shadow: none;}.IOncP .HvOprf.qs41qe.qs41qe {box-shadow: 0px 2px 1px -1px rgba(103, 58, 183, 0.2), 0px 1px 1px 0px rgba(103, 58, 183, 0.14), 0px 1px 3px 0px rgba(103, 58, 183, 0.12);}.Pi3FHb {outline-style: solid; outline-color: rgb(103, 58, 183);}.da8bmd .RDPZE .Pi3FHb {outline-color: rgba(0, 0, 0, .54);}.LygNqb.RDPZE .snByac {color: #70757a;}.LygNqb.RDPZE.N2RpBe .snByac, .LygNqb.RDPZE.B6Vhqe .snByac {color: #202124;}.wMUAvd .LygNqb.RDPZE .snByac, .wMUAvd .LygNqb.RDPZE.N2RpBe .snByac, .wMUAvd .LygNqb.RDPZE.B6Vhqe .snByac {color: black;}.LygNqb.RDPZE .PgfOZ svg {fill: rgba(0, 0, 0, .54);}.LygNqb.RDPZE.N2RpBe .PgfOZ, .LygNqb.RDPZE.B6Vhqe .PgfOZ svg {fill: rgba(0, 0, 0, .87);}.mqhyCf {color: rgb(103, 58, 183);}.AQRMP {color: rgb(103, 58, 183);}.RVEQke {background-color: rgb(103, 58, 183); color: rgba(255, 255, 255, 1);}.D8bnZd {background-color: rgb(240, 235, 248);}.xEUmYd {background-color: rgba(103, 58, 183, 0.05);}.cz0Zle {background-color: rgb(174, 121, 255);}.ENxQTe:hover {background-color: rgba(103, 58, 183, 0.1);}.YiC7Id {fill: rgb(103, 58, 183); stroke: rgb(103, 58, 183);}.PgdKqf {fill: rgb(103, 58, 183);}.LAANW {border-color: rgb(103, 58, 183);}.DGR5Ac {fill: rgba(255, 255, 255, 1)}.graCKc {background-color: rgb(103, 109, 114);}.G4EHhc, .G4EHhc .Wic03c .tL9Q4c, .G4EHhc .I9OJHe .KRoqRc, .G4EHhc .PyrB4, .G4EHhc .snByac {font-family: 'docs-Roboto', Helvetica, Arial, sans-serif;}.Jqhdy {font-family: 'docs-Roboto', Helvetica, Arial, sans-serif;}.BuWscd {font-family: 'docs-Parisienne', cursive;}.ULZu6e {font-family: 'docs-Patrick Hand', fantasy;}.kZBGEb {font-family: 'docs-Cormorant Garamond', serif;}.LgNcQe, .LgNcQe .Wic03c .tL9Q4c, .LgNcQe .I9OJHe .KRoqRc, .LgNcQe .PyrB4, .LgNcQe .snByac {font-size: 24pt;font-family: 'docs-Roboto', Helvetica, Arial, sans-serif;letter-spacing: 0;}.M7eMe, .M7eMe .Wic03c .tL9Q4c, .M7eMe .I9OJHe .KRoqRc, .M7eMe .PyrB4, .M7eMe .snByac{font-size: 12pt;font-family: 'docs-Roboto', Helvetica, Arial, sans-serif;letter-spacing: 0;}.OIC90c, .OIC90c.RjsPE, .OIC90c .zHQkBf, .OIC90c .Wic03c .tL9Q4c, .OIC90c .I9OJHe .KRoqRc, .OIC90c .PyrB4, .OIC90c .snByac {font-size: 11pt; line-height: 15pt;letter-spacing: 0;}.OIC90c .oJeWuf .zHQkBf {}.sId0Ce, .sId0Ce a {color: rgba(0, 0, 0, 0.66);}</style><link rel="icon" sizes="192x192" href="//ssl.gstatic.com/docs/forms/device_home/android_192.png"><link rel="apple-touch-icon" sizes="120x120" href="//ssl.gstatic.com/docs/forms/device_home/ios_120.png"><link rel="apple-touch-icon" sizes="152x152" href="//ssl.gstatic.com/docs/forms/device_home/ios_152.png"><meta name="msapplication-TileImage" content="//ssl.gstatic.com/docs/forms/device_home/windows_144.png"><meta name="msapplication-TileColor" content="#673ab7"><script nonce="sn9WhqAq5lIcj2A2Adc1wA">_docs_flag_initialData={"docs-ails":"docs_warm","docs-fwds":"docs_nf","docs-crs":"docs_crs_tsol","docs-cp-tp":6,"docs-cr-tp":5,"docs-fe-re":2,"docs-fl":1,"docs-hpr":0,"docs-l1lc":5,"docs-l1lm":"MAA","docs-l2lc":2,"docs-l2lm":"TUL","docs-l2t":0,"docs-lsd":1,"docs-orl":9,"docs-rls":1,"docs-shdn":0,"docs-eivt":false,"docs-tfh":"","info_params":{},"docs-epfdfjes":true,"docs-esaf":false,"docs-ecdh":true,"docs-eawbwm":true,"docs-eavlbm":true,"docs-ecbwm":true,"docs-ecucbwm":true,"docs-edlmbm":true,"docs-eafwbwm":true,"docs-elaswm":true,"docs-ncbwm":true,"docs-ectwm":false,"docs-edswm":true,"docs-ewcfer":true,"docs-ewubum":false,"docs-ewcm":false,"docs-eewsm":true,"docs-efrdwm":false,"docs-eeoswm":true,"docs-empwm":false,"docs-emaswm":true,"docs-emswm":true,"docs-emadwm":false,"docs-enswb":false,"docs-eodpswm":true,"docs-eobswm":true,"docs-epcswm":false,"docs-epsc":false,"docs-epdwm":true,"docs-erhswm":true,"docs-essr":true,"docs-esswm":false,"docs-ewbm":false,"docs-efhebwm":true,"docs-erbwm":true,"docs-eucrdwm":false,"docs-eicwdubl":true,"docs-hmg":true,"uls":"","docs-idu":false,"customer_type":"ND","scotty_upload_url":"/upload/forms/resumable","docs-edcfmb":false,"docs-erlbwfa":false,"docs-net-udmi":500000,"docs-net-udpt":40000,"docs-net-udur":"/upload/blob/forms","docs-net-usud":false,"docs-enable_feedback_svg":false,"docs-fpid":713678,"docs-fbid":"ExternalUserData","docs-obsImUrl":"https://ssl.gstatic.com/docs/common/netcheck.gif","docs-text-ewf":true,"docs-wfsl":["ca","da","de","en","es","fi","fr","it","nl","no","pt","sv"],"docs-efrsde":true,"docs-efpsf":true,"docs-edfn":true,"docs-efpsp":true,"docs-eefp":true,"docs-dli":false,"docs-liap":"/naLogImpressions","ilcm":{"eui":"ADFN-ctQsn4PAeVJmvxn_LFFcxpfjG6dlkUWNVRyAIyQyDKhkosQGYfiTVT0wrqKySEaoAGBaGYA","je":1,"sstu":1763053802697221,"si":"CIXkhJ3P75ADFYB0bwQdZWoHEA","gsc":null,"ei":[5701877,5703839,5704621,5705207,5705891,5706270,5707461,5707565,5711226,5713195,5713554,5715055,5718663,5718680,5726679,5726695,5727241,5727257,5731454,5731470,5734616,5734632,5737784,5737800,5738713,5738729,5739861,5739877,5740798,5740814,5754982,5754998,5764330,5764346,5764470,5764486,5774256,5774272,5774919,5774935,5790673,5790689,48966134,48966142,49398701,49398709,49471983,49471991,49498853,49498861,49643628,49643636,49644035,49644043,49769457,49769465,49822981,49822989,49823204,49823212,49833442,49833450,49842815,49842823,49924606,49924614,49943179,49943187,49979678,49979686,50266122,50266130,50273508,50273516,50297176,50297184,50439260,50439268,50503759,50503767,50513194,50513202,50549455,50549463,50561323,50561331,50562844,50562852,50587022,50587030,70971216,70971224,71038355,71038363,71079898,71079906,71085321,71085329,71121048,71121056,71325536,71325544,71376166,71376174,71387272,71387280,71387789,71387797,71429487,71429495,71466027,71466035,71478100,71478108,71478469,71478477,71515789,71515797,71528617,71528625,71530063,71530071,71544874,71544882,71545493,71545501,71546345,71546353,71574010,71574018,71639534,71639550,71642083,71642091,71657900,71657908,71659973,71659981,71679440,71679448,71689960,71689968,71705157,71705202,71710000,71710008,71727137,71727153,71847749,71847765,71854840,71854848,71897867,71897875,71899300,71960380,71960388,94327631,94327639,94353268,94353276,94368276,94368292,94434397,94434405,94448165,94448181,94510030,94510038,94523148,94523156,94624825,94624833,94629817,94629825,94646626,94646642,94660915,94660923,94661682,94661690,94692458,94692466,94744956,94744964,94813423,94813431,94862047,94862055,94864703,94864711,94891454,94891470,94904249,94904257,94919112,94919120,95087106,95087114,95112693,95112701,95118401,95118409,95135893,95135901,95163042,95163058,95213932,95213940,95234791,95234799,95273289,95273297,95314762,95314770,95317542,95317550,99265966,99265974,99277111,99277127,99338380,99338388,99368832,99368840,99400302,99400310,99402431,99402439,99440873,99440881,99457727,99457735,101448275,101448280,101508315,101508323,101513354,101513370,101519240,101519248,101557475,101557491,101561269,101561277,101561712,101561720,101562326,101562334,101586440,101586456,101631251,101631259,101659374,101659382,101686977,101686985,101754322,101855359,101855367,101891730,101891746,101917105,101917113,101922619,101922627,101922800,101922808,101956209,101956225,102030662,102030670,102070616,102070624,102073987,102073995,102146667,102146675,102161547,102161555,102195964,102195972,102198422,102198430,102207391,102236066,102236074,102244629,102244637,102258765,102258781,102262369,102262377,102280788,102280796,102287804,102287812,102342936,102342944,102343480,102343488,102402799,102402807,102428706,102428714,102430761,102430769,102469342,102469350,102469700,102469708,102515037,102515042,102517204,102517209,102618768,102618776,102625579,102625595,102659847,102659855,102673405,102685423,102685428,102685864,102685869,102690660,102690668,102691193,102691198,102718435,102741326,102741334,102762395,102762403,102774867,102774875,102787533,102807750,102807758,102867955,102867963,102887116,102887124,102903640,102903648,102909763,102909768,102921593,102921601,102925919,102925927,102930316,102930332,102932487,102932495,102944241,102944246,102944372,102944377,102944464,102944469,102944516,102944771,102944776,102956605,102956613,102969782,102969790,102972689,102972697,102973220,102973228,102979046,102979051,102984092,102984100,102988246,102988251,102988669,102988674,102999649,102999654,103011439,103011447,103066322,103066338,103067154,103067162,103067407,103067415,103074675,103074691,103124896,103124912,103152699,103152715,103169672,103169688,103176050,103176058,103176219,103176227,103276134,103276139,103281161,103281177,103288326,103288334,103289155,103289160,103325354,103325359,103339876,103339884,103343910,103343918,103354356,103354364,103354792,103354800,103355333,103355341,103355723,103355731,104522160,104522176,104522784,104522800,104530124,104538364,104574019,104574027,104599762,104599767,104661287,104661295,104699464,104699472,104713957,104713973,104764084,104764092,104793005,104793010,104801406,104801414,104869024,104869032,104907871,104907879,104932597,104932605,104940377,104940385,104958241,104983229,104983237,105060559,105060567,105072213,105072221,105082017,105082025,105085109,105085117,105087368,105087376,105092932,105092937,105143329,105143337,105180974,105180982,105230620,105230628,105255638,105275637,105275653,105276227,105276232,105283077,105283767,105283775,105293666,105293674,105302093,105302101,105312490,105312495,105346185,105346193,105360438,105360446,105360962,105360970,105393691,105393699,105439351,105439359,105442939,105459955,105459971,115509902,115509910,115533893,115533898,115626358,115626366,115629912,115629920,115662606,115669318,115669326,115722298,115722314,115769659,115769667,115795117,115808414,115808422,115862716,115893420,115893428,115893632,115893648,115895693,115895701,115899197,116055513,116055521,116079290,116236026,116353680],"crc":0,"cvi":[]},"docs-ccdil":true,"docs-eil":true,"docs-ecuach":false,"docs-cclt":2035,"docs-ecci":true,"docs-esi":false,"docs-cei":{"i":[102207391,5713195,101631259,94434405,104907879,105439359,71515797,103169688,101891746,102236074,5711226,115808422,101562334,104932605,99368840,103152715,104983237,102280796,101686985,49498861,71121056,103289160,71079906,102930332,104869032,94448181,50273516,105459971,102944776,49643636,5739877,95213940,50562852,5713554,105276232,102944469,49823212,94904257,105360446,103074691,71574018,103281177,105230628,103354364,102787533,94864711,104522800,95317550,71325544,102517209,102469708,102984100,71897875,101917113,5731470,71642091,5704621,104538364,102988251,102867963,102659855,105360970,103176058,49924614,94919120,102262377,71544882,71038363,102972697,102258781,104574027,94646642,101855367,95163058,5707565,102146675,5738729,102070624,50587030,95273297,71679448,103355731,94891470,101922808,49842823,99265974,116055521,102925927,103176227,70971224,5705207,105312495,105293674,115509910,105092937,50266130,115895701,101922627,94661690,103011447,101508323,5701877,71710008,115893428,105082025,115629920,104699472,102287812,102515042,102428714,50297184,94744964,115669326,71528625,102741334,71478108,94368292,94327639,50561331,116079290,102762403,102909768,71545501,99402439,102198430,49979686,105085117,103288334,5715055,105060567,95135901,105180982,102618776,103067415,102690668,99457735,104793010,5764346,104530124,104713973,102944246,5705891,102999654,94692466,102469350,71387797,102969790,71387280,102244637,49833450,50503767,95087114,102921601,5734632,115893648,115769667,94523156,102195972,102430769,5754998,48966142,103066338,101659382,104661295,50513202,104522176,95314770,71659981,71530071,5718680,116353680,71689968,102903648,5703839,102979051,49471991,101513370,5706270,5774935,101956225,102685428,102343488,5774272,71705202,102774875,102956613,71546353,94353276,105143337,101448280,99440881,49769465,102887124,115662606,102932495,95234799,99277127,102161555,101561720,71478477,102807758,102691198,115722314,103354800,94813431,101561277,5764486,103339884,102973228,49644043,103124912,49943187,71429495,115626366,102073995,103067162,103276139,105275653,105087376,104599767,95118409,115899197,103355341,115533898,5790689,101586456,71847765,5726695,5740814,71466035,71960388,49398709,71376174,94510038,95112701,99338388,50439268,94862055,71727153,115862716,5707461,102988674,102342944,105302101,5727257,94629825,104764092,71639550,102685869,102402807,116236026,102625595,101519248,99400310,105393699,105346193,5737800,104940385,101557491,94624833,102030670,49822989,105283775,71085329,94660923,103325359,105072221,104801414,103343918,102944377,71854848,50549463,71657908,101754322,101631251,94434397,104907871,105439351,71515789,103169672,101891730,102236066,115808414,101562326,104932597,99368832,103152699,104983229,102280788,101686977,49498853,71121048,103289155,71079898,102930316,104869024,94448165,50273508,105459955,102944771,49643628,5739861,95213932,50562844,105276227,102944464,49823204,94904249,105360438,103074675,71574010,103281161,105230620,103354356,102673405,94864703,104522784,95317542,71325536,102517204,102469700,102984092,71897867,101917105,5731454,71642083,71899300,102988246,102867955,102659847,105360962,103176050,49924606,94919112,102262369,71544874,71038355,102972689,102258765,104574019,94646626,101855359,95163042,102146667,5738713,102070616,50587022,95273289,71679440,103355723,94891454,101922800,49842815,99265966,116055513,102925919,103176219,70971216,105312490,105293666,115509902,105092932,50266122,115895693,101922619,94661682,103011439,101508315,71710000,115893420,105082017,115629912,104699464,102287804,102515037,102428706,50297176,94744956,115669318,71528617,102741326,71478100,94368276,94327631,50561323,105442939,102762395,102909763,71545493,99402431,102198422,49979678,105085109,103288326,105060559,95135893,105180974,102618768,103067407,102690660,99457727,104793005,5764330,102718435,104713957,102944241,102999649,94692458,102469342,71387789,102969782,71387272,102244629,49833442,50503759,95087106,102921593,5734616,115893632,115769659,94523148,102195964,102430761,5754982,48966134,103066322,101659374,104661287,50513194,104522160,95314762,71659973,71530063,5718663,102944516,71689960,102903640,102979046,49471983,101513354,5774919,101956209,102685423,102343480,5774256,71705157,102774867,102956605,71546345,94353268,105143329,101448275,99440873,49769457,102887116,104958241,102932487,95234791,99277111,102161547,101561712,71478469,102807750,102691193,115722298,103354792,94813423,101561269,5764470,103339876,102973220,49644035,103124896,49943179,71429487,115626358,102073987,103067154,103276134,105275637,105087368,104599762,95118401,105255638,103355333,115533893,5790673,101586440,71847749,5726679,5740798,71466027,71960380,49398701,71376166,94510030,95112693,99338380,50439260,94862047,71727137,105283077,102988669,102342936,105302093,5727241,94629817,104764084,71639534,102685864,102402799,115795117,102625579,101519240,99400302,105393691,105346185,5737784,104940377,101557475,94624825,102030662,49822981,105283767,71085321,94660915,103325354,105072213,104801406,103343910,102944372,71854840,50549455,71657900],"cf":{"enable_homescreen_priority_docs":[null,0],"enable_homescreen_priority_docs_promo":[null,0],"enable_homescreen_action_items_structured_query":[null,0]}},"docs-est":"CAMSCBUD9dL9Nx0H","docs-exfv":false,"docs-li":"713678","docs-trgthnt":"xwSFpxEiU0mHq3jmV6o0PcnvcKmd","docs-etmhn":false,"docs-thnt":"","docs-hbt":[],"docs-hdet":["nMX17M8pQ0kLUkpsP190WPbQDRJQ","17hED8kG50kLUkpsP190TThQn3DA","BDNZR4PXx0kLUkpsP190SJtNPkYt","Etj5wJCQk0kLUkpsP190NwiL8UMa","xCLbbDUPA0kLUkpsP190XkGJiPUm","2NUkoZehW0kLUkpsP190UUNLiXW9","yuvYtd5590kLUkpsP190Qya5K4UR","ZH4rzt2uk0kLUkpsP190UDkF5Bkq","uQUQhn57A0kLUkpsP190WHoihP41","93w8zoRF70kLUkpsP190TxXbtSeV","fAPatjr1X0kLUkpsP190SaRjNRjw","T4vgqqjK70kLUkpsP190ScPehgAW","JyFR2tYWZ0kLUkpsP190Rn3HzkxT","ufXj7vmeJ0kLUkpsP190QURhvJn2","KFks7UeZ30kLUkpsP190UUMR6cvh","LcTa6EjeC0kLUkpsP190RKgvW5qi","s3UFcjGjt0kLUkpsP190Z45ftWRr","o99ewBQXy0kLUkpsP190Nq2qr6tf","PHVyy5uSS0kLUkpsP190SUsYo8gQ","yZn21akid0iSFTCbiEB0WPiGEST3","h2TtqzmQF0kLUkpsP190YPJiQt7p","MZi9vb5UC0kLUkpsP190ReUhvVjy","dSR6SPjB80kLUkpsP190Y3xHa9qA","Bz6B7VmLu0kLUkpsP190W3FeobP7","AiLoubzsd0kLUkpsP190XtYNPgYT","2J3DVQoVh0kLUkpsP190R5wShSrC","MLmbZasLS0kLUkpsP190YHf6Zjsf","S1T4ezMsZ0kLUkpsP190U6GfQUxi","N5u4VeWhx0iSFTCbiEB0VUTNdX6g","XM16tjwrD0iSFTCbiEB0NfzvTeuU","ybYTJk1eD0iSFTCbiEB0QV4rkzSF","TgXar1TSG0iSFTCbiEB0SsXMaKuP","JYfGDkExa0iSFTCbiEB0TTQnEDtH","2i9JBUZ3w0iSFTCbiEB0RytbUoNq","pgvTVXNKa0iSFTCbiEB0ShqmBTMR","NsVnd81bW0iSFTCbiEB0RhcXEK9M","rTQirATnb0iSFTCbiEB0W5cPcA7D","wNyww2Syr0iSFTCbiEB0Pzsbemba","DVdpfbqGj0iSFTCbiEB0RP4dMdFg","WKN3dsuG20iSFTCbiEB0NtEYhMK7","S5iPRteXX0iSFTCbiEB0YkMazE6h","6hmou1AcB0iSFTCbiEB0R9rZWXdz","wvo4NcLUj0iSFTCbiEB0Tt7mcVxE","HWuSeN2AB0iSFTCbiEB0PoBwHT2F","rMLvYG5Cd0iSFTCbiEB0VMB6o5sk","EnxXFzAMR0iSFTCbiEB0NxWnFJEU","rTcCMw3BM0mHq3jmV6o0RHeAExRK","HUYzfGVRa0mHq3jmV6o0Uxe2caXK","1XYMmM1Cu0mHq3jmV6o0Z3pEi8xm","xHhMJiXiV0mHq3jmV6o0WB8WinyM","xwSFpxEiU0mHq3jmV6o0PcnvcKmd","4MBkBg26q0mHq3jmV6o0QeKPRMpY","y5g8iW2T80mHq3jmV6o0Nr8SAj4C","W9YRKy3Lb0iSFTCbiEB0Xfs1EfPr","Ed3nhrN8D0iSFTCbiEB0RN4bJ53y","zxDKY7PC10iSFTCbiEB0UDYPJwDZ","bhEyDmbwi0mHq3jmV6o0TngCF1v2","6rKYZ6uHA0mHq3jmV6o0TeDZjgB8","71Deousgx0mHq3jmV6o0WXBQiyzi","sVEZbUAa70mHq3jmV6o0TNq1M7FF","8ZPFZT5nG0mHq3jmV6o0PJ5yoVh4","P55v8p4Lk0mHq3jmV6o0VjggjHMV","QqnZoz9ko0mHq3jmV6o0QskzBcHn","6nr31z9Wv0mERqSGkGf0VhuvAXWC","RLHeYNm410mERqSGkGf0Y817EUFK","vmx68XtfJ0mERqSGkGf0RCUBfsQr","687J7yD1q0mERqSGkGf0RVmMYHo1","qwhWQy8Zi0mERqSGkGf0W2tdypUF","wF8Sk241e0mERqSGkGf0YNtN6gpV","ijUhdx2QN0mERqSGkGf0TSD26iBJ","3iBLaMnuG0mERqSGkGf0VdY8XuLS","cFR77YEGo0iSFTCbiEB0PcMDWjX2","evUYuNCS80mERqSGkGf0Psi8j3Dw","soWncRV7C0mERqSGkGf0PZheXrWA","TvjoiCaar0mERqSGkGf0S9qS5adj","txL54xWLC0mERqSGkGf0XoEGTvCu","MP3EsW1un0mERqSGkGf0QDkfTxat","N1q4Y3fqz0mERqSGkGf0W1oPWWoc","pnKWhXiJi0mERqSGkGf0RDJejrBm","ffZmMGtYT0suK1NZr2K0QUxSzEMN","NagbcZWyB0suK1NZr2K0SJmfmJ3n","KMcLKvubv0suK1NZr2K0PLMUJ7zr","a13ejFS5i0suK1NZr2K0WzewY5tP","pZ1hXv7ve0suK1NZr2K0U5qoNhyU","pwLDucJZU0ezFcgqx310NgtmYpbV","TCKDVQ6J0Bn3gbW4AcZC0PQKypCa","Z7vabQzZ0Bn3gbW4AcZC0TfvmSab","UUNcLtsso0mERqSGkGf0Uwg2tMZa","wYCZkqoz10fBWirfAym0S1sADKbJ"],"docs-hunds":false,"docs-hae":"PROD","docs-ehn":false,"docs-api-keys":{"scone_api_key":"AIzaSyAP66yw8QnPe4CgbQmLJ1potsrppninXxs","workspace_ui_api_key":"AIzaSyAGu65yOsDqNkYFlUT96M1i6BsyH4Nl6-s","espresso_api_key":"AIzaSyAYQn7Fb7-MOxi3BLfWHblG97kylSec-ak","cloud_search_api_key":"AIzaSyDsoqkkkgjVPCg2ep86sdbNNMrkGsCMJo0","link_previews_safe_search_api_key":"AIzaSyB8IGC2vlg9cTitrdc4HVUcbkr4SC1Z29s"},"docs-effeoima":false,"docs-etut":true,"docs-ertis":false,"docs-ethticpq":true,"docs-etsonc":false,"docs-ewfart":true,"docs-effnp":false,"docs-effnpf":false,"docs-dcheg":false,"buildLabel":"apps-forms.freebird_20251110.02_p0","docs-show_debug_info":false,"docs-edmlf":false,"docs-eemc":false,"docs-emleow":true,"docs-emlewpc":true,"docs-rmls":"DEFAULT_NO_RETRY","ondlburl":"//docs.google.com","drive_url":"//drive.google.com?usp\u003dforms_web","app_url":"https://docs.google.com/forms/?usp\u003dforms_web","drive_base_url":"//drive.google.com","docs-gsmd":"https://workspace.google.com","docs-icdmt":[],"docs-mip":25000000,"docs-mif":1000,"docs-msid":32767,"docs-emid":false,"docs-mib":52428800,"docs-mid":2048,"docs-rid":1024,"docs-ejsp":false,"docs-jspmpdm":30000.0,"docs-jspsim":8.0,"docs-jsptp":0.01,"docs-elbllqpm":false,"docs-phe":"https://contacts.google.com","docs-egpees":true,"docs-eph":true,"docs-istdr":false,"docs-escmv":false,"docs-sup":"/forms","docs-seu":"https://docs.google.com/forms/d/e/1FAIpQLSeCZKKAKigsNpvGG6Dazdo9rBB4dbKNCBhDEp5x1Wv7aHZb-A/edit","docs-crp":"/forms/d/e/1FAIpQLSeCZKKAKigsNpvGG6Dazdo9rBB4dbKNCBhDEp5x1Wv7aHZb-A/viewform","docs-crq":"usp\u003ddialog","docs-ifr":false,"docs-ucd":"","docs-uptc":["ofip","rr","lsrp","noreplica","tam","ntd","ths","app_install_xsrf_token","ouid","authEmail","authuser","ca","sh","fromCopy","ct","cs","cct","sle","dl","hi","hi_ext","usp","urp","utm_source","utm_medium","utm_campaign","utm_term","utm_content","docs_gsdv","srd"],"docs-doddn":"","docs-uddn":"","docs-ugn":"","docs-epq":true,"docs-upap":"/prefs","docs-tst":"","docs-ilbefsd":false,"docs-lbefm":0,"docs-lbesty":0,"docs-elsic":false,"docs-thtea":false,"docs-tdc":"[{\"id\":\"0:Basics\",\"name\":\"Basics\",\"deletedIds\":[]},{\"id\":\"0:Brochures\",\"name\":\"Brochures \\u0026 newsletters\",\"deletedIds\":[]},{\"id\":\"0:Calendars\",\"name\":\"Calendars \\u0026 schedules\",\"deletedIds\":[]},{\"id\":\"0:Business\",\"name\":\"Contracts, onboarding and other forms\",\"deletedIds\":[]},{\"id\":\"0:Finance\",\"name\":\"Finance \\u0026 accounting\",\"deletedIds\":[]},{\"id\":\"0:Letters\",\"name\":\"Letters\",\"deletedIds\":[]},{\"id\":\"0:Reports\",\"name\":\"Reports \\u0026 proposals\",\"deletedIds\":[]},{\"id\":\"0:Planners\",\"name\":\"Trackers\",\"deletedIds\":[]},{\"id\":\"Unparented\",\"name\":\"Uncategorised\",\"deletedIds\":[\"0:NoTemplateCategories\"]}]","docs-ttt":0,"docs-tcdtc":"[]","docs-ividtg":false,"docs-tdcp":0,"docs-tdvc":false,"docs-hetsdiaow":true,"docs-edt":true,"docs-tintd":false,"docs-tafl":true,"docs-puvtftv":true,"docs-erdiiv":false,"docs-eemt":["image"],"docs-eqspdc":true,"docs-roosb":false,"docs-esehbc":true,"docs-sqcuu":true,"docs-uaid":false,"docs-uaqs":0,"docs-eclpa":false,"docs-edp2":false,"docs-iidpm":false,"docs-mefu":false,"docs-iicp":false,"docs-edvm":false,"docs-elpg":false,"docs-elpgpm":false,"docs-acap":["docs.security.access_capabilities",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,1,0,0],"docs-ci":"","docs-eccfs":false,"docs-eep":false,"docs-ndt":"Untitled form","docs-plwtu":"//ssl.gstatic.com/docs/common/product/forms_app_icon1.png","docs-prn":"Google Forms","docs-sprn":"","docs-een":false,"docs-as":"","docs-mdck":"AIzaSyD8OLHtLvDxnjZsBoVq4-_cuwUbKEMa70s","docs-eccbs":false,"docs-mmpt":9000,"docs-erd":false,"docs-uootuns":false,"docs-amawso":false,"docs-ofmpp":false,"docs-anlpfdo":false,"docs-ems":"SHARE_SUBMENU","docs-glu":"","docs-wsu":"","docs-wsup":"","docs-sccfo":"PROD","docs-fecgd":false,"docs-pid":"","docs-ricocpb":false,"docs-rdowr":false,"docs-dec":false,"docs-ecgd":false,"docs-dsps":true,"docs-ececs":false,"docs-ezdi":false,"docs-ezduole":false,"server_time_ms":1763053802699,"gaia_session_id":"","docs-usp":"forms_web","docs-isb":false,"docs-agdc":false,"docs-anddc":true,"docs-adndldc":false,"docs-dhnap":"docs.google.com","docs-ds":"https","docs-clibs":1,"docs-cirts":20000,"docs-cide":true,"docs-cn":"","docs-dprfo":false,"docs-duesf":false,"docs-dcdpe":true,"docs-dom":false,"docs-eacr":false,"docs-eacw":false,"docs-ecer":false,"docs-ecir":true,"docs-ecssl":false,"docs-ecssi":false,"docs-ecped":true,"docs-copy-ecci":false,"docs-edpq":false,"docs-edamc":false,"docs-edomic":false,"docs-edbsms":false,"docs-eddm":false,"docos-edii":false,"docs-edspi":false,"docs-edvpim":false,"docs-edvpim2":false,"docs-fwd":false,"docs-eibs":true,"docs-elds":false,"docs-emp":false,"docs-emcf":true,"docs-emmu":false,"docs-enpks":false,"docs-epmi":false,"docs-epat":true,"docs-ermcf":false,"docs-erpep":false,"docs-ersd":false,"docs-esml":true,"docs-ete":false,"docs-ewlip":true,"docs-echiut":"default","docs-ipuv":true,"docs-oesf":false,"docs-oursf":false,"docs-plimif":20.0,"docs-srmdue":0.0,"docs-srmoe":0.01,"docs-srmour":0.01,"docs-srmxue":0.01,"docs-sptm":true,"docs-ssi":false,"docs-uoci":"","docs-wesf":false,"docs-xduesf":false,"docs-emmda":false,"docs-eafst":false,"docs-eltafi":false,"docs-eltafip2":false,"docs-emraffi":false,"docs-rolibilc":false,"docs-esqppo":false,"docs-etpi":false,"docs-ipmmp":true,"docs-emmafi":false,"docs-gth":"Go to Forms home screen","docs-ndsom":[],"docs-dm":"application/vnd.google-apps.freebird","docs-sdsom":[],"docs-po":"https://docs.google.com","docs-to":"https://docs.google.com","opmbs":52428800,"opmpd":5000,"opbu":"https://docs.google.com/picker","docs-pe":1,"opru":"https://docs.google.com/relay.html","opdu":false,"ophi":"trix_forms","opst":"","opuci":"","opsmu":"https://docs.google.com/picker","docs-ehipo":false,"docs-drk":[],"docs-erkpp":false,"docs-erkfsu":true,"maestro_domain":"https://script.google.com","enable_maestro":true,"docs-isctp":false,"docs-emae":false,"mae-cwssw":false,"mae-aoeba":true,"mae-esme":false,"mae-seitd":true,"docs-emgsmw":true,"docs-mhea":false,"docs-cpv":0,"docs-urouih":false,"docs-ect":true,"docs-alu":"https://myaccount.google.com/language","docs-cpks":[],"docs-hasid":"Forms","docs-hdod":"docs.google.com","docs-ehinbd":true,"docs-hdck":"AIzaSyCs1AYpdoC8cECMZEWg89u054wu3GiI0lI","docs-hucs":true,"docs-hufcm":false,"docs-cbrs":50,"docs-caru":"https://clients6.google.com","docs-cdru":"https://drivefrontend-pa.clients6.google.com","docs-cpari":"https://people-pa.clients6.google.com/","docs-cbau":"https://drive.google.com","docs-cfru":"https://lh3.google.com","docs-ctak":"AIzaSyAWGrfCCr7albM3lmCc937gx4uIphbpeKQ","docs-cgav":0,"docs-cci":2,"docs-gap":"/drive/v2internal","docs-eaotx":true,"docs-efgrr":false,"docs-ecrerfmo":false,"jobset":"prod","docs-cdie":false,"docs-copy-hp":true,"docs-icfc":false,"docs-ecrpsh":false,"docs-nad":"sites.google.com","docs-ccwt":80,"docs-ut":2,"docs-sol":true,"docs-dvs":1,"docs-dac":1,"docs-ilbrc":false,"docs-dlpe":false,"docs-erre":false,"enable_omnibox":true,"docs-cvmo":-1,"docs-eqam":false,"docs-euaool":false,"docs-eua":false,"docs-esap":true,"docs-efib":false,"docs-se":false,"docs-eaaw":false,"docs-eecs":false,"docs-ehlbap":true,"docs-emtr":false,"docs-uwzh":false,"docs-dafjera":false,"docs-daflia":false,"docs-dafgfma":false,"docs-era":true,"docs-fhnfst":"sVEZbUAa70mHq3jmV6o0TNq1M7FF","docs-fhnlst":"","docs-fhnprt":"bhEyDmbwi0mHq3jmV6o0TngCF1v2","docs-fhnqt":"8ZPFZT5nG0mHq3jmV6o0PJ5yoVh4","docs-fhnrqtt":"P55v8p4Lk0mHq3jmV6o0VjggjHMV","docs-fhntrts":"QqnZoz9ko0mHq3jmV6o0QskzBcHn","docs-egn":"-1","docs-eulsdo":false,"docs-eopd":"espresso-pa.googleapis.com","docs-gaopd":"appsgenaiserver-pa.clients6.google.com","docs-idephr":false,"docs-eoool":false,"docs-idep":false,"docs-ilc":false,"docs-ilecoi":false,"docs-ilecoo":false,"docs-ics":false,"docs-dcarft":false,"docs-egafedo":false,"docs-egafkd":false,"docs-ebkq":true,"docs-ebk":false,"docs-ebubgi":false,"docs-ecscv2":true,"docs-edtg":false,"docs-eslc":false,"docs-egnup":false,"docs-egpf":false,"docs-egaat":false,"docs-egqe":true,"docs-eisel":false,"docs-esptc":false,"docs-eupfsi":false,"docs-esigs":false,"docs-esa":false,"docs-es":false,"docs-esets":false,"docs-esgap":false,"docs-esn":false,"docs-evdmt":false,"docs-evdr":false,"docs-evst":false,"docs-shti":"","docs-rpod":"appsgrowthpromo-pa.clients6.google.com","docs-dht":"","docs-edcb":false,"docs-deo":false,"docs-depvv2":true,"docs-epbih":false,"docs-dslb":false,"docs-egsdsr":false,"docs-egsdepsv":false,"docs-gsdv":0,"docs-gsdvofdh":false,"docs-dt":"freebird","zpgp":"dgzkgczkijbgcsgimxjdlmtzjwzfivzxfzmsystzeoiwamjtzzhicxctdgfskvteervyhfvgjtkjtymwzaelnur","wbgrlvt_xzvprgz_pmxjuqynmb":0.3,"ewpwf_tjyo_jrgmrqcxgq":0.5,"ewpwf_rlao_abil_pmxjuqynmb":0.3,"jvrx_oiytot_des_fnbimqmhobt_meajug_nqe":"https://docs.google.com/picker?protocol\u003dgadgets\u0026parent\u003dhttps://docs.google.com/relay.html\u0026hostId\u003dspreadsheet-form-linker\u0026title\u003dChoose+a+spreadsheet+where+we\u0027ll+copy+responses+to+your+form\u0026hl\u003den_GB\u0026newDriveView\u003dtrue\u0026origin\u003dhttps://docs.google.com\u0026nav\u003d((%22spreadsheets%22,null,%7B%22mimeTypes%22:%22application/vnd.google-apps.spreadsheet,application/vnd.google-apps.ritz%22%7D))","alb_mrne_nkhohn_hpv":"https://docs.google.com/picker?protocol\u003dgadgets\u0026parent\u003dhttps://docs.google.com/relay.html\u0026hostId\u003dtrix_forms-fonts\u0026title\u003dFonts\u0026hl\u003den_GB\u0026newDriveView\u003dtrue\u0026origin\u003dhttps://docs.google.com\u0026navHidden\u003dtrue\u0026multiselectEnabled\u003dtrue\u0026selectButtonLabel\u003dOK\u0026nav\u003d((%22fonts%22))","hyigl_uapbckh_zcbpkkq_fixh":"https://drive.google.com/settings/storage","mz_dodrpm_fylol_smbq":false,"jvrxz-icbu":"6LcJMyUUAAAAABOakew3hdiQ0dU8a21s-POW69KQ","jvrxz-edl":false,"jvrxz-ddc":"Untitled survey","jvrxz-eydw":true,"jvrxz-edzno":false,"jvrxz-odzoe":false,"jvrxz-slg":"gndmhdcefbhlchkhipcnnbkcmicncehk","jvrxz-eie":false,"jvrxz-ecy":false,"jvrxz-eqez":false,"jvrxz-eqq":false,"jvrxz-eez":false,"jvrxz-exjm":false,"jvrxz-elnw":true,"jvrxz-eczde":false,"jvrxz-gpd":"https://accounts.google.com/","jvrxz-exo":true,"jvrxz-eoobpzxq":true,"jvrxz-usmd":false,"jvrxz-eaa":true,"jvrxz-ebbf3":false,"jvrxz-epyphxv":true,"jvrxz-eboeh":false,"jvrxz-eazc":false,"jvrxz-eqb":false,"jvrxz-eqlpu":false,"jvrxz-esvm":false,"jvrxz-sqfxg":false,"jvrxz-eeac":false,"jvrxz-eeacszf":true,"jvrxz-eacbu":true,"jvrxz-encbkz":false,"jvrxz-enomkz":false,"jvrxz-eabeq":false,"jvrxz-rnu":10000,"jvrxz-rwxvu":50000,"jvrxz-rdugv":40000,"jvrxz-sdugv":80000,"jvrxz-qgugv":8000,"jvrxz-rwxcu":100000,"jvrxz-rwxcek":10000,"jvrxz-eccavj":true,"jvrxz-e2ym":false,"jvrxz-esrq":false,"jvrxz-ebew":false,"jvrxz-erarql":false,"jvrxz-ezazelg":false,"jvrxz-emeof":false,"jvrxz-enbekwuy":true,"jvrxz-eemnds":false,"jvrxz-eqavqsv":true,"jvrxz-efrw":true,"jvrxz-edlyh":false,"jvrxz-epbmt":false,"jvrxz-eqao":true,"jvrxz-eaancjo":false,"jvrxz-esryo":false,"jvrxz-enrv":true,"googlesystem_blogspot_banlevel":"http://goo.gl/vqaya","docs-bcbt":"Forms Home","docs-bc-css":"forms","docs-spdy":false,"xdbcfAllowHostNamePrefix":true,"xdbcfAllowXpc":true,"docs-dbctc":false,"docs-cbcwro":false,"docs-ebctcio":true,"docs-iror":false,"docs-pse":"PROD","docs-nrfd":false,"docs-nrfdfr":false,"docs-sdb":false,"docs-lucpf":true,"docs-hbiwud":true,"docs-iwu":{},"docs-efypr":true,"docs-eyprp":true,"docs-dcr":false,"docs-eytpgcv":0};</script><base target="_blank"><meta property="og:title" content="Basic Knowledge and Math Quiz"><meta property="og:type" content="article"><meta property="og:site_name" content="Google Docs"><meta property="og:url" content="https://docs.google.com/forms/d/e/1FAIpQLSeCZKKAKigsNpvGG6Dazdo9rBB4dbKNCBhDEp5x1Wv7aHZb-A/viewform?usp=dialog&usp=embed_facebook"><meta property="og:image" content="https://lh4.googleusercontent.com/HtS7tPlskpu3MfZt9VQ_7oo2nG64sSHurl0T6-DhfKM3APHkhyoCFov1Ow39TmDSojC-wLq0zZhhcqQ=w1200-h630-p"><meta property="og:image:width" content="200"><meta property="og:image:height" content="200"><meta property="og:description" content="Test your basic addition and general knowledge."><meta property="og:ttl" content="604800"></head><body dir="ltr" itemscope itemtype="http://schema.org/CreativeWork/FormObject" class="D8bnZd " data-is-prepopulate-mode="false" data-is-response-view="true" jscontroller="OkF2xb" jsaction="rcuQ6b:npT2md; click:KjsqPd;oSngvd:KWFGld;UxRBlf:GrC6Ef;oDrQPd:l9NwTb;dkdJAd:CMTGD;"><meta itemprop="name" content="Basic Knowledge and Math Quiz"><meta itemprop="description" content="Test your basic addition and general knowledge."><meta itemprop="faviconUrl" content="https://ssl.gstatic.com/docs/spreadsheets/forms/forms_icon_2023q4.ico"><meta itemprop="url" content="https://docs.google.com/forms/d/e/1FAIpQLSeCZKKAKigsNpvGG6Dazdo9rBB4dbKNCBhDEp5x1Wv7aHZb-A/viewform?usp=dialog&usp=embed_googleplus"><meta itemprop="embedURL" content="https://docs.google.com/forms/d/e/1FAIpQLSeCZKKAKigsNpvGG6Dazdo9rBB4dbKNCBhDEp5x1Wv7aHZb-A/viewform?usp=dialog&embedded=true&usp=embed_googleplus"><meta itemprop="thumbnailUrl" content="https://ssl.gstatic.com/docs/forms/social/social-forms-big-2.png"><meta itemprop="image" content="https://ssl.gstatic.com/docs/forms/social/social-forms-big-2.png"><meta itemprop="imageUrl" content="https://ssl.gstatic.com/docs/forms/social/social-forms-big-2.png"><div class="Uc2NEf"><div class="vnFTpb teQAzf ErmvL KHCwJ"></div><div class="teQAzf"><form action="https://docs.google.com/forms/d/e/1FAIpQLSeCZKKAKigsNpvGG6Dazdo9rBB4dbKNCBhDEp5x1Wv7aHZb-A/formResponse" target="_self" method="POST" id="mG61Hd" jsmodel="TOfxwf Q91hve CEkLOc" data-shuffle-seed="3424541192946292657" data-clean-viewform-url="https://docs.google.com/forms/d/e/1FAIpQLSeCZKKAKigsNpvGG6Dazdo9rBB4dbKNCBhDEp5x1Wv7aHZb-A/viewform?usp=dialog" data-response="%.@.]" data-dlp-data="%.@.null,false]" data-first-entry="0" data-last-entry="6" data-is-first-page="true"><div jscontroller="yUS4Lc" jsaction="rcuQ6b:rcuQ6b;UxRBlf:rcuQ6b;"><div jsname="o6bZLc"></div></div><div class="RH5hzf RLS9Fe"><div class="lrKTG"><div class="Dq4amc"><div class="m7w29c O8VmIc tIvQIf"><noscript><div class="HB1eCd-X3SwIb-haAclf"><div class="HB1eCd-X3SwIb-i8xkGf"><div class="tk3N6e-cXJiPb tk3N6e-cXJiPb-TSZdd tk3N6e-cXJiPb-GMvhG">JavaScript isn't enabled in your browser, so this file can't be opened. Enable and reload.</div></div><br></div></noscript><div class="JH79cc RVEQke b33AEc"></div><div class="N0gd6"><div class="ahS2Le"><div class="F9yp7e ikZYwf LgNcQe" dir="auto" role="heading" aria-level="1">Basic Knowledge and Math Quiz</div></div><div class="cBGGJ OIC90c" dir="auto">Test your basic addition and general knowledge.</div><div jsname="F0H8Yc" class="liS6Hc"></div></div><div class="zAVwcb"></div><div class="DqBBlb"><div class="Oh1Vtf"><div class="kesdnc" id="SMMuxb"><a jscontroller="A2m8uc" jsaction="rcuQ6b:npT2md; click:mAWTmb;" href="https://accounts.google.com/AccountChooser?continue=https://docs.google.com/forms/d/e/1FAIpQLSeCZKKAKigsNpvGG6Dazdo9rBB4dbKNCBhDEp5x1Wv7aHZb-A/viewform?usp%3Ddialog&service=wise" aria-describedby="SMMuxb">Sign in to Google</a> to save your progress. <a class="TYUeKb" jscontroller="rmdjlf" jsaction="rcuQ6b:npT2md; click:xdDXgc;" role="button" tabindex="0">Learn more</a></div></div></div></div></div><div class="o3Dpx" role="list"><div class="Qr7Oae" role="listitem"><div jsmodel="CP1oW" data-params="%.@.[314895045,"What is 5 + 7?",null,0,[[612189310,null,false,null,null,null,null,null,null,null,[]]],null,null,null,null,null,null,[null,"What is 5 + 7?"]],"i1","i2","i3",false,"i4"]"><div jscontroller="sWGJ4b" jsaction="EEvAHc:yfX9oc;" jsname="WsjYwc" class="geS5n"><div class="z12JJ"><div class="M4DNQ"><div id="i1" class="HoXoMd D1wxyf RjsPE" role="heading" aria-level="3"><span class="M7eMe">What is 5 + 7?</span></div><div class="gubaDc OIC90c RjsPE" id="i2"></div></div></div><div jscontroller="oCiKKc" jsaction="rcuQ6b:vZc4S;O22p3e:zjh6rb;b2trFe:eVidQc;sPvj8e:d3sQLd;AHmuwe:h06R8;" class="AgroKb"><div class="rFrNMe k3kHxc RdH0ib yqQS1 zKHdkd RDPZE" jscontroller="pxq3x" jsaction="clickonly:KjsqPd; focus:Jt1EX; blur:fpfTEe; input:Lg5SV" jsshadow jsname="YPqjbf" aria-disabled="true"><div class="aCsJod oJeWuf"><div class="aXBtI Wic03c"><div class="Xb9hP"><input type="text" class="whsOnd zHQkBf" jsname="YPqjbf" autocomplete="off" tabindex="0" aria-labelledby="i1 i4" aria-describedby="i2 i3" disabled aria-disabled="true" dir="auto" data-initial-dir="auto" data-initial-value=""/><div jsname="LwH6nd" class="ndJi5d snByac" aria-hidden="true">Your answer</div></div><div class="i9lrp mIZh1c"></div><div jsname="XmnwAc" class="OabDMe cXrdqd"></div></div></div><div class="LXRPh"><div jsname="ty6ygf" class="ovnfwe Is7Fhb"></div></div></div></div><div jsname="Rfh2Tc" class="SL4Sz" id="i3" role="alert"></div></div></div></div><div class="Qr7Oae" role="listitem"><div jsmodel="CP1oW" data-params="%.@.[1403132839,"Calculate 15 + 8.",null,0,[[159990158,null,false,null,null,null,null,null,null,null,[]]],null,null,null,null,null,null,[null,"Calculate 15 + 8."]],"i6","i7","i8",false,"i9"]"><div jscontroller="sWGJ4b" jsaction="EEvAHc:yfX9oc;" jsname="WsjYwc" class="geS5n"><div class="z12JJ"><div class="M4DNQ"><div id="i6" class="HoXoMd D1wxyf RjsPE" role="heading" aria-level="3"><span class="M7eMe">Calculate 15 + 8.</span></div><div class="gubaDc OIC90c RjsPE" id="i7"></div></div></div><div jscontroller="oCiKKc" jsaction="rcuQ6b:vZc4S;O22p3e:zjh6rb;b2trFe:eVidQc;sPvj8e:d3sQLd;AHmuwe:h06R8;" class="AgroKb"><div class="rFrNMe k3kHxc RdH0ib yqQS1 zKHdkd RDPZE" jscontroller="pxq3x" jsaction="clickonly:KjsqPd; focus:Jt1EX; blur:fpfTEe; input:Lg5SV" jsshadow jsname="YPqjbf" aria-disabled="true"><div class="aCsJod oJeWuf"><div class="aXBtI Wic03c"><div class="Xb9hP"><input type="text" class="whsOnd zHQkBf" jsname="YPqjbf" autocomplete="off" tabindex="0" aria-labelledby="i6 i9" aria-describedby="i7 i8" disabled aria-disabled="true" dir="auto" data-initial-dir="auto" data-initial-value=""/><div jsname="LwH6nd" class="ndJi5d snByac" aria-hidden="true">Your answer</div></div><div class="i9lrp mIZh1c"></div><div jsname="XmnwAc" class="OabDMe cXrdqd"></div></div></div><div class="LXRPh"><div jsname="ty6ygf" class="ovnfwe Is7Fhb"></div></div></div></div><div jsname="Rfh2Tc" class="SL4Sz" id="i8" role="alert"></div></div></div></div><div class="Qr7Oae" role="listitem"><div jsmodel="CP1oW" data-params="%.@.[1307778553,"Which planet is known as the 'Red Planet'?",null,2,[[1414179930,[["Venus",null,null,null,false],["Mars",null,null,null,false],["Jupiter",null,null,null,false],["Saturn",null,null,null,false]],false,null,null,null,null,null,null,null,[]]],null,null,null,null,null,null,[null,"Which planet is known as the 'Red Planet'?"]],"i11","i12","i13",false,"i14"]"><div jscontroller="sWGJ4b" jsaction="EEvAHc:yfX9oc;" jsname="WsjYwc" class="geS5n"><div class="z12JJ"><div class="M4DNQ"><div id="i11" class="HoXoMd D1wxyf RjsPE" role="heading" aria-level="3"><span class="M7eMe">Which planet is known as the 'Red Planet'?</span></div><div class="gubaDc OIC90c RjsPE" id="i12"></div></div></div><div jscontroller="UmOCme" jsaction="rcuQ6b:vZc4S;O22p3e:zjh6rb;b2trFe:eVidQc;JIbuQc:RgMCxe(YlCLKb);sPvj8e:d3sQLd;TYy3Ne:RgMCxe;" class="oyXaNc" jsname="GCYh9b"><input type="hidden" name="entry.1414179930_sentinel" jsname="DTMEae"><div jscontroller="eFy6Rc" jsaction="sPvj8e:Gh295d" jsname="cnAzRb"><div class="lLfZXe fnxRtf cNDBpf" jscontroller="wPRNsd" jsshadow jsaction="keydown:I481le;JIbuQc:JIbuQc;rcuQ6b:rcuQ6b" jsname="wCJL8" aria-labelledby="i11 i14" aria-describedby="i12 i13" role="radiogroup"><span jsslot role="presentation" jsname="bN97Pc" class="H2Gmcc tyNBNd"><div class="SG0AAe"><div class="nWQGrd zwllIb"><label for="i16" class="docssharedWizToggleLabeledContainer ajBQVb RDPZE"><div class="bzfPab wFGF8"><div class="d7L4fc bJNwt FXLARc aomaEc ECvBRb"><div id="i16" class="Od2TWd hYsg7c RDPZE" jscontroller="D8e5bc" jsaction="keydown:I481le;dyRcpb:dyRcpb;click:cOuCgd; mousedown:UX7yZ; mouseup:lbsD7e; mouseenter:tfO1Yc; mouseleave:JywGue; focus:AHmuwe; blur:O22p3e; contextmenu:mg9Pef;touchstart:p6p2H; touchmove:FwuNnf; touchend:yfqBxc(preventDefault=true); touchcancel:JMtRjd;" jsshadow aria-label="Venus" aria-disabled="true" data-value="Venus" role="radio" aria-checked="false"><div class="x0k1lc MbhUzd"></div><div class="uyywbd"></div><div class="vd3tt"><div class="AB7Lab Id5V1"><div class="rseUEf nQOrEb"></div></div></div></div></div><div class="YEVVod"><div class="ulDsOb"><span dir="auto" class="aDTYNe snByac OvPDhc OIC90c">Venus</span></div></div></div></label></div><div class="nWQGrd zwllIb"><label for="i19" class="docssharedWizToggleLabeledContainer ajBQVb RDPZE"><div class="bzfPab wFGF8"><div class="d7L4fc bJNwt FXLARc aomaEc ECvBRb"><div id="i19" class="Od2TWd hYsg7c RDPZE" jscontroller="D8e5bc" jsaction="keydown:I481le;dyRcpb:dyRcpb;click:cOuCgd; mousedown:UX7yZ; mouseup:lbsD7e; mouseenter:tfO1Yc; mouseleave:JywGue; focus:AHmuwe; blur:O22p3e; contextmenu:mg9Pef;touchstart:p6p2H; touchmove:FwuNnf; touchend:yfqBxc(preventDefault=true); touchcancel:JMtRjd;" jsshadow aria-label="Mars" aria-disabled="true" data-value="Mars" role="radio" aria-checked="false"><div class="x0k1lc MbhUzd"></div><div class="uyywbd"></div><div class="vd3tt"><div class="AB7Lab Id5V1"><div class="rseUEf nQOrEb"></div></div></div></div></div><div class="YEVVod"><div class="ulDsOb"><span dir="auto" class="aDTYNe snByac OvPDhc OIC90c">Mars</span></div></div></div></label></div><div class="nWQGrd zwllIb"><label for="i22" class="docssharedWizToggleLabeledContainer ajBQVb RDPZE"><div class="bzfPab wFGF8"><div class="d7L4fc bJNwt FXLARc aomaEc ECvBRb"><div id="i22" class="Od2TWd hYsg7c RDPZE" jscontroller="D8e5bc" jsaction="keydown:I481le;dyRcpb:dyRcpb;click:cOuCgd; mousedown:UX7yZ; mouseup:lbsD7e; mouseenter:tfO1Yc; mouseleave:JywGue; focus:AHmuwe; blur:O22p3e; contextmenu:mg9Pef;touchstart:p6p2H; touchmove:FwuNnf; touchend:yfqBxc(preventDefault=true); touchcancel:JMtRjd;" jsshadow aria-label="Jupiter" aria-disabled="true" data-value="Jupiter" role="radio" aria-checked="false"><div class="x0k1lc MbhUzd"></div><div class="uyywbd"></div><div class="vd3tt"><div class="AB7Lab Id5V1"><div class="rseUEf nQOrEb"></div></div></div></div></div><div class="YEVVod"><div class="ulDsOb"><span dir="auto" class="aDTYNe snByac OvPDhc OIC90c">Jupiter</span></div></div></div></label></div><div class="nWQGrd zwllIb"><label for="i25" class="docssharedWizToggleLabeledContainer ajBQVb RDPZE"><div class="bzfPab wFGF8"><div class="d7L4fc bJNwt FXLARc aomaEc ECvBRb"><div id="i25" class="Od2TWd hYsg7c RDPZE" jscontroller="D8e5bc" jsaction="keydown:I481le;dyRcpb:dyRcpb;click:cOuCgd; mousedown:UX7yZ; mouseup:lbsD7e; mouseenter:tfO1Yc; mouseleave:JywGue; focus:AHmuwe; blur:O22p3e; contextmenu:mg9Pef;touchstart:p6p2H; touchmove:FwuNnf; touchend:yfqBxc(preventDefault=true); touchcancel:JMtRjd;" jsshadow aria-label="Saturn" aria-disabled="true" data-value="Saturn" role="radio" aria-checked="false"><div class="x0k1lc MbhUzd"></div><div class="uyywbd"></div><div class="vd3tt"><div class="AB7Lab Id5V1"><div class="rseUEf nQOrEb"></div></div></div></div></div><div class="YEVVod"><div class="ulDsOb"><span dir="auto" class="aDTYNe snByac OvPDhc OIC90c">Saturn</span></div></div></div></label></div></div></span></div></div><div class="Jwjdfe"><div class="dMALK bQXwDc" jsname="YlCLKb"><div role="button" class="uArJ5e UQuaGc kCyAyd" jscontroller="VXdfxd" jsaction="click:cOuCgd; mousedown:UX7yZ; mouseup:lbsD7e; mouseenter:tfO1Yc; mouseleave:JywGue;touchstart:p6p2H; touchmove:FwuNnf; touchend:yfqBxc(preventDefault=true); touchcancel:JMtRjd;focus:AHmuwe; blur:O22p3e; contextmenu:mg9Pef;" jsshadow tabindex="0"><div class="Fvio9d MbhUzd" jsname="ksKsZd"></div><div class="e19J0b CeoRYc"></div><span jsslot class="l4V7wb Fxmcue"><span class="NPEfkd RveJvd snByac">Clear selection</span></span></div></div></div></div><div jsname="Rfh2Tc" class="SL4Sz" id="i13" role="alert"></div></div></div></div><div class="Qr7Oae" role="listitem"><div jsmodel="CP1oW" data-params="%.@.[1004051401,"What is the capital city of France?",null,2,[[813508719,[["London",null,null,null,false],["Berlin",null,null,null,false],["Rome",null,null,null,false],["Paris",null,null,null,false]],false,null,null,null,null,null,false,null,[]]],null,null,null,null,null,null,[null,"What is the capital city of France?"]],"i28","i29","i30",false,"i31"]"><div jscontroller="sWGJ4b" jsaction="EEvAHc:yfX9oc;" jsname="WsjYwc" class="geS5n"><div class="z12JJ"><div class="M4DNQ"><div id="i28" class="HoXoMd D1wxyf RjsPE" role="heading" aria-level="3"><span class="M7eMe">What is the capital city of France?</span></div><div class="gubaDc OIC90c RjsPE" id="i29"></div></div></div><div jscontroller="UmOCme" jsaction="rcuQ6b:vZc4S;O22p3e:zjh6rb;b2trFe:eVidQc;JIbuQc:RgMCxe(YlCLKb);sPvj8e:d3sQLd;TYy3Ne:RgMCxe;" class="oyXaNc" jsname="GCYh9b"><input type="hidden" name="entry.813508719_sentinel" jsname="DTMEae"><div jscontroller="eFy6Rc" jsaction="sPvj8e:Gh295d" jsname="cnAzRb"><div class="lLfZXe fnxRtf cNDBpf" jscontroller="wPRNsd" jsshadow jsaction="keydown:I481le;JIbuQc:JIbuQc;rcuQ6b:rcuQ6b" jsname="wCJL8" aria-labelledby="i28 i31" aria-describedby="i29 i30" role="radiogroup"><span jsslot role="presentation" jsname="bN97Pc" class="H2Gmcc tyNBNd"><div class="SG0AAe"><div class="nWQGrd zwllIb"><label for="i33" class="docssharedWizToggleLabeledContainer ajBQVb RDPZE"><div class="bzfPab wFGF8"><div class="d7L4fc bJNwt FXLARc aomaEc ECvBRb"><div id="i33" class="Od2TWd hYsg7c RDPZE" jscontroller="D8e5bc" jsaction="keydown:I481le;dyRcpb:dyRcpb;click:cOuCgd; mousedown:UX7yZ; mouseup:lbsD7e; mouseenter:tfO1Yc; mouseleave:JywGue; focus:AHmuwe; blur:O22p3e; contextmenu:mg9Pef;touchstart:p6p2H; touchmove:FwuNnf; touchend:yfqBxc(preventDefault=true); touchcancel:JMtRjd;" jsshadow aria-label="London" aria-disabled="true" data-value="London" role="radio" aria-checked="false"><div class="x0k1lc MbhUzd"></div><div class="uyywbd"></div><div class="vd3tt"><div class="AB7Lab Id5V1"><div class="rseUEf nQOrEb"></div></div></div></div></div><div class="YEVVod"><div class="ulDsOb"><span dir="auto" class="aDTYNe snByac OvPDhc OIC90c">London</span></div></div></div></label></div><div class="nWQGrd zwllIb"><label for="i36" class="docssharedWizToggleLabeledContainer ajBQVb RDPZE"><div class="bzfPab wFGF8"><div class="d7L4fc bJNwt FXLARc aomaEc ECvBRb"><div id="i36" class="Od2TWd hYsg7c RDPZE" jscontroller="D8e5bc" jsaction="keydown:I481le;dyRcpb:dyRcpb;click:cOuCgd; mousedown:UX7yZ; mouseup:lbsD7e; mouseenter:tfO1Yc; mouseleave:JywGue; focus:AHmuwe; blur:O22p3e; contextmenu:mg9Pef;touchstart:p6p2H; touchmove:FwuNnf; touchend:yfqBxc(preventDefault=true); touchcancel:JMtRjd;" jsshadow aria-label="Berlin" aria-disabled="true" data-value="Berlin" role="radio" aria-checked="false"><div class="x0k1lc MbhUzd"></div><div class="uyywbd"></div><div class="vd3tt"><div class="AB7Lab Id5V1"><div class="rseUEf nQOrEb"></div></div></div></div></div><div class="YEVVod"><div class="ulDsOb"><span dir="auto" class="aDTYNe snByac OvPDhc OIC90c">Berlin</span></div></div></div></label></div><div class="nWQGrd zwllIb"><label for="i39" class="docssharedWizToggleLabeledContainer ajBQVb RDPZE"><div class="bzfPab wFGF8"><div class="d7L4fc bJNwt FXLARc aomaEc ECvBRb"><div id="i39" class="Od2TWd hYsg7c RDPZE" jscontroller="D8e5bc" jsaction="keydown:I481le;dyRcpb:dyRcpb;click:cOuCgd; mousedown:UX7yZ; mouseup:lbsD7e; mouseenter:tfO1Yc; mouseleave:JywGue; focus:AHmuwe; blur:O22p3e; contextmenu:mg9Pef;touchstart:p6p2H; touchmove:FwuNnf; touchend:yfqBxc(preventDefault=true); touchcancel:JMtRjd;" jsshadow aria-label="Rome" aria-disabled="true" data-value="Rome" role="radio" aria-checked="false"><div class="x0k1lc MbhUzd"></div><div class="uyywbd"></div><div class="vd3tt"><div class="AB7Lab Id5V1"><div class="rseUEf nQOrEb"></div></div></div></div></div><div class="YEVVod"><div class="ulDsOb"><span dir="auto" class="aDTYNe snByac OvPDhc OIC90c">Rome</span></div></div></div></label></div><div class="nWQGrd zwllIb"><label for="i42" class="docssharedWizToggleLabeledContainer ajBQVb RDPZE"><div class="bzfPab wFGF8"><div class="d7L4fc bJNwt FXLARc aomaEc ECvBRb"><div id="i42" class="Od2TWd hYsg7c RDPZE" jscontroller="D8e5bc" jsaction="keydown:I481le;dyRcpb:dyRcpb;click:cOuCgd; mousedown:UX7yZ; mouseup:lbsD7e; mouseenter:tfO1Yc; mouseleave:JywGue; focus:AHmuwe; blur:O22p3e; contextmenu:mg9Pef;touchstart:p6p2H; touchmove:FwuNnf; touchend:yfqBxc(preventDefault=true); touchcancel:JMtRjd;" jsshadow aria-label="Paris" aria-disabled="true" data-value="Paris" role="radio" aria-checked="false"><div class="x0k1lc MbhUzd"></div><div class="uyywbd"></div><div class="vd3tt"><div class="AB7Lab Id5V1"><div class="rseUEf nQOrEb"></div></div></div></div></div><div class="YEVVod"><div class="ulDsOb"><span dir="auto" class="aDTYNe snByac OvPDhc OIC90c">Paris</span></div></div></div></label></div></div></span></div></div><div class="Jwjdfe"><div class="dMALK bQXwDc" jsname="YlCLKb"><div role="button" class="uArJ5e UQuaGc kCyAyd" jscontroller="VXdfxd" jsaction="click:cOuCgd; mousedown:UX7yZ; mouseup:lbsD7e; mouseenter:tfO1Yc; mouseleave:JywGue;touchstart:p6p2H; touchmove:FwuNnf; touchend:yfqBxc(preventDefault=true); touchcancel:JMtRjd;focus:AHmuwe; blur:O22p3e; contextmenu:mg9Pef;" jsshadow tabindex="0"><div class="Fvio9d MbhUzd" jsname="ksKsZd"></div><div class="e19J0b CeoRYc"></div><span jsslot class="l4V7wb Fxmcue"><span class="NPEfkd RveJvd snByac">Clear selection</span></span></div></div></div></div><div jsname="Rfh2Tc" class="SL4Sz" id="i30" role="alert"></div></div></div></div><div class="Qr7Oae" role="listitem"><div jsmodel="CP1oW" data-params="%.@.[1619605659,"The process by which plants make their own food is called __________.",null,0,[[522759996,null,false,null,null,null,null,null,null,null,[]]],null,null,null,null,null,null,[null,"The process by which plants make their own food is called __________."]],"i45","i46","i47",false,"i48"]"><div jscontroller="sWGJ4b" jsaction="EEvAHc:yfX9oc;" jsname="WsjYwc" class="geS5n"><div class="z12JJ"><div class="M4DNQ"><div id="i45" class="HoXoMd D1wxyf RjsPE" role="heading" aria-level="3"><span class="M7eMe">The process by which plants make their own food is called __________.</span></div><div class="gubaDc OIC90c RjsPE" id="i46"></div></div></div><div jscontroller="oCiKKc" jsaction="rcuQ6b:vZc4S;O22p3e:zjh6rb;b2trFe:eVidQc;sPvj8e:d3sQLd;AHmuwe:h06R8;" class="AgroKb"><div class="rFrNMe k3kHxc RdH0ib yqQS1 zKHdkd RDPZE" jscontroller="pxq3x" jsaction="clickonly:KjsqPd; focus:Jt1EX; blur:fpfTEe; input:Lg5SV" jsshadow jsname="YPqjbf" aria-disabled="true"><div class="aCsJod oJeWuf"><div class="aXBtI Wic03c"><div class="Xb9hP"><input type="text" class="whsOnd zHQkBf" jsname="YPqjbf" autocomplete="off" tabindex="0" aria-labelledby="i45 i48" aria-describedby="i46 i47" disabled aria-disabled="true" dir="auto" data-initial-dir="auto" data-initial-value=""/><div jsname="LwH6nd" class="ndJi5d snByac" aria-hidden="true">Your answer</div></div><div class="i9lrp mIZh1c"></div><div jsname="XmnwAc" class="OabDMe cXrdqd"></div></div></div><div class="LXRPh"><div jsname="ty6ygf" class="ovnfwe Is7Fhb"></div></div></div></div><div jsname="Rfh2Tc" class="SL4Sz" id="i47" role="alert"></div></div></div></div><div class="Qr7Oae" role="listitem"><div jsmodel="CP1oW" data-params="%.@.[383428290,"A standard deck of cards has how many suits? (Select all correct options)",null,4,[[715543226,[["2",null,null,null,false],["3",null,null,null,false],["4",null,null,null,false],["5",null,null,null,false]],false,null,null,null,null,null,null,null,[]]],null,null,null,null,null,null,[null,"A standard deck of cards has how many suits? (Select all correct options)"]],"i50","i51","i52",false,"i53"]"><div jscontroller="sWGJ4b" jsaction="EEvAHc:yfX9oc;" jsname="WsjYwc" class="geS5n"><div class="z12JJ"><div class="M4DNQ"><div id="i50" class="HoXoMd D1wxyf RjsPE" role="heading" aria-level="3"><span class="M7eMe">A standard deck of cards has how many suits? (Select all correct options)</span></div><div class="gubaDc OIC90c RjsPE" id="i51"></div></div></div><div jscontroller="sW52Ae" jsaction="rcuQ6b:vZc4S;O22p3e:zjh6rb;b2trFe:eVidQc;sPvj8e:sEDvJ;JIbuQc:d3sQLd(MPu53c);" class="Y6Myld"><input type="hidden" name="entry.715543226_sentinel" jsname="DTMEae"><div role="list" aria-labelledby="i50 i53" aria-describedby="i51 i52 i55" class=""><div class="eBFwI" role="listitem" jsaction="JIbuQc:aj0Jcf" jscontroller="lWjoT" jsname="MPu53c"><label for="i56" class="docssharedWizToggleLabeledContainer Yri8Nb RDPZE"><div class="bzfPab wFGF8"><div id="i56" class="uVccjd aiSeRd FXLARc wGQFbe BJHAP oLlshd RDPZE" jscontroller="EcW08c" jsaction="keydown:I481le;dyRcpb:dyRcpb;click:cOuCgd; mousedown:UX7yZ; mouseup:lbsD7e; mouseenter:tfO1Yc; mouseleave:JywGue; focus:AHmuwe; blur:O22p3e; contextmenu:mg9Pef;touchstart:p6p2H; touchmove:FwuNnf; touchend:yfqBxc(preventDefault=true); touchcancel:JMtRjd;" jsshadow jsname="FkQz1b" aria-label="2" aria-disabled="true" data-answer-value="2" role="checkbox" aria-checked="false"><div class="PkgjBf MbhUzd"></div><div class="uHMk6b fsHoPb"></div><div class="rq8Mwb"><div class="TCA6qd"><div class="MbUTNc oyD5Oc"></div><div class="Ii6cVc oyD5Oc"></div></div></div></div><div class="YEVVod"><div class="ulDsOb"><span dir="auto" class="aDTYNe snByac n5vBHf OIC90c">2</span></div></div></div></label></div><div class="eBFwI" role="listitem" jsaction="JIbuQc:aj0Jcf" jscontroller="lWjoT" jsname="MPu53c"><label for="i59" class="docssharedWizToggleLabeledContainer Yri8Nb RDPZE"><div class="bzfPab wFGF8"><div id="i59" class="uVccjd aiSeRd FXLARc wGQFbe BJHAP oLlshd RDPZE" jscontroller="EcW08c" jsaction="keydown:I481le;dyRcpb:dyRcpb;click:cOuCgd; mousedown:UX7yZ; mouseup:lbsD7e; mouseenter:tfO1Yc; mouseleave:JywGue; focus:AHmuwe; blur:O22p3e; contextmenu:mg9Pef;touchstart:p6p2H; touchmove:FwuNnf; touchend:yfqBxc(preventDefault=true); touchcancel:JMtRjd;" jsshadow jsname="FkQz1b" aria-label="3" aria-disabled="true" data-answer-value="3" role="checkbox" aria-checked="false"><div class="PkgjBf MbhUzd"></div><div class="uHMk6b fsHoPb"></div><div class="rq8Mwb"><div class="TCA6qd"><div class="MbUTNc oyD5Oc"></div><div class="Ii6cVc oyD5Oc"></div></div></div></div><div class="YEVVod"><div class="ulDsOb"><span dir="auto" class="aDTYNe snByac n5vBHf OIC90c">3</span></div></div></div></label></div><div class="eBFwI" role="listitem" jsaction="JIbuQc:aj0Jcf" jscontroller="lWjoT" jsname="MPu53c"><label for="i62" class="docssharedWizToggleLabeledContainer Yri8Nb RDPZE"><div class="bzfPab wFGF8"><div id="i62" class="uVccjd aiSeRd FXLARc wGQFbe BJHAP oLlshd RDPZE" jscontroller="EcW08c" jsaction="keydown:I481le;dyRcpb:dyRcpb;click:cOuCgd; mousedown:UX7yZ; mouseup:lbsD7e; mouseenter:tfO1Yc; mouseleave:JywGue; focus:AHmuwe; blur:O22p3e; contextmenu:mg9Pef;touchstart:p6p2H; touchmove:FwuNnf; touchend:yfqBxc(preventDefault=true); touchcancel:JMtRjd;" jsshadow jsname="FkQz1b" aria-label="4" aria-disabled="true" data-answer-value="4" role="checkbox" aria-checked="false"><div class="PkgjBf MbhUzd"></div><div class="uHMk6b fsHoPb"></div><div class="rq8Mwb"><div class="TCA6qd"><div class="MbUTNc oyD5Oc"></div><div class="Ii6cVc oyD5Oc"></div></div></div></div><div class="YEVVod"><div class="ulDsOb"><span dir="auto" class="aDTYNe snByac n5vBHf OIC90c">4</span></div></div></div></label></div><div class="eBFwI" role="listitem" jsaction="JIbuQc:aj0Jcf" jscontroller="lWjoT" jsname="MPu53c"><label for="i65" class="docssharedWizToggleLabeledContainer Yri8Nb RDPZE"><div class="bzfPab wFGF8"><div id="i65" class="uVccjd aiSeRd FXLARc wGQFbe BJHAP oLlshd RDPZE" jscontroller="EcW08c" jsaction="keydown:I481le;dyRcpb:dyRcpb;click:cOuCgd; mousedown:UX7yZ; mouseup:lbsD7e; mouseenter:tfO1Yc; mouseleave:JywGue; focus:AHmuwe; blur:O22p3e; contextmenu:mg9Pef;touchstart:p6p2H; touchmove:FwuNnf; touchend:yfqBxc(preventDefault=true); touchcancel:JMtRjd;" jsshadow jsname="FkQz1b" aria-label="5" aria-disabled="true" data-answer-value="5" role="checkbox" aria-checked="false"><div class="PkgjBf MbhUzd"></div><div class="uHMk6b fsHoPb"></div><div class="rq8Mwb"><div class="TCA6qd"><div class="MbUTNc oyD5Oc"></div><div class="Ii6cVc oyD5Oc"></div></div></div></div><div class="YEVVod"><div class="ulDsOb"><span dir="auto" class="aDTYNe snByac n5vBHf OIC90c">5</span></div></div></div></label></div></div><div id="i55" class="fKfAyc"></div></div><div jsname="Rfh2Tc" class="SL4Sz" id="i52" role="alert"></div></div></div></div></div><div class="ThHDze" jscontroller="lSvzH" jsaction="rcuQ6b:npT2md;JIbuQc:qV61Ff(X5DuWc),Gl574d(QR6bsb),V3upec(GeGHKb),HiUbje(M2UYVd),NPBnCf(OCpkoe); keydown:duASZc" data-shuffle-seed="3424541192946292657" data-should-execute-invisible-captcha-on-form-submit="false" data-is-receipt-checked="false"><div class="DE3NNc CekdCb"><div class="lRwqcd"><div role="button" class="uArJ5e UQuaGc Y5sE8d VkkpIf QvWxOd" jscontroller="VXdfxd" jsaction="click:cOuCgd; mousedown:UX7yZ; mouseup:lbsD7e; mouseenter:tfO1Yc; mouseleave:JywGue;touchstart:p6p2H; touchmove:FwuNnf; touchend:yfqBxc(preventDefault=true); touchcancel:JMtRjd;focus:AHmuwe; blur:O22p3e; contextmenu:mg9Pef;" jsshadow jsname="M2UYVd" aria-label="Submit" tabindex="0"><div class="Fvio9d MbhUzd" jsname="ksKsZd"></div><div class="e19J0b CeoRYc"></div><span jsslot class="l4V7wb Fxmcue"><span class="NPEfkd RveJvd snByac">Submit</span></span></div></div><div class="nYdzXd"><div role="button" class="uArJ5e UQuaGc kCyAyd l3F1ye TFBnVe" jscontroller="VXdfxd" jsaction="click:cOuCgd; mousedown:UX7yZ; mouseup:lbsD7e; mouseenter:tfO1Yc; mouseleave:JywGue;touchstart:p6p2H; touchmove:FwuNnf; touchend:yfqBxc(preventDefault=true); touchcancel:JMtRjd;focus:AHmuwe; blur:O22p3e; contextmenu:mg9Pef;" jsshadow jsname="X5DuWc" tabindex="0"><div class="Fvio9d MbhUzd" jsname="ksKsZd"></div><div class="e19J0b CeoRYc"></div><span jsslot class="l4V7wb Fxmcue"><span class="NPEfkd RveJvd snByac">Clear form</span></span></div></div></div><div class="T2dutf">Never submit passwords through Google Forms.</div></div><input type="hidden" name="fvv" value="1"><input type="hidden" name="partialResponse" value="[null,null,"3424541192946292657"]"><input type="hidden" name="pageHistory" value="0"><input type="hidden" name="fbzx" value="3424541192946292657"><input type="hidden" name="submissionTimestamp" value="-1"></div></div></form><div><div class="v1CNvb sId0Ce">This content is neither created nor endorsed by Google. - <a href="https://policies.google.com/terms" target="_blank">Terms of Service</a> - <a href="https://policies.google.com/privacy" target="_blank">Privacy Policy</a><p>Does this form look suspicious? <a href="https://drive.google.com/abuse?id=AKkXjoy_fhua9rkW3G1eel9hF7GjxWRLB5HVNjblg5kzNUoG1nWUC60cwL8Z22AQvZfpLSua-ZKAi5RKPeA79uE:0&docurl=https://docs.google.com/forms/d/e/1FAIpQLSeCZKKAKigsNpvGG6Dazdo9rBB4dbKNCBhDEp5x1Wv7aHZb-A/viewform?usp%3Ddialog" target="_blank">Report</a></p></div><div class="I3zNcc yF4pU"><a dir="auto" href="//www.google.com/forms/about/?utm_source=product&utm_medium=forms_logo&utm_campaign=forms"><img src="https://www.gstatic.com/images/branding/googlelogo/svg/googlelogo_dark_clr_74x24px.svg" alt="Google" height="24px" width="74px"/> <span class="sUXvCd">Forms</span></a></div></div></div><div jscontroller="KFVhZe" jsaction="rcuQ6b:npT2md;FzgWvd:PSl28c;iFFCZc:Y0y4c;" data-report-abuse-url="https://drive.google.com/abuse?id=AKkXjoy_fhua9rkW3G1eel9hF7GjxWRLB5HVNjblg5kzNUoG1nWUC60cwL8Z22AQvZfpLSua-ZKAi5RKPeA79uE:0&docurl=https://docs.google.com/forms/d/e/1FAIpQLSeCZKKAKigsNpvGG6Dazdo9rBB4dbKNCBhDEp5x1Wv7aHZb-A/viewform?usp%3Ddialog" data-user-email-address="" data-user-display-name="" data-should-open-contact-owner-dialog="false" data-sign-in-url-for-contact-owner="https://accounts.google.com/Login?continue=https://docs.google.com/forms/d/e/1FAIpQLSeCZKKAKigsNpvGG6Dazdo9rBB4dbKNCBhDEp5x1Wv7aHZb-A/viewform?usp%3Ddialog%26socod%3Dtrue&service=wise" class="wJFUN"><div class="VfPpkd-xl07Ob-XxIAqe-OWXEXe-oYxtQd" jscontroller="wg1P6b" jsaction="JIbuQc:aj0Jcf(WjL7X); keydown:uYT2Vb(WjL7X);xDliB:oNPcuf;SM8mFd:li9Srb;iFFCZc:NSsOUb;Rld2oe:NSsOUb" jsname="hTYMre" jsshadow data-is-menu-hoisted="true"><div jsname="WjL7X" jsslot><span data-is-tooltip-wrapper="true"><button class="VfPpkd-Bz112c-LgbsSe yHy1rc eT1oJ mN1ivc" jscontroller="soHxf" jsaction="click:cOuCgd; mousedown:UX7yZ; mouseup:lbsD7e; mouseenter:tfO1Yc; mouseleave:JywGue; touchstart:p6p2H; touchmove:FwuNnf; touchend:yfqBxc; touchcancel:JMtRjd; focus:AHmuwe; blur:O22p3e; contextmenu:mg9Pef;mlnRJb:fLiPzd;" data-idom-class="yHy1rc eT1oJ mN1ivc" jsname="LW2oUc" aria-label="help and feedback" data-tooltip-enabled="true" data-tooltip-id="tt-i68" aria-expanded="false" aria-haspopup="menu"><div jsname="s3Eaab" class="VfPpkd-Bz112c-Jh9lGc"></div><div class="VfPpkd-Bz112c-J1Ukfc-LhBDec"></div><div class="foqfDc gdyQ3c"><div class="Y0xAIe BNL9Bd NpcyEe-n5T17d-Bz112c-h9d3hd-i5vt6e-BvMwwf" aria-hidden="true"> </div><div class="Y0xAIe ivmiLb NpcyEe-n5T17d-Bz112c-h9d3hd-i5vt6e-AhqUyc" aria-hidden="true"> </div><div class="Y0xAIe tDDvMb NpcyEe-n5T17d-Bz112c-h9d3hd-i5vt6e" aria-hidden="true"> </div></div></button><div class="EY8ABd-OWXEXe-TAWMXe" id="tt-i68" role="tooltip" aria-hidden="true">Help and feedback</div></span></div><div jsname="U0exHf" jsslot> <div class="VfPpkd-xl07Ob-XxIAqe VfPpkd-xl07Ob q6oraf P77izf" jscontroller="ywOR5c" jsaction="keydown:I481le;JIbuQc:j697N(rymPhb);XVaHYd:c9v4Fb(rymPhb);Oyo5M:b5fzT(rymPhb);DimkCe:TQSy7b(rymPhb);m0LGSd:fAWgXe(rymPhb);WAiFGd:kVJJuc(rymPhb);" data-is-hoisted="true" data-should-flip-corner-horizontally="false" data-stay-in-viewport="false" data-menu-uid="ucj-1"><ul class="VfPpkd-StrnGf-rymPhb DMZ54e" jsname="rymPhb" jscontroller="PHUIyb" jsaction="mouseleave:JywGue; touchcancel:JMtRjd; focus:AHmuwe; blur:O22p3e; keydown:I481le;" role="menu" tabindex="-1" aria-label="Help and feedback" data-disable-idom='true'><span class="VfPpkd-BFbNVe-bF1uUb NZp2ef" aria-hidden="true"></span><li class=" VfPpkd-StrnGf-rymPhb-ibnC6b" jsaction=" keydown:RDtNu; keyup:JdS61c; click:o6ZaF; mousedown:teoBgf; mouseup:NZPHBc; mouseleave:xq3APb; touchstart:jJiBRc; touchmove:kZeBdd; touchend:VfAz8;focusin:MeMJlc; focusout:bkTmIf;mouseenter:SKyDAe; change:uOgbud;" role="menuitem" jsname="yKLRBb" tabindex="-1"><span class="VfPpkd-StrnGf-rymPhb-pZXsl"></span><span class="VfPpkd-StrnGf-rymPhb-Zmlebc-LhBDec"></span><span class=" VfPpkd-StrnGf-rymPhb-f7MjDc"><div class="foqfDc gdyQ3c"><div class="Y0xAIe BNL9Bd NpcyEe-n5T17d-Bz112c-xvr5H-BvMwwf" aria-hidden="true"> </div><div class="Y0xAIe ivmiLb NpcyEe-n5T17d-Bz112c-xvr5H-AhqUyc" aria-hidden="true"> </div><div class="Y0xAIe tDDvMb NpcyEe-n5T17d-Bz112c-xvr5H" aria-hidden="true"> </div></div></span><span jsname="K4r5Ff" class="VfPpkd-StrnGf-rymPhb-b9t22c">Contact form owner</span></li><li class=" VfPpkd-StrnGf-rymPhb-clz4Ic" role="separator"></li><li class=" VfPpkd-StrnGf-rymPhb-ibnC6b" jsaction=" keydown:RDtNu; keyup:JdS61c; click:o6ZaF; mousedown:teoBgf; mouseup:NZPHBc; mouseleave:xq3APb; touchstart:jJiBRc; touchmove:kZeBdd; touchend:VfAz8;focusin:MeMJlc; focusout:bkTmIf;mouseenter:SKyDAe; change:uOgbud;" role="menuitem" jsname="QE0zbc" tabindex="-1"><span class="VfPpkd-StrnGf-rymPhb-pZXsl"></span><span class="VfPpkd-StrnGf-rymPhb-Zmlebc-LhBDec"></span><span class=" VfPpkd-StrnGf-rymPhb-f7MjDc"><div class="foqfDc gdyQ3c"><div class="Y0xAIe BNL9Bd NpcyEe-n5T17d-Bz112c-N7Eqid-XkWAb-BvMwwf" aria-hidden="true"> </div><div class="Y0xAIe ivmiLb NpcyEe-n5T17d-Bz112c-N7Eqid-XkWAb-AhqUyc" aria-hidden="true"> </div><div class="Y0xAIe tDDvMb NpcyEe-n5T17d-Bz112c-N7Eqid-XkWAb" aria-hidden="true"> </div></div></span><span jsname="K4r5Ff" class="VfPpkd-StrnGf-rymPhb-b9t22c">Help Forms improve</span></li><li class=" VfPpkd-StrnGf-rymPhb-ibnC6b" jsaction=" keydown:RDtNu; keyup:JdS61c; click:o6ZaF; mousedown:teoBgf; mouseup:NZPHBc; mouseleave:xq3APb; touchstart:jJiBRc; touchmove:kZeBdd; touchend:VfAz8;focusin:MeMJlc; focusout:bkTmIf;mouseenter:SKyDAe; change:uOgbud;" role="menuitem" jsname="DITn2" tabindex="-1"><span class="VfPpkd-StrnGf-rymPhb-pZXsl"></span><span class="VfPpkd-StrnGf-rymPhb-Zmlebc-LhBDec"></span><span class=" VfPpkd-StrnGf-rymPhb-f7MjDc"><div class="foqfDc gdyQ3c"><div class="Y0xAIe BNL9Bd NpcyEe-n5T17d-Bz112c-uQPRwe-BvMwwf" aria-hidden="true"> </div><div class="Y0xAIe ivmiLb NpcyEe-n5T17d-Bz112c-uQPRwe-AhqUyc" aria-hidden="true"> </div><div class="Y0xAIe tDDvMb NpcyEe-n5T17d-Bz112c-uQPRwe" aria-hidden="true"> </div></div></span><span jsname="K4r5Ff" class="VfPpkd-StrnGf-rymPhb-b9t22c">Report</span></li></ul></div></div></div></div></div><script nonce="sn9WhqAq5lIcj2A2Adc1wA">var FB_PUBLIC_LOAD_DATA_ = [null,["Test your basic addition and general knowledge.",[[314895045,"What is 5 + 7?",null,0,[[612189310,null,0]],null,null,null,null,null,null,[null,"What is 5 + 7?"]],[1403132839,"Calculate 15 + 8.",null,0,[[159990158,null,0]],null,null,null,null,null,null,[null,"Calculate 15 + 8."]],[1307778553,"Which planet is known as the 'Red Planet'?",null,2,[[1414179930,[["Venus",null,null,null,0],["Mars",null,null,null,0],["Jupiter",null,null,null,0],["Saturn",null,null,null,0]],0]],null,null,null,null,null,null,[null,"Which planet is known as the 'Red Planet'?"]],[1004051401,"What is the capital city of France?",null,2,[[813508719,[["London",null,null,null,0],["Berlin",null,null,null,0],["Rome",null,null,null,0],["Paris",null,null,null,0]],0,null,null,null,null,null,0]],null,null,null,null,null,null,[null,"What is the capital city of France?"]],[1619605659,"The process by which plants make their own food is called __________.",null,0,[[522759996,null,0]],null,null,null,null,null,null,[null,"The process by which plants make their own food is called __________."]],[383428290,"A standard deck of cards has how many suits? (Select all correct options)",null,4,[[715543226,[["2",null,null,null,0],["3",null,null,null,0],["4",null,null,null,0],["5",null,null,null,0]],0]],null,null,null,null,null,null,[null,"A standard deck of cards has how many suits? (Select all correct options)"]]],null,null,null,null,null,null,"Basic Knowledge and Math Quiz",73,[null,null,null,2,null,null,1],null,null,null,null,[2],null,null,null,null,null,null,null,null,[null,"Test your basic addition and general knowledge."],[null,"Basic Knowledge and Math Quiz"]],"/forms","Basic Knowledge and Math Quiz",null,null,null,"",null,0,0,null,"",0,"e/1FAIpQLSeCZKKAKigsNpvGG6Dazdo9rBB4dbKNCBhDEp5x1Wv7aHZb-A",0,"[]",0,0,1];</script><script id="base-js" src="https://www.gstatic.com/_/freebird/_/js/k=freebird.v.en_GB.5NpfnOghiNY.O/am=AAAG/d=1/rs=AMjVe6i2HJieY6fmo--8ySB-lCe3i_D0rQ/m=viewer_base" nonce="sn9WhqAq5lIcj2A2Adc1wA"></script></body></html>
|
|
|
|
|
|
requirements.txt
CHANGED
|
@@ -1 +1,8 @@
|
|
| 1 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
fastapi
|
| 2 |
+
uvicorn
|
| 3 |
+
httpx
|
| 4 |
+
playwright
|
| 5 |
+
pandas
|
| 6 |
+
numpy
|
| 7 |
+
pdfplumber
|
| 8 |
+
python-multipart
|
server.py
ADDED
|
@@ -0,0 +1,29 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
from fastapi import FastAPI, HTTPException, Request
|
| 2 |
+
from fastapi.exceptions import RequestValidationError
|
| 3 |
+
from fastapi.responses import JSONResponse
|
| 4 |
+
from pydantic import BaseModel, EmailStr
|
| 5 |
+
import asyncio
|
| 6 |
+
from solver.quiz_solver import solve_quiz
|
| 7 |
+
|
| 8 |
+
SECRET = "supersecret123"
|
| 9 |
+
|
| 10 |
+
app = FastAPI()
|
| 11 |
+
|
| 12 |
+
|
| 13 |
+
class Input(BaseModel):
|
| 14 |
+
email: EmailStr
|
| 15 |
+
secret: str
|
| 16 |
+
url: str
|
| 17 |
+
|
| 18 |
+
|
| 19 |
+
@app.exception_handler(RequestValidationError)
|
| 20 |
+
async def validation_exception_handler(request: Request, exc: RequestValidationError):
|
| 21 |
+
return JSONResponse(status_code=400, content={"detail": "Invalid JSON or missing fields"})
|
| 22 |
+
|
| 23 |
+
|
| 24 |
+
@app.post("/")
|
| 25 |
+
async def root(payload: Input):
|
| 26 |
+
if payload.secret != SECRET:
|
| 27 |
+
raise HTTPException(status_code=403, detail="Invalid secret")
|
| 28 |
+
asyncio.create_task(solve_quiz(payload.email, payload.secret, payload.url))
|
| 29 |
+
return {"status": "received", "message": "Solver running"}
|
solver/__init__.py
ADDED
|
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
"""Solver package for TDS-style quiz solver."""
|
| 2 |
+
|
| 3 |
+
__all__ = ["browser", "quiz_solver", "utils"]
|
solver/browser.py
ADDED
|
@@ -0,0 +1,12 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
from playwright.async_api import async_playwright
|
| 2 |
+
|
| 3 |
+
async def open_browser():
|
| 4 |
+
"""Launch Playwright Chromium browser and return (playwright, browser, context, page).
|
| 5 |
+
|
| 6 |
+
The caller is responsible for closing the returned objects (context.close(), browser.close(), playwright.stop()).
|
| 7 |
+
"""
|
| 8 |
+
p = await async_playwright().start()
|
| 9 |
+
browser = await p.chromium.launch(headless=True)
|
| 10 |
+
context = await browser.new_context(accept_downloads=True)
|
| 11 |
+
page = await context.new_page()
|
| 12 |
+
return p, browser, context, page
|
solver/quiz_solver.py
ADDED
|
@@ -0,0 +1,80 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
import asyncio
|
| 2 |
+
import logging
|
| 3 |
+
import httpx
|
| 4 |
+
from typing import Optional
|
| 5 |
+
|
| 6 |
+
from .browser import open_browser
|
| 7 |
+
from .utils import extract_base64, extract_submit_url
|
| 8 |
+
|
| 9 |
+
|
| 10 |
+
async def compute_answer(page) -> str:
|
| 11 |
+
"""Placeholder answer computation. Replace with real logic.
|
| 12 |
+
|
| 13 |
+
For now returns a dummy value.
|
| 14 |
+
"""
|
| 15 |
+
# Example: evaluate something on the page if needed
|
| 16 |
+
try:
|
| 17 |
+
title = await page.title()
|
| 18 |
+
except Exception:
|
| 19 |
+
title = ""
|
| 20 |
+
return "42"
|
| 21 |
+
|
| 22 |
+
|
| 23 |
+
async def solve_quiz(email: str, secret: str, start_url: str) -> None:
|
| 24 |
+
"""Main solve loop: navigates pages, extracts question/base64, computes answer, submits, follows next URL."""
|
| 25 |
+
logging.info("Solver started for %s", email)
|
| 26 |
+
p, browser, context, page = await open_browser()
|
| 27 |
+
try:
|
| 28 |
+
url: Optional[str] = start_url
|
| 29 |
+
async with httpx.AsyncClient() as client:
|
| 30 |
+
while url:
|
| 31 |
+
logging.info("Loading page: %s", url)
|
| 32 |
+
try:
|
| 33 |
+
await page.goto(url, wait_until="networkidle")
|
| 34 |
+
except Exception:
|
| 35 |
+
logging.exception("Failed to load page %s", url)
|
| 36 |
+
break
|
| 37 |
+
await asyncio.sleep(0.5)
|
| 38 |
+
html = await page.content()
|
| 39 |
+
# extract base64 or question
|
| 40 |
+
b64 = extract_base64(html)
|
| 41 |
+
if b64:
|
| 42 |
+
logging.info("Found base64 block (len=%d)", len(b64))
|
| 43 |
+
try:
|
| 44 |
+
submit_url = extract_submit_url(html)
|
| 45 |
+
except ValueError:
|
| 46 |
+
logging.exception("Submit URL not found; stopping")
|
| 47 |
+
break
|
| 48 |
+
answer = await compute_answer(page)
|
| 49 |
+
payload = {"email": email, "answer": answer}
|
| 50 |
+
logging.info("Submitting answer to %s", submit_url)
|
| 51 |
+
try:
|
| 52 |
+
resp = await client.post(submit_url, json=payload, timeout=30.0)
|
| 53 |
+
except Exception:
|
| 54 |
+
logging.exception("Submission failed")
|
| 55 |
+
break
|
| 56 |
+
try:
|
| 57 |
+
data = resp.json()
|
| 58 |
+
except Exception:
|
| 59 |
+
logging.debug("Non-JSON response received; stopping")
|
| 60 |
+
break
|
| 61 |
+
next_url = data.get("url")
|
| 62 |
+
if not next_url:
|
| 63 |
+
logging.info("No next url in response; finishing")
|
| 64 |
+
break
|
| 65 |
+
url = next_url
|
| 66 |
+
await asyncio.sleep(1)
|
| 67 |
+
finally:
|
| 68 |
+
try:
|
| 69 |
+
await context.close()
|
| 70 |
+
except Exception:
|
| 71 |
+
pass
|
| 72 |
+
try:
|
| 73 |
+
await browser.close()
|
| 74 |
+
except Exception:
|
| 75 |
+
pass
|
| 76 |
+
try:
|
| 77 |
+
await p.stop()
|
| 78 |
+
except Exception:
|
| 79 |
+
pass
|
| 80 |
+
logging.info("Solver finished for %s", email)
|
solver/utils.py
ADDED
|
@@ -0,0 +1,26 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
import re
|
| 2 |
+
from typing import Optional
|
| 3 |
+
|
| 4 |
+
|
| 5 |
+
def extract_base64(html: str) -> Optional[str]:
|
| 6 |
+
"""Try to find a base64 data block in the HTML and return the encoded string."""
|
| 7 |
+
m = re.search(r"data:[^;]+;base64,([A-Za-z0-9+/=]+)", html)
|
| 8 |
+
if m:
|
| 9 |
+
return m.group(1)
|
| 10 |
+
# fallback: look for long base64-like sequences
|
| 11 |
+
m2 = re.search(r"([A-Za-z0-9+/=]{100,})", html)
|
| 12 |
+
return m2.group(1) if m2 else None
|
| 13 |
+
|
| 14 |
+
|
| 15 |
+
def extract_submit_url(html: str) -> str:
|
| 16 |
+
"""Extract a submit URL from form action or JSON-like fields in HTML.
|
| 17 |
+
|
| 18 |
+
Raises ValueError if not found.
|
| 19 |
+
"""
|
| 20 |
+
m = re.search(r"action=[\"'](https?://[^\"']+)[\"']", html)
|
| 21 |
+
if m:
|
| 22 |
+
return m.group(1)
|
| 23 |
+
m2 = re.search(r'"submit_url"\s*:\s*"(https?://[^"]+)"', html)
|
| 24 |
+
if m2:
|
| 25 |
+
return m2.group(1)
|
| 26 |
+
raise ValueError("Submit URL not found on page")
|
src/main.py
DELETED
|
@@ -1,63 +0,0 @@
|
|
| 1 |
-
# Main entry point for DoMyDA quiz solver
|
| 2 |
-
import sys
|
| 3 |
-
import os
|
| 4 |
-
import argparse
|
| 5 |
-
sys.path.append(os.path.abspath(os.path.join(os.path.dirname(__file__), '../helpers')))
|
| 6 |
-
from helper_functions import (
|
| 7 |
-
parse_quiz_html,
|
| 8 |
-
list_received_files,
|
| 9 |
-
find_files_matching_url,
|
| 10 |
-
download_quiz_files,
|
| 11 |
-
extract_likely_questions,
|
| 12 |
-
find_answers_with_gemini,
|
| 13 |
-
)
|
| 14 |
-
|
| 15 |
-
|
| 16 |
-
def main():
|
| 17 |
-
p = argparse.ArgumentParser(description='DoMyDA quiz processor')
|
| 18 |
-
p.add_argument('--url', '-u', help='The quiz URL or identifier to match files', required=False)
|
| 19 |
-
p.add_argument('--dir', '-d', help='Path to recieved_data directory', default=os.path.abspath(os.path.join(os.path.dirname(__file__), '..', 'recieved_data')))
|
| 20 |
-
args = p.parse_args()
|
| 21 |
-
|
| 22 |
-
received_dir = args.dir
|
| 23 |
-
url = args.url
|
| 24 |
-
|
| 25 |
-
print(f"Scanning received directory: {received_dir}")
|
| 26 |
-
files = list_received_files(received_dir)
|
| 27 |
-
if not files:
|
| 28 |
-
print("No files found in recieved_data.")
|
| 29 |
-
return
|
| 30 |
-
|
| 31 |
-
if url:
|
| 32 |
-
matches = find_files_matching_url(received_dir, url)
|
| 33 |
-
if not matches:
|
| 34 |
-
print(f"No files matched the URL: {url}")
|
| 35 |
-
print("Attempting to download from URL...")
|
| 36 |
-
downloaded = download_quiz_files(url, received_dir)
|
| 37 |
-
if not downloaded:
|
| 38 |
-
print("Download failed or no files saved.")
|
| 39 |
-
return
|
| 40 |
-
matches = downloaded
|
| 41 |
-
else:
|
| 42 |
-
# If no url provided, process all html/js/json/text files
|
| 43 |
-
matches = [f for f in files if os.path.splitext(f)[1].lower() in ('.html', '.htm', '.js', '.json', '.txt')]
|
| 44 |
-
|
| 45 |
-
# Process each matched file
|
| 46 |
-
for path in matches:
|
| 47 |
-
print('\n' + '='*60)
|
| 48 |
-
print(f"Processing file: {path}")
|
| 49 |
-
try:
|
| 50 |
-
questions = extract_likely_questions(path)
|
| 51 |
-
if questions:
|
| 52 |
-
print("Questions and Answers:")
|
| 53 |
-
answers = find_answers_with_gemini(questions)
|
| 54 |
-
for q, a in zip(questions, answers):
|
| 55 |
-
print(f"Q: {q}\nA: {a}\n")
|
| 56 |
-
else:
|
| 57 |
-
print("No likely questions found.")
|
| 58 |
-
except Exception as e:
|
| 59 |
-
print(f"Error processing {path}: {e}")
|
| 60 |
-
|
| 61 |
-
|
| 62 |
-
if __name__ == '__main__':
|
| 63 |
-
main()
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|