diff --git a/.gitignore b/.gitignore index b1dec5aa4..af9f22366 100644 --- a/.gitignore +++ b/.gitignore @@ -27,6 +27,7 @@ __pycache__ *.log *.pid /tests/.pytest_cache/ +/node_modules # Pycharm defaults .idea @@ -79,3 +80,7 @@ docker/local.env # config dumps from make docker-compose-config-to-file config-compose-* + +# Frontend +frontend/node_modules +frontend/dist \ No newline at end of file diff --git a/bin/frontend.py b/bin/frontend.py deleted file mode 100644 index 10badf28b..000000000 --- a/bin/frontend.py +++ /dev/null @@ -1,112 +0,0 @@ -# Copyright: 2022, ECP, NLnet Labs and the Internet.nl contributors -# SPDX-License-Identifier: Apache-2.0 -from argparse import ArgumentParser -import io -import os -from uuid import uuid4 as uuid - -import rjsmin -import sass - - -FRONTEND_FOLDER = "frontend" -FRONTEND_JS_FOLDER = "frontend/js" -FRONTEND_CSS_FOLDER = "frontend/css" - -DJANGO_STATIC_FOLDER = "static_frontend" -DJANGO_STATIC_JS_FOLDER = DJANGO_STATIC_FOLDER + "/js" -DJANGO_STATIC_CSS_FOLDER = DJANGO_STATIC_FOLDER + "/css" - - -def build_js(args=None): - """ - Replace any hardcoded placeholders, minify JS and copy into Django's static - folder. - - """ - print("-"*20) - print("Building JS files.") - unique = uuid().hex - try: - os.mkdir(DJANGO_STATIC_JS_FOLDER) - except FileExistsError: - pass - for root, dirs, files in os.walk(FRONTEND_JS_FOLDER): - for filename in files: - if filename.endswith(".js"): - print(f"Found {filename}...") - content = "" - filepath = os.path.join(root, filename) - with open(filepath, encoding="utf-8") as jsfile: - content = jsfile.read() - - content = content.replace("@@unique@@", unique) - content_min = rjsmin.jsmin(content) - filename, _ = filename.rsplit(".", 1) - filepath = os.path.join( - DJANGO_STATIC_JS_FOLDER, filename + "-min.js") - - print(f"... minifying to {filepath}") - with open(filepath, 'w', encoding="utf-8") as f: - f.write(content_min) - break - print("Done!") - - -def build_css(args=None): - """ - Build/minify CSS and copy into Django's static folder. - - """ - print("-"*20) - print("Building CSS files.") - try: - os.mkdir(DJANGO_STATIC_CSS_FOLDER) - except FileExistsError: - pass - for root, dirs, files in os.walk(FRONTEND_CSS_FOLDER): - for filename in files: - if filename.endswith(".css"): - if filename == "style.css-notyet-scss": - continue - print(f"Found {filename}...") - filepath = os.path.join(root, filename) - content_min = sass.compile( - filename=filepath, output_style="compressed") - filename, _ = filename.rsplit(".", 1) - filepath = os.path.join( - DJANGO_STATIC_CSS_FOLDER, filename + "-min.css") - print(f"... minifying to {filepath}") - with open(filepath, 'w', encoding="utf-8") as f: - f.write(content_min) - break - print("Done!") - - -def parse(): - """ - Parse the command line. - - Currently two subcommands are available: - - css: compile any scss, minify css and copy into Django's static folder. - - js: minify js and copy into Django's static folder. - - """ - parser = ArgumentParser() - subparsers = parser.add_subparsers( - title='subcommands', description='valid subcommands') - - parser.set_defaults(func=lambda x: parser.print_help()) - - to_django = subparsers.add_parser('css') - to_django.set_defaults(func=build_css) - - to_tar = subparsers.add_parser('js') - to_tar.set_defaults(func=build_js) - - args = parser.parse_args() - args.func(args) - - -if __name__ == "__main__": - parse() diff --git a/checks/fixtures/example_reports.json b/checks/fixtures/example_reports.json new file mode 100644 index 000000000..c8d9f4281 --- /dev/null +++ b/checks/fixtures/example_reports.json @@ -0,0 +1,5197 @@ +[ + { + "model": "checks.connectiontest", + "pk": 9000, + "fields": { + "report": "{'resolver_conn': {'label': 'detail conn ipv6 resolver-conn label', 'status': 0, 'verdict': 'detail conn ipv6 resolver-conn verdict bad', 'exp': 'detail conn ipv6 resolver-conn exp', 'tech_type': '', 'tech_string': '', 'tech_data': ''}, 'dns_conn': {'label': 'detail conn ipv6 dns-conn label', 'status': 0, 'verdict': 'detail conn ipv6 dns-conn verdict bad', 'exp': 'detail conn ipv6 dns-conn exp', 'tech_type': '', 'tech_string': '', 'tech_data': ''}, 'connection': {'label': 'detail conn ipv6 connection label', 'status': 4, 'verdict': 'detail verdict not-tested', 'exp': 'detail conn ipv6 connection exp', 'tech_type': 'table', 'tech_string': 'detail conn ipv6 connection tech table', 'tech_data': ''}, 'privacy': {'label': 'detail conn ipv6 privacy label', 'status': 4, 'verdict': 'detail verdict not-tested', 'exp': 'detail conn ipv6 privacy exp', 'tech_type': '', 'tech_string': '', 'tech_data': ''}, 'ipv4_conn': {'label': 'detail conn ipv6 ipv4-conn label', 'status': 5, 'verdict': 'detail conn ipv6 ipv4-conn verdict bad', 'exp': 'detail conn ipv6 ipv4-conn exp', 'tech_type': '', 'tech_string': 'detail conn ipv6 ipv4-conn tech table', 'tech_data': ''}}", + "reportdnssec": "{'validation': {'label': 'detail conn dnssec validation label', 'status': 4, 'verdict': 'detail verdict not-tested', 'exp': 'detail conn dnssec validation exp', 'tech_type': 'table', 'tech_string': 'detail conn dnssec validation tech table', 'tech_data': ''}}", + "test_id": "aea3135249fb432d9be101e0d0448c1d", + "timestamp": "2025-03-14T15:13:49.443Z", + "ipv4_addr": "", + "ipv4_owner": "", + "ipv4_origin_as": null, + "ipv4_reverse": "", + "ipv6_addr": "", + "ipv6_owner": "", + "ipv6_origin_as": null, + "ipv6_reverse": "", + "aaaa_ipv6": false, + "addr_ipv6": false, + "resolv_ipv6": false, + "slaac_without_privext": false, + "dnssec_val": false, + "score_ipv6": 0, + "score_ipv6_max": 100, + "score_dnssec": 0, + "score_dnssec_max": 100, + "finished": true + } + }, + { + "model": "checks.connectiontest", + "pk": 9001, + "fields": { + "report": "{'resolver_conn': {'label': 'detail conn ipv6 resolver-conn label', 'status': 0, 'verdict': 'detail conn ipv6 resolver-conn verdict bad', 'exp': 'detail conn ipv6 resolver-conn exp', 'tech_type': '', 'tech_string': '', 'tech_data': ''}, 'dns_conn': {'label': 'detail conn ipv6 dns-conn label', 'status': 0, 'verdict': 'detail conn ipv6 dns-conn verdict bad', 'exp': 'detail conn ipv6 dns-conn exp', 'tech_type': '', 'tech_string': '', 'tech_data': ''}, 'connection': {'label': 'detail conn ipv6 connection label', 'status': 4, 'verdict': 'detail verdict not-tested', 'exp': 'detail conn ipv6 connection exp', 'tech_type': 'table', 'tech_string': 'detail conn ipv6 connection tech table', 'tech_data': ''}, 'privacy': {'label': 'detail conn ipv6 privacy label', 'status': 4, 'verdict': 'detail verdict not-tested', 'exp': 'detail conn ipv6 privacy exp', 'tech_type': '', 'tech_string': '', 'tech_data': ''}, 'ipv4_conn': {'label': 'detail conn ipv6 ipv4-conn label', 'status': 5, 'verdict': 'detail conn ipv6 ipv4-conn verdict bad', 'exp': 'detail conn ipv6 ipv4-conn exp', 'tech_type': '', 'tech_string': 'detail conn ipv6 ipv4-conn tech table', 'tech_data': ''}}", + "reportdnssec": "{'validation': {'label': 'detail conn dnssec validation label', 'status': 4, 'verdict': 'detail verdict not-tested', 'exp': 'detail conn dnssec validation exp', 'tech_type': 'table', 'tech_string': 'detail conn dnssec validation tech table', 'tech_data': ''}}", + "test_id": "b8a1653498d245bc88e9822b94736512", + "timestamp": "2025-03-14T15:13:55.756Z", + "ipv4_addr": "", + "ipv4_owner": "", + "ipv4_origin_as": null, + "ipv4_reverse": "", + "ipv6_addr": "", + "ipv6_owner": "", + "ipv6_origin_as": null, + "ipv6_reverse": "", + "aaaa_ipv6": false, + "addr_ipv6": false, + "resolv_ipv6": false, + "slaac_without_privext": false, + "dnssec_val": false, + "score_ipv6": 0, + "score_ipv6_max": 100, + "score_dnssec": 0, + "score_dnssec_max": 100, + "finished": true + } + }, + { + "model": "checks.domaintestipv6", + "pk": 9000, + "fields": { + "timestamp": "2025-03-14T15:14:03.482Z", + "domain": "internet.nl", + "report": "{'ns_aaaa': {'name': 'ns_aaaa', 'label': 'detail web-mail ipv6 ns-AAAA label', 'status': 1, 'worst_status': 0, 'verdict': 'detail web-mail ipv6 ns-AAAA verdict good', 'exp': 'detail web-mail ipv6 ns-AAAA exp', 'tech_type': 'table', 'tech_string': 'detail web-mail ipv6 ns-AAAA tech table', 'tech_data': [('ns2.sidnlabs.nl.', ['2001:678:2c:0:194:0:28:11'], ['194.0.28.11']), ('ns5.sidn.nl.', ['2604:1380:4601:6300::1'], ['145.40.68.55']), ('ns1.sidnlabs.nl.', ['2a00:d78:0:712:94:198:159:8'], ['94.198.159.8'])], 'override_mandatory': None}, 'ns_reach': {'name': 'ns_reach', 'label': 'detail web-mail ipv6 ns-reach label', 'status': 1, 'worst_status': 0, 'verdict': 'detail web-mail ipv6 ns-reach verdict good', 'exp': 'detail web-mail ipv6 ns-reach exp', 'tech_type': '', 'tech_string': 'detail web-mail ipv6 ns-reach tech table', 'tech_data': 'detail tech data not-tested', 'override_mandatory': None}, 'web_aaaa': {'name': 'web_aaaa', 'label': 'detail web ipv6 web-AAAA label', 'status': 1, 'worst_status': 0, 'verdict': 'detail web ipv6 web-AAAA verdict good', 'exp': 'detail web ipv6 web-AAAA exp', 'tech_type': 'table', 'tech_string': 'detail web ipv6 web-AAAA tech table', 'tech_data': [('internet.nl', ['2a00:d00:ff:162:62:204:66:10'], ['62.204.66.10'])], 'override_mandatory': None}, 'web_reach': {'name': 'web_reach', 'label': 'detail web ipv6 web-reach label', 'status': 1, 'worst_status': 0, 'verdict': 'detail web ipv6 web-reach verdict good', 'exp': 'detail web ipv6 web-reach exp', 'tech_type': '', 'tech_string': 'detail web ipv6 web-reach tech table', 'tech_data': 'detail tech data not-tested', 'override_mandatory': None}, 'web_ipv46': {'name': 'web_ipv46', 'label': 'detail web ipv6 web-ipv46 label', 'status': 1, 'worst_status': 0, 'verdict': 'detail web ipv6 web-ipv46 verdict good', 'exp': 'detail web ipv6 web-ipv46 exp', 'tech_type': '', 'tech_string': '', 'tech_data': 'detail tech data not-tested', 'override_mandatory': None}}", + "web_simhash_distance": 0, + "web_simhash_score": 2, + "web_score": 10, + "mx_score": null, + "ns_score": 10, + "score": 22, + "max_score": 22 + } + }, + { + "model": "checks.domaintestipv6", + "pk": 9001, + "fields": { + "timestamp": "2025-03-14T15:14:21.409Z", + "domain": "example.nl", + "report": "{'ns_aaaa': {'name': 'ns_aaaa', 'label': 'detail web-mail ipv6 ns-AAAA label', 'status': 1, 'worst_status': 0, 'verdict': 'detail web-mail ipv6 ns-AAAA verdict good', 'exp': 'detail web-mail ipv6 ns-AAAA exp', 'tech_type': 'table', 'tech_string': 'detail web-mail ipv6 ns-AAAA tech table', 'tech_data': [('ex2.sidnlabs.nl.', ['2604:1380:4601:6300::1'], ['145.40.68.55']), ('ex1.sidnlabs.nl.', ['2a00:d78:0:712:94:198:159:8'], ['94.198.159.8']), ('anytest1.sidnlabs.nl.', ['2001:678:8::53'], ['194.0.5.53'])], 'override_mandatory': None}, 'ns_reach': {'name': 'ns_reach', 'label': 'detail web-mail ipv6 ns-reach label', 'status': 1, 'worst_status': 0, 'verdict': 'detail web-mail ipv6 ns-reach verdict good', 'exp': 'detail web-mail ipv6 ns-reach exp', 'tech_type': '', 'tech_string': 'detail web-mail ipv6 ns-reach tech table', 'tech_data': 'detail tech data not-tested', 'override_mandatory': None}, 'web_aaaa': {'name': 'web_aaaa', 'label': 'detail web ipv6 web-AAAA label', 'status': 1, 'worst_status': 0, 'verdict': 'detail web ipv6 web-AAAA verdict good', 'exp': 'detail web ipv6 web-AAAA exp', 'tech_type': 'table', 'tech_string': 'detail web ipv6 web-AAAA tech table', 'tech_data': [('example.nl', ['2a00:d78:0:712:94:198:159:35'], ['94.198.159.35'])], 'override_mandatory': None}, 'web_reach': {'name': 'web_reach', 'label': 'detail web ipv6 web-reach label', 'status': 1, 'worst_status': 0, 'verdict': 'detail web ipv6 web-reach verdict good', 'exp': 'detail web ipv6 web-reach exp', 'tech_type': '', 'tech_string': 'detail web ipv6 web-reach tech table', 'tech_data': 'detail tech data not-tested', 'override_mandatory': None}, 'web_ipv46': {'name': 'web_ipv46', 'label': 'detail web ipv6 web-ipv46 label', 'status': 1, 'worst_status': 0, 'verdict': 'detail web ipv6 web-ipv46 verdict good', 'exp': 'detail web ipv6 web-ipv46 exp', 'tech_type': '', 'tech_string': '', 'tech_data': 'detail tech data not-tested', 'override_mandatory': None}}", + "web_simhash_distance": 0, + "web_simhash_score": 2, + "web_score": 10, + "mx_score": null, + "ns_score": 10, + "score": 22, + "max_score": 22 + } + }, + { + "model": "checks.domaintestipv6", + "pk": 9002, + "fields": { + "timestamp": "2025-03-14T15:14:31.259Z", + "domain": "ipv6.internet.nl", + "report": "{'ns_aaaa': {'name': 'ns_aaaa', 'label': 'detail web-mail ipv6 ns-AAAA label', 'status': 1, 'worst_status': 0, 'verdict': 'detail web-mail ipv6 ns-AAAA verdict good', 'exp': 'detail web-mail ipv6 ns-AAAA exp', 'tech_type': 'table', 'tech_string': 'detail web-mail ipv6 ns-AAAA tech table', 'tech_data': [('ns5.sidn.nl.', ['2604:1380:4601:6300::1'], ['145.40.68.55']), ('ns1.sidnlabs.nl.', ['2a00:d78:0:712:94:198:159:8'], ['94.198.159.8']), ('ns2.sidnlabs.nl.', ['2001:678:2c:0:194:0:28:11'], ['194.0.28.11'])], 'override_mandatory': None}, 'ns_reach': {'name': 'ns_reach', 'label': 'detail web-mail ipv6 ns-reach label', 'status': 1, 'worst_status': 0, 'verdict': 'detail web-mail ipv6 ns-reach verdict good', 'exp': 'detail web-mail ipv6 ns-reach exp', 'tech_type': '', 'tech_string': 'detail web-mail ipv6 ns-reach tech table', 'tech_data': 'detail tech data not-tested', 'override_mandatory': None}, 'web_aaaa': {'name': 'web_aaaa', 'label': 'detail web ipv6 web-AAAA label', 'status': 1, 'worst_status': 0, 'verdict': 'detail web ipv6 web-AAAA verdict good', 'exp': 'detail web ipv6 web-AAAA exp', 'tech_type': 'table', 'tech_string': 'detail web ipv6 web-AAAA tech table', 'tech_data': [('ipv6.internet.nl', ['2a00:d00:ff:162:62:204:66:10'], [])], 'override_mandatory': None}, 'web_reach': {'name': 'web_reach', 'label': 'detail web ipv6 web-reach label', 'status': 1, 'worst_status': 0, 'verdict': 'detail web ipv6 web-reach verdict good', 'exp': 'detail web ipv6 web-reach exp', 'tech_type': '', 'tech_string': 'detail web ipv6 web-reach tech table', 'tech_data': 'detail tech data not-tested', 'override_mandatory': None}, 'web_ipv46': {'name': 'web_ipv46', 'label': 'detail web ipv6 web-ipv46 label', 'status': 4, 'worst_status': 4, 'verdict': 'detail verdict not-tested', 'exp': 'detail web ipv6 web-ipv46 exp', 'tech_type': '', 'tech_string': '', 'tech_data': 'detail tech data not-tested', 'override_mandatory': None}}", + "web_simhash_distance": -1, + "web_simhash_score": 2, + "web_score": 10, + "mx_score": null, + "ns_score": 10, + "score": 20, + "max_score": 20 + } + }, + { + "model": "checks.domaintestipv6", + "pk": 9003, + "fields": { + "timestamp": "2025-03-14T15:14:39.464Z", + "domain": "forfun.net", + "report": "{'ns_aaaa': {'name': 'ns_aaaa', 'label': 'detail web-mail ipv6 ns-AAAA label', 'status': 1, 'worst_status': 0, 'verdict': 'detail web-mail ipv6 ns-AAAA verdict good', 'exp': 'detail web-mail ipv6 ns-AAAA exp', 'tech_type': 'table', 'tech_string': 'detail web-mail ipv6 ns-AAAA tech table', 'tech_data': [('ns3.surfnet.nl.', ['2001:610:0:800c:195:169:124:71'], ['195.169.124.71']), ('li1.forfun.net.', ['2600:3c03::f03c:91ff:fedf:1e98'], ['96.126.104.187']), ('pdns-public-ns2.powerdns.com.', ['2604:a880:1:20::132:5001'], ['45.55.10.200'])], 'override_mandatory': None}, 'ns_reach': {'name': 'ns_reach', 'label': 'detail web-mail ipv6 ns-reach label', 'status': 1, 'worst_status': 0, 'verdict': 'detail web-mail ipv6 ns-reach verdict good', 'exp': 'detail web-mail ipv6 ns-reach exp', 'tech_type': '', 'tech_string': 'detail web-mail ipv6 ns-reach tech table', 'tech_data': 'detail tech data not-tested', 'override_mandatory': None}, 'web_aaaa': {'name': 'web_aaaa', 'label': 'detail web ipv6 web-AAAA label', 'status': 1, 'worst_status': 0, 'verdict': 'detail web ipv6 web-AAAA verdict good', 'exp': 'detail web ipv6 web-AAAA exp', 'tech_type': 'table', 'tech_string': 'detail web ipv6 web-AAAA tech table', 'tech_data': [('forfun.net', ['2a05:1500:600:1:1c00:4aff:fe00:428'], [])], 'override_mandatory': None}, 'web_reach': {'name': 'web_reach', 'label': 'detail web ipv6 web-reach label', 'status': 1, 'worst_status': 0, 'verdict': 'detail web ipv6 web-reach verdict good', 'exp': 'detail web ipv6 web-reach exp', 'tech_type': '', 'tech_string': 'detail web ipv6 web-reach tech table', 'tech_data': 'detail tech data not-tested', 'override_mandatory': None}, 'web_ipv46': {'name': 'web_ipv46', 'label': 'detail web ipv6 web-ipv46 label', 'status': 4, 'worst_status': 4, 'verdict': 'detail verdict not-tested', 'exp': 'detail web ipv6 web-ipv46 exp', 'tech_type': '', 'tech_string': '', 'tech_data': 'detail tech data not-tested', 'override_mandatory': None}}", + "web_simhash_distance": -1, + "web_simhash_score": 2, + "web_score": 10, + "mx_score": null, + "ns_score": 10, + "score": 20, + "max_score": 20 + } + }, + { + "model": "checks.domaintestipv6", + "pk": 9004, + "fields": { + "timestamp": "2025-03-14T15:14:46.216Z", + "domain": "ipv6.google.com", + "report": "{'ns_aaaa': {'name': 'ns_aaaa', 'label': 'detail web-mail ipv6 ns-AAAA label', 'status': 1, 'worst_status': 0, 'verdict': 'detail web-mail ipv6 ns-AAAA verdict good', 'exp': 'detail web-mail ipv6 ns-AAAA exp', 'tech_type': 'table', 'tech_string': 'detail web-mail ipv6 ns-AAAA tech table', 'tech_data': [('ns2.google.com.', ['2001:4860:4802:34::a'], ['216.239.34.10']), ('ns4.google.com.', ['2001:4860:4802:38::a'], ['216.239.38.10']), ('ns3.google.com.', ['2001:4860:4802:36::a'], ['216.239.36.10']), ('ns1.google.com.', ['2001:4860:4802:32::a'], ['216.239.32.10'])], 'override_mandatory': None}, 'ns_reach': {'name': 'ns_reach', 'label': 'detail web-mail ipv6 ns-reach label', 'status': 1, 'worst_status': 0, 'verdict': 'detail web-mail ipv6 ns-reach verdict good', 'exp': 'detail web-mail ipv6 ns-reach exp', 'tech_type': '', 'tech_string': 'detail web-mail ipv6 ns-reach tech table', 'tech_data': 'detail tech data not-tested', 'override_mandatory': None}, 'web_aaaa': {'name': 'web_aaaa', 'label': 'detail web ipv6 web-AAAA label', 'status': 1, 'worst_status': 0, 'verdict': 'detail web ipv6 web-AAAA verdict good', 'exp': 'detail web ipv6 web-AAAA exp', 'tech_type': 'table', 'tech_string': 'detail web ipv6 web-AAAA tech table', 'tech_data': [('ipv6.google.com', ['2a00:1450:4026:804::200e'], [])], 'override_mandatory': None}, 'web_reach': {'name': 'web_reach', 'label': 'detail web ipv6 web-reach label', 'status': 1, 'worst_status': 0, 'verdict': 'detail web ipv6 web-reach verdict good', 'exp': 'detail web ipv6 web-reach exp', 'tech_type': '', 'tech_string': 'detail web ipv6 web-reach tech table', 'tech_data': 'detail tech data not-tested', 'override_mandatory': None}, 'web_ipv46': {'name': 'web_ipv46', 'label': 'detail web ipv6 web-ipv46 label', 'status': 4, 'worst_status': 4, 'verdict': 'detail verdict not-tested', 'exp': 'detail web ipv6 web-ipv46 exp', 'tech_type': '', 'tech_string': '', 'tech_data': 'detail tech data not-tested', 'override_mandatory': None}}", + "web_simhash_distance": -1, + "web_simhash_score": 2, + "web_score": 10, + "mx_score": null, + "ns_score": 10, + "score": 20, + "max_score": 20 + } + }, + { + "model": "checks.domaintestipv6", + "pk": 9005, + "fields": { + "timestamp": "2025-03-14T15:18:50.179Z", + "domain": "brokendnssec.net", + "report": "{'ns_aaaa': {'name': 'ns_aaaa', 'label': 'detail web-mail ipv6 ns-AAAA label', 'status': 1, 'worst_status': 0, 'verdict': 'detail web-mail ipv6 ns-AAAA verdict good', 'exp': 'detail web-mail ipv6 ns-AAAA exp', 'tech_type': 'table', 'tech_string': 'detail web-mail ipv6 ns-AAAA tech table', 'tech_data': [('carl.ns.cloudflare.com.', ['2606:4700:58::adf5:3b6a', '2a06:98c1:50::ac40:216a', '2803:f800:50::6ca2:c16a'], ['172.64.33.106', '173.245.59.106', '108.162.193.106']), ('cruz.ns.cloudflare.com.', ['2606:4700:50::adf5:3a58', '2a06:98c1:50::ac40:2058', '2803:f800:50::6ca2:c058'], ['173.245.58.88', '108.162.192.88', '172.64.32.88'])], 'override_mandatory': None}, 'ns_reach': {'name': 'ns_reach', 'label': 'detail web-mail ipv6 ns-reach label', 'status': 1, 'worst_status': 0, 'verdict': 'detail web-mail ipv6 ns-reach verdict good', 'exp': 'detail web-mail ipv6 ns-reach exp', 'tech_type': '', 'tech_string': 'detail web-mail ipv6 ns-reach tech table', 'tech_data': 'detail tech data not-tested', 'override_mandatory': None}, 'web_aaaa': {'name': 'web_aaaa', 'label': 'detail web ipv6 web-AAAA label', 'status': 0, 'worst_status': 0, 'verdict': 'detail web ipv6 web-AAAA verdict bad', 'exp': 'detail web ipv6 web-AAAA exp', 'tech_type': 'table', 'tech_string': 'detail web ipv6 web-AAAA tech table', 'tech_data': [('brokendnssec.net', [], ['104.18.26.110', '104.18.27.110'])], 'override_mandatory': None}, 'web_reach': {'name': 'web_reach', 'label': 'detail web ipv6 web-reach label', 'status': 4, 'worst_status': 0, 'verdict': 'detail verdict not-tested', 'exp': 'detail web ipv6 web-reach exp', 'tech_type': '', 'tech_string': 'detail web ipv6 web-reach tech table', 'tech_data': 'detail tech data not-tested', 'override_mandatory': None}, 'web_ipv46': {'name': 'web_ipv46', 'label': 'detail web ipv6 web-ipv46 label', 'status': 4, 'worst_status': 0, 'verdict': 'detail verdict not-tested', 'exp': 'detail web ipv6 web-ipv46 exp', 'tech_type': '', 'tech_string': '', 'tech_data': 'detail tech data not-tested', 'override_mandatory': None}}", + "web_simhash_distance": 10010, + "web_simhash_score": 0, + "web_score": 0, + "mx_score": null, + "ns_score": 10, + "score": 10, + "max_score": 22 + } + }, + { + "model": "checks.domaintestipv6", + "pk": 9006, + "fields": { + "timestamp": "2025-03-14T15:19:13.089Z", + "domain": "ok.bogussig.ok.bad-dnssec.wb.sidnlabs.nl", + "report": "{'ns_aaaa': {'name': 'ns_aaaa', 'label': 'detail web-mail ipv6 ns-AAAA label', 'status': 1, 'worst_status': 0, 'verdict': 'detail web-mail ipv6 ns-AAAA verdict good', 'exp': 'detail web-mail ipv6 ns-AAAA exp', 'tech_type': 'table', 'tech_string': 'detail web-mail ipv6 ns-AAAA tech table', 'tech_data': [('bind9.sidnlabs.nl.', ['2a00:d78:0:712:94:198:159:39'], ['94.198.159.39']), ('yadifa.sidnlabs.nl.', ['2a00:d78:0:712:94:198:159:28'], ['94.198.159.28']), ('powerdns.sidnlabs.nl.', ['2a00:d78:0:712:94:198:159:26'], ['94.198.159.26']), ('knot.sidnlabs.nl.', ['2a00:d78:0:712:94:198:159:27'], ['94.198.159.27']), ('nsd4.sidnlabs.nl.', ['2a00:d78:0:712:94:198:159:33'], ['94.198.159.33'])], 'override_mandatory': None}, 'ns_reach': {'name': 'ns_reach', 'label': 'detail web-mail ipv6 ns-reach label', 'status': 0, 'worst_status': 0, 'verdict': 'detail web-mail ipv6 ns-reach verdict bad', 'exp': 'detail web-mail ipv6 ns-reach exp', 'tech_type': 'table', 'tech_string': 'detail web-mail ipv6 ns-reach tech table', 'tech_data': [('yadifa.sidnlabs.nl.', ['2a00:d78:0:712:94:198:159:28'])], 'override_mandatory': None}, 'web_aaaa': {'name': 'web_aaaa', 'label': 'detail web ipv6 web-AAAA label', 'status': 1, 'worst_status': 0, 'verdict': 'detail web ipv6 web-AAAA verdict good', 'exp': 'detail web ipv6 web-AAAA exp', 'tech_type': 'table', 'tech_string': 'detail web ipv6 web-AAAA tech table', 'tech_data': [('ok.bogussig.ok.bad-dnssec.wb.sidnlabs.nl', ['2a00:d78:0:712:94:198:159:39'], ['94.198.159.39'])], 'override_mandatory': None}, 'web_reach': {'name': 'web_reach', 'label': 'detail web ipv6 web-reach label', 'status': 1, 'worst_status': 0, 'verdict': 'detail web ipv6 web-reach verdict good', 'exp': 'detail web ipv6 web-reach exp', 'tech_type': '', 'tech_string': 'detail web ipv6 web-reach tech table', 'tech_data': 'detail tech data not-tested', 'override_mandatory': None}, 'web_ipv46': {'name': 'web_ipv46', 'label': 'detail web ipv6 web-ipv46 label', 'status': 1, 'worst_status': 0, 'verdict': 'detail web ipv6 web-ipv46 verdict good', 'exp': 'detail web ipv6 web-ipv46 exp', 'tech_type': '', 'tech_string': '', 'tech_data': 'detail tech data not-tested', 'override_mandatory': None}}", + "web_simhash_distance": 0, + "web_simhash_score": 2, + "web_score": 10, + "mx_score": null, + "ns_score": 8, + "score": 20, + "max_score": 22 + } + }, + { + "model": "checks.domaintestipv6", + "pk": 9007, + "fields": { + "timestamp": "2025-03-14T15:19:22.977Z", + "domain": "badhash.dane.huque.com", + "report": "{'ns_aaaa': {'name': 'ns_aaaa', 'label': 'detail web-mail ipv6 ns-AAAA label', 'status': 1, 'worst_status': 0, 'verdict': 'detail web-mail ipv6 ns-AAAA verdict good', 'exp': 'detail web-mail ipv6 ns-AAAA exp', 'tech_type': 'table', 'tech_string': 'detail web-mail ipv6 ns-AAAA tech table', 'tech_data': [('adns1.nnn.upenn.edu.', ['2607:f470:1001::ad:1'], ['128.91.2.53']), ('adns2.dnsrakuda.com.', ['2600:1f14:990:2e01::bad'], ['52.88.78.179']), ('adns3.nnn.upenn.edu.', ['2607:f470:1003::ad:3'], ['128.91.251.53']), ('adns1.dnsrakuda.com.', ['2600:1f18:6296:8902::c0de'], ['3.225.161.117']), ('adns2.nnn.upenn.edu.', ['2607:f470:1002::ad:2'], ['128.91.254.53'])], 'override_mandatory': None}, 'ns_reach': {'name': 'ns_reach', 'label': 'detail web-mail ipv6 ns-reach label', 'status': 1, 'worst_status': 0, 'verdict': 'detail web-mail ipv6 ns-reach verdict good', 'exp': 'detail web-mail ipv6 ns-reach exp', 'tech_type': '', 'tech_string': 'detail web-mail ipv6 ns-reach tech table', 'tech_data': 'detail tech data not-tested', 'override_mandatory': None}, 'web_aaaa': {'name': 'web_aaaa', 'label': 'detail web ipv6 web-AAAA label', 'status': 0, 'worst_status': 0, 'verdict': 'detail web ipv6 web-AAAA verdict bad', 'exp': 'detail web ipv6 web-AAAA exp', 'tech_type': 'table', 'tech_string': 'detail web ipv6 web-AAAA tech table', 'tech_data': [('badhash.dane.huque.com', [], ['54.200.198.48'])], 'override_mandatory': None}, 'web_reach': {'name': 'web_reach', 'label': 'detail web ipv6 web-reach label', 'status': 4, 'worst_status': 0, 'verdict': 'detail verdict not-tested', 'exp': 'detail web ipv6 web-reach exp', 'tech_type': '', 'tech_string': 'detail web ipv6 web-reach tech table', 'tech_data': 'detail tech data not-tested', 'override_mandatory': None}, 'web_ipv46': {'name': 'web_ipv46', 'label': 'detail web ipv6 web-ipv46 label', 'status': 4, 'worst_status': 0, 'verdict': 'detail verdict not-tested', 'exp': 'detail web ipv6 web-ipv46 exp', 'tech_type': '', 'tech_string': '', 'tech_data': 'detail tech data not-tested', 'override_mandatory': None}}", + "web_simhash_distance": 10010, + "web_simhash_score": 0, + "web_score": 0, + "mx_score": null, + "ns_score": 10, + "score": 10, + "max_score": 22 + } + }, + { + "model": "checks.domaintestipv6", + "pk": 9008, + "fields": { + "timestamp": "2025-03-14T15:19:57.704Z", + "domain": "expired.badssl.com", + "report": "{'ns_aaaa': {'name': 'ns_aaaa', 'label': 'detail web-mail ipv6 ns-AAAA label', 'status': 1, 'worst_status': 0, 'verdict': 'detail web-mail ipv6 ns-AAAA verdict good', 'exp': 'detail web-mail ipv6 ns-AAAA exp', 'tech_type': 'table', 'tech_string': 'detail web-mail ipv6 ns-AAAA tech table', 'tech_data': [('ns-cloud-c3.googledomains.com.', ['2001:4860:4802:36::6c'], ['216.239.36.108']), ('ns-cloud-c1.googledomains.com.', ['2001:4860:4802:32::6c'], ['216.239.32.108']), ('ns-cloud-c2.googledomains.com.', ['2001:4860:4802:34::6c'], ['216.239.34.108']), ('ns-cloud-c4.googledomains.com.', ['2001:4860:4802:38::6c'], ['216.239.38.108'])], 'override_mandatory': None}, 'ns_reach': {'name': 'ns_reach', 'label': 'detail web-mail ipv6 ns-reach label', 'status': 1, 'worst_status': 0, 'verdict': 'detail web-mail ipv6 ns-reach verdict good', 'exp': 'detail web-mail ipv6 ns-reach exp', 'tech_type': '', 'tech_string': 'detail web-mail ipv6 ns-reach tech table', 'tech_data': 'detail tech data not-tested', 'override_mandatory': None}, 'web_aaaa': {'name': 'web_aaaa', 'label': 'detail web ipv6 web-AAAA label', 'status': 0, 'worst_status': 0, 'verdict': 'detail web ipv6 web-AAAA verdict bad', 'exp': 'detail web ipv6 web-AAAA exp', 'tech_type': 'table', 'tech_string': 'detail web ipv6 web-AAAA tech table', 'tech_data': [('expired.badssl.com', [], ['104.154.89.105'])], 'override_mandatory': None}, 'web_reach': {'name': 'web_reach', 'label': 'detail web ipv6 web-reach label', 'status': 4, 'worst_status': 0, 'verdict': 'detail verdict not-tested', 'exp': 'detail web ipv6 web-reach exp', 'tech_type': '', 'tech_string': 'detail web ipv6 web-reach tech table', 'tech_data': 'detail tech data not-tested', 'override_mandatory': None}, 'web_ipv46': {'name': 'web_ipv46', 'label': 'detail web ipv6 web-ipv46 label', 'status': 4, 'worst_status': 0, 'verdict': 'detail verdict not-tested', 'exp': 'detail web ipv6 web-ipv46 exp', 'tech_type': '', 'tech_string': '', 'tech_data': 'detail tech data not-tested', 'override_mandatory': None}}", + "web_simhash_distance": 10010, + "web_simhash_score": 0, + "web_score": 0, + "mx_score": null, + "ns_score": 10, + "score": 10, + "max_score": 22 + } + }, + { + "model": "checks.domaintestipv6", + "pk": 9009, + "fields": { + "timestamp": "2025-03-14T15:20:26.307Z", + "domain": "wrong.host.badssl.com", + "report": "{'ns_aaaa': {'name': 'ns_aaaa', 'label': 'detail web-mail ipv6 ns-AAAA label', 'status': 1, 'worst_status': 0, 'verdict': 'detail web-mail ipv6 ns-AAAA verdict good', 'exp': 'detail web-mail ipv6 ns-AAAA exp', 'tech_type': 'table', 'tech_string': 'detail web-mail ipv6 ns-AAAA tech table', 'tech_data': [('ns-cloud-c2.googledomains.com.', ['2001:4860:4802:34::6c'], ['216.239.34.108']), ('ns-cloud-c4.googledomains.com.', ['2001:4860:4802:38::6c'], ['216.239.38.108']), ('ns-cloud-c3.googledomains.com.', ['2001:4860:4802:36::6c'], ['216.239.36.108']), ('ns-cloud-c1.googledomains.com.', ['2001:4860:4802:32::6c'], ['216.239.32.108'])], 'override_mandatory': None}, 'ns_reach': {'name': 'ns_reach', 'label': 'detail web-mail ipv6 ns-reach label', 'status': 1, 'worst_status': 0, 'verdict': 'detail web-mail ipv6 ns-reach verdict good', 'exp': 'detail web-mail ipv6 ns-reach exp', 'tech_type': '', 'tech_string': 'detail web-mail ipv6 ns-reach tech table', 'tech_data': 'detail tech data not-tested', 'override_mandatory': None}, 'web_aaaa': {'name': 'web_aaaa', 'label': 'detail web ipv6 web-AAAA label', 'status': 0, 'worst_status': 0, 'verdict': 'detail web ipv6 web-AAAA verdict bad', 'exp': 'detail web ipv6 web-AAAA exp', 'tech_type': 'table', 'tech_string': 'detail web ipv6 web-AAAA tech table', 'tech_data': [('wrong.host.badssl.com', [], ['104.154.89.105'])], 'override_mandatory': None}, 'web_reach': {'name': 'web_reach', 'label': 'detail web ipv6 web-reach label', 'status': 4, 'worst_status': 0, 'verdict': 'detail verdict not-tested', 'exp': 'detail web ipv6 web-reach exp', 'tech_type': '', 'tech_string': 'detail web ipv6 web-reach tech table', 'tech_data': 'detail tech data not-tested', 'override_mandatory': None}, 'web_ipv46': {'name': 'web_ipv46', 'label': 'detail web ipv6 web-ipv46 label', 'status': 4, 'worst_status': 0, 'verdict': 'detail verdict not-tested', 'exp': 'detail web ipv6 web-ipv46 exp', 'tech_type': '', 'tech_string': '', 'tech_data': 'detail tech data not-tested', 'override_mandatory': None}}", + "web_simhash_distance": 10010, + "web_simhash_score": 0, + "web_score": 0, + "mx_score": null, + "ns_score": 10, + "score": 10, + "max_score": 22 + } + }, + { + "model": "checks.domaintestipv6", + "pk": 9010, + "fields": { + "timestamp": "2025-03-14T15:20:54.614Z", + "domain": "self-signed.badssl.com", + "report": "{'ns_aaaa': {'name': 'ns_aaaa', 'label': 'detail web-mail ipv6 ns-AAAA label', 'status': 1, 'worst_status': 0, 'verdict': 'detail web-mail ipv6 ns-AAAA verdict good', 'exp': 'detail web-mail ipv6 ns-AAAA exp', 'tech_type': 'table', 'tech_string': 'detail web-mail ipv6 ns-AAAA tech table', 'tech_data': [('ns-cloud-c4.googledomains.com.', ['2001:4860:4802:38::6c'], ['216.239.38.108']), ('ns-cloud-c3.googledomains.com.', ['2001:4860:4802:36::6c'], ['216.239.36.108']), ('ns-cloud-c1.googledomains.com.', ['2001:4860:4802:32::6c'], ['216.239.32.108']), ('ns-cloud-c2.googledomains.com.', ['2001:4860:4802:34::6c'], ['216.239.34.108'])], 'override_mandatory': None}, 'ns_reach': {'name': 'ns_reach', 'label': 'detail web-mail ipv6 ns-reach label', 'status': 1, 'worst_status': 0, 'verdict': 'detail web-mail ipv6 ns-reach verdict good', 'exp': 'detail web-mail ipv6 ns-reach exp', 'tech_type': '', 'tech_string': 'detail web-mail ipv6 ns-reach tech table', 'tech_data': 'detail tech data not-tested', 'override_mandatory': None}, 'web_aaaa': {'name': 'web_aaaa', 'label': 'detail web ipv6 web-AAAA label', 'status': 0, 'worst_status': 0, 'verdict': 'detail web ipv6 web-AAAA verdict bad', 'exp': 'detail web ipv6 web-AAAA exp', 'tech_type': 'table', 'tech_string': 'detail web ipv6 web-AAAA tech table', 'tech_data': [('self-signed.badssl.com', [], ['104.154.89.105'])], 'override_mandatory': None}, 'web_reach': {'name': 'web_reach', 'label': 'detail web ipv6 web-reach label', 'status': 4, 'worst_status': 0, 'verdict': 'detail verdict not-tested', 'exp': 'detail web ipv6 web-reach exp', 'tech_type': '', 'tech_string': 'detail web ipv6 web-reach tech table', 'tech_data': 'detail tech data not-tested', 'override_mandatory': None}, 'web_ipv46': {'name': 'web_ipv46', 'label': 'detail web ipv6 web-ipv46 label', 'status': 4, 'worst_status': 0, 'verdict': 'detail verdict not-tested', 'exp': 'detail web ipv6 web-ipv46 exp', 'tech_type': '', 'tech_string': '', 'tech_data': 'detail tech data not-tested', 'override_mandatory': None}}", + "web_simhash_distance": 10010, + "web_simhash_score": 0, + "web_score": 0, + "mx_score": null, + "ns_score": 10, + "score": 10, + "max_score": 22 + } + }, + { + "model": "checks.domaintestipv6", + "pk": 9011, + "fields": { + "timestamp": "2025-03-14T15:21:23.386Z", + "domain": "untrusted-root.badssl.com", + "report": "{'ns_aaaa': {'name': 'ns_aaaa', 'label': 'detail web-mail ipv6 ns-AAAA label', 'status': 1, 'worst_status': 0, 'verdict': 'detail web-mail ipv6 ns-AAAA verdict good', 'exp': 'detail web-mail ipv6 ns-AAAA exp', 'tech_type': 'table', 'tech_string': 'detail web-mail ipv6 ns-AAAA tech table', 'tech_data': [('ns-cloud-c3.googledomains.com.', ['2001:4860:4802:36::6c'], ['216.239.36.108']), ('ns-cloud-c1.googledomains.com.', ['2001:4860:4802:32::6c'], ['216.239.32.108']), ('ns-cloud-c2.googledomains.com.', ['2001:4860:4802:34::6c'], ['216.239.34.108']), ('ns-cloud-c4.googledomains.com.', ['2001:4860:4802:38::6c'], ['216.239.38.108'])], 'override_mandatory': None}, 'ns_reach': {'name': 'ns_reach', 'label': 'detail web-mail ipv6 ns-reach label', 'status': 1, 'worst_status': 0, 'verdict': 'detail web-mail ipv6 ns-reach verdict good', 'exp': 'detail web-mail ipv6 ns-reach exp', 'tech_type': '', 'tech_string': 'detail web-mail ipv6 ns-reach tech table', 'tech_data': 'detail tech data not-tested', 'override_mandatory': None}, 'web_aaaa': {'name': 'web_aaaa', 'label': 'detail web ipv6 web-AAAA label', 'status': 0, 'worst_status': 0, 'verdict': 'detail web ipv6 web-AAAA verdict bad', 'exp': 'detail web ipv6 web-AAAA exp', 'tech_type': 'table', 'tech_string': 'detail web ipv6 web-AAAA tech table', 'tech_data': [('untrusted-root.badssl.com', [], ['104.154.89.105'])], 'override_mandatory': None}, 'web_reach': {'name': 'web_reach', 'label': 'detail web ipv6 web-reach label', 'status': 4, 'worst_status': 0, 'verdict': 'detail verdict not-tested', 'exp': 'detail web ipv6 web-reach exp', 'tech_type': '', 'tech_string': 'detail web ipv6 web-reach tech table', 'tech_data': 'detail tech data not-tested', 'override_mandatory': None}, 'web_ipv46': {'name': 'web_ipv46', 'label': 'detail web ipv6 web-ipv46 label', 'status': 4, 'worst_status': 0, 'verdict': 'detail verdict not-tested', 'exp': 'detail web ipv6 web-ipv46 exp', 'tech_type': '', 'tech_string': '', 'tech_data': 'detail tech data not-tested', 'override_mandatory': None}}", + "web_simhash_distance": 10010, + "web_simhash_score": 0, + "web_score": 0, + "mx_score": null, + "ns_score": 10, + "score": 10, + "max_score": 22 + } + }, + { + "model": "checks.domaintestipv6", + "pk": 9012, + "fields": { + "timestamp": "2025-03-14T15:21:52.267Z", + "domain": "revoked.badssl.com", + "report": "{'ns_aaaa': {'name': 'ns_aaaa', 'label': 'detail web-mail ipv6 ns-AAAA label', 'status': 1, 'worst_status': 0, 'verdict': 'detail web-mail ipv6 ns-AAAA verdict good', 'exp': 'detail web-mail ipv6 ns-AAAA exp', 'tech_type': 'table', 'tech_string': 'detail web-mail ipv6 ns-AAAA tech table', 'tech_data': [('ns-cloud-c1.googledomains.com.', ['2001:4860:4802:32::6c'], ['216.239.32.108']), ('ns-cloud-c2.googledomains.com.', ['2001:4860:4802:34::6c'], ['216.239.34.108']), ('ns-cloud-c4.googledomains.com.', ['2001:4860:4802:38::6c'], ['216.239.38.108']), ('ns-cloud-c3.googledomains.com.', ['2001:4860:4802:36::6c'], ['216.239.36.108'])], 'override_mandatory': None}, 'ns_reach': {'name': 'ns_reach', 'label': 'detail web-mail ipv6 ns-reach label', 'status': 1, 'worst_status': 0, 'verdict': 'detail web-mail ipv6 ns-reach verdict good', 'exp': 'detail web-mail ipv6 ns-reach exp', 'tech_type': '', 'tech_string': 'detail web-mail ipv6 ns-reach tech table', 'tech_data': 'detail tech data not-tested', 'override_mandatory': None}, 'web_aaaa': {'name': 'web_aaaa', 'label': 'detail web ipv6 web-AAAA label', 'status': 0, 'worst_status': 0, 'verdict': 'detail web ipv6 web-AAAA verdict bad', 'exp': 'detail web ipv6 web-AAAA exp', 'tech_type': 'table', 'tech_string': 'detail web ipv6 web-AAAA tech table', 'tech_data': [('revoked.badssl.com', [], ['104.154.89.105'])], 'override_mandatory': None}, 'web_reach': {'name': 'web_reach', 'label': 'detail web ipv6 web-reach label', 'status': 4, 'worst_status': 0, 'verdict': 'detail verdict not-tested', 'exp': 'detail web ipv6 web-reach exp', 'tech_type': '', 'tech_string': 'detail web ipv6 web-reach tech table', 'tech_data': 'detail tech data not-tested', 'override_mandatory': None}, 'web_ipv46': {'name': 'web_ipv46', 'label': 'detail web ipv6 web-ipv46 label', 'status': 4, 'worst_status': 0, 'verdict': 'detail verdict not-tested', 'exp': 'detail web ipv6 web-ipv46 exp', 'tech_type': '', 'tech_string': '', 'tech_data': 'detail tech data not-tested', 'override_mandatory': None}}", + "web_simhash_distance": 10010, + "web_simhash_score": 0, + "web_score": 0, + "mx_score": null, + "ns_score": 10, + "score": 10, + "max_score": 22 + } + }, + { + "model": "checks.domaintestipv6", + "pk": 9013, + "fields": { + "timestamp": "2025-03-14T15:22:11.731Z", + "domain": "pinning-test.badssl.com", + "report": "{'ns_aaaa': {'name': 'ns_aaaa', 'label': 'detail web-mail ipv6 ns-AAAA label', 'status': 1, 'worst_status': 0, 'verdict': 'detail web-mail ipv6 ns-AAAA verdict good', 'exp': 'detail web-mail ipv6 ns-AAAA exp', 'tech_type': 'table', 'tech_string': 'detail web-mail ipv6 ns-AAAA tech table', 'tech_data': [('ns-cloud-c4.googledomains.com.', ['2001:4860:4802:38::6c'], ['216.239.38.108']), ('ns-cloud-c3.googledomains.com.', ['2001:4860:4802:36::6c'], ['216.239.36.108']), ('ns-cloud-c1.googledomains.com.', ['2001:4860:4802:32::6c'], ['216.239.32.108']), ('ns-cloud-c2.googledomains.com.', ['2001:4860:4802:34::6c'], ['216.239.34.108'])], 'override_mandatory': None}, 'ns_reach': {'name': 'ns_reach', 'label': 'detail web-mail ipv6 ns-reach label', 'status': 1, 'worst_status': 0, 'verdict': 'detail web-mail ipv6 ns-reach verdict good', 'exp': 'detail web-mail ipv6 ns-reach exp', 'tech_type': '', 'tech_string': 'detail web-mail ipv6 ns-reach tech table', 'tech_data': 'detail tech data not-tested', 'override_mandatory': None}, 'web_aaaa': {'name': 'web_aaaa', 'label': 'detail web ipv6 web-AAAA label', 'status': 0, 'worst_status': 0, 'verdict': 'detail web ipv6 web-AAAA verdict bad', 'exp': 'detail web ipv6 web-AAAA exp', 'tech_type': 'table', 'tech_string': 'detail web ipv6 web-AAAA tech table', 'tech_data': [('pinning-test.badssl.com', [], ['104.154.89.105'])], 'override_mandatory': None}, 'web_reach': {'name': 'web_reach', 'label': 'detail web ipv6 web-reach label', 'status': 4, 'worst_status': 0, 'verdict': 'detail verdict not-tested', 'exp': 'detail web ipv6 web-reach exp', 'tech_type': '', 'tech_string': 'detail web ipv6 web-reach tech table', 'tech_data': 'detail tech data not-tested', 'override_mandatory': None}, 'web_ipv46': {'name': 'web_ipv46', 'label': 'detail web ipv6 web-ipv46 label', 'status': 4, 'worst_status': 0, 'verdict': 'detail verdict not-tested', 'exp': 'detail web ipv6 web-ipv46 exp', 'tech_type': '', 'tech_string': '', 'tech_data': 'detail tech data not-tested', 'override_mandatory': None}}", + "web_simhash_distance": 10010, + "web_simhash_score": 0, + "web_score": 0, + "mx_score": null, + "ns_score": 10, + "score": 10, + "max_score": 22 + } + }, + { + "model": "checks.domaintestipv6", + "pk": 9014, + "fields": { + "timestamp": "2025-03-14T15:22:40.006Z", + "domain": "invalid.rpki.isbgpsafeyet.com", + "report": "{'ns_aaaa': {'name': 'ns_aaaa', 'label': 'detail web-mail ipv6 ns-AAAA label', 'status': 1, 'worst_status': 0, 'verdict': 'detail web-mail ipv6 ns-AAAA verdict good', 'exp': 'detail web-mail ipv6 ns-AAAA exp', 'tech_type': 'table', 'tech_string': 'detail web-mail ipv6 ns-AAAA tech table', 'tech_data': [('jerry.ns.cloudflare.com.', ['2606:4700:58::adf5:3bb6', '2803:f800:50::6ca2:c1b6', '2a06:98c1:50::ac40:21b6'], ['172.64.33.182', '108.162.193.182', '173.245.59.182']), ('meera.ns.cloudflare.com.', ['2606:4700:50::adf5:3ac3', '2803:f800:50::6ca2:c0c3', '2a06:98c1:50::ac40:20c3'], ['173.245.58.195', '108.162.192.195', '172.64.32.195'])], 'override_mandatory': None}, 'ns_reach': {'name': 'ns_reach', 'label': 'detail web-mail ipv6 ns-reach label', 'status': 1, 'worst_status': 0, 'verdict': 'detail web-mail ipv6 ns-reach verdict good', 'exp': 'detail web-mail ipv6 ns-reach exp', 'tech_type': '', 'tech_string': 'detail web-mail ipv6 ns-reach tech table', 'tech_data': 'detail tech data not-tested', 'override_mandatory': None}, 'web_aaaa': {'name': 'web_aaaa', 'label': 'detail web ipv6 web-AAAA label', 'status': 1, 'worst_status': 0, 'verdict': 'detail web ipv6 web-AAAA verdict good', 'exp': 'detail web ipv6 web-AAAA exp', 'tech_type': 'table', 'tech_string': 'detail web ipv6 web-AAAA tech table', 'tech_data': [('invalid.rpki.isbgpsafeyet.com', ['2606:4700:7000::6715:f408', '2606:4700:7000::6715:f409'], ['103.21.244.9', '103.21.244.8'])], 'override_mandatory': None}, 'web_reach': {'name': 'web_reach', 'label': 'detail web ipv6 web-reach label', 'status': 1, 'worst_status': 0, 'verdict': 'detail web ipv6 web-reach verdict good', 'exp': 'detail web ipv6 web-reach exp', 'tech_type': '', 'tech_string': 'detail web ipv6 web-reach tech table', 'tech_data': 'detail tech data not-tested', 'override_mandatory': None}, 'web_ipv46': {'name': 'web_ipv46', 'label': 'detail web ipv6 web-ipv46 label', 'status': 1, 'worst_status': 0, 'verdict': 'detail web ipv6 web-ipv46 verdict good', 'exp': 'detail web ipv6 web-ipv46 exp', 'tech_type': '', 'tech_string': '', 'tech_data': 'detail tech data not-tested', 'override_mandatory': None}}", + "web_simhash_distance": 0, + "web_simhash_score": 2, + "web_score": 10, + "mx_score": null, + "ns_score": 10, + "score": 22, + "max_score": 22 + } + }, + { + "model": "checks.webdomain", + "pk": 9000, + "fields": { + "domain": "internet.nl", + "v6_good": "['2a00:d00:ff:162:62:204:66:10']", + "v6_bad": "[]", + "v4_good": "['62.204.66.10']", + "v4_bad": "[]", + "score": 10, + "domaintestipv6": 9000 + } + }, + { + "model": "checks.webdomain", + "pk": 9001, + "fields": { + "domain": "example.nl", + "v6_good": "['2a00:d78:0:712:94:198:159:35']", + "v6_bad": "[]", + "v4_good": "['94.198.159.35']", + "v4_bad": "[]", + "score": 10, + "domaintestipv6": 9001 + } + }, + { + "model": "checks.webdomain", + "pk": 9002, + "fields": { + "domain": "ipv6.internet.nl", + "v6_good": "['2a00:d00:ff:162:62:204:66:10']", + "v6_bad": "[]", + "v4_good": "[]", + "v4_bad": "[]", + "score": 10, + "domaintestipv6": 9002 + } + }, + { + "model": "checks.webdomain", + "pk": 9003, + "fields": { + "domain": "forfun.net", + "v6_good": "['2a05:1500:600:1:1c00:4aff:fe00:428']", + "v6_bad": "[]", + "v4_good": "[]", + "v4_bad": "[]", + "score": 10, + "domaintestipv6": 9003 + } + }, + { + "model": "checks.webdomain", + "pk": 9004, + "fields": { + "domain": "ipv6.google.com", + "v6_good": "['2a00:1450:4026:804::200e']", + "v6_bad": "[]", + "v4_good": "[]", + "v4_bad": "[]", + "score": 10, + "domaintestipv6": 9004 + } + }, + { + "model": "checks.webdomain", + "pk": 9005, + "fields": { + "domain": "brokendnssec.net", + "v6_good": "[]", + "v6_bad": "[]", + "v4_good": "['104.18.26.110', '104.18.27.110']", + "v4_bad": "[]", + "score": 0, + "domaintestipv6": 9005 + } + }, + { + "model": "checks.webdomain", + "pk": 9006, + "fields": { + "domain": "ok.bogussig.ok.bad-dnssec.wb.sidnlabs.nl", + "v6_good": "['2a00:d78:0:712:94:198:159:39']", + "v6_bad": "[]", + "v4_good": "['94.198.159.39']", + "v4_bad": "[]", + "score": 10, + "domaintestipv6": 9006 + } + }, + { + "model": "checks.webdomain", + "pk": 9007, + "fields": { + "domain": "badhash.dane.huque.com", + "v6_good": "[]", + "v6_bad": "[]", + "v4_good": "['54.200.198.48']", + "v4_bad": "[]", + "score": 0, + "domaintestipv6": 9007 + } + }, + { + "model": "checks.webdomain", + "pk": 9008, + "fields": { + "domain": "expired.badssl.com", + "v6_good": "[]", + "v6_bad": "[]", + "v4_good": "['104.154.89.105']", + "v4_bad": "[]", + "score": 0, + "domaintestipv6": 9008 + } + }, + { + "model": "checks.webdomain", + "pk": 9009, + "fields": { + "domain": "wrong.host.badssl.com", + "v6_good": "[]", + "v6_bad": "[]", + "v4_good": "['104.154.89.105']", + "v4_bad": "[]", + "score": 0, + "domaintestipv6": 9009 + } + }, + { + "model": "checks.webdomain", + "pk": 9010, + "fields": { + "domain": "self-signed.badssl.com", + "v6_good": "[]", + "v6_bad": "[]", + "v4_good": "['104.154.89.105']", + "v4_bad": "[]", + "score": 0, + "domaintestipv6": 9010 + } + }, + { + "model": "checks.webdomain", + "pk": 9011, + "fields": { + "domain": "untrusted-root.badssl.com", + "v6_good": "[]", + "v6_bad": "[]", + "v4_good": "['104.154.89.105']", + "v4_bad": "[]", + "score": 0, + "domaintestipv6": 9011 + } + }, + { + "model": "checks.webdomain", + "pk": 9012, + "fields": { + "domain": "revoked.badssl.com", + "v6_good": "[]", + "v6_bad": "[]", + "v4_good": "['104.154.89.105']", + "v4_bad": "[]", + "score": 0, + "domaintestipv6": 9012 + } + }, + { + "model": "checks.webdomain", + "pk": 9013, + "fields": { + "domain": "pinning-test.badssl.com", + "v6_good": "[]", + "v6_bad": "[]", + "v4_good": "['104.154.89.105']", + "v4_bad": "[]", + "score": 0, + "domaintestipv6": 9013 + } + }, + { + "model": "checks.webdomain", + "pk": 9014, + "fields": { + "domain": "invalid.rpki.isbgpsafeyet.com", + "v6_good": "['2606:4700:7000::6715:f408', '2606:4700:7000::6715:f409']", + "v6_bad": "[]", + "v4_good": "['103.21.244.9', '103.21.244.8']", + "v4_bad": "[]", + "score": 10, + "domaintestipv6": 9014 + } + }, + { + "model": "checks.domaintestdnssec", + "pk": 9000, + "fields": { + "timestamp": "2025-03-14T15:14:03.032Z", + "domain": "internet.nl", + "report": "{'dnssec_exists': {'name': 'dnssec_exists', 'label': 'detail web dnssec exists label', 'status': 1, 'worst_status': 0, 'verdict': 'detail web dnssec exists verdict good', 'exp': 'detail web dnssec exists exp', 'tech_type': 'table', 'tech_string': 'detail web dnssec exists tech table', 'tech_data': [['internet.nl', 'Stichting Internet Domeinregistratie Nederland, SIDN BV']], 'override_mandatory': None}, 'dnssec_valid': {'name': 'dnssec_valid', 'label': 'detail web dnssec valid label', 'status': 1, 'worst_status': 0, 'verdict': 'detail web dnssec valid verdict good', 'exp': 'detail web dnssec valid exp', 'tech_type': 'table', 'tech_string': 'detail web dnssec valid tech table', 'tech_data': [['internet.nl', 'detail tech data secure']], 'override_mandatory': None}}", + "status": 1, + "log": "", + "score": 10, + "max_score": 10, + "maildomain": null + } + }, + { + "model": "checks.domaintestdnssec", + "pk": 9001, + "fields": { + "timestamp": "2025-03-14T15:14:20.879Z", + "domain": "example.nl", + "report": "{'dnssec_exists': {'name': 'dnssec_exists', 'label': 'detail web dnssec exists label', 'status': 1, 'worst_status': 0, 'verdict': 'detail web dnssec exists verdict good', 'exp': 'detail web dnssec exists exp', 'tech_type': 'table', 'tech_string': 'detail web dnssec exists tech table', 'tech_data': [['example.nl', 'Stichting Internet Domeinregistratie Nederland, SIDN BV']], 'override_mandatory': None}, 'dnssec_valid': {'name': 'dnssec_valid', 'label': 'detail web dnssec valid label', 'status': 1, 'worst_status': 0, 'verdict': 'detail web dnssec valid verdict good', 'exp': 'detail web dnssec valid exp', 'tech_type': 'table', 'tech_string': 'detail web dnssec valid tech table', 'tech_data': [['example.nl', 'detail tech data secure']], 'override_mandatory': None}}", + "status": 1, + "log": "", + "score": 10, + "max_score": 10, + "maildomain": null + } + }, + { + "model": "checks.domaintestdnssec", + "pk": 9002, + "fields": { + "timestamp": "2025-03-14T15:14:31.088Z", + "domain": "ipv6.internet.nl", + "report": "{'dnssec_exists': {'name': 'dnssec_exists', 'label': 'detail web dnssec exists label', 'status': 1, 'worst_status': 0, 'verdict': 'detail web dnssec exists verdict good', 'exp': 'detail web dnssec exists exp', 'tech_type': 'table', 'tech_string': 'detail web dnssec exists tech table', 'tech_data': [['ipv6.internet.nl', 'Stichting Internet Domeinregistratie Nederland, SIDN BV']], 'override_mandatory': None}, 'dnssec_valid': {'name': 'dnssec_valid', 'label': 'detail web dnssec valid label', 'status': 1, 'worst_status': 0, 'verdict': 'detail web dnssec valid verdict good', 'exp': 'detail web dnssec valid exp', 'tech_type': 'table', 'tech_string': 'detail web dnssec valid tech table', 'tech_data': [['ipv6.internet.nl', 'detail tech data secure']], 'override_mandatory': None}}", + "status": 1, + "log": "", + "score": 10, + "max_score": 10, + "maildomain": null + } + }, + { + "model": "checks.domaintestdnssec", + "pk": 9003, + "fields": { + "timestamp": "2025-03-14T15:14:38.897Z", + "domain": "forfun.net", + "report": "{'dnssec_exists': {'name': 'dnssec_exists', 'label': 'detail web dnssec exists label', 'status': 1, 'worst_status': 0, 'verdict': 'detail web dnssec exists verdict good', 'exp': 'detail web dnssec exists exp', 'tech_type': 'table', 'tech_string': 'detail web dnssec exists tech table', 'tech_data': [['forfun.net', 'Key-Systems GmbH']], 'override_mandatory': None}, 'dnssec_valid': {'name': 'dnssec_valid', 'label': 'detail web dnssec valid label', 'status': 1, 'worst_status': 0, 'verdict': 'detail web dnssec valid verdict good', 'exp': 'detail web dnssec valid exp', 'tech_type': 'table', 'tech_string': 'detail web dnssec valid tech table', 'tech_data': [['forfun.net', 'detail tech data secure']], 'override_mandatory': None}}", + "status": 1, + "log": "", + "score": 10, + "max_score": 10, + "maildomain": null + } + }, + { + "model": "checks.domaintestdnssec", + "pk": 9004, + "fields": { + "timestamp": "2025-03-14T15:14:45.810Z", + "domain": "ipv6.google.com", + "report": "{'dnssec_exists': {'name': 'dnssec_exists', 'label': 'detail web dnssec exists label', 'status': 0, 'worst_status': 0, 'verdict': 'detail web dnssec exists verdict bad', 'exp': 'detail web dnssec exists exp', 'tech_type': 'table', 'tech_string': 'detail web dnssec exists tech table', 'tech_data': [['ipv6.google.com', 'MarkMonitor Inc.']], 'override_mandatory': None}, 'dnssec_valid': {'name': 'dnssec_valid', 'label': 'detail web dnssec valid label', 'status': 4, 'worst_status': 0, 'verdict': 'detail verdict not-tested', 'exp': 'detail web dnssec valid exp', 'tech_type': 'table', 'tech_string': 'detail web dnssec valid tech table', 'tech_data': [['ipv6.google.com', 'detail tech data insecure']], 'override_mandatory': None}}", + "status": 0, + "log": "", + "score": 2, + "max_score": 10, + "maildomain": null + } + }, + { + "model": "checks.domaintestdnssec", + "pk": 9005, + "fields": { + "timestamp": "2025-03-14T15:14:54.532Z", + "domain": "servfail.nl", + "report": "{'dnssec_exists': {'name': 'dnssec_exists', 'label': 'detail web dnssec exists label', 'status': 0, 'worst_status': 0, 'verdict': 'detail web dnssec exists verdict resolver-error', 'exp': 'detail web dnssec exists exp', 'tech_type': 'table', 'tech_string': 'detail web dnssec exists tech table', 'tech_data': [['servfail.nl', 'team.blue nl B.V., SIDN BV']], 'override_mandatory': None}, 'dnssec_valid': {'name': 'dnssec_valid', 'label': 'detail web dnssec valid label', 'status': 4, 'worst_status': 0, 'verdict': 'detail verdict not-tested', 'exp': 'detail web dnssec valid exp', 'tech_type': 'table', 'tech_string': 'detail web dnssec valid tech table', 'tech_data': [['servfail.nl', 'detail tech data not-tested']], 'override_mandatory': None}}", + "status": 4, + "log": "", + "score": 0, + "max_score": 10, + "maildomain": null + } + }, + { + "model": "checks.domaintestdnssec", + "pk": 9006, + "fields": { + "timestamp": "2025-03-14T15:18:50.106Z", + "domain": "brokendnssec.net", + "report": "{'dnssec_exists': {'name': 'dnssec_exists', 'label': 'detail web dnssec exists label', 'status': 1, 'worst_status': 0, 'verdict': 'detail web dnssec exists verdict good', 'exp': 'detail web dnssec exists exp', 'tech_type': 'table', 'tech_string': 'detail web dnssec exists tech table', 'tech_data': [['brokendnssec.net', 'Cloudflare, Inc.']], 'override_mandatory': None}, 'dnssec_valid': {'name': 'dnssec_valid', 'label': 'detail web dnssec valid label', 'status': 0, 'worst_status': 0, 'verdict': 'detail web dnssec valid verdict bad', 'exp': 'detail web dnssec valid exp', 'tech_type': 'table', 'tech_string': 'detail web dnssec valid tech table', 'tech_data': [['brokendnssec.net', 'detail tech data bogus']], 'override_mandatory': None}}", + "status": 2, + "log": "[]", + "score": 0, + "max_score": 10, + "maildomain": null + } + }, + { + "model": "checks.domaintestdnssec", + "pk": 9007, + "fields": { + "timestamp": "2025-03-14T15:19:03.283Z", + "domain": "ok.bogussig.ok.bad-dnssec.wb.sidnlabs.nl", + "report": "{'dnssec_exists': {'name': 'dnssec_exists', 'label': 'detail web dnssec exists label', 'status': 1, 'worst_status': 0, 'verdict': 'detail web dnssec exists verdict good', 'exp': 'detail web dnssec exists exp', 'tech_type': 'table', 'tech_string': 'detail web dnssec exists tech table', 'tech_data': [['ok.bogussig.ok.bad-dnssec.wb.sidnlabs.nl', 'Stichting Internet Domeinregistratie Nederland, SIDN BV']], 'override_mandatory': None}, 'dnssec_valid': {'name': 'dnssec_valid', 'label': 'detail web dnssec valid label', 'status': 0, 'worst_status': 0, 'verdict': 'detail web dnssec valid verdict bad', 'exp': 'detail web dnssec valid exp', 'tech_type': 'table', 'tech_string': 'detail web dnssec valid tech table', 'tech_data': [['ok.bogussig.ok.bad-dnssec.wb.sidnlabs.nl', 'detail tech data bogus']], 'override_mandatory': None}}", + "status": 2, + "log": "[]", + "score": 0, + "max_score": 10, + "maildomain": null + } + }, + { + "model": "checks.domaintestdnssec", + "pk": 9008, + "fields": { + "timestamp": "2025-03-14T15:19:19.940Z", + "domain": "badhash.dane.huque.com", + "report": "{'dnssec_exists': {'name': 'dnssec_exists', 'label': 'detail web dnssec exists label', 'status': 1, 'worst_status': 0, 'verdict': 'detail web dnssec exists verdict good', 'exp': 'detail web dnssec exists exp', 'tech_type': 'table', 'tech_string': 'detail web dnssec exists tech table', 'tech_data': [['badhash.dane.huque.com', 'GKG.Net, Inc.']], 'override_mandatory': None}, 'dnssec_valid': {'name': 'dnssec_valid', 'label': 'detail web dnssec valid label', 'status': 1, 'worst_status': 0, 'verdict': 'detail web dnssec valid verdict good', 'exp': 'detail web dnssec valid exp', 'tech_type': 'table', 'tech_string': 'detail web dnssec valid tech table', 'tech_data': [['badhash.dane.huque.com', 'detail tech data secure']], 'override_mandatory': None}}", + "status": 1, + "log": "", + "score": 10, + "max_score": 10, + "maildomain": null + } + }, + { + "model": "checks.domaintestdnssec", + "pk": 9009, + "fields": { + "timestamp": "2025-03-14T15:19:57.386Z", + "domain": "expired.badssl.com", + "report": "{'dnssec_exists': {'name': 'dnssec_exists', 'label': 'detail web dnssec exists label', 'status': 0, 'worst_status': 0, 'verdict': 'detail web dnssec exists verdict bad', 'exp': 'detail web dnssec exists exp', 'tech_type': 'table', 'tech_string': 'detail web dnssec exists tech table', 'tech_data': [['expired.badssl.com', 'MarkMonitor Inc.']], 'override_mandatory': None}, 'dnssec_valid': {'name': 'dnssec_valid', 'label': 'detail web dnssec valid label', 'status': 4, 'worst_status': 0, 'verdict': 'detail verdict not-tested', 'exp': 'detail web dnssec valid exp', 'tech_type': 'table', 'tech_string': 'detail web dnssec valid tech table', 'tech_data': [['expired.badssl.com', 'detail tech data insecure']], 'override_mandatory': None}}", + "status": 0, + "log": "", + "score": 2, + "max_score": 10, + "maildomain": null + } + }, + { + "model": "checks.domaintestdnssec", + "pk": 9010, + "fields": { + "timestamp": "2025-03-14T15:20:26.211Z", + "domain": "wrong.host.badssl.com", + "report": "{'dnssec_exists': {'name': 'dnssec_exists', 'label': 'detail web dnssec exists label', 'status': 0, 'worst_status': 0, 'verdict': 'detail web dnssec exists verdict bad', 'exp': 'detail web dnssec exists exp', 'tech_type': 'table', 'tech_string': 'detail web dnssec exists tech table', 'tech_data': [['wrong.host.badssl.com', 'MarkMonitor Inc.']], 'override_mandatory': None}, 'dnssec_valid': {'name': 'dnssec_valid', 'label': 'detail web dnssec valid label', 'status': 4, 'worst_status': 0, 'verdict': 'detail verdict not-tested', 'exp': 'detail web dnssec valid exp', 'tech_type': 'table', 'tech_string': 'detail web dnssec valid tech table', 'tech_data': [['wrong.host.badssl.com', 'detail tech data insecure']], 'override_mandatory': None}}", + "status": 0, + "log": "", + "score": 2, + "max_score": 10, + "maildomain": null + } + }, + { + "model": "checks.domaintestdnssec", + "pk": 9011, + "fields": { + "timestamp": "2025-03-14T15:20:54.683Z", + "domain": "self-signed.badssl.com", + "report": "{'dnssec_exists': {'name': 'dnssec_exists', 'label': 'detail web dnssec exists label', 'status': 0, 'worst_status': 0, 'verdict': 'detail web dnssec exists verdict bad', 'exp': 'detail web dnssec exists exp', 'tech_type': 'table', 'tech_string': 'detail web dnssec exists tech table', 'tech_data': [['self-signed.badssl.com', 'MarkMonitor Inc.']], 'override_mandatory': None}, 'dnssec_valid': {'name': 'dnssec_valid', 'label': 'detail web dnssec valid label', 'status': 4, 'worst_status': 0, 'verdict': 'detail verdict not-tested', 'exp': 'detail web dnssec valid exp', 'tech_type': 'table', 'tech_string': 'detail web dnssec valid tech table', 'tech_data': [['self-signed.badssl.com', 'detail tech data insecure']], 'override_mandatory': None}}", + "status": 0, + "log": "", + "score": 2, + "max_score": 10, + "maildomain": null + } + }, + { + "model": "checks.domaintestdnssec", + "pk": 9012, + "fields": { + "timestamp": "2025-03-14T15:21:23.395Z", + "domain": "untrusted-root.badssl.com", + "report": "{'dnssec_exists': {'name': 'dnssec_exists', 'label': 'detail web dnssec exists label', 'status': 0, 'worst_status': 0, 'verdict': 'detail web dnssec exists verdict bad', 'exp': 'detail web dnssec exists exp', 'tech_type': 'table', 'tech_string': 'detail web dnssec exists tech table', 'tech_data': [['untrusted-root.badssl.com', 'MarkMonitor Inc.']], 'override_mandatory': None}, 'dnssec_valid': {'name': 'dnssec_valid', 'label': 'detail web dnssec valid label', 'status': 4, 'worst_status': 0, 'verdict': 'detail verdict not-tested', 'exp': 'detail web dnssec valid exp', 'tech_type': 'table', 'tech_string': 'detail web dnssec valid tech table', 'tech_data': [['untrusted-root.badssl.com', 'detail tech data insecure']], 'override_mandatory': None}}", + "status": 0, + "log": "", + "score": 2, + "max_score": 10, + "maildomain": null + } + }, + { + "model": "checks.domaintestdnssec", + "pk": 9013, + "fields": { + "timestamp": "2025-03-14T15:21:52.188Z", + "domain": "revoked.badssl.com", + "report": "{'dnssec_exists': {'name': 'dnssec_exists', 'label': 'detail web dnssec exists label', 'status': 0, 'worst_status': 0, 'verdict': 'detail web dnssec exists verdict bad', 'exp': 'detail web dnssec exists exp', 'tech_type': 'table', 'tech_string': 'detail web dnssec exists tech table', 'tech_data': [['revoked.badssl.com', 'MarkMonitor Inc.']], 'override_mandatory': None}, 'dnssec_valid': {'name': 'dnssec_valid', 'label': 'detail web dnssec valid label', 'status': 4, 'worst_status': 0, 'verdict': 'detail verdict not-tested', 'exp': 'detail web dnssec valid exp', 'tech_type': 'table', 'tech_string': 'detail web dnssec valid tech table', 'tech_data': [['revoked.badssl.com', 'detail tech data insecure']], 'override_mandatory': None}}", + "status": 0, + "log": "", + "score": 2, + "max_score": 10, + "maildomain": null + } + }, + { + "model": "checks.domaintestdnssec", + "pk": 9014, + "fields": { + "timestamp": "2025-03-14T15:22:11.709Z", + "domain": "pinning-test.badssl.com", + "report": "{'dnssec_exists': {'name': 'dnssec_exists', 'label': 'detail web dnssec exists label', 'status': 0, 'worst_status': 0, 'verdict': 'detail web dnssec exists verdict bad', 'exp': 'detail web dnssec exists exp', 'tech_type': 'table', 'tech_string': 'detail web dnssec exists tech table', 'tech_data': [['pinning-test.badssl.com', 'MarkMonitor Inc.']], 'override_mandatory': None}, 'dnssec_valid': {'name': 'dnssec_valid', 'label': 'detail web dnssec valid label', 'status': 4, 'worst_status': 0, 'verdict': 'detail verdict not-tested', 'exp': 'detail web dnssec valid exp', 'tech_type': 'table', 'tech_string': 'detail web dnssec valid tech table', 'tech_data': [['pinning-test.badssl.com', 'detail tech data insecure']], 'override_mandatory': None}}", + "status": 0, + "log": "", + "score": 2, + "max_score": 10, + "maildomain": null + } + }, + { + "model": "checks.domaintestdnssec", + "pk": 9015, + "fields": { + "timestamp": "2025-03-14T15:22:39.846Z", + "domain": "invalid.rpki.isbgpsafeyet.com", + "report": "{'dnssec_exists': {'name': 'dnssec_exists', 'label': 'detail web dnssec exists label', 'status': 1, 'worst_status': 0, 'verdict': 'detail web dnssec exists verdict good', 'exp': 'detail web dnssec exists exp', 'tech_type': 'table', 'tech_string': 'detail web dnssec exists tech table', 'tech_data': [['invalid.rpki.isbgpsafeyet.com', 'Cloudflare, Inc.']], 'override_mandatory': None}, 'dnssec_valid': {'name': 'dnssec_valid', 'label': 'detail web dnssec valid label', 'status': 1, 'worst_status': 0, 'verdict': 'detail web dnssec valid verdict good', 'exp': 'detail web dnssec valid exp', 'tech_type': 'table', 'tech_string': 'detail web dnssec valid tech table', 'tech_data': [['invalid.rpki.isbgpsafeyet.com', 'detail tech data secure']], 'override_mandatory': None}}", + "status": 1, + "log": "", + "score": 10, + "max_score": 10, + "maildomain": null + } + }, + { + "model": "checks.webtesttls", + "pk": 9000, + "fields": { + "domain": "internet.nl", + "report": "{'https_exists': {'name': 'https_exists', 'label': 'detail web tls https-exists label', 'status': 1, 'worst_status': 0, 'verdict': 'detail web tls https-exists verdict good', 'exp': 'detail web tls https-exists exp', 'tech_type': 'table', 'tech_string': 'detail web tls https-exists tech table', 'tech_data': [('62.204.66.10', 'detail tech data yes'), ('2a00:d00:ff:162:62:204:66:10', 'detail tech data yes')], 'override_mandatory': None}, 'https_forced': {'name': 'https_forced', 'label': 'detail web tls https-forced label', 'status': 1, 'worst_status': 0, 'verdict': 'detail web tls https-forced verdict good', 'exp': 'detail web tls https-forced exp', 'tech_type': 'table', 'tech_string': 'detail web tls https-forced tech table', 'tech_data': [('62.204.66.10', 'detail tech data yes'), ('2a00:d00:ff:162:62:204:66:10', 'detail tech data yes')], 'override_mandatory': None}, 'https_hsts': {'name': 'https_hsts', 'label': 'detail web tls https-hsts label', 'status': 1, 'worst_status': 0, 'verdict': 'detail web tls https-hsts verdict good', 'exp': 'detail web tls https-hsts exp', 'tech_type': 'table', 'tech_string': 'detail web tls https-hsts tech table', 'tech_data': [('62.204.66.10', ['max-age=31536000;']), ('2a00:d00:ff:162:62:204:66:10', ['max-age=31536000;'])], 'override_mandatory': None}, 'http_compression': {'name': 'http_compression', 'label': 'detail web tls http-compression label', 'status': 1, 'worst_status': 5, 'verdict': 'detail web tls http-compression verdict good', 'exp': 'detail web tls http-compression exp', 'tech_type': 'table', 'tech_string': 'detail web tls http-compression tech table', 'tech_data': [('62.204.66.10', 'detail tech data no'), ('2a00:d00:ff:162:62:204:66:10', 'detail tech data no')], 'override_mandatory': None}, 'fs_params': {'name': 'fs_params', 'label': 'detail web tls fs-params label', 'status': 1, 'worst_status': 0, 'verdict': 'detail web tls fs-params verdict good', 'exp': 'detail web tls fs-params exp', 'tech_type': 'table_multi_col', 'tech_string': 'detail web tls fs-params tech table', 'tech_data': [('62.204.66.10', ''), ('2a00:d00:ff:162:62:204:66:10', '')], 'override_mandatory': None}, 'tls_ciphers': {'name': 'tls_ciphers', 'label': 'detail web tls ciphers label', 'status': 1, 'worst_status': 0, 'verdict': 'detail web tls ciphers verdict good', 'exp': 'detail web tls ciphers exp', 'tech_type': 'table_multi_col', 'tech_string': 'detail web tls ciphers tech table', 'tech_data': [('62.204.66.10', ''), ('2a00:d00:ff:162:62:204:66:10', '')], 'override_mandatory': None}, 'tls_cipher_order': {'name': 'tls_cipher_order', 'label': 'detail web tls cipher-order label', 'status': 1, 'worst_status': 0, 'verdict': 'detail web tls cipher-order verdict na', 'exp': 'detail web tls cipher-order exp', 'tech_type': 'table_multi_col', 'tech_string': 'detail web tls cipher-order tech table', 'tech_data': [('62.204.66.10', ''), ('2a00:d00:ff:162:62:204:66:10', '')], 'override_mandatory': None}, 'tls_version': {'name': 'tls_version', 'label': 'detail web tls version label', 'status': 1, 'worst_status': 0, 'verdict': 'detail web tls version verdict good', 'exp': 'detail web tls version exp', 'tech_type': 'table_multi_col', 'tech_string': 'detail web tls version tech table', 'tech_data': [('62.204.66.10', ['TLS 1.3', 'TLS 1.2'], ['detail tech data good', 'detail tech data sufficient']), ('2a00:d00:ff:162:62:204:66:10', ['TLS 1.3', 'TLS 1.2'], ['detail tech data good', 'detail tech data sufficient'])], 'override_mandatory': None}, 'tls_compression': {'name': 'tls_compression', 'label': 'detail web tls compression label', 'status': 1, 'worst_status': 0, 'verdict': 'detail web tls compression verdict good', 'exp': 'detail web tls compression exp', 'tech_type': 'table', 'tech_string': 'detail web tls compression tech table', 'tech_data': [('62.204.66.10', 'detail tech data no'), ('2a00:d00:ff:162:62:204:66:10', 'detail tech data no')], 'override_mandatory': None}, 'renegotiation_secure': {'name': 'renegotiation_secure', 'label': 'detail web tls renegotiation-secure label', 'status': 1, 'worst_status': 0, 'verdict': 'detail web tls renegotiation-secure verdict good', 'exp': 'detail web tls renegotiation-secure exp', 'tech_type': 'table', 'tech_string': 'detail web tls renegotiation-secure tech table', 'tech_data': [('62.204.66.10', 'detail tech data yes'), ('2a00:d00:ff:162:62:204:66:10', 'detail tech data yes')], 'override_mandatory': None}, 'renegotiation_client': {'name': 'renegotiation_client', 'label': 'detail web tls renegotiation-client label', 'status': 1, 'worst_status': 5, 'verdict': 'detail web tls renegotiation-client verdict good', 'exp': 'detail web tls renegotiation-client exp', 'tech_type': 'table', 'tech_string': 'detail web tls renegotiation-client tech table', 'tech_data': [('62.204.66.10', 'detail tech data no'), ('2a00:d00:ff:162:62:204:66:10', 'detail tech data no')], 'override_mandatory': None}, 'cert_trust': {'name': 'cert_trust', 'label': 'detail web tls cert-trust label', 'status': 1, 'worst_status': 0, 'verdict': 'detail web tls cert-trust verdict good', 'exp': 'detail web tls cert-trust exp', 'tech_type': 'table', 'tech_string': 'detail web tls cert-trust tech table', 'tech_data': [('62.204.66.10', ''), ('2a00:d00:ff:162:62:204:66:10', '')], 'override_mandatory': None}, 'cert_pubkey': {'name': 'cert_pubkey', 'label': 'detail web tls cert-pubkey label', 'status': 1, 'worst_status': 0, 'verdict': 'detail web tls cert-pubkey verdict good', 'exp': 'detail web tls cert-pubkey exp', 'tech_type': 'table', 'tech_string': 'detail web tls cert-pubkey tech table', 'tech_data': [('62.204.66.10', ''), ('2a00:d00:ff:162:62:204:66:10', '')], 'override_mandatory': None}, 'cert_signature': {'name': 'cert_signature', 'label': 'detail web tls cert-signature label', 'status': 1, 'worst_status': 0, 'verdict': 'detail web tls cert-signature verdict good', 'exp': 'detail web tls cert-signature exp', 'tech_type': 'table_multi_col', 'tech_string': 'detail web tls cert-signature tech table', 'tech_data': [('62.204.66.10', ''), ('2a00:d00:ff:162:62:204:66:10', '')], 'override_mandatory': None}, 'cert_hostmatch': {'name': 'cert_hostmatch', 'label': 'detail web tls cert-hostmatch label', 'status': 1, 'worst_status': 0, 'verdict': 'detail web tls cert-hostmatch verdict good', 'exp': 'detail web tls cert-hostmatch exp', 'tech_type': 'table', 'tech_string': 'detail web tls cert-hostmatch tech table', 'tech_data': [('62.204.66.10', ''), ('2a00:d00:ff:162:62:204:66:10', '')], 'override_mandatory': None}, 'web_caa': {'name': 'web_caa', 'label': 'detail web caa label', 'status': 1, 'worst_status': 5, 'verdict': 'detail web caa verdict good', 'exp': 'detail web caa exp', 'tech_type': 'table_translatable', 'tech_string': 'detail web caa tech table', 'tech_data': [[{'msgid': 'detail tech data caa found_host', 'context': {'host': 'internet.nl.'}}]], 'override_mandatory': None}, 'dane_exists': {'name': 'dane_exists', 'label': 'detail web tls dane-exists label', 'status': 1, 'worst_status': 5, 'verdict': 'detail web tls dane-exists verdict good', 'exp': 'detail web tls dane-exists exp', 'tech_type': 'table', 'tech_string': 'detail web tls dane-exists tech table', 'tech_data': [('62.204.66.10', ['2 1 1 2bbad93ab5c79279ec121507f272cbe0c6647a3aae52e22f388afab426b4adba', '2 1 1 3586d4ecf070578cbd27aedce20b964e48bc149faeb9dad72f46b857869172b8', '2 1 1 6ddac18698f7f1f7e1c69b9bce420d974ac6f94ca8b2c761701623f99c767dc7', '2 1 1 885bf0572252c6741dc9a52f5044487fef2a93b811cdedfad7624cc283b7cdd5', '2 1 1 8d02536c887482bc34ff54e41d2ba659bf85b341a0a20afadb5813dcfbcf286d', '2 1 1 919c0df7a787b597ed056ace654b1de9c0387acf349f73734a4fd7b58cf612a4', '2 1 1 cbbc559b44d524d6a132bdac672744da3407f12aae5d5f722c5f6c7913871c75', '2 1 1 d016e1fe311948aca64f2de44ce86c9a51ca041df6103bb52a88eb3f761f57d7', '2 1 1 f1440a9b76e1e41e53a4cb461329bf6337b419726be513e42e19f1c691c5d4b2', '2 1 1 f1647a5ee3efac54c892e930584fe47979b7acd1c76c1271bca1c5076d869888', '2 1 1 025490860b498ab73c6a12f27a49ad5fe230fafe3ac8f6112c9b7d0aad46941d']), ('2a00:d00:ff:162:62:204:66:10', ['2 1 1 8d02536c887482bc34ff54e41d2ba659bf85b341a0a20afadb5813dcfbcf286d', '2 1 1 919c0df7a787b597ed056ace654b1de9c0387acf349f73734a4fd7b58cf612a4', '2 1 1 cbbc559b44d524d6a132bdac672744da3407f12aae5d5f722c5f6c7913871c75', '2 1 1 d016e1fe311948aca64f2de44ce86c9a51ca041df6103bb52a88eb3f761f57d7', '2 1 1 f1440a9b76e1e41e53a4cb461329bf6337b419726be513e42e19f1c691c5d4b2', '2 1 1 f1647a5ee3efac54c892e930584fe47979b7acd1c76c1271bca1c5076d869888', '2 1 1 025490860b498ab73c6a12f27a49ad5fe230fafe3ac8f6112c9b7d0aad46941d', '2 1 1 2bbad93ab5c79279ec121507f272cbe0c6647a3aae52e22f388afab426b4adba', '2 1 1 3586d4ecf070578cbd27aedce20b964e48bc149faeb9dad72f46b857869172b8', '2 1 1 6ddac18698f7f1f7e1c69b9bce420d974ac6f94ca8b2c761701623f99c767dc7', '2 1 1 885bf0572252c6741dc9a52f5044487fef2a93b811cdedfad7624cc283b7cdd5'])], 'override_mandatory': None}, 'dane_valid': {'name': 'dane_valid', 'label': 'detail web tls dane-valid label', 'status': 1, 'worst_status': 2, 'verdict': 'detail web tls dane-valid verdict good', 'exp': 'detail web tls dane-valid exp', 'tech_type': 'table', 'tech_string': 'detail web tls dane-valid tech table', 'tech_data': [('62.204.66.10', 'detail tech data yes'), ('2a00:d00:ff:162:62:204:66:10', 'detail tech data yes')], 'override_mandatory': None}, 'zero_rtt': {'name': 'zero_rtt', 'label': 'detail web tls zero-rtt label', 'status': 1, 'worst_status': 0, 'verdict': 'detail web tls zero-rtt verdict good', 'exp': 'detail web tls zero-rtt exp', 'tech_type': 'table', 'tech_string': 'detail web tls zero-rtt tech table', 'tech_data': [('62.204.66.10', 'detail tech data no'), ('2a00:d00:ff:162:62:204:66:10', 'detail tech data no')], 'override_mandatory': None}, 'ocsp_stapling': {'name': 'ocsp_stapling', 'label': 'detail web tls ocsp-stapling label', 'status': 1, 'worst_status': 2, 'verdict': 'detail web tls ocsp-stapling verdict good', 'exp': 'detail web tls ocsp-stapling exp', 'tech_type': 'table', 'tech_string': 'detail web tls ocsp-stapling tech table', 'tech_data': [('62.204.66.10', 'detail tech data yes'), ('2a00:d00:ff:162:62:204:66:10', 'detail tech data yes')], 'override_mandatory': None}, 'kex_hash_func': {'name': 'kex_hash_func', 'label': 'detail web tls kex-hash-func label', 'status': 1, 'worst_status': 2, 'verdict': 'detail web tls kex-hash-func verdict good', 'exp': 'detail web tls kex-hash-func exp', 'tech_type': 'table', 'tech_string': 'detail web tls kex-hash-func tech table', 'tech_data': [('62.204.66.10', 'detail tech data yes'), ('2a00:d00:ff:162:62:204:66:10', 'detail tech data yes')], 'override_mandatory': None}}", + "score": 130, + "max_score": 130, + "timestamp": "2025-03-14T15:14:05.828Z" + } + }, + { + "model": "checks.webtesttls", + "pk": 9001, + "fields": { + "domain": "example.nl", + "report": "{'https_exists': {'name': 'https_exists', 'label': 'detail web tls https-exists label', 'status': 1, 'worst_status': 0, 'verdict': 'detail web tls https-exists verdict good', 'exp': 'detail web tls https-exists exp', 'tech_type': 'table', 'tech_string': 'detail web tls https-exists tech table', 'tech_data': [('94.198.159.35', 'detail tech data yes'), ('2a00:d78:0:712:94:198:159:35', 'detail tech data yes')], 'override_mandatory': None}, 'https_forced': {'name': 'https_forced', 'label': 'detail web tls https-forced label', 'status': 1, 'worst_status': 0, 'verdict': 'detail web tls https-forced verdict good', 'exp': 'detail web tls https-forced exp', 'tech_type': 'table', 'tech_string': 'detail web tls https-forced tech table', 'tech_data': [('94.198.159.35', 'detail tech data yes'), ('2a00:d78:0:712:94:198:159:35', 'detail tech data yes')], 'override_mandatory': None}, 'https_hsts': {'name': 'https_hsts', 'label': 'detail web tls https-hsts label', 'status': 1, 'worst_status': 0, 'verdict': 'detail web tls https-hsts verdict good', 'exp': 'detail web tls https-hsts exp', 'tech_type': 'table', 'tech_string': 'detail web tls https-hsts tech table', 'tech_data': [('94.198.159.35', ['max-age=31622400']), ('2a00:d78:0:712:94:198:159:35', ['max-age=31622400'])], 'override_mandatory': None}, 'http_compression': {'name': 'http_compression', 'label': 'detail web tls http-compression label', 'status': 1, 'worst_status': 5, 'verdict': 'detail web tls http-compression verdict good', 'exp': 'detail web tls http-compression exp', 'tech_type': 'table', 'tech_string': 'detail web tls http-compression tech table', 'tech_data': [('94.198.159.35', 'detail tech data no'), ('2a00:d78:0:712:94:198:159:35', 'detail tech data no')], 'override_mandatory': None}, 'fs_params': {'name': 'fs_params', 'label': 'detail web tls fs-params label', 'status': 1, 'worst_status': 0, 'verdict': 'detail web tls fs-params verdict good', 'exp': 'detail web tls fs-params exp', 'tech_type': 'table_multi_col', 'tech_string': 'detail web tls fs-params tech table', 'tech_data': [('94.198.159.35', ''), ('2a00:d78:0:712:94:198:159:35', '')], 'override_mandatory': None}, 'tls_ciphers': {'name': 'tls_ciphers', 'label': 'detail web tls ciphers label', 'status': 1, 'worst_status': 0, 'verdict': 'detail web tls ciphers verdict good', 'exp': 'detail web tls ciphers exp', 'tech_type': 'table_multi_col', 'tech_string': 'detail web tls ciphers tech table', 'tech_data': [('94.198.159.35', ''), ('2a00:d78:0:712:94:198:159:35', '')], 'override_mandatory': None}, 'tls_cipher_order': {'name': 'tls_cipher_order', 'label': 'detail web tls cipher-order label', 'status': 1, 'worst_status': 0, 'verdict': 'detail web tls cipher-order verdict na', 'exp': 'detail web tls cipher-order exp', 'tech_type': 'table_multi_col', 'tech_string': 'detail web tls cipher-order tech table', 'tech_data': [('94.198.159.35', ''), ('2a00:d78:0:712:94:198:159:35', '')], 'override_mandatory': None}, 'tls_version': {'name': 'tls_version', 'label': 'detail web tls version label', 'status': 1, 'worst_status': 0, 'verdict': 'detail web tls version verdict good', 'exp': 'detail web tls version exp', 'tech_type': 'table_multi_col', 'tech_string': 'detail web tls version tech table', 'tech_data': [('94.198.159.35', ['TLS 1.3', 'TLS 1.2'], ['detail tech data good', 'detail tech data sufficient']), ('2a00:d78:0:712:94:198:159:35', ['TLS 1.3', 'TLS 1.2'], ['detail tech data good', 'detail tech data sufficient'])], 'override_mandatory': None}, 'tls_compression': {'name': 'tls_compression', 'label': 'detail web tls compression label', 'status': 1, 'worst_status': 0, 'verdict': 'detail web tls compression verdict good', 'exp': 'detail web tls compression exp', 'tech_type': 'table', 'tech_string': 'detail web tls compression tech table', 'tech_data': [('94.198.159.35', 'detail tech data no'), ('2a00:d78:0:712:94:198:159:35', 'detail tech data no')], 'override_mandatory': None}, 'renegotiation_secure': {'name': 'renegotiation_secure', 'label': 'detail web tls renegotiation-secure label', 'status': 1, 'worst_status': 0, 'verdict': 'detail web tls renegotiation-secure verdict good', 'exp': 'detail web tls renegotiation-secure exp', 'tech_type': 'table', 'tech_string': 'detail web tls renegotiation-secure tech table', 'tech_data': [('94.198.159.35', 'detail tech data yes'), ('2a00:d78:0:712:94:198:159:35', 'detail tech data yes')], 'override_mandatory': None}, 'renegotiation_client': {'name': 'renegotiation_client', 'label': 'detail web tls renegotiation-client label', 'status': 1, 'worst_status': 5, 'verdict': 'detail web tls renegotiation-client verdict good', 'exp': 'detail web tls renegotiation-client exp', 'tech_type': 'table', 'tech_string': 'detail web tls renegotiation-client tech table', 'tech_data': [('94.198.159.35', 'detail tech data no'), ('2a00:d78:0:712:94:198:159:35', 'detail tech data no')], 'override_mandatory': None}, 'cert_trust': {'name': 'cert_trust', 'label': 'detail web tls cert-trust label', 'status': 1, 'worst_status': 0, 'verdict': 'detail web tls cert-trust verdict good', 'exp': 'detail web tls cert-trust exp', 'tech_type': 'table', 'tech_string': 'detail web tls cert-trust tech table', 'tech_data': [('94.198.159.35', ''), ('2a00:d78:0:712:94:198:159:35', '')], 'override_mandatory': None}, 'cert_pubkey': {'name': 'cert_pubkey', 'label': 'detail web tls cert-pubkey label', 'status': 1, 'worst_status': 0, 'verdict': 'detail web tls cert-pubkey verdict good', 'exp': 'detail web tls cert-pubkey exp', 'tech_type': 'table', 'tech_string': 'detail web tls cert-pubkey tech table', 'tech_data': [('94.198.159.35', ''), ('2a00:d78:0:712:94:198:159:35', '')], 'override_mandatory': None}, 'cert_signature': {'name': 'cert_signature', 'label': 'detail web tls cert-signature label', 'status': 1, 'worst_status': 0, 'verdict': 'detail web tls cert-signature verdict good', 'exp': 'detail web tls cert-signature exp', 'tech_type': 'table_multi_col', 'tech_string': 'detail web tls cert-signature tech table', 'tech_data': [('94.198.159.35', ''), ('2a00:d78:0:712:94:198:159:35', '')], 'override_mandatory': None}, 'cert_hostmatch': {'name': 'cert_hostmatch', 'label': 'detail web tls cert-hostmatch label', 'status': 1, 'worst_status': 0, 'verdict': 'detail web tls cert-hostmatch verdict good', 'exp': 'detail web tls cert-hostmatch exp', 'tech_type': 'table', 'tech_string': 'detail web tls cert-hostmatch tech table', 'tech_data': [('94.198.159.35', ''), ('2a00:d78:0:712:94:198:159:35', '')], 'override_mandatory': None}, 'web_caa': {'name': 'web_caa', 'label': 'detail web caa label', 'status': 1, 'worst_status': 5, 'verdict': 'detail web caa verdict good', 'exp': 'detail web caa exp', 'tech_type': 'table_translatable', 'tech_string': 'detail web caa tech table', 'tech_data': [[{'msgid': 'detail tech data caa found_host', 'context': {'host': 'example.nl.'}}]], 'override_mandatory': None}, 'dane_exists': {'name': 'dane_exists', 'label': 'detail web tls dane-exists label', 'status': 1, 'worst_status': 5, 'verdict': 'detail web tls dane-exists verdict good', 'exp': 'detail web tls dane-exists exp', 'tech_type': 'table', 'tech_string': 'detail web tls dane-exists tech table', 'tech_data': [('94.198.159.35', ['0 0 1 4ff460d54b9c86dabfbcfc5712e0400d2bed3fbc4d4fbdaa86e06adcd2a9ad7a']), ('2a00:d78:0:712:94:198:159:35', ['0 0 1 4ff460d54b9c86dabfbcfc5712e0400d2bed3fbc4d4fbdaa86e06adcd2a9ad7a'])], 'override_mandatory': None}, 'dane_valid': {'name': 'dane_valid', 'label': 'detail web tls dane-valid label', 'status': 1, 'worst_status': 2, 'verdict': 'detail web tls dane-valid verdict good', 'exp': 'detail web tls dane-valid exp', 'tech_type': 'table', 'tech_string': 'detail web tls dane-valid tech table', 'tech_data': [('94.198.159.35', 'detail tech data yes'), ('2a00:d78:0:712:94:198:159:35', 'detail tech data yes')], 'override_mandatory': None}, 'zero_rtt': {'name': 'zero_rtt', 'label': 'detail web tls zero-rtt label', 'status': 1, 'worst_status': 0, 'verdict': 'detail web tls zero-rtt verdict good', 'exp': 'detail web tls zero-rtt exp', 'tech_type': 'table', 'tech_string': 'detail web tls zero-rtt tech table', 'tech_data': [('94.198.159.35', 'detail tech data no'), ('2a00:d78:0:712:94:198:159:35', 'detail tech data no')], 'override_mandatory': None}, 'ocsp_stapling': {'name': 'ocsp_stapling', 'label': 'detail web tls ocsp-stapling label', 'status': 1, 'worst_status': 2, 'verdict': 'detail web tls ocsp-stapling verdict good', 'exp': 'detail web tls ocsp-stapling exp', 'tech_type': 'table', 'tech_string': 'detail web tls ocsp-stapling tech table', 'tech_data': [('94.198.159.35', 'detail tech data yes'), ('2a00:d78:0:712:94:198:159:35', 'detail tech data yes')], 'override_mandatory': None}, 'kex_hash_func': {'name': 'kex_hash_func', 'label': 'detail web tls kex-hash-func label', 'status': 1, 'worst_status': 2, 'verdict': 'detail web tls kex-hash-func verdict good', 'exp': 'detail web tls kex-hash-func exp', 'tech_type': 'table', 'tech_string': 'detail web tls kex-hash-func tech table', 'tech_data': [('94.198.159.35', 'detail tech data yes'), ('2a00:d78:0:712:94:198:159:35', 'detail tech data yes')], 'override_mandatory': None}}", + "score": 130, + "max_score": 130, + "timestamp": "2025-03-14T15:14:24.230Z" + } + }, + { + "model": "checks.webtesttls", + "pk": 9002, + "fields": { + "domain": "ipv6.internet.nl", + "report": "{'https_exists': {'name': 'https_exists', 'label': 'detail web tls https-exists label', 'status': 1, 'worst_status': 0, 'verdict': 'detail web tls https-exists verdict good', 'exp': 'detail web tls https-exists exp', 'tech_type': 'table', 'tech_string': 'detail web tls https-exists tech table', 'tech_data': [('2a00:d00:ff:162:62:204:66:10', 'detail tech data yes')], 'override_mandatory': None}, 'https_forced': {'name': 'https_forced', 'label': 'detail web tls https-forced label', 'status': 1, 'worst_status': 0, 'verdict': 'detail web tls https-forced verdict good', 'exp': 'detail web tls https-forced exp', 'tech_type': 'table', 'tech_string': 'detail web tls https-forced tech table', 'tech_data': [('2a00:d00:ff:162:62:204:66:10', 'detail tech data yes')], 'override_mandatory': None}, 'https_hsts': {'name': 'https_hsts', 'label': 'detail web tls https-hsts label', 'status': 1, 'worst_status': 0, 'verdict': 'detail web tls https-hsts verdict good', 'exp': 'detail web tls https-hsts exp', 'tech_type': 'table', 'tech_string': 'detail web tls https-hsts tech table', 'tech_data': [('2a00:d00:ff:162:62:204:66:10', ['max-age=31536000;'])], 'override_mandatory': None}, 'http_compression': {'name': 'http_compression', 'label': 'detail web tls http-compression label', 'status': 1, 'worst_status': 5, 'verdict': 'detail web tls http-compression verdict good', 'exp': 'detail web tls http-compression exp', 'tech_type': 'table', 'tech_string': 'detail web tls http-compression tech table', 'tech_data': [('2a00:d00:ff:162:62:204:66:10', 'detail tech data no')], 'override_mandatory': None}, 'fs_params': {'name': 'fs_params', 'label': 'detail web tls fs-params label', 'status': 1, 'worst_status': 0, 'verdict': 'detail web tls fs-params verdict good', 'exp': 'detail web tls fs-params exp', 'tech_type': 'table_multi_col', 'tech_string': 'detail web tls fs-params tech table', 'tech_data': [('2a00:d00:ff:162:62:204:66:10', '')], 'override_mandatory': None}, 'tls_ciphers': {'name': 'tls_ciphers', 'label': 'detail web tls ciphers label', 'status': 1, 'worst_status': 0, 'verdict': 'detail web tls ciphers verdict good', 'exp': 'detail web tls ciphers exp', 'tech_type': 'table_multi_col', 'tech_string': 'detail web tls ciphers tech table', 'tech_data': [('2a00:d00:ff:162:62:204:66:10', '')], 'override_mandatory': None}, 'tls_cipher_order': {'name': 'tls_cipher_order', 'label': 'detail web tls cipher-order label', 'status': 1, 'worst_status': 0, 'verdict': 'detail web tls cipher-order verdict na', 'exp': 'detail web tls cipher-order exp', 'tech_type': 'table_multi_col', 'tech_string': 'detail web tls cipher-order tech table', 'tech_data': [('2a00:d00:ff:162:62:204:66:10', '')], 'override_mandatory': None}, 'tls_version': {'name': 'tls_version', 'label': 'detail web tls version label', 'status': 1, 'worst_status': 0, 'verdict': 'detail web tls version verdict good', 'exp': 'detail web tls version exp', 'tech_type': 'table_multi_col', 'tech_string': 'detail web tls version tech table', 'tech_data': [('2a00:d00:ff:162:62:204:66:10', ['TLS 1.3', 'TLS 1.2'], ['detail tech data good', 'detail tech data sufficient'])], 'override_mandatory': None}, 'tls_compression': {'name': 'tls_compression', 'label': 'detail web tls compression label', 'status': 1, 'worst_status': 0, 'verdict': 'detail web tls compression verdict good', 'exp': 'detail web tls compression exp', 'tech_type': 'table', 'tech_string': 'detail web tls compression tech table', 'tech_data': [('2a00:d00:ff:162:62:204:66:10', 'detail tech data no')], 'override_mandatory': None}, 'renegotiation_secure': {'name': 'renegotiation_secure', 'label': 'detail web tls renegotiation-secure label', 'status': 1, 'worst_status': 0, 'verdict': 'detail web tls renegotiation-secure verdict good', 'exp': 'detail web tls renegotiation-secure exp', 'tech_type': 'table', 'tech_string': 'detail web tls renegotiation-secure tech table', 'tech_data': [('2a00:d00:ff:162:62:204:66:10', 'detail tech data yes')], 'override_mandatory': None}, 'renegotiation_client': {'name': 'renegotiation_client', 'label': 'detail web tls renegotiation-client label', 'status': 1, 'worst_status': 5, 'verdict': 'detail web tls renegotiation-client verdict good', 'exp': 'detail web tls renegotiation-client exp', 'tech_type': 'table', 'tech_string': 'detail web tls renegotiation-client tech table', 'tech_data': [('2a00:d00:ff:162:62:204:66:10', 'detail tech data no')], 'override_mandatory': None}, 'cert_trust': {'name': 'cert_trust', 'label': 'detail web tls cert-trust label', 'status': 1, 'worst_status': 0, 'verdict': 'detail web tls cert-trust verdict good', 'exp': 'detail web tls cert-trust exp', 'tech_type': 'table', 'tech_string': 'detail web tls cert-trust tech table', 'tech_data': [('2a00:d00:ff:162:62:204:66:10', '')], 'override_mandatory': None}, 'cert_pubkey': {'name': 'cert_pubkey', 'label': 'detail web tls cert-pubkey label', 'status': 1, 'worst_status': 0, 'verdict': 'detail web tls cert-pubkey verdict good', 'exp': 'detail web tls cert-pubkey exp', 'tech_type': 'table', 'tech_string': 'detail web tls cert-pubkey tech table', 'tech_data': [('2a00:d00:ff:162:62:204:66:10', '')], 'override_mandatory': None}, 'cert_signature': {'name': 'cert_signature', 'label': 'detail web tls cert-signature label', 'status': 1, 'worst_status': 0, 'verdict': 'detail web tls cert-signature verdict good', 'exp': 'detail web tls cert-signature exp', 'tech_type': 'table_multi_col', 'tech_string': 'detail web tls cert-signature tech table', 'tech_data': [('2a00:d00:ff:162:62:204:66:10', '')], 'override_mandatory': None}, 'cert_hostmatch': {'name': 'cert_hostmatch', 'label': 'detail web tls cert-hostmatch label', 'status': 1, 'worst_status': 0, 'verdict': 'detail web tls cert-hostmatch verdict good', 'exp': 'detail web tls cert-hostmatch exp', 'tech_type': 'table', 'tech_string': 'detail web tls cert-hostmatch tech table', 'tech_data': [('2a00:d00:ff:162:62:204:66:10', '')], 'override_mandatory': None}, 'web_caa': {'name': 'web_caa', 'label': 'detail web caa label', 'status': 1, 'worst_status': 5, 'verdict': 'detail web caa verdict good', 'exp': 'detail web caa exp', 'tech_type': 'table_translatable', 'tech_string': 'detail web caa tech table', 'tech_data': [[{'msgid': 'detail tech data caa found_host', 'context': {'host': 'internet.nl.'}}]], 'override_mandatory': None}, 'dane_exists': {'name': 'dane_exists', 'label': 'detail web tls dane-exists label', 'status': 1, 'worst_status': 5, 'verdict': 'detail web tls dane-exists verdict good', 'exp': 'detail web tls dane-exists exp', 'tech_type': 'table', 'tech_string': 'detail web tls dane-exists tech table', 'tech_data': [('2a00:d00:ff:162:62:204:66:10', ['2 1 1 f1647a5ee3efac54c892e930584fe47979b7acd1c76c1271bca1c5076d869888', '2 1 1 025490860b498ab73c6a12f27a49ad5fe230fafe3ac8f6112c9b7d0aad46941d', '2 1 1 2bbad93ab5c79279ec121507f272cbe0c6647a3aae52e22f388afab426b4adba', '2 1 1 3586d4ecf070578cbd27aedce20b964e48bc149faeb9dad72f46b857869172b8', '2 1 1 6ddac18698f7f1f7e1c69b9bce420d974ac6f94ca8b2c761701623f99c767dc7', '2 1 1 885bf0572252c6741dc9a52f5044487fef2a93b811cdedfad7624cc283b7cdd5', '2 1 1 8d02536c887482bc34ff54e41d2ba659bf85b341a0a20afadb5813dcfbcf286d', '2 1 1 919c0df7a787b597ed056ace654b1de9c0387acf349f73734a4fd7b58cf612a4', '2 1 1 cbbc559b44d524d6a132bdac672744da3407f12aae5d5f722c5f6c7913871c75', '2 1 1 d016e1fe311948aca64f2de44ce86c9a51ca041df6103bb52a88eb3f761f57d7', '2 1 1 f1440a9b76e1e41e53a4cb461329bf6337b419726be513e42e19f1c691c5d4b2'])], 'override_mandatory': None}, 'dane_valid': {'name': 'dane_valid', 'label': 'detail web tls dane-valid label', 'status': 1, 'worst_status': 2, 'verdict': 'detail web tls dane-valid verdict good', 'exp': 'detail web tls dane-valid exp', 'tech_type': 'table', 'tech_string': 'detail web tls dane-valid tech table', 'tech_data': [('2a00:d00:ff:162:62:204:66:10', 'detail tech data yes')], 'override_mandatory': None}, 'zero_rtt': {'name': 'zero_rtt', 'label': 'detail web tls zero-rtt label', 'status': 1, 'worst_status': 0, 'verdict': 'detail web tls zero-rtt verdict good', 'exp': 'detail web tls zero-rtt exp', 'tech_type': 'table', 'tech_string': 'detail web tls zero-rtt tech table', 'tech_data': [('2a00:d00:ff:162:62:204:66:10', 'detail tech data no')], 'override_mandatory': None}, 'ocsp_stapling': {'name': 'ocsp_stapling', 'label': 'detail web tls ocsp-stapling label', 'status': 1, 'worst_status': 2, 'verdict': 'detail web tls ocsp-stapling verdict good', 'exp': 'detail web tls ocsp-stapling exp', 'tech_type': 'table', 'tech_string': 'detail web tls ocsp-stapling tech table', 'tech_data': [('2a00:d00:ff:162:62:204:66:10', 'detail tech data yes')], 'override_mandatory': None}, 'kex_hash_func': {'name': 'kex_hash_func', 'label': 'detail web tls kex-hash-func label', 'status': 1, 'worst_status': 2, 'verdict': 'detail web tls kex-hash-func verdict good', 'exp': 'detail web tls kex-hash-func exp', 'tech_type': 'table', 'tech_string': 'detail web tls kex-hash-func tech table', 'tech_data': [('2a00:d00:ff:162:62:204:66:10', 'detail tech data yes')], 'override_mandatory': None}}", + "score": 130, + "max_score": 130, + "timestamp": "2025-03-14T15:14:32.551Z" + } + }, + { + "model": "checks.webtesttls", + "pk": 9003, + "fields": { + "domain": "forfun.net", + "report": "{'https_exists': {'name': 'https_exists', 'label': 'detail web tls https-exists label', 'status': 1, 'worst_status': 0, 'verdict': 'detail web tls https-exists verdict good', 'exp': 'detail web tls https-exists exp', 'tech_type': 'table', 'tech_string': 'detail web tls https-exists tech table', 'tech_data': [('2a05:1500:600:1:1c00:4aff:fe00:428', 'detail tech data yes')], 'override_mandatory': None}, 'https_forced': {'name': 'https_forced', 'label': 'detail web tls https-forced label', 'status': 1, 'worst_status': 0, 'verdict': 'detail web tls https-forced verdict good', 'exp': 'detail web tls https-forced exp', 'tech_type': 'table', 'tech_string': 'detail web tls https-forced tech table', 'tech_data': [('2a05:1500:600:1:1c00:4aff:fe00:428', 'detail tech data yes')], 'override_mandatory': None}, 'https_hsts': {'name': 'https_hsts', 'label': 'detail web tls https-hsts label', 'status': 1, 'worst_status': 0, 'verdict': 'detail web tls https-hsts verdict good', 'exp': 'detail web tls https-hsts exp', 'tech_type': 'table', 'tech_string': 'detail web tls https-hsts tech table', 'tech_data': [('2a05:1500:600:1:1c00:4aff:fe00:428', ['max-age=31536000'])], 'override_mandatory': None}, 'http_compression': {'name': 'http_compression', 'label': 'detail web tls http-compression label', 'status': 1, 'worst_status': 5, 'verdict': 'detail web tls http-compression verdict good', 'exp': 'detail web tls http-compression exp', 'tech_type': 'table', 'tech_string': 'detail web tls http-compression tech table', 'tech_data': [('2a05:1500:600:1:1c00:4aff:fe00:428', 'detail tech data no')], 'override_mandatory': None}, 'fs_params': {'name': 'fs_params', 'label': 'detail web tls fs-params label', 'status': 1, 'worst_status': 0, 'verdict': 'detail web tls fs-params verdict good', 'exp': 'detail web tls fs-params exp', 'tech_type': 'table_multi_col', 'tech_string': 'detail web tls fs-params tech table', 'tech_data': [('2a05:1500:600:1:1c00:4aff:fe00:428', '')], 'override_mandatory': None}, 'tls_ciphers': {'name': 'tls_ciphers', 'label': 'detail web tls ciphers label', 'status': 1, 'worst_status': 0, 'verdict': 'detail web tls ciphers verdict good', 'exp': 'detail web tls ciphers exp', 'tech_type': 'table_multi_col', 'tech_string': 'detail web tls ciphers tech table', 'tech_data': [('2a05:1500:600:1:1c00:4aff:fe00:428', '')], 'override_mandatory': None}, 'tls_cipher_order': {'name': 'tls_cipher_order', 'label': 'detail web tls cipher-order label', 'status': 1, 'worst_status': 0, 'verdict': 'detail web tls cipher-order verdict na', 'exp': 'detail web tls cipher-order exp', 'tech_type': 'table_multi_col', 'tech_string': 'detail web tls cipher-order tech table', 'tech_data': [('2a05:1500:600:1:1c00:4aff:fe00:428', '')], 'override_mandatory': None}, 'tls_version': {'name': 'tls_version', 'label': 'detail web tls version label', 'status': 1, 'worst_status': 0, 'verdict': 'detail web tls version verdict good', 'exp': 'detail web tls version exp', 'tech_type': 'table_multi_col', 'tech_string': 'detail web tls version tech table', 'tech_data': [('2a05:1500:600:1:1c00:4aff:fe00:428', ['TLS 1.3', 'TLS 1.2'], ['detail tech data good', 'detail tech data sufficient'])], 'override_mandatory': None}, 'tls_compression': {'name': 'tls_compression', 'label': 'detail web tls compression label', 'status': 1, 'worst_status': 0, 'verdict': 'detail web tls compression verdict good', 'exp': 'detail web tls compression exp', 'tech_type': 'table', 'tech_string': 'detail web tls compression tech table', 'tech_data': [('2a05:1500:600:1:1c00:4aff:fe00:428', 'detail tech data no')], 'override_mandatory': None}, 'renegotiation_secure': {'name': 'renegotiation_secure', 'label': 'detail web tls renegotiation-secure label', 'status': 1, 'worst_status': 0, 'verdict': 'detail web tls renegotiation-secure verdict good', 'exp': 'detail web tls renegotiation-secure exp', 'tech_type': 'table', 'tech_string': 'detail web tls renegotiation-secure tech table', 'tech_data': [('2a05:1500:600:1:1c00:4aff:fe00:428', 'detail tech data yes')], 'override_mandatory': None}, 'renegotiation_client': {'name': 'renegotiation_client', 'label': 'detail web tls renegotiation-client label', 'status': 1, 'worst_status': 5, 'verdict': 'detail web tls renegotiation-client verdict good', 'exp': 'detail web tls renegotiation-client exp', 'tech_type': 'table', 'tech_string': 'detail web tls renegotiation-client tech table', 'tech_data': [('2a05:1500:600:1:1c00:4aff:fe00:428', 'detail tech data no')], 'override_mandatory': None}, 'cert_trust': {'name': 'cert_trust', 'label': 'detail web tls cert-trust label', 'status': 1, 'worst_status': 0, 'verdict': 'detail web tls cert-trust verdict good', 'exp': 'detail web tls cert-trust exp', 'tech_type': 'table', 'tech_string': 'detail web tls cert-trust tech table', 'tech_data': [('2a05:1500:600:1:1c00:4aff:fe00:428', '')], 'override_mandatory': None}, 'cert_pubkey': {'name': 'cert_pubkey', 'label': 'detail web tls cert-pubkey label', 'status': 1, 'worst_status': 0, 'verdict': 'detail web tls cert-pubkey verdict good', 'exp': 'detail web tls cert-pubkey exp', 'tech_type': 'table', 'tech_string': 'detail web tls cert-pubkey tech table', 'tech_data': [('2a05:1500:600:1:1c00:4aff:fe00:428', '')], 'override_mandatory': None}, 'cert_signature': {'name': 'cert_signature', 'label': 'detail web tls cert-signature label', 'status': 1, 'worst_status': 0, 'verdict': 'detail web tls cert-signature verdict good', 'exp': 'detail web tls cert-signature exp', 'tech_type': 'table_multi_col', 'tech_string': 'detail web tls cert-signature tech table', 'tech_data': [('2a05:1500:600:1:1c00:4aff:fe00:428', '')], 'override_mandatory': None}, 'cert_hostmatch': {'name': 'cert_hostmatch', 'label': 'detail web tls cert-hostmatch label', 'status': 1, 'worst_status': 0, 'verdict': 'detail web tls cert-hostmatch verdict good', 'exp': 'detail web tls cert-hostmatch exp', 'tech_type': 'table', 'tech_string': 'detail web tls cert-hostmatch tech table', 'tech_data': [('2a05:1500:600:1:1c00:4aff:fe00:428', '')], 'override_mandatory': None}, 'web_caa': {'name': 'web_caa', 'label': 'detail web caa label', 'status': 1, 'worst_status': 5, 'verdict': 'detail web caa verdict good', 'exp': 'detail web caa exp', 'tech_type': 'table_translatable', 'tech_string': 'detail web caa tech table', 'tech_data': [[{'msgid': 'detail tech data caa found_host', 'context': {'host': 'forfun.net.'}}]], 'override_mandatory': None}, 'dane_exists': {'name': 'dane_exists', 'label': 'detail web tls dane-exists label', 'status': 1, 'worst_status': 5, 'verdict': 'detail web tls dane-exists verdict good', 'exp': 'detail web tls dane-exists exp', 'tech_type': 'table', 'tech_string': 'detail web tls dane-exists tech table', 'tech_data': [('2a05:1500:600:1:1c00:4aff:fe00:428', ['0 1 1 0b9fa5a59eed715c26c1020c711b4f6ec42d58b0015e14337a39dad301c5afc3'])], 'override_mandatory': None}, 'dane_valid': {'name': 'dane_valid', 'label': 'detail web tls dane-valid label', 'status': 1, 'worst_status': 2, 'verdict': 'detail web tls dane-valid verdict good', 'exp': 'detail web tls dane-valid exp', 'tech_type': 'table', 'tech_string': 'detail web tls dane-valid tech table', 'tech_data': [('2a05:1500:600:1:1c00:4aff:fe00:428', 'detail tech data yes')], 'override_mandatory': None}, 'zero_rtt': {'name': 'zero_rtt', 'label': 'detail web tls zero-rtt label', 'status': 1, 'worst_status': 0, 'verdict': 'detail web tls zero-rtt verdict good', 'exp': 'detail web tls zero-rtt exp', 'tech_type': 'table', 'tech_string': 'detail web tls zero-rtt tech table', 'tech_data': [('2a05:1500:600:1:1c00:4aff:fe00:428', 'detail tech data no')], 'override_mandatory': None}, 'ocsp_stapling': {'name': 'ocsp_stapling', 'label': 'detail web tls ocsp-stapling label', 'status': 1, 'worst_status': 2, 'verdict': 'detail web tls ocsp-stapling verdict good', 'exp': 'detail web tls ocsp-stapling exp', 'tech_type': 'table', 'tech_string': 'detail web tls ocsp-stapling tech table', 'tech_data': [('2a05:1500:600:1:1c00:4aff:fe00:428', 'detail tech data yes')], 'override_mandatory': None}, 'kex_hash_func': {'name': 'kex_hash_func', 'label': 'detail web tls kex-hash-func label', 'status': 1, 'worst_status': 2, 'verdict': 'detail web tls kex-hash-func verdict good', 'exp': 'detail web tls kex-hash-func exp', 'tech_type': 'table', 'tech_string': 'detail web tls kex-hash-func tech table', 'tech_data': [('2a05:1500:600:1:1c00:4aff:fe00:428', 'detail tech data yes')], 'override_mandatory': None}}", + "score": 130, + "max_score": 130, + "timestamp": "2025-03-14T15:14:40.038Z" + } + }, + { + "model": "checks.webtesttls", + "pk": 9004, + "fields": { + "domain": "ipv6.google.com", + "report": "{'https_exists': {'name': 'https_exists', 'label': 'detail web tls https-exists label', 'status': 1, 'worst_status': 0, 'verdict': 'detail web tls https-exists verdict good', 'exp': 'detail web tls https-exists exp', 'tech_type': 'table', 'tech_string': 'detail web tls https-exists tech table', 'tech_data': [('2a00:1450:4026:804::200e', 'detail tech data yes')], 'override_mandatory': None}, 'https_forced': {'name': 'https_forced', 'label': 'detail web tls https-forced label', 'status': 0, 'worst_status': 0, 'verdict': 'detail web tls https-forced verdict bad', 'exp': 'detail web tls https-forced exp', 'tech_type': 'table', 'tech_string': 'detail web tls https-forced tech table', 'tech_data': [('2a00:1450:4026:804::200e', 'detail tech data no')], 'override_mandatory': None}, 'https_hsts': {'name': 'https_hsts', 'label': 'detail web tls https-hsts label', 'status': 0, 'worst_status': 0, 'verdict': 'detail web tls https-hsts verdict bad', 'exp': 'detail web tls https-hsts exp', 'tech_type': 'table', 'tech_string': 'detail web tls https-hsts tech table', 'tech_data': [('2a00:1450:4026:804::200e', '')], 'override_mandatory': None}, 'http_compression': {'name': 'http_compression', 'label': 'detail web tls http-compression label', 'status': 5, 'worst_status': 5, 'verdict': 'detail web tls http-compression verdict bad', 'exp': 'detail web tls http-compression exp', 'tech_type': 'table', 'tech_string': 'detail web tls http-compression tech table', 'tech_data': [('2a00:1450:4026:804::200e', 'detail tech data yes')], 'override_mandatory': None}, 'fs_params': {'name': 'fs_params', 'label': 'detail web tls fs-params label', 'status': 1, 'worst_status': 0, 'verdict': 'detail web tls fs-params verdict good', 'exp': 'detail web tls fs-params exp', 'tech_type': 'table_multi_col', 'tech_string': 'detail web tls fs-params tech table', 'tech_data': [('2a00:1450:4026:804::200e', '')], 'override_mandatory': None}, 'tls_ciphers': {'name': 'tls_ciphers', 'label': 'detail web tls ciphers label', 'status': 2, 'worst_status': 0, 'verdict': 'detail web tls ciphers verdict phase-out', 'exp': 'detail web tls ciphers exp', 'tech_type': 'table_multi_col', 'tech_string': 'detail web tls ciphers tech table', 'tech_data': [('2a00:1450:4026:804::200e', ['AES128-SHA', 'AES256-GCM-SHA384', 'AES128-GCM-SHA256', 'AES256-SHA', 'DES-CBC3-SHA'], ['detail tech data phase-out', 'detail tech data phase-out', 'detail tech data phase-out', 'detail tech data phase-out', 'detail tech data phase-out'])], 'override_mandatory': None}, 'tls_cipher_order': {'name': 'tls_cipher_order', 'label': 'detail web tls cipher-order label', 'status': 1, 'worst_status': 0, 'verdict': 'detail web tls cipher-order verdict good', 'exp': 'detail web tls cipher-order exp', 'tech_type': 'table_multi_col', 'tech_string': 'detail web tls cipher-order tech table', 'tech_data': [('2a00:1450:4026:804::200e', '')], 'override_mandatory': None}, 'tls_version': {'name': 'tls_version', 'label': 'detail web tls version label', 'status': 2, 'worst_status': 0, 'verdict': 'detail web tls version verdict phase-out', 'exp': 'detail web tls version exp', 'tech_type': 'table_multi_col', 'tech_string': 'detail web tls version tech table', 'tech_data': [('2a00:1450:4026:804::200e', ['TLS 1.3', 'TLS 1.2', 'TLS 1.1', 'TLS 1.0'], ['detail tech data good', 'detail tech data sufficient', 'detail tech data phase-out', 'detail tech data phase-out'])], 'override_mandatory': None}, 'tls_compression': {'name': 'tls_compression', 'label': 'detail web tls compression label', 'status': 1, 'worst_status': 0, 'verdict': 'detail web tls compression verdict good', 'exp': 'detail web tls compression exp', 'tech_type': 'table', 'tech_string': 'detail web tls compression tech table', 'tech_data': [('2a00:1450:4026:804::200e', 'detail tech data no')], 'override_mandatory': None}, 'renegotiation_secure': {'name': 'renegotiation_secure', 'label': 'detail web tls renegotiation-secure label', 'status': 1, 'worst_status': 0, 'verdict': 'detail web tls renegotiation-secure verdict good', 'exp': 'detail web tls renegotiation-secure exp', 'tech_type': 'table', 'tech_string': 'detail web tls renegotiation-secure tech table', 'tech_data': [('2a00:1450:4026:804::200e', 'detail tech data yes')], 'override_mandatory': None}, 'renegotiation_client': {'name': 'renegotiation_client', 'label': 'detail web tls renegotiation-client label', 'status': 1, 'worst_status': 5, 'verdict': 'detail web tls renegotiation-client verdict good', 'exp': 'detail web tls renegotiation-client exp', 'tech_type': 'table', 'tech_string': 'detail web tls renegotiation-client tech table', 'tech_data': [('2a00:1450:4026:804::200e', 'detail tech data no')], 'override_mandatory': None}, 'cert_trust': {'name': 'cert_trust', 'label': 'detail web tls cert-trust label', 'status': 1, 'worst_status': 0, 'verdict': 'detail web tls cert-trust verdict good', 'exp': 'detail web tls cert-trust exp', 'tech_type': 'table', 'tech_string': 'detail web tls cert-trust tech table', 'tech_data': [('2a00:1450:4026:804::200e', '')], 'override_mandatory': None}, 'cert_pubkey': {'name': 'cert_pubkey', 'label': 'detail web tls cert-pubkey label', 'status': 1, 'worst_status': 0, 'verdict': 'detail web tls cert-pubkey verdict good', 'exp': 'detail web tls cert-pubkey exp', 'tech_type': 'table', 'tech_string': 'detail web tls cert-pubkey tech table', 'tech_data': [('2a00:1450:4026:804::200e', '')], 'override_mandatory': None}, 'cert_signature': {'name': 'cert_signature', 'label': 'detail web tls cert-signature label', 'status': 1, 'worst_status': 0, 'verdict': 'detail web tls cert-signature verdict good', 'exp': 'detail web tls cert-signature exp', 'tech_type': 'table_multi_col', 'tech_string': 'detail web tls cert-signature tech table', 'tech_data': [('2a00:1450:4026:804::200e', '')], 'override_mandatory': None}, 'cert_hostmatch': {'name': 'cert_hostmatch', 'label': 'detail web tls cert-hostmatch label', 'status': 1, 'worst_status': 0, 'verdict': 'detail web tls cert-hostmatch verdict good', 'exp': 'detail web tls cert-hostmatch exp', 'tech_type': 'table', 'tech_string': 'detail web tls cert-hostmatch tech table', 'tech_data': [('2a00:1450:4026:804::200e', '')], 'override_mandatory': None}, 'web_caa': {'name': 'web_caa', 'label': 'detail web caa label', 'status': 1, 'worst_status': 5, 'verdict': 'detail web caa verdict good', 'exp': 'detail web caa exp', 'tech_type': 'table_translatable', 'tech_string': 'detail web caa tech table', 'tech_data': [[{'msgid': 'detail tech data caa found_host', 'context': {'host': 'google.com.'}}]], 'override_mandatory': None}, 'dane_exists': {'name': 'dane_exists', 'label': 'detail web tls dane-exists label', 'status': 5, 'worst_status': 5, 'verdict': 'detail web tls dane-exists verdict bad', 'exp': 'detail web tls dane-exists exp', 'tech_type': 'table', 'tech_string': 'detail web tls dane-exists tech table', 'tech_data': [('2a00:1450:4026:804::200e', 'detail tech data no')], 'override_mandatory': None}, 'dane_valid': {'name': 'dane_valid', 'label': 'detail web tls dane-valid label', 'status': 4, 'worst_status': 2, 'verdict': 'detail verdict not-tested', 'exp': 'detail web tls dane-valid exp', 'tech_type': 'table', 'tech_string': 'detail web tls dane-valid tech table', 'tech_data': [('2a00:1450:4026:804::200e', 'detail tech data not-tested')], 'override_mandatory': None}, 'zero_rtt': {'name': 'zero_rtt', 'label': 'detail web tls zero-rtt label', 'status': 0, 'worst_status': 0, 'verdict': 'detail web tls zero-rtt verdict bad', 'exp': 'detail web tls zero-rtt exp', 'tech_type': 'table', 'tech_string': 'detail web tls zero-rtt tech table', 'tech_data': [('2a00:1450:4026:804::200e', 'detail tech data yes')], 'override_mandatory': None}, 'ocsp_stapling': {'name': 'ocsp_stapling', 'label': 'detail web tls ocsp-stapling label', 'status': 5, 'worst_status': 2, 'verdict': 'detail web tls ocsp-stapling verdict ok', 'exp': 'detail web tls ocsp-stapling exp', 'tech_type': 'table', 'tech_string': 'detail web tls ocsp-stapling tech table', 'tech_data': [('2a00:1450:4026:804::200e', 'detail tech data no')], 'override_mandatory': None}, 'kex_hash_func': {'name': 'kex_hash_func', 'label': 'detail web tls kex-hash-func label', 'status': 1, 'worst_status': 2, 'verdict': 'detail web tls kex-hash-func verdict good', 'exp': 'detail web tls kex-hash-func exp', 'tech_type': 'table', 'tech_string': 'detail web tls kex-hash-func tech table', 'tech_data': [('2a00:1450:4026:804::200e', 'detail tech data yes')], 'override_mandatory': None}}", + "score": 100, + "max_score": 130, + "timestamp": "2025-03-14T15:14:47.227Z" + } + }, + { + "model": "checks.webtesttls", + "pk": 9005, + "fields": { + "domain": "servfail.nl", + "report": "{'https_exists': {'name': 'https_exists', 'label': 'detail web tls https-exists label', 'status': 1, 'worst_status': 0, 'verdict': 'detail web tls https-exists verdict good', 'exp': 'detail web tls https-exists exp', 'tech_type': 'table', 'tech_string': 'detail web tls https-exists tech table', 'tech_data': [('2a05:1500:600:1:1c00:4aff:fe00:428', 'detail tech data yes')], 'override_mandatory': None}, 'https_forced': {'name': 'https_forced', 'label': 'detail web tls https-forced label', 'status': 0, 'worst_status': 0, 'verdict': 'detail web tls https-forced verdict bad', 'exp': 'detail web tls https-forced exp', 'tech_type': 'table', 'tech_string': 'detail web tls https-forced tech table', 'tech_data': [('2a05:1500:600:1:1c00:4aff:fe00:428', 'detail tech data no')], 'override_mandatory': None}, 'https_hsts': {'name': 'https_hsts', 'label': 'detail web tls https-hsts label', 'status': 1, 'worst_status': 0, 'verdict': 'detail web tls https-hsts verdict good', 'exp': 'detail web tls https-hsts exp', 'tech_type': 'table', 'tech_string': 'detail web tls https-hsts tech table', 'tech_data': [('2a05:1500:600:1:1c00:4aff:fe00:428', ['max-age=31536000'])], 'override_mandatory': None}, 'http_compression': {'name': 'http_compression', 'label': 'detail web tls http-compression label', 'status': 1, 'worst_status': 5, 'verdict': 'detail web tls http-compression verdict good', 'exp': 'detail web tls http-compression exp', 'tech_type': 'table', 'tech_string': 'detail web tls http-compression tech table', 'tech_data': [('2a05:1500:600:1:1c00:4aff:fe00:428', 'detail tech data no')], 'override_mandatory': None}, 'fs_params': {'name': 'fs_params', 'label': 'detail web tls fs-params label', 'status': 1, 'worst_status': 0, 'verdict': 'detail web tls fs-params verdict good', 'exp': 'detail web tls fs-params exp', 'tech_type': 'table_multi_col', 'tech_string': 'detail web tls fs-params tech table', 'tech_data': [('2a05:1500:600:1:1c00:4aff:fe00:428', '')], 'override_mandatory': None}, 'tls_ciphers': {'name': 'tls_ciphers', 'label': 'detail web tls ciphers label', 'status': 1, 'worst_status': 0, 'verdict': 'detail web tls ciphers verdict good', 'exp': 'detail web tls ciphers exp', 'tech_type': 'table_multi_col', 'tech_string': 'detail web tls ciphers tech table', 'tech_data': [('2a05:1500:600:1:1c00:4aff:fe00:428', '')], 'override_mandatory': None}, 'tls_cipher_order': {'name': 'tls_cipher_order', 'label': 'detail web tls cipher-order label', 'status': 1, 'worst_status': 0, 'verdict': 'detail web tls cipher-order verdict na', 'exp': 'detail web tls cipher-order exp', 'tech_type': 'table_multi_col', 'tech_string': 'detail web tls cipher-order tech table', 'tech_data': [('2a05:1500:600:1:1c00:4aff:fe00:428', '')], 'override_mandatory': None}, 'tls_version': {'name': 'tls_version', 'label': 'detail web tls version label', 'status': 1, 'worst_status': 0, 'verdict': 'detail web tls version verdict good', 'exp': 'detail web tls version exp', 'tech_type': 'table_multi_col', 'tech_string': 'detail web tls version tech table', 'tech_data': [('2a05:1500:600:1:1c00:4aff:fe00:428', ['TLS 1.3', 'TLS 1.2'], ['detail tech data good', 'detail tech data sufficient'])], 'override_mandatory': None}, 'tls_compression': {'name': 'tls_compression', 'label': 'detail web tls compression label', 'status': 1, 'worst_status': 0, 'verdict': 'detail web tls compression verdict good', 'exp': 'detail web tls compression exp', 'tech_type': 'table', 'tech_string': 'detail web tls compression tech table', 'tech_data': [('2a05:1500:600:1:1c00:4aff:fe00:428', 'detail tech data no')], 'override_mandatory': None}, 'renegotiation_secure': {'name': 'renegotiation_secure', 'label': 'detail web tls renegotiation-secure label', 'status': 1, 'worst_status': 0, 'verdict': 'detail web tls renegotiation-secure verdict good', 'exp': 'detail web tls renegotiation-secure exp', 'tech_type': 'table', 'tech_string': 'detail web tls renegotiation-secure tech table', 'tech_data': [('2a05:1500:600:1:1c00:4aff:fe00:428', 'detail tech data yes')], 'override_mandatory': None}, 'renegotiation_client': {'name': 'renegotiation_client', 'label': 'detail web tls renegotiation-client label', 'status': 1, 'worst_status': 5, 'verdict': 'detail web tls renegotiation-client verdict good', 'exp': 'detail web tls renegotiation-client exp', 'tech_type': 'table', 'tech_string': 'detail web tls renegotiation-client tech table', 'tech_data': [('2a05:1500:600:1:1c00:4aff:fe00:428', 'detail tech data no')], 'override_mandatory': None}, 'cert_trust': {'name': 'cert_trust', 'label': 'detail web tls cert-trust label', 'status': 1, 'worst_status': 0, 'verdict': 'detail web tls cert-trust verdict good', 'exp': 'detail web tls cert-trust exp', 'tech_type': 'table', 'tech_string': 'detail web tls cert-trust tech table', 'tech_data': [('2a05:1500:600:1:1c00:4aff:fe00:428', '')], 'override_mandatory': None}, 'cert_pubkey': {'name': 'cert_pubkey', 'label': 'detail web tls cert-pubkey label', 'status': 1, 'worst_status': 0, 'verdict': 'detail web tls cert-pubkey verdict good', 'exp': 'detail web tls cert-pubkey exp', 'tech_type': 'table', 'tech_string': 'detail web tls cert-pubkey tech table', 'tech_data': [('2a05:1500:600:1:1c00:4aff:fe00:428', '')], 'override_mandatory': None}, 'cert_signature': {'name': 'cert_signature', 'label': 'detail web tls cert-signature label', 'status': 1, 'worst_status': 0, 'verdict': 'detail web tls cert-signature verdict good', 'exp': 'detail web tls cert-signature exp', 'tech_type': 'table_multi_col', 'tech_string': 'detail web tls cert-signature tech table', 'tech_data': [('2a05:1500:600:1:1c00:4aff:fe00:428', '')], 'override_mandatory': None}, 'cert_hostmatch': {'name': 'cert_hostmatch', 'label': 'detail web tls cert-hostmatch label', 'status': 0, 'worst_status': 0, 'verdict': 'detail web tls cert-hostmatch verdict bad', 'exp': 'detail web tls cert-hostmatch exp', 'tech_type': 'table', 'tech_string': 'detail web tls cert-hostmatch tech table', 'tech_data': [('2a05:1500:600:1:1c00:4aff:fe00:428', ['forfun.net', 'www.forfun.net'])], 'override_mandatory': None}, 'web_caa': {'name': 'web_caa', 'label': 'detail web caa label', 'status': 5, 'worst_status': 5, 'verdict': 'detail web caa verdict bad', 'exp': 'detail web caa exp', 'tech_type': 'table_translatable', 'tech_string': 'detail web caa tech table', 'tech_data': [[{'msgid': 'detail tech data caa not_found', 'context': {}}]], 'override_mandatory': None}, 'dane_exists': {'name': 'dane_exists', 'label': 'detail web tls dane-exists label', 'status': 5, 'worst_status': 5, 'verdict': 'detail web tls dane-exists verdict bad', 'exp': 'detail web tls dane-exists exp', 'tech_type': 'table', 'tech_string': 'detail web tls dane-exists tech table', 'tech_data': [('2a05:1500:600:1:1c00:4aff:fe00:428', 'detail tech data no')], 'override_mandatory': None}, 'dane_valid': {'name': 'dane_valid', 'label': 'detail web tls dane-valid label', 'status': 4, 'worst_status': 2, 'verdict': 'detail verdict not-tested', 'exp': 'detail web tls dane-valid exp', 'tech_type': 'table', 'tech_string': 'detail web tls dane-valid tech table', 'tech_data': [('2a05:1500:600:1:1c00:4aff:fe00:428', 'detail tech data not-tested')], 'override_mandatory': None}, 'zero_rtt': {'name': 'zero_rtt', 'label': 'detail web tls zero-rtt label', 'status': 1, 'worst_status': 0, 'verdict': 'detail web tls zero-rtt verdict good', 'exp': 'detail web tls zero-rtt exp', 'tech_type': 'table', 'tech_string': 'detail web tls zero-rtt tech table', 'tech_data': [('2a05:1500:600:1:1c00:4aff:fe00:428', 'detail tech data no')], 'override_mandatory': None}, 'ocsp_stapling': {'name': 'ocsp_stapling', 'label': 'detail web tls ocsp-stapling label', 'status': 1, 'worst_status': 2, 'verdict': 'detail web tls ocsp-stapling verdict good', 'exp': 'detail web tls ocsp-stapling exp', 'tech_type': 'table', 'tech_string': 'detail web tls ocsp-stapling tech table', 'tech_data': [('2a05:1500:600:1:1c00:4aff:fe00:428', 'detail tech data yes')], 'override_mandatory': None}, 'kex_hash_func': {'name': 'kex_hash_func', 'label': 'detail web tls kex-hash-func label', 'status': 1, 'worst_status': 2, 'verdict': 'detail web tls kex-hash-func verdict good', 'exp': 'detail web tls kex-hash-func exp', 'tech_type': 'table', 'tech_string': 'detail web tls kex-hash-func tech table', 'tech_data': [('2a05:1500:600:1:1c00:4aff:fe00:428', 'detail tech data yes')], 'override_mandatory': None}}", + "score": 110, + "max_score": 130, + "timestamp": "2025-03-14T15:14:55.342Z" + } + }, + { + "model": "checks.webtesttls", + "pk": 9006, + "fields": { + "domain": "brokendnssec.net", + "report": "{'https_exists': {'name': 'https_exists', 'label': 'detail web tls https-exists label', 'status': 0, 'worst_status': 0, 'verdict': 'detail web tls https-exists verdict bad', 'exp': 'detail web tls https-exists exp', 'tech_type': 'table', 'tech_string': 'detail web tls https-exists tech table', 'tech_data': [('104.18.27.110', 'detail tech data no')], 'override_mandatory': None}, 'https_forced': {'name': 'https_forced', 'label': 'detail web tls https-forced label', 'status': 4, 'worst_status': 0, 'verdict': 'detail verdict not-tested', 'exp': 'detail web tls https-forced exp', 'tech_type': 'table', 'tech_string': 'detail web tls https-forced tech table', 'tech_data': [('104.18.27.110', 'detail tech data not-tested')], 'override_mandatory': None}, 'https_hsts': {'name': 'https_hsts', 'label': 'detail web tls https-hsts label', 'status': 4, 'worst_status': 0, 'verdict': 'detail verdict not-tested', 'exp': 'detail web tls https-hsts exp', 'tech_type': 'table', 'tech_string': 'detail web tls https-hsts tech table', 'tech_data': [('104.18.27.110', 'detail tech data not-tested')], 'override_mandatory': None}, 'http_compression': {'name': 'http_compression', 'label': 'detail web tls http-compression label', 'status': 4, 'worst_status': 5, 'verdict': 'detail verdict not-tested', 'exp': 'detail web tls http-compression exp', 'tech_type': 'table', 'tech_string': 'detail web tls http-compression tech table', 'tech_data': [('104.18.27.110', 'detail tech data not-tested')], 'override_mandatory': None}, 'fs_params': {'name': 'fs_params', 'label': 'detail web tls fs-params label', 'status': 4, 'worst_status': 0, 'verdict': 'detail verdict not-tested', 'exp': 'detail web tls fs-params exp', 'tech_type': 'table_multi_col', 'tech_string': 'detail web tls fs-params tech table', 'tech_data': [('104.18.27.110', 'detail tech data not-tested')], 'override_mandatory': None}, 'tls_ciphers': {'name': 'tls_ciphers', 'label': 'detail web tls ciphers label', 'status': 4, 'worst_status': 0, 'verdict': 'detail verdict not-tested', 'exp': 'detail web tls ciphers exp', 'tech_type': 'table_multi_col', 'tech_string': 'detail web tls ciphers tech table', 'tech_data': [('104.18.27.110', 'detail tech data not-tested')], 'override_mandatory': None}, 'tls_cipher_order': {'name': 'tls_cipher_order', 'label': 'detail web tls cipher-order label', 'status': 4, 'worst_status': 0, 'verdict': 'detail verdict not-tested', 'exp': 'detail web tls cipher-order exp', 'tech_type': 'table_multi_col', 'tech_string': 'detail web tls cipher-order tech table', 'tech_data': [('104.18.27.110', 'detail tech data not-tested')], 'override_mandatory': None}, 'tls_version': {'name': 'tls_version', 'label': 'detail web tls version label', 'status': 4, 'worst_status': 0, 'verdict': 'detail verdict not-tested', 'exp': 'detail web tls version exp', 'tech_type': 'table_multi_col', 'tech_string': 'detail web tls version tech table', 'tech_data': [('104.18.27.110', 'detail tech data not-tested')], 'override_mandatory': None}, 'tls_compression': {'name': 'tls_compression', 'label': 'detail web tls compression label', 'status': 4, 'worst_status': 0, 'verdict': 'detail verdict not-tested', 'exp': 'detail web tls compression exp', 'tech_type': 'table', 'tech_string': 'detail web tls compression tech table', 'tech_data': [('104.18.27.110', 'detail tech data not-tested')], 'override_mandatory': None}, 'renegotiation_secure': {'name': 'renegotiation_secure', 'label': 'detail web tls renegotiation-secure label', 'status': 4, 'worst_status': 0, 'verdict': 'detail verdict not-tested', 'exp': 'detail web tls renegotiation-secure exp', 'tech_type': 'table', 'tech_string': 'detail web tls renegotiation-secure tech table', 'tech_data': [('104.18.27.110', 'detail tech data not-tested')], 'override_mandatory': None}, 'renegotiation_client': {'name': 'renegotiation_client', 'label': 'detail web tls renegotiation-client label', 'status': 4, 'worst_status': 5, 'verdict': 'detail verdict not-tested', 'exp': 'detail web tls renegotiation-client exp', 'tech_type': 'table', 'tech_string': 'detail web tls renegotiation-client tech table', 'tech_data': [('104.18.27.110', 'detail tech data not-tested')], 'override_mandatory': None}, 'cert_trust': {'name': 'cert_trust', 'label': 'detail web tls cert-trust label', 'status': 4, 'worst_status': 0, 'verdict': 'detail verdict not-tested', 'exp': 'detail web tls cert-trust exp', 'tech_type': 'table', 'tech_string': 'detail web tls cert-trust tech table', 'tech_data': [('104.18.27.110', 'detail tech data not-tested')], 'override_mandatory': None}, 'cert_pubkey': {'name': 'cert_pubkey', 'label': 'detail web tls cert-pubkey label', 'status': 4, 'worst_status': 0, 'verdict': 'detail verdict not-tested', 'exp': 'detail web tls cert-pubkey exp', 'tech_type': 'table', 'tech_string': 'detail web tls cert-pubkey tech table', 'tech_data': [('104.18.27.110', 'detail tech data not-tested')], 'override_mandatory': None}, 'cert_signature': {'name': 'cert_signature', 'label': 'detail web tls cert-signature label', 'status': 4, 'worst_status': 0, 'verdict': 'detail verdict not-tested', 'exp': 'detail web tls cert-signature exp', 'tech_type': 'table_multi_col', 'tech_string': 'detail web tls cert-signature tech table', 'tech_data': [('104.18.27.110', 'detail tech data not-tested')], 'override_mandatory': None}, 'cert_hostmatch': {'name': 'cert_hostmatch', 'label': 'detail web tls cert-hostmatch label', 'status': 4, 'worst_status': 0, 'verdict': 'detail verdict not-tested', 'exp': 'detail web tls cert-hostmatch exp', 'tech_type': 'table', 'tech_string': 'detail web tls cert-hostmatch tech table', 'tech_data': [('104.18.27.110', 'detail tech data not-tested')], 'override_mandatory': None}, 'web_caa': {'name': 'web_caa', 'label': 'detail web caa label', 'status': 4, 'worst_status': 5, 'verdict': 'detail verdict not-tested', 'exp': 'detail web caa exp', 'tech_type': 'table_translatable', 'tech_string': 'detail web caa tech table', 'tech_data': ['detail tech data not-tested'], 'override_mandatory': None}, 'dane_exists': {'name': 'dane_exists', 'label': 'detail web tls dane-exists label', 'status': 4, 'worst_status': 5, 'verdict': 'detail verdict not-tested', 'exp': 'detail web tls dane-exists exp', 'tech_type': 'table', 'tech_string': 'detail web tls dane-exists tech table', 'tech_data': [('104.18.27.110', 'detail tech data not-tested')], 'override_mandatory': None}, 'dane_valid': {'name': 'dane_valid', 'label': 'detail web tls dane-valid label', 'status': 4, 'worst_status': 2, 'verdict': 'detail verdict not-tested', 'exp': 'detail web tls dane-valid exp', 'tech_type': 'table', 'tech_string': 'detail web tls dane-valid tech table', 'tech_data': [('104.18.27.110', 'detail tech data not-tested')], 'override_mandatory': None}, 'zero_rtt': {'name': 'zero_rtt', 'label': 'detail web tls zero-rtt label', 'status': 4, 'worst_status': 0, 'verdict': 'detail verdict not-tested', 'exp': 'detail web tls zero-rtt exp', 'tech_type': 'table', 'tech_string': 'detail web tls zero-rtt tech table', 'tech_data': [('104.18.27.110', 'detail tech data not-tested')], 'override_mandatory': None}, 'ocsp_stapling': {'name': 'ocsp_stapling', 'label': 'detail web tls ocsp-stapling label', 'status': 4, 'worst_status': 2, 'verdict': 'detail verdict not-tested', 'exp': 'detail web tls ocsp-stapling exp', 'tech_type': 'table', 'tech_string': 'detail web tls ocsp-stapling tech table', 'tech_data': [('104.18.27.110', 'detail tech data not-tested')], 'override_mandatory': None}, 'kex_hash_func': {'name': 'kex_hash_func', 'label': 'detail web tls kex-hash-func label', 'status': 4, 'worst_status': 2, 'verdict': 'detail verdict not-tested', 'exp': 'detail web tls kex-hash-func exp', 'tech_type': 'table', 'tech_string': 'detail web tls kex-hash-func tech table', 'tech_data': [('104.18.27.110', 'detail tech data not-tested')], 'override_mandatory': None}}", + "score": 0, + "max_score": 130, + "timestamp": "2025-03-14T15:18:50.200Z" + } + }, + { + "model": "checks.webtesttls", + "pk": 9007, + "fields": { + "domain": "ok.bogussig.ok.bad-dnssec.wb.sidnlabs.nl", + "report": "{'https_exists': {'name': 'https_exists', 'label': 'detail web tls https-exists label', 'status': 1, 'worst_status': 0, 'verdict': 'detail web tls https-exists verdict good', 'exp': 'detail web tls https-exists exp', 'tech_type': 'table', 'tech_string': 'detail web tls https-exists tech table', 'tech_data': [('94.198.159.39', 'detail tech data yes'), ('2a00:d78:0:712:94:198:159:39', 'detail tech data yes')], 'override_mandatory': None}, 'https_forced': {'name': 'https_forced', 'label': 'detail web tls https-forced label', 'status': 0, 'worst_status': 0, 'verdict': 'detail web tls https-forced verdict bad', 'exp': 'detail web tls https-forced exp', 'tech_type': 'table', 'tech_string': 'detail web tls https-forced tech table', 'tech_data': [('94.198.159.39', 'detail tech data no'), ('2a00:d78:0:712:94:198:159:39', 'detail tech data no')], 'override_mandatory': None}, 'https_hsts': {'name': 'https_hsts', 'label': 'detail web tls https-hsts label', 'status': 0, 'worst_status': 0, 'verdict': 'detail web tls https-hsts verdict bad', 'exp': 'detail web tls https-hsts exp', 'tech_type': 'table', 'tech_string': 'detail web tls https-hsts tech table', 'tech_data': [('94.198.159.39', ''), ('2a00:d78:0:712:94:198:159:39', '')], 'override_mandatory': None}, 'http_compression': {'name': 'http_compression', 'label': 'detail web tls http-compression label', 'status': 5, 'worst_status': 5, 'verdict': 'detail web tls http-compression verdict bad', 'exp': 'detail web tls http-compression exp', 'tech_type': 'table', 'tech_string': 'detail web tls http-compression tech table', 'tech_data': [('94.198.159.39', 'detail tech data yes'), ('2a00:d78:0:712:94:198:159:39', 'detail tech data yes')], 'override_mandatory': None}, 'fs_params': {'name': 'fs_params', 'label': 'detail web tls fs-params label', 'status': 1, 'worst_status': 0, 'verdict': 'detail web tls fs-params verdict good', 'exp': 'detail web tls fs-params exp', 'tech_type': 'table_multi_col', 'tech_string': 'detail web tls fs-params tech table', 'tech_data': [('94.198.159.39', ''), ('2a00:d78:0:712:94:198:159:39', '')], 'override_mandatory': None}, 'tls_ciphers': {'name': 'tls_ciphers', 'label': 'detail web tls ciphers label', 'status': 1, 'worst_status': 0, 'verdict': 'detail web tls ciphers verdict good', 'exp': 'detail web tls ciphers exp', 'tech_type': 'table_multi_col', 'tech_string': 'detail web tls ciphers tech table', 'tech_data': [('94.198.159.39', ''), ('2a00:d78:0:712:94:198:159:39', '')], 'override_mandatory': None}, 'tls_cipher_order': {'name': 'tls_cipher_order', 'label': 'detail web tls cipher-order label', 'status': 1, 'worst_status': 0, 'verdict': 'detail web tls cipher-order verdict na', 'exp': 'detail web tls cipher-order exp', 'tech_type': 'table_multi_col', 'tech_string': 'detail web tls cipher-order tech table', 'tech_data': [('94.198.159.39', ''), ('2a00:d78:0:712:94:198:159:39', '')], 'override_mandatory': None}, 'tls_version': {'name': 'tls_version', 'label': 'detail web tls version label', 'status': 1, 'worst_status': 0, 'verdict': 'detail web tls version verdict good', 'exp': 'detail web tls version exp', 'tech_type': 'table_multi_col', 'tech_string': 'detail web tls version tech table', 'tech_data': [('94.198.159.39', ['TLS 1.3', 'TLS 1.2'], ['detail tech data good', 'detail tech data sufficient']), ('2a00:d78:0:712:94:198:159:39', ['TLS 1.3', 'TLS 1.2'], ['detail tech data good', 'detail tech data sufficient'])], 'override_mandatory': None}, 'tls_compression': {'name': 'tls_compression', 'label': 'detail web tls compression label', 'status': 1, 'worst_status': 0, 'verdict': 'detail web tls compression verdict good', 'exp': 'detail web tls compression exp', 'tech_type': 'table', 'tech_string': 'detail web tls compression tech table', 'tech_data': [('94.198.159.39', 'detail tech data no'), ('2a00:d78:0:712:94:198:159:39', 'detail tech data no')], 'override_mandatory': None}, 'renegotiation_secure': {'name': 'renegotiation_secure', 'label': 'detail web tls renegotiation-secure label', 'status': 1, 'worst_status': 0, 'verdict': 'detail web tls renegotiation-secure verdict good', 'exp': 'detail web tls renegotiation-secure exp', 'tech_type': 'table', 'tech_string': 'detail web tls renegotiation-secure tech table', 'tech_data': [('94.198.159.39', 'detail tech data yes'), ('2a00:d78:0:712:94:198:159:39', 'detail tech data yes')], 'override_mandatory': None}, 'renegotiation_client': {'name': 'renegotiation_client', 'label': 'detail web tls renegotiation-client label', 'status': 1, 'worst_status': 5, 'verdict': 'detail web tls renegotiation-client verdict good', 'exp': 'detail web tls renegotiation-client exp', 'tech_type': 'table', 'tech_string': 'detail web tls renegotiation-client tech table', 'tech_data': [('94.198.159.39', 'detail tech data no'), ('2a00:d78:0:712:94:198:159:39', 'detail tech data no')], 'override_mandatory': None}, 'cert_trust': {'name': 'cert_trust', 'label': 'detail web tls cert-trust label', 'status': 1, 'worst_status': 0, 'verdict': 'detail web tls cert-trust verdict good', 'exp': 'detail web tls cert-trust exp', 'tech_type': 'table', 'tech_string': 'detail web tls cert-trust tech table', 'tech_data': [('94.198.159.39', ''), ('2a00:d78:0:712:94:198:159:39', '')], 'override_mandatory': None}, 'cert_pubkey': {'name': 'cert_pubkey', 'label': 'detail web tls cert-pubkey label', 'status': 1, 'worst_status': 0, 'verdict': 'detail web tls cert-pubkey verdict good', 'exp': 'detail web tls cert-pubkey exp', 'tech_type': 'table', 'tech_string': 'detail web tls cert-pubkey tech table', 'tech_data': [('94.198.159.39', ''), ('2a00:d78:0:712:94:198:159:39', '')], 'override_mandatory': None}, 'cert_signature': {'name': 'cert_signature', 'label': 'detail web tls cert-signature label', 'status': 1, 'worst_status': 0, 'verdict': 'detail web tls cert-signature verdict good', 'exp': 'detail web tls cert-signature exp', 'tech_type': 'table_multi_col', 'tech_string': 'detail web tls cert-signature tech table', 'tech_data': [('94.198.159.39', ''), ('2a00:d78:0:712:94:198:159:39', '')], 'override_mandatory': None}, 'cert_hostmatch': {'name': 'cert_hostmatch', 'label': 'detail web tls cert-hostmatch label', 'status': 0, 'worst_status': 0, 'verdict': 'detail web tls cert-hostmatch verdict bad', 'exp': 'detail web tls cert-hostmatch exp', 'tech_type': 'table', 'tech_string': 'detail web tls cert-hostmatch tech table', 'tech_data': [('94.198.159.39', ['workbench.sidnlabs.nl']), ('2a00:d78:0:712:94:198:159:39', ['workbench.sidnlabs.nl'])], 'override_mandatory': None}, 'web_caa': {'name': 'web_caa', 'label': 'detail web caa label', 'status': 1, 'worst_status': 5, 'verdict': 'detail web caa verdict good', 'exp': 'detail web caa exp', 'tech_type': 'table_translatable', 'tech_string': 'detail web caa tech table', 'tech_data': [[{'msgid': 'detail tech data caa found_host', 'context': {'host': 'sidnlabs.nl.'}}]], 'override_mandatory': None}, 'dane_exists': {'name': 'dane_exists', 'label': 'detail web tls dane-exists label', 'status': 5, 'worst_status': 5, 'verdict': 'detail web tls dane-exists verdict bad', 'exp': 'detail web tls dane-exists exp', 'tech_type': 'table', 'tech_string': 'detail web tls dane-exists tech table', 'tech_data': [('94.198.159.39', 'detail tech data no'), ('2a00:d78:0:712:94:198:159:39', 'detail tech data no')], 'override_mandatory': None}, 'dane_valid': {'name': 'dane_valid', 'label': 'detail web tls dane-valid label', 'status': 4, 'worst_status': 2, 'verdict': 'detail verdict not-tested', 'exp': 'detail web tls dane-valid exp', 'tech_type': 'table', 'tech_string': 'detail web tls dane-valid tech table', 'tech_data': [('94.198.159.39', 'detail tech data not-tested'), ('2a00:d78:0:712:94:198:159:39', 'detail tech data not-tested')], 'override_mandatory': None}, 'zero_rtt': {'name': 'zero_rtt', 'label': 'detail web tls zero-rtt label', 'status': 1, 'worst_status': 0, 'verdict': 'detail web tls zero-rtt verdict good', 'exp': 'detail web tls zero-rtt exp', 'tech_type': 'table', 'tech_string': 'detail web tls zero-rtt tech table', 'tech_data': [('94.198.159.39', 'detail tech data no'), ('2a00:d78:0:712:94:198:159:39', 'detail tech data no')], 'override_mandatory': None}, 'ocsp_stapling': {'name': 'ocsp_stapling', 'label': 'detail web tls ocsp-stapling label', 'status': 5, 'worst_status': 2, 'verdict': 'detail web tls ocsp-stapling verdict ok', 'exp': 'detail web tls ocsp-stapling exp', 'tech_type': 'table', 'tech_string': 'detail web tls ocsp-stapling tech table', 'tech_data': [('94.198.159.39', 'detail tech data no'), ('2a00:d78:0:712:94:198:159:39', 'detail tech data no')], 'override_mandatory': None}, 'kex_hash_func': {'name': 'kex_hash_func', 'label': 'detail web tls kex-hash-func label', 'status': 1, 'worst_status': 2, 'verdict': 'detail web tls kex-hash-func verdict good', 'exp': 'detail web tls kex-hash-func exp', 'tech_type': 'table', 'tech_string': 'detail web tls kex-hash-func tech table', 'tech_data': [('94.198.159.39', 'detail tech data yes'), ('2a00:d78:0:712:94:198:159:39', 'detail tech data yes')], 'override_mandatory': None}}", + "score": 100, + "max_score": 130, + "timestamp": "2025-03-14T15:19:08.815Z" + } + }, + { + "model": "checks.webtesttls", + "pk": 9008, + "fields": { + "domain": "badhash.dane.huque.com", + "report": "{'https_exists': {'name': 'https_exists', 'label': 'detail web tls https-exists label', 'status': 1, 'worst_status': 0, 'verdict': 'detail web tls https-exists verdict good', 'exp': 'detail web tls https-exists exp', 'tech_type': 'table', 'tech_string': 'detail web tls https-exists tech table', 'tech_data': [('54.200.198.48', 'detail tech data yes')], 'override_mandatory': None}, 'https_forced': {'name': 'https_forced', 'label': 'detail web tls https-forced label', 'status': 0, 'worst_status': 0, 'verdict': 'detail web tls https-forced verdict bad', 'exp': 'detail web tls https-forced exp', 'tech_type': 'table', 'tech_string': 'detail web tls https-forced tech table', 'tech_data': [('54.200.198.48', 'detail tech data no')], 'override_mandatory': None}, 'https_hsts': {'name': 'https_hsts', 'label': 'detail web tls https-hsts label', 'status': 0, 'worst_status': 0, 'verdict': 'detail web tls https-hsts verdict bad', 'exp': 'detail web tls https-hsts exp', 'tech_type': 'table', 'tech_string': 'detail web tls https-hsts tech table', 'tech_data': [('54.200.198.48', '')], 'override_mandatory': None}, 'http_compression': {'name': 'http_compression', 'label': 'detail web tls http-compression label', 'status': 1, 'worst_status': 5, 'verdict': 'detail web tls http-compression verdict good', 'exp': 'detail web tls http-compression exp', 'tech_type': 'table', 'tech_string': 'detail web tls http-compression tech table', 'tech_data': [('54.200.198.48', 'detail tech data no')], 'override_mandatory': None}, 'fs_params': {'name': 'fs_params', 'label': 'detail web tls fs-params label', 'status': 0, 'worst_status': 0, 'verdict': 'detail web tls fs-params verdict bad', 'exp': 'detail web tls fs-params exp', 'tech_type': 'table_multi_col', 'tech_string': 'detail web tls fs-params tech table', 'tech_data': [('54.200.198.48', ['DH-2048'], ['detail tech data insufficient'])], 'override_mandatory': None}, 'tls_ciphers': {'name': 'tls_ciphers', 'label': 'detail web tls ciphers label', 'status': 0, 'worst_status': 0, 'verdict': 'detail web tls ciphers verdict bad', 'exp': 'detail web tls ciphers exp', 'tech_type': 'table_multi_col', 'tech_string': 'detail web tls ciphers tech table', 'tech_data': [('54.200.198.48', ['RC4-SHA', 'IDEA-CBC-SHA', 'ECDHE-RSA-RC4-SHA', 'CAMELLIA256-SHA', 'DES-CBC3-SHA', 'DHE-RSA-SEED-SHA', 'AES256-SHA256', 'SEED-SHA', 'CAMELLIA128-SHA', 'AES128-SHA', 'EDH-RSA-DES-CBC3-SHA', 'AES256-SHA', 'AES256-GCM-SHA384', 'AES128-GCM-SHA256', 'ECDHE-RSA-DES-CBC3-SHA', 'DHE-RSA-DES-CBC3-SHA', 'AES128-SHA256'], ['detail tech data insufficient', 'detail tech data insufficient', 'detail tech data insufficient', 'detail tech data phase-out', 'detail tech data phase-out', 'detail tech data phase-out', 'detail tech data phase-out', 'detail tech data phase-out', 'detail tech data phase-out', 'detail tech data phase-out', 'detail tech data phase-out', 'detail tech data phase-out', 'detail tech data phase-out', 'detail tech data phase-out', 'detail tech data phase-out', 'detail tech data phase-out', 'detail tech data phase-out'])], 'override_mandatory': None}, 'tls_cipher_order': {'name': 'tls_cipher_order', 'label': 'detail web tls cipher-order label', 'status': 0, 'worst_status': 0, 'verdict': 'detail web tls cipher-order verdict seclevel-bad', 'exp': 'detail web tls cipher-order exp', 'tech_type': 'table_multi_col', 'tech_string': 'detail web tls cipher-order tech table', 'tech_data': [('54.200.198.48', ['DHE-RSA-CAMELLIA256-SHA', 'ECDHE-RSA-AES128-GCM-SHA256'])], 'override_mandatory': None}, 'tls_version': {'name': 'tls_version', 'label': 'detail web tls version label', 'status': 2, 'worst_status': 0, 'verdict': 'detail web tls version verdict phase-out', 'exp': 'detail web tls version exp', 'tech_type': 'table_multi_col', 'tech_string': 'detail web tls version tech table', 'tech_data': [('54.200.198.48', ['TLS 1.2', 'TLS 1.1', 'TLS 1.0'], ['detail tech data sufficient', 'detail tech data phase-out', 'detail tech data phase-out'])], 'override_mandatory': None}, 'tls_compression': {'name': 'tls_compression', 'label': 'detail web tls compression label', 'status': 1, 'worst_status': 0, 'verdict': 'detail web tls compression verdict good', 'exp': 'detail web tls compression exp', 'tech_type': 'table', 'tech_string': 'detail web tls compression tech table', 'tech_data': [('54.200.198.48', 'detail tech data no')], 'override_mandatory': None}, 'renegotiation_secure': {'name': 'renegotiation_secure', 'label': 'detail web tls renegotiation-secure label', 'status': 1, 'worst_status': 0, 'verdict': 'detail web tls renegotiation-secure verdict good', 'exp': 'detail web tls renegotiation-secure exp', 'tech_type': 'table', 'tech_string': 'detail web tls renegotiation-secure tech table', 'tech_data': [('54.200.198.48', 'detail tech data yes')], 'override_mandatory': None}, 'renegotiation_client': {'name': 'renegotiation_client', 'label': 'detail web tls renegotiation-client label', 'status': 1, 'worst_status': 5, 'verdict': 'detail web tls renegotiation-client verdict good', 'exp': 'detail web tls renegotiation-client exp', 'tech_type': 'table', 'tech_string': 'detail web tls renegotiation-client tech table', 'tech_data': [('54.200.198.48', 'detail tech data no')], 'override_mandatory': None}, 'cert_trust': {'name': 'cert_trust', 'label': 'detail web tls cert-trust label', 'status': 1, 'worst_status': 0, 'verdict': 'detail web tls cert-trust verdict good', 'exp': 'detail web tls cert-trust exp', 'tech_type': 'table', 'tech_string': 'detail web tls cert-trust tech table', 'tech_data': [('54.200.198.48', '')], 'override_mandatory': None}, 'cert_pubkey': {'name': 'cert_pubkey', 'label': 'detail web tls cert-pubkey label', 'status': 1, 'worst_status': 0, 'verdict': 'detail web tls cert-pubkey verdict good', 'exp': 'detail web tls cert-pubkey exp', 'tech_type': 'table', 'tech_string': 'detail web tls cert-pubkey tech table', 'tech_data': [('54.200.198.48', '')], 'override_mandatory': None}, 'cert_signature': {'name': 'cert_signature', 'label': 'detail web tls cert-signature label', 'status': 1, 'worst_status': 0, 'verdict': 'detail web tls cert-signature verdict good', 'exp': 'detail web tls cert-signature exp', 'tech_type': 'table_multi_col', 'tech_string': 'detail web tls cert-signature tech table', 'tech_data': [('54.200.198.48', '')], 'override_mandatory': None}, 'cert_hostmatch': {'name': 'cert_hostmatch', 'label': 'detail web tls cert-hostmatch label', 'status': 1, 'worst_status': 0, 'verdict': 'detail web tls cert-hostmatch verdict good', 'exp': 'detail web tls cert-hostmatch exp', 'tech_type': 'table', 'tech_string': 'detail web tls cert-hostmatch tech table', 'tech_data': [('54.200.198.48', '')], 'override_mandatory': None}, 'web_caa': {'name': 'web_caa', 'label': 'detail web caa label', 'status': 5, 'worst_status': 5, 'verdict': 'detail web caa verdict bad', 'exp': 'detail web caa exp', 'tech_type': 'table_translatable', 'tech_string': 'detail web caa tech table', 'tech_data': [[{'msgid': 'detail tech data caa not_found', 'context': {}}]], 'override_mandatory': None}, 'dane_exists': {'name': 'dane_exists', 'label': 'detail web tls dane-exists label', 'status': 1, 'worst_status': 5, 'verdict': 'detail web tls dane-exists verdict good', 'exp': 'detail web tls dane-exists exp', 'tech_type': 'table', 'tech_string': 'detail web tls dane-exists tech table', 'tech_data': [('54.200.198.48', ['3 1 1 b760c12119c388736da724df1224d21dfd23bf03366c286de1a4125369ef7de0'])], 'override_mandatory': None}, 'dane_valid': {'name': 'dane_valid', 'label': 'detail web tls dane-valid label', 'status': 2, 'worst_status': 2, 'verdict': 'detail web tls dane-valid verdict bad', 'exp': 'detail web tls dane-valid exp', 'tech_type': 'table', 'tech_string': 'detail web tls dane-valid tech table', 'tech_data': [('54.200.198.48', 'detail tech data no')], 'override_mandatory': None}, 'zero_rtt': {'name': 'zero_rtt', 'label': 'detail web tls zero-rtt label', 'status': 1, 'worst_status': 0, 'verdict': 'detail web tls zero-rtt verdict na', 'exp': 'detail web tls zero-rtt exp', 'tech_type': 'table', 'tech_string': 'detail web tls zero-rtt tech table', 'tech_data': [('54.200.198.48', 'detail tech data no')], 'override_mandatory': None}, 'ocsp_stapling': {'name': 'ocsp_stapling', 'label': 'detail web tls ocsp-stapling label', 'status': 5, 'worst_status': 2, 'verdict': 'detail web tls ocsp-stapling verdict ok', 'exp': 'detail web tls ocsp-stapling exp', 'tech_type': 'table', 'tech_string': 'detail web tls ocsp-stapling tech table', 'tech_data': [('54.200.198.48', 'detail tech data no')], 'override_mandatory': None}, 'kex_hash_func': {'name': 'kex_hash_func', 'label': 'detail web tls kex-hash-func label', 'status': 1, 'worst_status': 2, 'verdict': 'detail web tls kex-hash-func verdict good', 'exp': 'detail web tls kex-hash-func exp', 'tech_type': 'table', 'tech_string': 'detail web tls kex-hash-func tech table', 'tech_data': [('54.200.198.48', 'detail tech data yes')], 'override_mandatory': None}}", + "score": 80, + "max_score": 130, + "timestamp": "2025-03-14T15:19:52.504Z" + } + }, + { + "model": "checks.webtesttls", + "pk": 9009, + "fields": { + "domain": "expired.badssl.com", + "report": "{'https_exists': {'name': 'https_exists', 'label': 'detail web tls https-exists label', 'status': 1, 'worst_status': 0, 'verdict': 'detail web tls https-exists verdict good', 'exp': 'detail web tls https-exists exp', 'tech_type': 'table', 'tech_string': 'detail web tls https-exists tech table', 'tech_data': [('104.154.89.105', 'detail tech data yes')], 'override_mandatory': None}, 'https_forced': {'name': 'https_forced', 'label': 'detail web tls https-forced label', 'status': 1, 'worst_status': 0, 'verdict': 'detail web tls https-forced verdict good', 'exp': 'detail web tls https-forced exp', 'tech_type': 'table', 'tech_string': 'detail web tls https-forced tech table', 'tech_data': [('104.154.89.105', 'detail tech data yes')], 'override_mandatory': None}, 'https_hsts': {'name': 'https_hsts', 'label': 'detail web tls https-hsts label', 'status': 0, 'worst_status': 0, 'verdict': 'detail web tls https-hsts verdict bad', 'exp': 'detail web tls https-hsts exp', 'tech_type': 'table', 'tech_string': 'detail web tls https-hsts tech table', 'tech_data': [('104.154.89.105', '')], 'override_mandatory': None}, 'http_compression': {'name': 'http_compression', 'label': 'detail web tls http-compression label', 'status': 5, 'worst_status': 5, 'verdict': 'detail web tls http-compression verdict bad', 'exp': 'detail web tls http-compression exp', 'tech_type': 'table', 'tech_string': 'detail web tls http-compression tech table', 'tech_data': [('104.154.89.105', 'detail tech data yes')], 'override_mandatory': None}, 'fs_params': {'name': 'fs_params', 'label': 'detail web tls fs-params label', 'status': 0, 'worst_status': 0, 'verdict': 'detail web tls fs-params verdict bad', 'exp': 'detail web tls fs-params exp', 'tech_type': 'table_multi_col', 'tech_string': 'detail web tls fs-params tech table', 'tech_data': [('104.154.89.105', ['DH-2048'], ['detail tech data insufficient'])], 'override_mandatory': None}, 'tls_ciphers': {'name': 'tls_ciphers', 'label': 'detail web tls ciphers label', 'status': 2, 'worst_status': 0, 'verdict': 'detail web tls ciphers verdict phase-out', 'exp': 'detail web tls ciphers exp', 'tech_type': 'table_multi_col', 'tech_string': 'detail web tls ciphers tech table', 'tech_data': [('104.154.89.105', ['CAMELLIA256-SHA', 'DES-CBC3-SHA', 'AES256-SHA256', 'CAMELLIA128-SHA', 'AES128-SHA', 'AES256-GCM-SHA384', 'AES128-GCM-SHA256', 'AES128-SHA256', 'AES256-SHA', 'ECDHE-RSA-DES-CBC3-SHA'], ['detail tech data phase-out', 'detail tech data phase-out', 'detail tech data phase-out', 'detail tech data phase-out', 'detail tech data phase-out', 'detail tech data phase-out', 'detail tech data phase-out', 'detail tech data phase-out', 'detail tech data phase-out', 'detail tech data phase-out'])], 'override_mandatory': None}, 'tls_cipher_order': {'name': 'tls_cipher_order', 'label': 'detail web tls cipher-order label', 'status': 1, 'worst_status': 0, 'verdict': 'detail web tls cipher-order verdict good', 'exp': 'detail web tls cipher-order exp', 'tech_type': 'table_multi_col', 'tech_string': 'detail web tls cipher-order tech table', 'tech_data': [('104.154.89.105', '')], 'override_mandatory': None}, 'tls_version': {'name': 'tls_version', 'label': 'detail web tls version label', 'status': 2, 'worst_status': 0, 'verdict': 'detail web tls version verdict phase-out', 'exp': 'detail web tls version exp', 'tech_type': 'table_multi_col', 'tech_string': 'detail web tls version tech table', 'tech_data': [('104.154.89.105', ['TLS 1.2', 'TLS 1.1', 'TLS 1.0'], ['detail tech data sufficient', 'detail tech data phase-out', 'detail tech data phase-out'])], 'override_mandatory': None}, 'tls_compression': {'name': 'tls_compression', 'label': 'detail web tls compression label', 'status': 1, 'worst_status': 0, 'verdict': 'detail web tls compression verdict good', 'exp': 'detail web tls compression exp', 'tech_type': 'table', 'tech_string': 'detail web tls compression tech table', 'tech_data': [('104.154.89.105', 'detail tech data no')], 'override_mandatory': None}, 'renegotiation_secure': {'name': 'renegotiation_secure', 'label': 'detail web tls renegotiation-secure label', 'status': 1, 'worst_status': 0, 'verdict': 'detail web tls renegotiation-secure verdict good', 'exp': 'detail web tls renegotiation-secure exp', 'tech_type': 'table', 'tech_string': 'detail web tls renegotiation-secure tech table', 'tech_data': [('104.154.89.105', 'detail tech data yes')], 'override_mandatory': None}, 'renegotiation_client': {'name': 'renegotiation_client', 'label': 'detail web tls renegotiation-client label', 'status': 1, 'worst_status': 5, 'verdict': 'detail web tls renegotiation-client verdict good', 'exp': 'detail web tls renegotiation-client exp', 'tech_type': 'table', 'tech_string': 'detail web tls renegotiation-client tech table', 'tech_data': [('104.154.89.105', 'detail tech data no')], 'override_mandatory': None}, 'cert_trust': {'name': 'cert_trust', 'label': 'detail web tls cert-trust label', 'status': 0, 'worst_status': 0, 'verdict': 'detail web tls cert-trust verdict bad', 'exp': 'detail web tls cert-trust exp', 'tech_type': 'table', 'tech_string': 'detail web tls cert-trust tech table', 'tech_data': [('104.154.89.105', ['*.badssl.com', 'COMODO RSA Domain Validation Secure Server CA', 'COMODO RSA Certification Authority'])], 'override_mandatory': None}, 'cert_pubkey': {'name': 'cert_pubkey', 'label': 'detail web tls cert-pubkey label', 'status': 1, 'worst_status': 0, 'verdict': 'detail web tls cert-pubkey verdict good', 'exp': 'detail web tls cert-pubkey exp', 'tech_type': 'table', 'tech_string': 'detail web tls cert-pubkey tech table', 'tech_data': [('104.154.89.105', '')], 'override_mandatory': None}, 'cert_signature': {'name': 'cert_signature', 'label': 'detail web tls cert-signature label', 'status': 1, 'worst_status': 0, 'verdict': 'detail web tls cert-signature verdict good', 'exp': 'detail web tls cert-signature exp', 'tech_type': 'table_multi_col', 'tech_string': 'detail web tls cert-signature tech table', 'tech_data': [('104.154.89.105', '')], 'override_mandatory': None}, 'cert_hostmatch': {'name': 'cert_hostmatch', 'label': 'detail web tls cert-hostmatch label', 'status': 1, 'worst_status': 0, 'verdict': 'detail web tls cert-hostmatch verdict good', 'exp': 'detail web tls cert-hostmatch exp', 'tech_type': 'table', 'tech_string': 'detail web tls cert-hostmatch tech table', 'tech_data': [('104.154.89.105', '')], 'override_mandatory': None}, 'web_caa': {'name': 'web_caa', 'label': 'detail web caa label', 'status': 5, 'worst_status': 5, 'verdict': 'detail web caa verdict bad', 'exp': 'detail web caa exp', 'tech_type': 'table_translatable', 'tech_string': 'detail web caa tech table', 'tech_data': [[{'msgid': 'detail tech data caa not_found', 'context': {}}]], 'override_mandatory': None}, 'dane_exists': {'name': 'dane_exists', 'label': 'detail web tls dane-exists label', 'status': 5, 'worst_status': 5, 'verdict': 'detail web tls dane-exists verdict bad', 'exp': 'detail web tls dane-exists exp', 'tech_type': 'table', 'tech_string': 'detail web tls dane-exists tech table', 'tech_data': [('104.154.89.105', 'detail tech data no')], 'override_mandatory': None}, 'dane_valid': {'name': 'dane_valid', 'label': 'detail web tls dane-valid label', 'status': 4, 'worst_status': 2, 'verdict': 'detail verdict not-tested', 'exp': 'detail web tls dane-valid exp', 'tech_type': 'table', 'tech_string': 'detail web tls dane-valid tech table', 'tech_data': [('104.154.89.105', 'detail tech data not-tested')], 'override_mandatory': None}, 'zero_rtt': {'name': 'zero_rtt', 'label': 'detail web tls zero-rtt label', 'status': 1, 'worst_status': 0, 'verdict': 'detail web tls zero-rtt verdict na', 'exp': 'detail web tls zero-rtt exp', 'tech_type': 'table', 'tech_string': 'detail web tls zero-rtt tech table', 'tech_data': [('104.154.89.105', 'detail tech data no')], 'override_mandatory': None}, 'ocsp_stapling': {'name': 'ocsp_stapling', 'label': 'detail web tls ocsp-stapling label', 'status': 5, 'worst_status': 2, 'verdict': 'detail web tls ocsp-stapling verdict ok', 'exp': 'detail web tls ocsp-stapling exp', 'tech_type': 'table', 'tech_string': 'detail web tls ocsp-stapling tech table', 'tech_data': [('104.154.89.105', 'detail tech data no')], 'override_mandatory': None}, 'kex_hash_func': {'name': 'kex_hash_func', 'label': 'detail web tls kex-hash-func label', 'status': 1, 'worst_status': 2, 'verdict': 'detail web tls kex-hash-func verdict good', 'exp': 'detail web tls kex-hash-func exp', 'tech_type': 'table', 'tech_string': 'detail web tls kex-hash-func tech table', 'tech_data': [('104.154.89.105', 'detail tech data yes')], 'override_mandatory': None}}", + "score": 100, + "max_score": 130, + "timestamp": "2025-03-14T15:20:20.306Z" + } + }, + { + "model": "checks.webtesttls", + "pk": 9010, + "fields": { + "domain": "wrong.host.badssl.com", + "report": "{'https_exists': {'name': 'https_exists', 'label': 'detail web tls https-exists label', 'status': 1, 'worst_status': 0, 'verdict': 'detail web tls https-exists verdict good', 'exp': 'detail web tls https-exists exp', 'tech_type': 'table', 'tech_string': 'detail web tls https-exists tech table', 'tech_data': [('104.154.89.105', 'detail tech data yes')], 'override_mandatory': None}, 'https_forced': {'name': 'https_forced', 'label': 'detail web tls https-forced label', 'status': 1, 'worst_status': 0, 'verdict': 'detail web tls https-forced verdict good', 'exp': 'detail web tls https-forced exp', 'tech_type': 'table', 'tech_string': 'detail web tls https-forced tech table', 'tech_data': [('104.154.89.105', 'detail tech data yes')], 'override_mandatory': None}, 'https_hsts': {'name': 'https_hsts', 'label': 'detail web tls https-hsts label', 'status': 0, 'worst_status': 0, 'verdict': 'detail web tls https-hsts verdict bad', 'exp': 'detail web tls https-hsts exp', 'tech_type': 'table', 'tech_string': 'detail web tls https-hsts tech table', 'tech_data': [('104.154.89.105', '')], 'override_mandatory': None}, 'http_compression': {'name': 'http_compression', 'label': 'detail web tls http-compression label', 'status': 5, 'worst_status': 5, 'verdict': 'detail web tls http-compression verdict bad', 'exp': 'detail web tls http-compression exp', 'tech_type': 'table', 'tech_string': 'detail web tls http-compression tech table', 'tech_data': [('104.154.89.105', 'detail tech data yes')], 'override_mandatory': None}, 'fs_params': {'name': 'fs_params', 'label': 'detail web tls fs-params label', 'status': 0, 'worst_status': 0, 'verdict': 'detail web tls fs-params verdict bad', 'exp': 'detail web tls fs-params exp', 'tech_type': 'table_multi_col', 'tech_string': 'detail web tls fs-params tech table', 'tech_data': [('104.154.89.105', ['DH-2048'], ['detail tech data insufficient'])], 'override_mandatory': None}, 'tls_ciphers': {'name': 'tls_ciphers', 'label': 'detail web tls ciphers label', 'status': 2, 'worst_status': 0, 'verdict': 'detail web tls ciphers verdict phase-out', 'exp': 'detail web tls ciphers exp', 'tech_type': 'table_multi_col', 'tech_string': 'detail web tls ciphers tech table', 'tech_data': [('104.154.89.105', ['CAMELLIA256-SHA', 'DES-CBC3-SHA', 'AES256-SHA256', 'CAMELLIA128-SHA', 'AES128-SHA', 'AES256-GCM-SHA384', 'AES128-GCM-SHA256', 'AES128-SHA256', 'AES256-SHA', 'ECDHE-RSA-DES-CBC3-SHA'], ['detail tech data phase-out', 'detail tech data phase-out', 'detail tech data phase-out', 'detail tech data phase-out', 'detail tech data phase-out', 'detail tech data phase-out', 'detail tech data phase-out', 'detail tech data phase-out', 'detail tech data phase-out', 'detail tech data phase-out'])], 'override_mandatory': None}, 'tls_cipher_order': {'name': 'tls_cipher_order', 'label': 'detail web tls cipher-order label', 'status': 1, 'worst_status': 0, 'verdict': 'detail web tls cipher-order verdict good', 'exp': 'detail web tls cipher-order exp', 'tech_type': 'table_multi_col', 'tech_string': 'detail web tls cipher-order tech table', 'tech_data': [('104.154.89.105', '')], 'override_mandatory': None}, 'tls_version': {'name': 'tls_version', 'label': 'detail web tls version label', 'status': 2, 'worst_status': 0, 'verdict': 'detail web tls version verdict phase-out', 'exp': 'detail web tls version exp', 'tech_type': 'table_multi_col', 'tech_string': 'detail web tls version tech table', 'tech_data': [('104.154.89.105', ['TLS 1.2', 'TLS 1.1', 'TLS 1.0'], ['detail tech data sufficient', 'detail tech data phase-out', 'detail tech data phase-out'])], 'override_mandatory': None}, 'tls_compression': {'name': 'tls_compression', 'label': 'detail web tls compression label', 'status': 1, 'worst_status': 0, 'verdict': 'detail web tls compression verdict good', 'exp': 'detail web tls compression exp', 'tech_type': 'table', 'tech_string': 'detail web tls compression tech table', 'tech_data': [('104.154.89.105', 'detail tech data no')], 'override_mandatory': None}, 'renegotiation_secure': {'name': 'renegotiation_secure', 'label': 'detail web tls renegotiation-secure label', 'status': 1, 'worst_status': 0, 'verdict': 'detail web tls renegotiation-secure verdict good', 'exp': 'detail web tls renegotiation-secure exp', 'tech_type': 'table', 'tech_string': 'detail web tls renegotiation-secure tech table', 'tech_data': [('104.154.89.105', 'detail tech data yes')], 'override_mandatory': None}, 'renegotiation_client': {'name': 'renegotiation_client', 'label': 'detail web tls renegotiation-client label', 'status': 1, 'worst_status': 5, 'verdict': 'detail web tls renegotiation-client verdict good', 'exp': 'detail web tls renegotiation-client exp', 'tech_type': 'table', 'tech_string': 'detail web tls renegotiation-client tech table', 'tech_data': [('104.154.89.105', 'detail tech data no')], 'override_mandatory': None}, 'cert_trust': {'name': 'cert_trust', 'label': 'detail web tls cert-trust label', 'status': 1, 'worst_status': 0, 'verdict': 'detail web tls cert-trust verdict good', 'exp': 'detail web tls cert-trust exp', 'tech_type': 'table', 'tech_string': 'detail web tls cert-trust tech table', 'tech_data': [('104.154.89.105', '')], 'override_mandatory': None}, 'cert_pubkey': {'name': 'cert_pubkey', 'label': 'detail web tls cert-pubkey label', 'status': 1, 'worst_status': 0, 'verdict': 'detail web tls cert-pubkey verdict good', 'exp': 'detail web tls cert-pubkey exp', 'tech_type': 'table', 'tech_string': 'detail web tls cert-pubkey tech table', 'tech_data': [('104.154.89.105', '')], 'override_mandatory': None}, 'cert_signature': {'name': 'cert_signature', 'label': 'detail web tls cert-signature label', 'status': 1, 'worst_status': 0, 'verdict': 'detail web tls cert-signature verdict good', 'exp': 'detail web tls cert-signature exp', 'tech_type': 'table_multi_col', 'tech_string': 'detail web tls cert-signature tech table', 'tech_data': [('104.154.89.105', '')], 'override_mandatory': None}, 'cert_hostmatch': {'name': 'cert_hostmatch', 'label': 'detail web tls cert-hostmatch label', 'status': 0, 'worst_status': 0, 'verdict': 'detail web tls cert-hostmatch verdict bad', 'exp': 'detail web tls cert-hostmatch exp', 'tech_type': 'table', 'tech_string': 'detail web tls cert-hostmatch tech table', 'tech_data': [('104.154.89.105', ['*.badssl.com', 'badssl.com'])], 'override_mandatory': None}, 'web_caa': {'name': 'web_caa', 'label': 'detail web caa label', 'status': 5, 'worst_status': 5, 'verdict': 'detail web caa verdict bad', 'exp': 'detail web caa exp', 'tech_type': 'table_translatable', 'tech_string': 'detail web caa tech table', 'tech_data': [[{'msgid': 'detail tech data caa not_found', 'context': {}}]], 'override_mandatory': None}, 'dane_exists': {'name': 'dane_exists', 'label': 'detail web tls dane-exists label', 'status': 5, 'worst_status': 5, 'verdict': 'detail web tls dane-exists verdict bad', 'exp': 'detail web tls dane-exists exp', 'tech_type': 'table', 'tech_string': 'detail web tls dane-exists tech table', 'tech_data': [('104.154.89.105', 'detail tech data no')], 'override_mandatory': None}, 'dane_valid': {'name': 'dane_valid', 'label': 'detail web tls dane-valid label', 'status': 4, 'worst_status': 2, 'verdict': 'detail verdict not-tested', 'exp': 'detail web tls dane-valid exp', 'tech_type': 'table', 'tech_string': 'detail web tls dane-valid tech table', 'tech_data': [('104.154.89.105', 'detail tech data not-tested')], 'override_mandatory': None}, 'zero_rtt': {'name': 'zero_rtt', 'label': 'detail web tls zero-rtt label', 'status': 1, 'worst_status': 0, 'verdict': 'detail web tls zero-rtt verdict na', 'exp': 'detail web tls zero-rtt exp', 'tech_type': 'table', 'tech_string': 'detail web tls zero-rtt tech table', 'tech_data': [('104.154.89.105', 'detail tech data no')], 'override_mandatory': None}, 'ocsp_stapling': {'name': 'ocsp_stapling', 'label': 'detail web tls ocsp-stapling label', 'status': 5, 'worst_status': 2, 'verdict': 'detail web tls ocsp-stapling verdict ok', 'exp': 'detail web tls ocsp-stapling exp', 'tech_type': 'table', 'tech_string': 'detail web tls ocsp-stapling tech table', 'tech_data': [('104.154.89.105', 'detail tech data no')], 'override_mandatory': None}, 'kex_hash_func': {'name': 'kex_hash_func', 'label': 'detail web tls kex-hash-func label', 'status': 1, 'worst_status': 2, 'verdict': 'detail web tls kex-hash-func verdict good', 'exp': 'detail web tls kex-hash-func exp', 'tech_type': 'table', 'tech_string': 'detail web tls kex-hash-func tech table', 'tech_data': [('104.154.89.105', 'detail tech data yes')], 'override_mandatory': None}}", + "score": 100, + "max_score": 130, + "timestamp": "2025-03-14T15:20:48.995Z" + } + }, + { + "model": "checks.webtesttls", + "pk": 9011, + "fields": { + "domain": "self-signed.badssl.com", + "report": "{'https_exists': {'name': 'https_exists', 'label': 'detail web tls https-exists label', 'status': 1, 'worst_status': 0, 'verdict': 'detail web tls https-exists verdict good', 'exp': 'detail web tls https-exists exp', 'tech_type': 'table', 'tech_string': 'detail web tls https-exists tech table', 'tech_data': [('104.154.89.105', 'detail tech data yes')], 'override_mandatory': None}, 'https_forced': {'name': 'https_forced', 'label': 'detail web tls https-forced label', 'status': 1, 'worst_status': 0, 'verdict': 'detail web tls https-forced verdict good', 'exp': 'detail web tls https-forced exp', 'tech_type': 'table', 'tech_string': 'detail web tls https-forced tech table', 'tech_data': [('104.154.89.105', 'detail tech data yes')], 'override_mandatory': None}, 'https_hsts': {'name': 'https_hsts', 'label': 'detail web tls https-hsts label', 'status': 0, 'worst_status': 0, 'verdict': 'detail web tls https-hsts verdict bad', 'exp': 'detail web tls https-hsts exp', 'tech_type': 'table', 'tech_string': 'detail web tls https-hsts tech table', 'tech_data': [('104.154.89.105', '')], 'override_mandatory': None}, 'http_compression': {'name': 'http_compression', 'label': 'detail web tls http-compression label', 'status': 5, 'worst_status': 5, 'verdict': 'detail web tls http-compression verdict bad', 'exp': 'detail web tls http-compression exp', 'tech_type': 'table', 'tech_string': 'detail web tls http-compression tech table', 'tech_data': [('104.154.89.105', 'detail tech data yes')], 'override_mandatory': None}, 'fs_params': {'name': 'fs_params', 'label': 'detail web tls fs-params label', 'status': 0, 'worst_status': 0, 'verdict': 'detail web tls fs-params verdict bad', 'exp': 'detail web tls fs-params exp', 'tech_type': 'table_multi_col', 'tech_string': 'detail web tls fs-params tech table', 'tech_data': [('104.154.89.105', ['DH-2048'], ['detail tech data insufficient'])], 'override_mandatory': None}, 'tls_ciphers': {'name': 'tls_ciphers', 'label': 'detail web tls ciphers label', 'status': 2, 'worst_status': 0, 'verdict': 'detail web tls ciphers verdict phase-out', 'exp': 'detail web tls ciphers exp', 'tech_type': 'table_multi_col', 'tech_string': 'detail web tls ciphers tech table', 'tech_data': [('104.154.89.105', ['CAMELLIA256-SHA', 'DES-CBC3-SHA', 'AES256-SHA256', 'CAMELLIA128-SHA', 'AES128-SHA', 'AES256-GCM-SHA384', 'AES128-GCM-SHA256', 'AES128-SHA256', 'AES256-SHA', 'ECDHE-RSA-DES-CBC3-SHA'], ['detail tech data phase-out', 'detail tech data phase-out', 'detail tech data phase-out', 'detail tech data phase-out', 'detail tech data phase-out', 'detail tech data phase-out', 'detail tech data phase-out', 'detail tech data phase-out', 'detail tech data phase-out', 'detail tech data phase-out'])], 'override_mandatory': None}, 'tls_cipher_order': {'name': 'tls_cipher_order', 'label': 'detail web tls cipher-order label', 'status': 1, 'worst_status': 0, 'verdict': 'detail web tls cipher-order verdict good', 'exp': 'detail web tls cipher-order exp', 'tech_type': 'table_multi_col', 'tech_string': 'detail web tls cipher-order tech table', 'tech_data': [('104.154.89.105', '')], 'override_mandatory': None}, 'tls_version': {'name': 'tls_version', 'label': 'detail web tls version label', 'status': 2, 'worst_status': 0, 'verdict': 'detail web tls version verdict phase-out', 'exp': 'detail web tls version exp', 'tech_type': 'table_multi_col', 'tech_string': 'detail web tls version tech table', 'tech_data': [('104.154.89.105', ['TLS 1.2', 'TLS 1.1', 'TLS 1.0'], ['detail tech data sufficient', 'detail tech data phase-out', 'detail tech data phase-out'])], 'override_mandatory': None}, 'tls_compression': {'name': 'tls_compression', 'label': 'detail web tls compression label', 'status': 1, 'worst_status': 0, 'verdict': 'detail web tls compression verdict good', 'exp': 'detail web tls compression exp', 'tech_type': 'table', 'tech_string': 'detail web tls compression tech table', 'tech_data': [('104.154.89.105', 'detail tech data no')], 'override_mandatory': None}, 'renegotiation_secure': {'name': 'renegotiation_secure', 'label': 'detail web tls renegotiation-secure label', 'status': 1, 'worst_status': 0, 'verdict': 'detail web tls renegotiation-secure verdict good', 'exp': 'detail web tls renegotiation-secure exp', 'tech_type': 'table', 'tech_string': 'detail web tls renegotiation-secure tech table', 'tech_data': [('104.154.89.105', 'detail tech data yes')], 'override_mandatory': None}, 'renegotiation_client': {'name': 'renegotiation_client', 'label': 'detail web tls renegotiation-client label', 'status': 1, 'worst_status': 5, 'verdict': 'detail web tls renegotiation-client verdict good', 'exp': 'detail web tls renegotiation-client exp', 'tech_type': 'table', 'tech_string': 'detail web tls renegotiation-client tech table', 'tech_data': [('104.154.89.105', 'detail tech data no')], 'override_mandatory': None}, 'cert_trust': {'name': 'cert_trust', 'label': 'detail web tls cert-trust label', 'status': 0, 'worst_status': 0, 'verdict': 'detail web tls cert-trust verdict bad', 'exp': 'detail web tls cert-trust exp', 'tech_type': 'table', 'tech_string': 'detail web tls cert-trust tech table', 'tech_data': [('104.154.89.105', ['*.badssl.com'])], 'override_mandatory': None}, 'cert_pubkey': {'name': 'cert_pubkey', 'label': 'detail web tls cert-pubkey label', 'status': 1, 'worst_status': 0, 'verdict': 'detail web tls cert-pubkey verdict good', 'exp': 'detail web tls cert-pubkey exp', 'tech_type': 'table', 'tech_string': 'detail web tls cert-pubkey tech table', 'tech_data': [('104.154.89.105', '')], 'override_mandatory': None}, 'cert_signature': {'name': 'cert_signature', 'label': 'detail web tls cert-signature label', 'status': 1, 'worst_status': 0, 'verdict': 'detail web tls cert-signature verdict good', 'exp': 'detail web tls cert-signature exp', 'tech_type': 'table_multi_col', 'tech_string': 'detail web tls cert-signature tech table', 'tech_data': [('104.154.89.105', '')], 'override_mandatory': None}, 'cert_hostmatch': {'name': 'cert_hostmatch', 'label': 'detail web tls cert-hostmatch label', 'status': 1, 'worst_status': 0, 'verdict': 'detail web tls cert-hostmatch verdict good', 'exp': 'detail web tls cert-hostmatch exp', 'tech_type': 'table', 'tech_string': 'detail web tls cert-hostmatch tech table', 'tech_data': [('104.154.89.105', '')], 'override_mandatory': None}, 'web_caa': {'name': 'web_caa', 'label': 'detail web caa label', 'status': 5, 'worst_status': 5, 'verdict': 'detail web caa verdict bad', 'exp': 'detail web caa exp', 'tech_type': 'table_translatable', 'tech_string': 'detail web caa tech table', 'tech_data': [[{'msgid': 'detail tech data caa not_found', 'context': {}}]], 'override_mandatory': None}, 'dane_exists': {'name': 'dane_exists', 'label': 'detail web tls dane-exists label', 'status': 5, 'worst_status': 5, 'verdict': 'detail web tls dane-exists verdict bad', 'exp': 'detail web tls dane-exists exp', 'tech_type': 'table', 'tech_string': 'detail web tls dane-exists tech table', 'tech_data': [('104.154.89.105', 'detail tech data no')], 'override_mandatory': None}, 'dane_valid': {'name': 'dane_valid', 'label': 'detail web tls dane-valid label', 'status': 4, 'worst_status': 2, 'verdict': 'detail verdict not-tested', 'exp': 'detail web tls dane-valid exp', 'tech_type': 'table', 'tech_string': 'detail web tls dane-valid tech table', 'tech_data': [('104.154.89.105', 'detail tech data not-tested')], 'override_mandatory': None}, 'zero_rtt': {'name': 'zero_rtt', 'label': 'detail web tls zero-rtt label', 'status': 1, 'worst_status': 0, 'verdict': 'detail web tls zero-rtt verdict na', 'exp': 'detail web tls zero-rtt exp', 'tech_type': 'table', 'tech_string': 'detail web tls zero-rtt tech table', 'tech_data': [('104.154.89.105', 'detail tech data no')], 'override_mandatory': None}, 'ocsp_stapling': {'name': 'ocsp_stapling', 'label': 'detail web tls ocsp-stapling label', 'status': 5, 'worst_status': 2, 'verdict': 'detail web tls ocsp-stapling verdict ok', 'exp': 'detail web tls ocsp-stapling exp', 'tech_type': 'table', 'tech_string': 'detail web tls ocsp-stapling tech table', 'tech_data': [('104.154.89.105', 'detail tech data no')], 'override_mandatory': None}, 'kex_hash_func': {'name': 'kex_hash_func', 'label': 'detail web tls kex-hash-func label', 'status': 1, 'worst_status': 2, 'verdict': 'detail web tls kex-hash-func verdict good', 'exp': 'detail web tls kex-hash-func exp', 'tech_type': 'table', 'tech_string': 'detail web tls kex-hash-func tech table', 'tech_data': [('104.154.89.105', 'detail tech data yes')], 'override_mandatory': None}}", + "score": 100, + "max_score": 130, + "timestamp": "2025-03-14T15:21:17.327Z" + } + }, + { + "model": "checks.webtesttls", + "pk": 9012, + "fields": { + "domain": "untrusted-root.badssl.com", + "report": "{'https_exists': {'name': 'https_exists', 'label': 'detail web tls https-exists label', 'status': 1, 'worst_status': 0, 'verdict': 'detail web tls https-exists verdict good', 'exp': 'detail web tls https-exists exp', 'tech_type': 'table', 'tech_string': 'detail web tls https-exists tech table', 'tech_data': [('104.154.89.105', 'detail tech data yes')], 'override_mandatory': None}, 'https_forced': {'name': 'https_forced', 'label': 'detail web tls https-forced label', 'status': 1, 'worst_status': 0, 'verdict': 'detail web tls https-forced verdict good', 'exp': 'detail web tls https-forced exp', 'tech_type': 'table', 'tech_string': 'detail web tls https-forced tech table', 'tech_data': [('104.154.89.105', 'detail tech data yes')], 'override_mandatory': None}, 'https_hsts': {'name': 'https_hsts', 'label': 'detail web tls https-hsts label', 'status': 0, 'worst_status': 0, 'verdict': 'detail web tls https-hsts verdict bad', 'exp': 'detail web tls https-hsts exp', 'tech_type': 'table', 'tech_string': 'detail web tls https-hsts tech table', 'tech_data': [('104.154.89.105', '')], 'override_mandatory': None}, 'http_compression': {'name': 'http_compression', 'label': 'detail web tls http-compression label', 'status': 5, 'worst_status': 5, 'verdict': 'detail web tls http-compression verdict bad', 'exp': 'detail web tls http-compression exp', 'tech_type': 'table', 'tech_string': 'detail web tls http-compression tech table', 'tech_data': [('104.154.89.105', 'detail tech data yes')], 'override_mandatory': None}, 'fs_params': {'name': 'fs_params', 'label': 'detail web tls fs-params label', 'status': 0, 'worst_status': 0, 'verdict': 'detail web tls fs-params verdict bad', 'exp': 'detail web tls fs-params exp', 'tech_type': 'table_multi_col', 'tech_string': 'detail web tls fs-params tech table', 'tech_data': [('104.154.89.105', ['DH-2048'], ['detail tech data insufficient'])], 'override_mandatory': None}, 'tls_ciphers': {'name': 'tls_ciphers', 'label': 'detail web tls ciphers label', 'status': 2, 'worst_status': 0, 'verdict': 'detail web tls ciphers verdict phase-out', 'exp': 'detail web tls ciphers exp', 'tech_type': 'table_multi_col', 'tech_string': 'detail web tls ciphers tech table', 'tech_data': [('104.154.89.105', ['CAMELLIA256-SHA', 'DES-CBC3-SHA', 'AES256-SHA256', 'CAMELLIA128-SHA', 'AES128-SHA', 'AES256-GCM-SHA384', 'AES128-GCM-SHA256', 'AES128-SHA256', 'AES256-SHA', 'ECDHE-RSA-DES-CBC3-SHA'], ['detail tech data phase-out', 'detail tech data phase-out', 'detail tech data phase-out', 'detail tech data phase-out', 'detail tech data phase-out', 'detail tech data phase-out', 'detail tech data phase-out', 'detail tech data phase-out', 'detail tech data phase-out', 'detail tech data phase-out'])], 'override_mandatory': None}, 'tls_cipher_order': {'name': 'tls_cipher_order', 'label': 'detail web tls cipher-order label', 'status': 1, 'worst_status': 0, 'verdict': 'detail web tls cipher-order verdict good', 'exp': 'detail web tls cipher-order exp', 'tech_type': 'table_multi_col', 'tech_string': 'detail web tls cipher-order tech table', 'tech_data': [('104.154.89.105', '')], 'override_mandatory': None}, 'tls_version': {'name': 'tls_version', 'label': 'detail web tls version label', 'status': 2, 'worst_status': 0, 'verdict': 'detail web tls version verdict phase-out', 'exp': 'detail web tls version exp', 'tech_type': 'table_multi_col', 'tech_string': 'detail web tls version tech table', 'tech_data': [('104.154.89.105', ['TLS 1.2', 'TLS 1.1', 'TLS 1.0'], ['detail tech data sufficient', 'detail tech data phase-out', 'detail tech data phase-out'])], 'override_mandatory': None}, 'tls_compression': {'name': 'tls_compression', 'label': 'detail web tls compression label', 'status': 1, 'worst_status': 0, 'verdict': 'detail web tls compression verdict good', 'exp': 'detail web tls compression exp', 'tech_type': 'table', 'tech_string': 'detail web tls compression tech table', 'tech_data': [('104.154.89.105', 'detail tech data no')], 'override_mandatory': None}, 'renegotiation_secure': {'name': 'renegotiation_secure', 'label': 'detail web tls renegotiation-secure label', 'status': 1, 'worst_status': 0, 'verdict': 'detail web tls renegotiation-secure verdict good', 'exp': 'detail web tls renegotiation-secure exp', 'tech_type': 'table', 'tech_string': 'detail web tls renegotiation-secure tech table', 'tech_data': [('104.154.89.105', 'detail tech data yes')], 'override_mandatory': None}, 'renegotiation_client': {'name': 'renegotiation_client', 'label': 'detail web tls renegotiation-client label', 'status': 1, 'worst_status': 5, 'verdict': 'detail web tls renegotiation-client verdict good', 'exp': 'detail web tls renegotiation-client exp', 'tech_type': 'table', 'tech_string': 'detail web tls renegotiation-client tech table', 'tech_data': [('104.154.89.105', 'detail tech data no')], 'override_mandatory': None}, 'cert_trust': {'name': 'cert_trust', 'label': 'detail web tls cert-trust label', 'status': 0, 'worst_status': 0, 'verdict': 'detail web tls cert-trust verdict bad', 'exp': 'detail web tls cert-trust exp', 'tech_type': 'table', 'tech_string': 'detail web tls cert-trust tech table', 'tech_data': [('104.154.89.105', ['*.badssl.com', 'BadSSL Untrusted Root Certificate Authority'])], 'override_mandatory': None}, 'cert_pubkey': {'name': 'cert_pubkey', 'label': 'detail web tls cert-pubkey label', 'status': 1, 'worst_status': 0, 'verdict': 'detail web tls cert-pubkey verdict good', 'exp': 'detail web tls cert-pubkey exp', 'tech_type': 'table', 'tech_string': 'detail web tls cert-pubkey tech table', 'tech_data': [('104.154.89.105', '')], 'override_mandatory': None}, 'cert_signature': {'name': 'cert_signature', 'label': 'detail web tls cert-signature label', 'status': 1, 'worst_status': 0, 'verdict': 'detail web tls cert-signature verdict good', 'exp': 'detail web tls cert-signature exp', 'tech_type': 'table_multi_col', 'tech_string': 'detail web tls cert-signature tech table', 'tech_data': [('104.154.89.105', '')], 'override_mandatory': None}, 'cert_hostmatch': {'name': 'cert_hostmatch', 'label': 'detail web tls cert-hostmatch label', 'status': 1, 'worst_status': 0, 'verdict': 'detail web tls cert-hostmatch verdict good', 'exp': 'detail web tls cert-hostmatch exp', 'tech_type': 'table', 'tech_string': 'detail web tls cert-hostmatch tech table', 'tech_data': [('104.154.89.105', '')], 'override_mandatory': None}, 'web_caa': {'name': 'web_caa', 'label': 'detail web caa label', 'status': 5, 'worst_status': 5, 'verdict': 'detail web caa verdict bad', 'exp': 'detail web caa exp', 'tech_type': 'table_translatable', 'tech_string': 'detail web caa tech table', 'tech_data': [[{'msgid': 'detail tech data caa not_found', 'context': {}}]], 'override_mandatory': None}, 'dane_exists': {'name': 'dane_exists', 'label': 'detail web tls dane-exists label', 'status': 5, 'worst_status': 5, 'verdict': 'detail web tls dane-exists verdict bad', 'exp': 'detail web tls dane-exists exp', 'tech_type': 'table', 'tech_string': 'detail web tls dane-exists tech table', 'tech_data': [('104.154.89.105', 'detail tech data no')], 'override_mandatory': None}, 'dane_valid': {'name': 'dane_valid', 'label': 'detail web tls dane-valid label', 'status': 4, 'worst_status': 2, 'verdict': 'detail verdict not-tested', 'exp': 'detail web tls dane-valid exp', 'tech_type': 'table', 'tech_string': 'detail web tls dane-valid tech table', 'tech_data': [('104.154.89.105', 'detail tech data not-tested')], 'override_mandatory': None}, 'zero_rtt': {'name': 'zero_rtt', 'label': 'detail web tls zero-rtt label', 'status': 1, 'worst_status': 0, 'verdict': 'detail web tls zero-rtt verdict na', 'exp': 'detail web tls zero-rtt exp', 'tech_type': 'table', 'tech_string': 'detail web tls zero-rtt tech table', 'tech_data': [('104.154.89.105', 'detail tech data no')], 'override_mandatory': None}, 'ocsp_stapling': {'name': 'ocsp_stapling', 'label': 'detail web tls ocsp-stapling label', 'status': 5, 'worst_status': 2, 'verdict': 'detail web tls ocsp-stapling verdict ok', 'exp': 'detail web tls ocsp-stapling exp', 'tech_type': 'table', 'tech_string': 'detail web tls ocsp-stapling tech table', 'tech_data': [('104.154.89.105', 'detail tech data no')], 'override_mandatory': None}, 'kex_hash_func': {'name': 'kex_hash_func', 'label': 'detail web tls kex-hash-func label', 'status': 1, 'worst_status': 2, 'verdict': 'detail web tls kex-hash-func verdict good', 'exp': 'detail web tls kex-hash-func exp', 'tech_type': 'table', 'tech_string': 'detail web tls kex-hash-func tech table', 'tech_data': [('104.154.89.105', 'detail tech data yes')], 'override_mandatory': None}}", + "score": 100, + "max_score": 130, + "timestamp": "2025-03-14T15:21:45.959Z" + } + }, + { + "model": "checks.webtesttls", + "pk": 9013, + "fields": { + "domain": "revoked.badssl.com", + "report": "{'https_exists': {'name': 'https_exists', 'label': 'detail web tls https-exists label', 'status': 1, 'worst_status': 0, 'verdict': 'detail web tls https-exists verdict good', 'exp': 'detail web tls https-exists exp', 'tech_type': 'table', 'tech_string': 'detail web tls https-exists tech table', 'tech_data': [('104.154.89.105', 'detail tech data yes')], 'override_mandatory': None}, 'https_forced': {'name': 'https_forced', 'label': 'detail web tls https-forced label', 'status': 1, 'worst_status': 0, 'verdict': 'detail web tls https-forced verdict good', 'exp': 'detail web tls https-forced exp', 'tech_type': 'table', 'tech_string': 'detail web tls https-forced tech table', 'tech_data': [('104.154.89.105', 'detail tech data yes')], 'override_mandatory': None}, 'https_hsts': {'name': 'https_hsts', 'label': 'detail web tls https-hsts label', 'status': 0, 'worst_status': 0, 'verdict': 'detail web tls https-hsts verdict bad', 'exp': 'detail web tls https-hsts exp', 'tech_type': 'table', 'tech_string': 'detail web tls https-hsts tech table', 'tech_data': [('104.154.89.105', '')], 'override_mandatory': None}, 'http_compression': {'name': 'http_compression', 'label': 'detail web tls http-compression label', 'status': 5, 'worst_status': 5, 'verdict': 'detail web tls http-compression verdict bad', 'exp': 'detail web tls http-compression exp', 'tech_type': 'table', 'tech_string': 'detail web tls http-compression tech table', 'tech_data': [('104.154.89.105', 'detail tech data yes')], 'override_mandatory': None}, 'fs_params': {'name': 'fs_params', 'label': 'detail web tls fs-params label', 'status': 1, 'worst_status': 0, 'verdict': 'detail web tls fs-params verdict good', 'exp': 'detail web tls fs-params exp', 'tech_type': 'table_multi_col', 'tech_string': 'detail web tls fs-params tech table', 'tech_data': [('104.154.89.105', '')], 'override_mandatory': None}, 'tls_ciphers': {'name': 'tls_ciphers', 'label': 'detail web tls ciphers label', 'status': 2, 'worst_status': 0, 'verdict': 'detail web tls ciphers verdict phase-out', 'exp': 'detail web tls ciphers exp', 'tech_type': 'table_multi_col', 'tech_string': 'detail web tls ciphers tech table', 'tech_data': [('104.154.89.105', ['ECDHE-ECDSA-DES-CBC3-SHA'], ['detail tech data phase-out'])], 'override_mandatory': None}, 'tls_cipher_order': {'name': 'tls_cipher_order', 'label': 'detail web tls cipher-order label', 'status': 1, 'worst_status': 0, 'verdict': 'detail web tls cipher-order verdict good', 'exp': 'detail web tls cipher-order exp', 'tech_type': 'table_multi_col', 'tech_string': 'detail web tls cipher-order tech table', 'tech_data': [('104.154.89.105', '')], 'override_mandatory': None}, 'tls_version': {'name': 'tls_version', 'label': 'detail web tls version label', 'status': 2, 'worst_status': 0, 'verdict': 'detail web tls version verdict phase-out', 'exp': 'detail web tls version exp', 'tech_type': 'table_multi_col', 'tech_string': 'detail web tls version tech table', 'tech_data': [('104.154.89.105', ['TLS 1.2', 'TLS 1.1', 'TLS 1.0'], ['detail tech data sufficient', 'detail tech data phase-out', 'detail tech data phase-out'])], 'override_mandatory': None}, 'tls_compression': {'name': 'tls_compression', 'label': 'detail web tls compression label', 'status': 1, 'worst_status': 0, 'verdict': 'detail web tls compression verdict good', 'exp': 'detail web tls compression exp', 'tech_type': 'table', 'tech_string': 'detail web tls compression tech table', 'tech_data': [('104.154.89.105', 'detail tech data no')], 'override_mandatory': None}, 'renegotiation_secure': {'name': 'renegotiation_secure', 'label': 'detail web tls renegotiation-secure label', 'status': 1, 'worst_status': 0, 'verdict': 'detail web tls renegotiation-secure verdict good', 'exp': 'detail web tls renegotiation-secure exp', 'tech_type': 'table', 'tech_string': 'detail web tls renegotiation-secure tech table', 'tech_data': [('104.154.89.105', 'detail tech data yes')], 'override_mandatory': None}, 'renegotiation_client': {'name': 'renegotiation_client', 'label': 'detail web tls renegotiation-client label', 'status': 1, 'worst_status': 5, 'verdict': 'detail web tls renegotiation-client verdict good', 'exp': 'detail web tls renegotiation-client exp', 'tech_type': 'table', 'tech_string': 'detail web tls renegotiation-client tech table', 'tech_data': [('104.154.89.105', 'detail tech data no')], 'override_mandatory': None}, 'cert_trust': {'name': 'cert_trust', 'label': 'detail web tls cert-trust label', 'status': 1, 'worst_status': 0, 'verdict': 'detail web tls cert-trust verdict good', 'exp': 'detail web tls cert-trust exp', 'tech_type': 'table', 'tech_string': 'detail web tls cert-trust tech table', 'tech_data': [('104.154.89.105', '')], 'override_mandatory': None}, 'cert_pubkey': {'name': 'cert_pubkey', 'label': 'detail web tls cert-pubkey label', 'status': 1, 'worst_status': 0, 'verdict': 'detail web tls cert-pubkey verdict good', 'exp': 'detail web tls cert-pubkey exp', 'tech_type': 'table', 'tech_string': 'detail web tls cert-pubkey tech table', 'tech_data': [('104.154.89.105', '')], 'override_mandatory': None}, 'cert_signature': {'name': 'cert_signature', 'label': 'detail web tls cert-signature label', 'status': 1, 'worst_status': 0, 'verdict': 'detail web tls cert-signature verdict good', 'exp': 'detail web tls cert-signature exp', 'tech_type': 'table_multi_col', 'tech_string': 'detail web tls cert-signature tech table', 'tech_data': [('104.154.89.105', '')], 'override_mandatory': None}, 'cert_hostmatch': {'name': 'cert_hostmatch', 'label': 'detail web tls cert-hostmatch label', 'status': 1, 'worst_status': 0, 'verdict': 'detail web tls cert-hostmatch verdict good', 'exp': 'detail web tls cert-hostmatch exp', 'tech_type': 'table', 'tech_string': 'detail web tls cert-hostmatch tech table', 'tech_data': [('104.154.89.105', '')], 'override_mandatory': None}, 'web_caa': {'name': 'web_caa', 'label': 'detail web caa label', 'status': 5, 'worst_status': 5, 'verdict': 'detail web caa verdict bad', 'exp': 'detail web caa exp', 'tech_type': 'table_translatable', 'tech_string': 'detail web caa tech table', 'tech_data': [[{'msgid': 'detail tech data caa not_found', 'context': {}}]], 'override_mandatory': None}, 'dane_exists': {'name': 'dane_exists', 'label': 'detail web tls dane-exists label', 'status': 5, 'worst_status': 5, 'verdict': 'detail web tls dane-exists verdict bad', 'exp': 'detail web tls dane-exists exp', 'tech_type': 'table', 'tech_string': 'detail web tls dane-exists tech table', 'tech_data': [('104.154.89.105', 'detail tech data no')], 'override_mandatory': None}, 'dane_valid': {'name': 'dane_valid', 'label': 'detail web tls dane-valid label', 'status': 4, 'worst_status': 2, 'verdict': 'detail verdict not-tested', 'exp': 'detail web tls dane-valid exp', 'tech_type': 'table', 'tech_string': 'detail web tls dane-valid tech table', 'tech_data': [('104.154.89.105', 'detail tech data not-tested')], 'override_mandatory': None}, 'zero_rtt': {'name': 'zero_rtt', 'label': 'detail web tls zero-rtt label', 'status': 1, 'worst_status': 0, 'verdict': 'detail web tls zero-rtt verdict na', 'exp': 'detail web tls zero-rtt exp', 'tech_type': 'table', 'tech_string': 'detail web tls zero-rtt tech table', 'tech_data': [('104.154.89.105', 'detail tech data no')], 'override_mandatory': None}, 'ocsp_stapling': {'name': 'ocsp_stapling', 'label': 'detail web tls ocsp-stapling label', 'status': 5, 'worst_status': 2, 'verdict': 'detail web tls ocsp-stapling verdict ok', 'exp': 'detail web tls ocsp-stapling exp', 'tech_type': 'table', 'tech_string': 'detail web tls ocsp-stapling tech table', 'tech_data': [('104.154.89.105', 'detail tech data no')], 'override_mandatory': None}, 'kex_hash_func': {'name': 'kex_hash_func', 'label': 'detail web tls kex-hash-func label', 'status': 1, 'worst_status': 2, 'verdict': 'detail web tls kex-hash-func verdict good', 'exp': 'detail web tls kex-hash-func exp', 'tech_type': 'table', 'tech_string': 'detail web tls kex-hash-func tech table', 'tech_data': [('104.154.89.105', 'detail tech data yes')], 'override_mandatory': None}}", + "score": 120, + "max_score": 130, + "timestamp": "2025-03-14T15:22:04.659Z" + } + }, + { + "model": "checks.webtesttls", + "pk": 9014, + "fields": { + "domain": "pinning-test.badssl.com", + "report": "{'https_exists': {'name': 'https_exists', 'label': 'detail web tls https-exists label', 'status': 1, 'worst_status': 0, 'verdict': 'detail web tls https-exists verdict good', 'exp': 'detail web tls https-exists exp', 'tech_type': 'table', 'tech_string': 'detail web tls https-exists tech table', 'tech_data': [('104.154.89.105', 'detail tech data yes')], 'override_mandatory': None}, 'https_forced': {'name': 'https_forced', 'label': 'detail web tls https-forced label', 'status': 1, 'worst_status': 0, 'verdict': 'detail web tls https-forced verdict good', 'exp': 'detail web tls https-forced exp', 'tech_type': 'table', 'tech_string': 'detail web tls https-forced tech table', 'tech_data': [('104.154.89.105', 'detail tech data yes')], 'override_mandatory': None}, 'https_hsts': {'name': 'https_hsts', 'label': 'detail web tls https-hsts label', 'status': 0, 'worst_status': 0, 'verdict': 'detail web tls https-hsts verdict bad', 'exp': 'detail web tls https-hsts exp', 'tech_type': 'table', 'tech_string': 'detail web tls https-hsts tech table', 'tech_data': [('104.154.89.105', '')], 'override_mandatory': None}, 'http_compression': {'name': 'http_compression', 'label': 'detail web tls http-compression label', 'status': 5, 'worst_status': 5, 'verdict': 'detail web tls http-compression verdict bad', 'exp': 'detail web tls http-compression exp', 'tech_type': 'table', 'tech_string': 'detail web tls http-compression tech table', 'tech_data': [('104.154.89.105', 'detail tech data yes')], 'override_mandatory': None}, 'fs_params': {'name': 'fs_params', 'label': 'detail web tls fs-params label', 'status': 0, 'worst_status': 0, 'verdict': 'detail web tls fs-params verdict bad', 'exp': 'detail web tls fs-params exp', 'tech_type': 'table_multi_col', 'tech_string': 'detail web tls fs-params tech table', 'tech_data': [('104.154.89.105', ['DH-2048'], ['detail tech data insufficient'])], 'override_mandatory': None}, 'tls_ciphers': {'name': 'tls_ciphers', 'label': 'detail web tls ciphers label', 'status': 2, 'worst_status': 0, 'verdict': 'detail web tls ciphers verdict phase-out', 'exp': 'detail web tls ciphers exp', 'tech_type': 'table_multi_col', 'tech_string': 'detail web tls ciphers tech table', 'tech_data': [('104.154.89.105', ['CAMELLIA256-SHA', 'DES-CBC3-SHA', 'AES256-SHA256', 'CAMELLIA128-SHA', 'AES128-SHA', 'AES256-GCM-SHA384', 'AES128-GCM-SHA256', 'AES128-SHA256', 'AES256-SHA', 'ECDHE-RSA-DES-CBC3-SHA'], ['detail tech data phase-out', 'detail tech data phase-out', 'detail tech data phase-out', 'detail tech data phase-out', 'detail tech data phase-out', 'detail tech data phase-out', 'detail tech data phase-out', 'detail tech data phase-out', 'detail tech data phase-out', 'detail tech data phase-out'])], 'override_mandatory': None}, 'tls_cipher_order': {'name': 'tls_cipher_order', 'label': 'detail web tls cipher-order label', 'status': 1, 'worst_status': 0, 'verdict': 'detail web tls cipher-order verdict good', 'exp': 'detail web tls cipher-order exp', 'tech_type': 'table_multi_col', 'tech_string': 'detail web tls cipher-order tech table', 'tech_data': [('104.154.89.105', '')], 'override_mandatory': None}, 'tls_version': {'name': 'tls_version', 'label': 'detail web tls version label', 'status': 2, 'worst_status': 0, 'verdict': 'detail web tls version verdict phase-out', 'exp': 'detail web tls version exp', 'tech_type': 'table_multi_col', 'tech_string': 'detail web tls version tech table', 'tech_data': [('104.154.89.105', ['TLS 1.2', 'TLS 1.1', 'TLS 1.0'], ['detail tech data sufficient', 'detail tech data phase-out', 'detail tech data phase-out'])], 'override_mandatory': None}, 'tls_compression': {'name': 'tls_compression', 'label': 'detail web tls compression label', 'status': 1, 'worst_status': 0, 'verdict': 'detail web tls compression verdict good', 'exp': 'detail web tls compression exp', 'tech_type': 'table', 'tech_string': 'detail web tls compression tech table', 'tech_data': [('104.154.89.105', 'detail tech data no')], 'override_mandatory': None}, 'renegotiation_secure': {'name': 'renegotiation_secure', 'label': 'detail web tls renegotiation-secure label', 'status': 1, 'worst_status': 0, 'verdict': 'detail web tls renegotiation-secure verdict good', 'exp': 'detail web tls renegotiation-secure exp', 'tech_type': 'table', 'tech_string': 'detail web tls renegotiation-secure tech table', 'tech_data': [('104.154.89.105', 'detail tech data yes')], 'override_mandatory': None}, 'renegotiation_client': {'name': 'renegotiation_client', 'label': 'detail web tls renegotiation-client label', 'status': 1, 'worst_status': 5, 'verdict': 'detail web tls renegotiation-client verdict good', 'exp': 'detail web tls renegotiation-client exp', 'tech_type': 'table', 'tech_string': 'detail web tls renegotiation-client tech table', 'tech_data': [('104.154.89.105', 'detail tech data no')], 'override_mandatory': None}, 'cert_trust': {'name': 'cert_trust', 'label': 'detail web tls cert-trust label', 'status': 1, 'worst_status': 0, 'verdict': 'detail web tls cert-trust verdict good', 'exp': 'detail web tls cert-trust exp', 'tech_type': 'table', 'tech_string': 'detail web tls cert-trust tech table', 'tech_data': [('104.154.89.105', '')], 'override_mandatory': None}, 'cert_pubkey': {'name': 'cert_pubkey', 'label': 'detail web tls cert-pubkey label', 'status': 1, 'worst_status': 0, 'verdict': 'detail web tls cert-pubkey verdict good', 'exp': 'detail web tls cert-pubkey exp', 'tech_type': 'table', 'tech_string': 'detail web tls cert-pubkey tech table', 'tech_data': [('104.154.89.105', '')], 'override_mandatory': None}, 'cert_signature': {'name': 'cert_signature', 'label': 'detail web tls cert-signature label', 'status': 1, 'worst_status': 0, 'verdict': 'detail web tls cert-signature verdict good', 'exp': 'detail web tls cert-signature exp', 'tech_type': 'table_multi_col', 'tech_string': 'detail web tls cert-signature tech table', 'tech_data': [('104.154.89.105', '')], 'override_mandatory': None}, 'cert_hostmatch': {'name': 'cert_hostmatch', 'label': 'detail web tls cert-hostmatch label', 'status': 1, 'worst_status': 0, 'verdict': 'detail web tls cert-hostmatch verdict good', 'exp': 'detail web tls cert-hostmatch exp', 'tech_type': 'table', 'tech_string': 'detail web tls cert-hostmatch tech table', 'tech_data': [('104.154.89.105', '')], 'override_mandatory': None}, 'web_caa': {'name': 'web_caa', 'label': 'detail web caa label', 'status': 5, 'worst_status': 5, 'verdict': 'detail web caa verdict bad', 'exp': 'detail web caa exp', 'tech_type': 'table_translatable', 'tech_string': 'detail web caa tech table', 'tech_data': [[{'msgid': 'detail tech data caa not_found', 'context': {}}]], 'override_mandatory': None}, 'dane_exists': {'name': 'dane_exists', 'label': 'detail web tls dane-exists label', 'status': 5, 'worst_status': 5, 'verdict': 'detail web tls dane-exists verdict bad', 'exp': 'detail web tls dane-exists exp', 'tech_type': 'table', 'tech_string': 'detail web tls dane-exists tech table', 'tech_data': [('104.154.89.105', 'detail tech data no')], 'override_mandatory': None}, 'dane_valid': {'name': 'dane_valid', 'label': 'detail web tls dane-valid label', 'status': 4, 'worst_status': 2, 'verdict': 'detail verdict not-tested', 'exp': 'detail web tls dane-valid exp', 'tech_type': 'table', 'tech_string': 'detail web tls dane-valid tech table', 'tech_data': [('104.154.89.105', 'detail tech data not-tested')], 'override_mandatory': None}, 'zero_rtt': {'name': 'zero_rtt', 'label': 'detail web tls zero-rtt label', 'status': 1, 'worst_status': 0, 'verdict': 'detail web tls zero-rtt verdict na', 'exp': 'detail web tls zero-rtt exp', 'tech_type': 'table', 'tech_string': 'detail web tls zero-rtt tech table', 'tech_data': [('104.154.89.105', 'detail tech data no')], 'override_mandatory': None}, 'ocsp_stapling': {'name': 'ocsp_stapling', 'label': 'detail web tls ocsp-stapling label', 'status': 5, 'worst_status': 2, 'verdict': 'detail web tls ocsp-stapling verdict ok', 'exp': 'detail web tls ocsp-stapling exp', 'tech_type': 'table', 'tech_string': 'detail web tls ocsp-stapling tech table', 'tech_data': [('104.154.89.105', 'detail tech data no')], 'override_mandatory': None}, 'kex_hash_func': {'name': 'kex_hash_func', 'label': 'detail web tls kex-hash-func label', 'status': 1, 'worst_status': 2, 'verdict': 'detail web tls kex-hash-func verdict good', 'exp': 'detail web tls kex-hash-func exp', 'tech_type': 'table', 'tech_string': 'detail web tls kex-hash-func tech table', 'tech_data': [('104.154.89.105', 'detail tech data yes')], 'override_mandatory': None}}", + "score": 110, + "max_score": 130, + "timestamp": "2025-03-14T15:22:34.346Z" + } + }, + { + "model": "checks.webtesttls", + "pk": 9015, + "fields": { + "domain": "invalid.rpki.isbgpsafeyet.com", + "report": "{'https_exists': {'name': 'https_exists', 'label': 'detail web tls https-exists label', 'status': 1, 'worst_status': 0, 'verdict': 'detail web tls https-exists verdict good', 'exp': 'detail web tls https-exists exp', 'tech_type': 'table', 'tech_string': 'detail web tls https-exists tech table', 'tech_data': [('103.21.244.8', 'detail tech data yes'), ('2606:4700:7000::6715:f409', 'detail tech data yes')], 'override_mandatory': None}, 'https_forced': {'name': 'https_forced', 'label': 'detail web tls https-forced label', 'status': 1, 'worst_status': 0, 'verdict': 'detail web tls https-forced verdict good', 'exp': 'detail web tls https-forced exp', 'tech_type': 'table', 'tech_string': 'detail web tls https-forced tech table', 'tech_data': [('103.21.244.8', 'detail tech data yes'), ('2606:4700:7000::6715:f409', 'detail tech data yes')], 'override_mandatory': None}, 'https_hsts': {'name': 'https_hsts', 'label': 'detail web tls https-hsts label', 'status': 1, 'worst_status': 0, 'verdict': 'detail web tls https-hsts verdict good', 'exp': 'detail web tls https-hsts exp', 'tech_type': 'table', 'tech_string': 'detail web tls https-hsts tech table', 'tech_data': [('103.21.244.8', ['max-age=31536000']), ('2606:4700:7000::6715:f409', ['max-age=31536000'])], 'override_mandatory': None}, 'http_compression': {'name': 'http_compression', 'label': 'detail web tls http-compression label', 'status': 5, 'worst_status': 5, 'verdict': 'detail web tls http-compression verdict bad', 'exp': 'detail web tls http-compression exp', 'tech_type': 'table', 'tech_string': 'detail web tls http-compression tech table', 'tech_data': [('103.21.244.8', 'detail tech data yes'), ('2606:4700:7000::6715:f409', 'detail tech data yes')], 'override_mandatory': None}, 'fs_params': {'name': 'fs_params', 'label': 'detail web tls fs-params label', 'status': 1, 'worst_status': 0, 'verdict': 'detail web tls fs-params verdict good', 'exp': 'detail web tls fs-params exp', 'tech_type': 'table_multi_col', 'tech_string': 'detail web tls fs-params tech table', 'tech_data': [('103.21.244.8', ''), ('2606:4700:7000::6715:f409', '')], 'override_mandatory': None}, 'tls_ciphers': {'name': 'tls_ciphers', 'label': 'detail web tls ciphers label', 'status': 1, 'worst_status': 0, 'verdict': 'detail web tls ciphers verdict good', 'exp': 'detail web tls ciphers exp', 'tech_type': 'table_multi_col', 'tech_string': 'detail web tls ciphers tech table', 'tech_data': [('103.21.244.8', ''), ('2606:4700:7000::6715:f409', '')], 'override_mandatory': None}, 'tls_cipher_order': {'name': 'tls_cipher_order', 'label': 'detail web tls cipher-order label', 'status': 0, 'worst_status': 0, 'verdict': 'detail web tls cipher-order verdict seclevel-bad', 'exp': 'detail web tls cipher-order exp', 'tech_type': 'table_multi_col', 'tech_string': 'detail web tls cipher-order tech table', 'tech_data': [('103.21.244.8', ['ECDHE-ECDSA-AES128-SHA', 'ECDHE-ECDSA-AES256-GCM-SHA384']), ('2606:4700:7000::6715:f409', ['ECDHE-ECDSA-AES128-SHA', 'ECDHE-ECDSA-AES256-GCM-SHA384'])], 'override_mandatory': None}, 'tls_version': {'name': 'tls_version', 'label': 'detail web tls version label', 'status': 1, 'worst_status': 0, 'verdict': 'detail web tls version verdict good', 'exp': 'detail web tls version exp', 'tech_type': 'table_multi_col', 'tech_string': 'detail web tls version tech table', 'tech_data': [('103.21.244.8', ['TLS 1.3', 'TLS 1.2'], ['detail tech data good', 'detail tech data sufficient']), ('2606:4700:7000::6715:f409', ['TLS 1.3', 'TLS 1.2'], ['detail tech data good', 'detail tech data sufficient'])], 'override_mandatory': None}, 'tls_compression': {'name': 'tls_compression', 'label': 'detail web tls compression label', 'status': 1, 'worst_status': 0, 'verdict': 'detail web tls compression verdict good', 'exp': 'detail web tls compression exp', 'tech_type': 'table', 'tech_string': 'detail web tls compression tech table', 'tech_data': [('103.21.244.8', 'detail tech data no'), ('2606:4700:7000::6715:f409', 'detail tech data no')], 'override_mandatory': None}, 'renegotiation_secure': {'name': 'renegotiation_secure', 'label': 'detail web tls renegotiation-secure label', 'status': 1, 'worst_status': 0, 'verdict': 'detail web tls renegotiation-secure verdict good', 'exp': 'detail web tls renegotiation-secure exp', 'tech_type': 'table', 'tech_string': 'detail web tls renegotiation-secure tech table', 'tech_data': [('103.21.244.8', 'detail tech data yes'), ('2606:4700:7000::6715:f409', 'detail tech data yes')], 'override_mandatory': None}, 'renegotiation_client': {'name': 'renegotiation_client', 'label': 'detail web tls renegotiation-client label', 'status': 1, 'worst_status': 5, 'verdict': 'detail web tls renegotiation-client verdict good', 'exp': 'detail web tls renegotiation-client exp', 'tech_type': 'table', 'tech_string': 'detail web tls renegotiation-client tech table', 'tech_data': [('103.21.244.8', 'detail tech data no'), ('2606:4700:7000::6715:f409', 'detail tech data no')], 'override_mandatory': None}, 'cert_trust': {'name': 'cert_trust', 'label': 'detail web tls cert-trust label', 'status': 1, 'worst_status': 0, 'verdict': 'detail web tls cert-trust verdict good', 'exp': 'detail web tls cert-trust exp', 'tech_type': 'table', 'tech_string': 'detail web tls cert-trust tech table', 'tech_data': [('103.21.244.8', ''), ('2606:4700:7000::6715:f409', '')], 'override_mandatory': None}, 'cert_pubkey': {'name': 'cert_pubkey', 'label': 'detail web tls cert-pubkey label', 'status': 1, 'worst_status': 0, 'verdict': 'detail web tls cert-pubkey verdict good', 'exp': 'detail web tls cert-pubkey exp', 'tech_type': 'table', 'tech_string': 'detail web tls cert-pubkey tech table', 'tech_data': [('103.21.244.8', ''), ('2606:4700:7000::6715:f409', '')], 'override_mandatory': None}, 'cert_signature': {'name': 'cert_signature', 'label': 'detail web tls cert-signature label', 'status': 1, 'worst_status': 0, 'verdict': 'detail web tls cert-signature verdict good', 'exp': 'detail web tls cert-signature exp', 'tech_type': 'table_multi_col', 'tech_string': 'detail web tls cert-signature tech table', 'tech_data': [('103.21.244.8', ''), ('2606:4700:7000::6715:f409', '')], 'override_mandatory': None}, 'cert_hostmatch': {'name': 'cert_hostmatch', 'label': 'detail web tls cert-hostmatch label', 'status': 1, 'worst_status': 0, 'verdict': 'detail web tls cert-hostmatch verdict good', 'exp': 'detail web tls cert-hostmatch exp', 'tech_type': 'table', 'tech_string': 'detail web tls cert-hostmatch tech table', 'tech_data': [('103.21.244.8', ''), ('2606:4700:7000::6715:f409', '')], 'override_mandatory': None}, 'web_caa': {'name': 'web_caa', 'label': 'detail web caa label', 'status': 5, 'worst_status': 5, 'verdict': 'detail web caa verdict bad', 'exp': 'detail web caa exp', 'tech_type': 'table_translatable', 'tech_string': 'detail web caa tech table', 'tech_data': [[{'msgid': 'detail tech data caa not_found', 'context': {}}]], 'override_mandatory': None}, 'dane_exists': {'name': 'dane_exists', 'label': 'detail web tls dane-exists label', 'status': 5, 'worst_status': 5, 'verdict': 'detail web tls dane-exists verdict bad', 'exp': 'detail web tls dane-exists exp', 'tech_type': 'table', 'tech_string': 'detail web tls dane-exists tech table', 'tech_data': [('103.21.244.8', 'detail tech data no'), ('2606:4700:7000::6715:f409', 'detail tech data no')], 'override_mandatory': None}, 'dane_valid': {'name': 'dane_valid', 'label': 'detail web tls dane-valid label', 'status': 4, 'worst_status': 2, 'verdict': 'detail verdict not-tested', 'exp': 'detail web tls dane-valid exp', 'tech_type': 'table', 'tech_string': 'detail web tls dane-valid tech table', 'tech_data': [('103.21.244.8', 'detail tech data not-tested'), ('2606:4700:7000::6715:f409', 'detail tech data not-tested')], 'override_mandatory': None}, 'zero_rtt': {'name': 'zero_rtt', 'label': 'detail web tls zero-rtt label', 'status': 0, 'worst_status': 0, 'verdict': 'detail web tls zero-rtt verdict bad', 'exp': 'detail web tls zero-rtt exp', 'tech_type': 'table', 'tech_string': 'detail web tls zero-rtt tech table', 'tech_data': [('103.21.244.8', 'detail tech data yes'), ('2606:4700:7000::6715:f409', 'detail tech data yes')], 'override_mandatory': None}, 'ocsp_stapling': {'name': 'ocsp_stapling', 'label': 'detail web tls ocsp-stapling label', 'status': 1, 'worst_status': 2, 'verdict': 'detail web tls ocsp-stapling verdict good', 'exp': 'detail web tls ocsp-stapling exp', 'tech_type': 'table', 'tech_string': 'detail web tls ocsp-stapling tech table', 'tech_data': [('103.21.244.8', 'detail tech data yes'), ('2606:4700:7000::6715:f409', 'detail tech data yes')], 'override_mandatory': None}, 'kex_hash_func': {'name': 'kex_hash_func', 'label': 'detail web tls kex-hash-func label', 'status': 1, 'worst_status': 2, 'verdict': 'detail web tls kex-hash-func verdict good', 'exp': 'detail web tls kex-hash-func exp', 'tech_type': 'table', 'tech_string': 'detail web tls kex-hash-func tech table', 'tech_data': [('103.21.244.8', 'detail tech data yes'), ('2606:4700:7000::6715:f409', 'detail tech data yes')], 'override_mandatory': None}}", + "score": 110, + "max_score": 130, + "timestamp": "2025-03-14T15:22:41.328Z" + } + }, + { + "model": "checks.domaintesttls", + "pk": 9000, + "fields": { + "timestamp": "2025-03-14T15:14:05.830Z", + "domain": "62.204.66.10", + "report": "{'https_exists': {'name': 'https_exists', 'label': 'detail web tls https-exists label', 'status': 1, 'worst_status': 0, 'verdict': 'detail web tls https-exists verdict good', 'exp': 'detail web tls https-exists exp', 'tech_type': 'table', 'tech_string': 'detail web tls https-exists tech table', 'tech_data': 'detail tech data yes', 'override_mandatory': None}, 'https_forced': {'name': 'https_forced', 'label': 'detail web tls https-forced label', 'status': 1, 'worst_status': 0, 'verdict': 'detail web tls https-forced verdict good', 'exp': 'detail web tls https-forced exp', 'tech_type': 'table', 'tech_string': 'detail web tls https-forced tech table', 'tech_data': 'detail tech data yes', 'override_mandatory': None}, 'https_hsts': {'name': 'https_hsts', 'label': 'detail web tls https-hsts label', 'status': 1, 'worst_status': 0, 'verdict': 'detail web tls https-hsts verdict good', 'exp': 'detail web tls https-hsts exp', 'tech_type': 'table', 'tech_string': 'detail web tls https-hsts tech table', 'tech_data': ['max-age=31536000;'], 'override_mandatory': None}, 'http_compression': {'name': 'http_compression', 'label': 'detail web tls http-compression label', 'status': 1, 'worst_status': 5, 'verdict': 'detail web tls http-compression verdict good', 'exp': 'detail web tls http-compression exp', 'tech_type': 'table', 'tech_string': 'detail web tls http-compression tech table', 'tech_data': 'detail tech data no', 'override_mandatory': None}, 'fs_params': {'name': 'fs_params', 'label': 'detail web tls fs-params label', 'status': 1, 'worst_status': 0, 'verdict': 'detail web tls fs-params verdict good', 'exp': 'detail web tls fs-params exp', 'tech_type': 'table_multi_col', 'tech_string': 'detail web tls fs-params tech table', 'tech_data': '', 'override_mandatory': None}, 'tls_ciphers': {'name': 'tls_ciphers', 'label': 'detail web tls ciphers label', 'status': 1, 'worst_status': 0, 'verdict': 'detail web tls ciphers verdict good', 'exp': 'detail web tls ciphers exp', 'tech_type': 'table_multi_col', 'tech_string': 'detail web tls ciphers tech table', 'tech_data': '', 'override_mandatory': None}, 'tls_cipher_order': {'name': 'tls_cipher_order', 'label': 'detail web tls cipher-order label', 'status': 1, 'worst_status': 0, 'verdict': 'detail web tls cipher-order verdict na', 'exp': 'detail web tls cipher-order exp', 'tech_type': 'table_multi_col', 'tech_string': 'detail web tls cipher-order tech table', 'tech_data': '', 'override_mandatory': None}, 'tls_version': {'name': 'tls_version', 'label': 'detail web tls version label', 'status': 1, 'worst_status': 0, 'verdict': 'detail web tls version verdict good', 'exp': 'detail web tls version exp', 'tech_type': 'table_multi_col', 'tech_string': 'detail web tls version tech table', 'tech_data': [['TLS 1.3', 'TLS 1.2'], ['detail tech data good', 'detail tech data sufficient']], 'override_mandatory': None}, 'tls_compression': {'name': 'tls_compression', 'label': 'detail web tls compression label', 'status': 1, 'worst_status': 0, 'verdict': 'detail web tls compression verdict good', 'exp': 'detail web tls compression exp', 'tech_type': 'table', 'tech_string': 'detail web tls compression tech table', 'tech_data': 'detail tech data no', 'override_mandatory': None}, 'renegotiation_secure': {'name': 'renegotiation_secure', 'label': 'detail web tls renegotiation-secure label', 'status': 1, 'worst_status': 0, 'verdict': 'detail web tls renegotiation-secure verdict good', 'exp': 'detail web tls renegotiation-secure exp', 'tech_type': 'table', 'tech_string': 'detail web tls renegotiation-secure tech table', 'tech_data': 'detail tech data yes', 'override_mandatory': None}, 'renegotiation_client': {'name': 'renegotiation_client', 'label': 'detail web tls renegotiation-client label', 'status': 1, 'worst_status': 5, 'verdict': 'detail web tls renegotiation-client verdict good', 'exp': 'detail web tls renegotiation-client exp', 'tech_type': 'table', 'tech_string': 'detail web tls renegotiation-client tech table', 'tech_data': 'detail tech data no', 'override_mandatory': None}, 'cert_trust': {'name': 'cert_trust', 'label': 'detail web tls cert-trust label', 'status': 1, 'worst_status': 0, 'verdict': 'detail web tls cert-trust verdict good', 'exp': 'detail web tls cert-trust exp', 'tech_type': 'table', 'tech_string': 'detail web tls cert-trust tech table', 'tech_data': '', 'override_mandatory': None}, 'cert_pubkey': {'name': 'cert_pubkey', 'label': 'detail web tls cert-pubkey label', 'status': 1, 'worst_status': 0, 'verdict': 'detail web tls cert-pubkey verdict good', 'exp': 'detail web tls cert-pubkey exp', 'tech_type': 'table', 'tech_string': 'detail web tls cert-pubkey tech table', 'tech_data': '', 'override_mandatory': None}, 'cert_signature': {'name': 'cert_signature', 'label': 'detail web tls cert-signature label', 'status': 1, 'worst_status': 0, 'verdict': 'detail web tls cert-signature verdict good', 'exp': 'detail web tls cert-signature exp', 'tech_type': 'table_multi_col', 'tech_string': 'detail web tls cert-signature tech table', 'tech_data': '', 'override_mandatory': None}, 'cert_hostmatch': {'name': 'cert_hostmatch', 'label': 'detail web tls cert-hostmatch label', 'status': 1, 'worst_status': 0, 'verdict': 'detail web tls cert-hostmatch verdict good', 'exp': 'detail web tls cert-hostmatch exp', 'tech_type': 'table', 'tech_string': 'detail web tls cert-hostmatch tech table', 'tech_data': '', 'override_mandatory': None}, 'web_caa': {'name': 'web_caa', 'label': 'detail web caa label', 'status': 1, 'worst_status': 5, 'verdict': 'detail web caa verdict good', 'exp': 'detail web caa exp', 'tech_type': 'table_translatable', 'tech_string': 'detail web caa tech table', 'tech_data': [{'msgid': 'detail tech data caa found_host', 'context': {'host': 'internet.nl.'}}], 'override_mandatory': None}, 'dane_exists': {'name': 'dane_exists', 'label': 'detail web tls dane-exists label', 'status': 1, 'worst_status': 5, 'verdict': 'detail web tls dane-exists verdict good', 'exp': 'detail web tls dane-exists exp', 'tech_type': 'table', 'tech_string': 'detail web tls dane-exists tech table', 'tech_data': ['2 1 1 2bbad93ab5c79279ec121507f272cbe0c6647a3aae52e22f388afab426b4adba', '2 1 1 3586d4ecf070578cbd27aedce20b964e48bc149faeb9dad72f46b857869172b8', '2 1 1 6ddac18698f7f1f7e1c69b9bce420d974ac6f94ca8b2c761701623f99c767dc7', '2 1 1 885bf0572252c6741dc9a52f5044487fef2a93b811cdedfad7624cc283b7cdd5', '2 1 1 8d02536c887482bc34ff54e41d2ba659bf85b341a0a20afadb5813dcfbcf286d', '2 1 1 919c0df7a787b597ed056ace654b1de9c0387acf349f73734a4fd7b58cf612a4', '2 1 1 cbbc559b44d524d6a132bdac672744da3407f12aae5d5f722c5f6c7913871c75', '2 1 1 d016e1fe311948aca64f2de44ce86c9a51ca041df6103bb52a88eb3f761f57d7', '2 1 1 f1440a9b76e1e41e53a4cb461329bf6337b419726be513e42e19f1c691c5d4b2', '2 1 1 f1647a5ee3efac54c892e930584fe47979b7acd1c76c1271bca1c5076d869888', '2 1 1 025490860b498ab73c6a12f27a49ad5fe230fafe3ac8f6112c9b7d0aad46941d'], 'override_mandatory': None}, 'dane_valid': {'name': 'dane_valid', 'label': 'detail web tls dane-valid label', 'status': 1, 'worst_status': 2, 'verdict': 'detail web tls dane-valid verdict good', 'exp': 'detail web tls dane-valid exp', 'tech_type': 'table', 'tech_string': 'detail web tls dane-valid tech table', 'tech_data': 'detail tech data yes', 'override_mandatory': None}, 'zero_rtt': {'name': 'zero_rtt', 'label': 'detail web tls zero-rtt label', 'status': 1, 'worst_status': 0, 'verdict': 'detail web tls zero-rtt verdict good', 'exp': 'detail web tls zero-rtt exp', 'tech_type': 'table', 'tech_string': 'detail web tls zero-rtt tech table', 'tech_data': 'detail tech data no', 'override_mandatory': None}, 'ocsp_stapling': {'name': 'ocsp_stapling', 'label': 'detail web tls ocsp-stapling label', 'status': 1, 'worst_status': 2, 'verdict': 'detail web tls ocsp-stapling verdict good', 'exp': 'detail web tls ocsp-stapling exp', 'tech_type': 'table', 'tech_string': 'detail web tls ocsp-stapling tech table', 'tech_data': 'detail tech data yes', 'override_mandatory': None}, 'kex_hash_func': {'name': 'kex_hash_func', 'label': 'detail web tls kex-hash-func label', 'status': 1, 'worst_status': 2, 'verdict': 'detail web tls kex-hash-func verdict good', 'exp': 'detail web tls kex-hash-func exp', 'tech_type': 'table', 'tech_string': 'detail web tls kex-hash-func tech table', 'tech_data': 'detail tech data yes', 'override_mandatory': None}}", + "port": 443, + "maildomain": null, + "webdomain": 9000, + "server_reachable": true, + "tls_enabled": true, + "tls_enabled_score": 0, + "could_not_test_smtp_starttls": false, + "dane_log": "CN=internet.nl dane-validated successfully\n", + "dane_score": 10, + "dane_status": 0, + "dane_records": "['2 1 1 2bbad93ab5c79279ec121507f272cbe0c6647a3aae52e22f388afab426b4adba', '2 1 1 3586d4ecf070578cbd27aedce20b964e48bc149faeb9dad72f46b857869172b8', '2 1 1 6ddac18698f7f1f7e1c69b9bce420d974ac6f94ca8b2c761701623f99c767dc7', '2 1 1 885bf0572252c6741dc9a52f5044487fef2a93b811cdedfad7624cc283b7cdd5', '2 1 1 8d02536c887482bc34ff54e41d2ba659bf85b341a0a20afadb5813dcfbcf286d', '2 1 1 919c0df7a787b597ed056ace654b1de9c0387acf349f73734a4fd7b58cf612a4', '2 1 1 cbbc559b44d524d6a132bdac672744da3407f12aae5d5f722c5f6c7913871c75', '2 1 1 d016e1fe311948aca64f2de44ce86c9a51ca041df6103bb52a88eb3f761f57d7', '2 1 1 f1440a9b76e1e41e53a4cb461329bf6337b419726be513e42e19f1c691c5d4b2', '2 1 1 f1647a5ee3efac54c892e930584fe47979b7acd1c76c1271bca1c5076d869888', '2 1 1 025490860b498ab73c6a12f27a49ad5fe230fafe3ac8f6112c9b7d0aad46941d']", + "dane_rollover": false, + "dh_param": "False", + "ecdh_param": "521", + "fs_bad": "[]", + "fs_phase_out": "[]", + "fs_score": 10, + "ciphers_bad": "[]", + "ciphers_phase_out": "[]", + "ciphers_score": 10, + "cipher_order": 4, + "cipher_order_violation": "[]", + "cipher_order_score": 10, + "protocols_bad": "[]", + "protocols_good": "['TLS 1.3']", + "protocols_phase_out": "[]", + "protocols_score": 10, + "compression": false, + "compression_score": 10, + "secure_reneg": true, + "secure_reneg_score": 10, + "client_reneg": false, + "client_reneg_score": 10, + "zero_rtt": 1, + "zero_rtt_score": 10, + "ocsp_stapling": 1, + "ocsp_stapling_score": 10, + "kex_hash_func": 1, + "kex_hash_func_score": 10, + "forced_https": 1, + "forced_https_score": 10, + "http_compression_enabled": false, + "http_compression_score": 10, + "hsts_enabled": true, + "hsts_policies": "['max-age=31536000;']", + "hsts_score": 10, + "cert_chain": "['internet.nl', 'E5']", + "cert_trusted": 0, + "cert_trusted_score": 10, + "cert_pubkey_bad": "[]", + "cert_pubkey_phase_out": "[]", + "cert_pubkey_score": 10, + "cert_signature_bad": "{}", + "cert_signature_score": 10, + "cert_hostmatch_bad": "[]", + "cert_hostmatch_score": 10, + "caa_enabled": true, + "caa_errors": "[]", + "caa_recommendations": "[]", + "caa_score": 10, + "caa_found_on_domain": "internet.nl.", + "score": 130 + } + }, + { + "model": "checks.domaintesttls", + "pk": 9001, + "fields": { + "timestamp": "2025-03-14T15:14:05.834Z", + "domain": "2a00:d00:ff:162:62:204:66:10", + "report": "{'https_exists': {'name': 'https_exists', 'label': 'detail web tls https-exists label', 'status': 1, 'worst_status': 0, 'verdict': 'detail web tls https-exists verdict good', 'exp': 'detail web tls https-exists exp', 'tech_type': 'table', 'tech_string': 'detail web tls https-exists tech table', 'tech_data': 'detail tech data yes', 'override_mandatory': None}, 'https_forced': {'name': 'https_forced', 'label': 'detail web tls https-forced label', 'status': 1, 'worst_status': 0, 'verdict': 'detail web tls https-forced verdict good', 'exp': 'detail web tls https-forced exp', 'tech_type': 'table', 'tech_string': 'detail web tls https-forced tech table', 'tech_data': 'detail tech data yes', 'override_mandatory': None}, 'https_hsts': {'name': 'https_hsts', 'label': 'detail web tls https-hsts label', 'status': 1, 'worst_status': 0, 'verdict': 'detail web tls https-hsts verdict good', 'exp': 'detail web tls https-hsts exp', 'tech_type': 'table', 'tech_string': 'detail web tls https-hsts tech table', 'tech_data': ['max-age=31536000;'], 'override_mandatory': None}, 'http_compression': {'name': 'http_compression', 'label': 'detail web tls http-compression label', 'status': 1, 'worst_status': 5, 'verdict': 'detail web tls http-compression verdict good', 'exp': 'detail web tls http-compression exp', 'tech_type': 'table', 'tech_string': 'detail web tls http-compression tech table', 'tech_data': 'detail tech data no', 'override_mandatory': None}, 'fs_params': {'name': 'fs_params', 'label': 'detail web tls fs-params label', 'status': 1, 'worst_status': 0, 'verdict': 'detail web tls fs-params verdict good', 'exp': 'detail web tls fs-params exp', 'tech_type': 'table_multi_col', 'tech_string': 'detail web tls fs-params tech table', 'tech_data': '', 'override_mandatory': None}, 'tls_ciphers': {'name': 'tls_ciphers', 'label': 'detail web tls ciphers label', 'status': 1, 'worst_status': 0, 'verdict': 'detail web tls ciphers verdict good', 'exp': 'detail web tls ciphers exp', 'tech_type': 'table_multi_col', 'tech_string': 'detail web tls ciphers tech table', 'tech_data': '', 'override_mandatory': None}, 'tls_cipher_order': {'name': 'tls_cipher_order', 'label': 'detail web tls cipher-order label', 'status': 1, 'worst_status': 0, 'verdict': 'detail web tls cipher-order verdict na', 'exp': 'detail web tls cipher-order exp', 'tech_type': 'table_multi_col', 'tech_string': 'detail web tls cipher-order tech table', 'tech_data': '', 'override_mandatory': None}, 'tls_version': {'name': 'tls_version', 'label': 'detail web tls version label', 'status': 1, 'worst_status': 0, 'verdict': 'detail web tls version verdict good', 'exp': 'detail web tls version exp', 'tech_type': 'table_multi_col', 'tech_string': 'detail web tls version tech table', 'tech_data': [['TLS 1.3', 'TLS 1.2'], ['detail tech data good', 'detail tech data sufficient']], 'override_mandatory': None}, 'tls_compression': {'name': 'tls_compression', 'label': 'detail web tls compression label', 'status': 1, 'worst_status': 0, 'verdict': 'detail web tls compression verdict good', 'exp': 'detail web tls compression exp', 'tech_type': 'table', 'tech_string': 'detail web tls compression tech table', 'tech_data': 'detail tech data no', 'override_mandatory': None}, 'renegotiation_secure': {'name': 'renegotiation_secure', 'label': 'detail web tls renegotiation-secure label', 'status': 1, 'worst_status': 0, 'verdict': 'detail web tls renegotiation-secure verdict good', 'exp': 'detail web tls renegotiation-secure exp', 'tech_type': 'table', 'tech_string': 'detail web tls renegotiation-secure tech table', 'tech_data': 'detail tech data yes', 'override_mandatory': None}, 'renegotiation_client': {'name': 'renegotiation_client', 'label': 'detail web tls renegotiation-client label', 'status': 1, 'worst_status': 5, 'verdict': 'detail web tls renegotiation-client verdict good', 'exp': 'detail web tls renegotiation-client exp', 'tech_type': 'table', 'tech_string': 'detail web tls renegotiation-client tech table', 'tech_data': 'detail tech data no', 'override_mandatory': None}, 'cert_trust': {'name': 'cert_trust', 'label': 'detail web tls cert-trust label', 'status': 1, 'worst_status': 0, 'verdict': 'detail web tls cert-trust verdict good', 'exp': 'detail web tls cert-trust exp', 'tech_type': 'table', 'tech_string': 'detail web tls cert-trust tech table', 'tech_data': '', 'override_mandatory': None}, 'cert_pubkey': {'name': 'cert_pubkey', 'label': 'detail web tls cert-pubkey label', 'status': 1, 'worst_status': 0, 'verdict': 'detail web tls cert-pubkey verdict good', 'exp': 'detail web tls cert-pubkey exp', 'tech_type': 'table', 'tech_string': 'detail web tls cert-pubkey tech table', 'tech_data': '', 'override_mandatory': None}, 'cert_signature': {'name': 'cert_signature', 'label': 'detail web tls cert-signature label', 'status': 1, 'worst_status': 0, 'verdict': 'detail web tls cert-signature verdict good', 'exp': 'detail web tls cert-signature exp', 'tech_type': 'table_multi_col', 'tech_string': 'detail web tls cert-signature tech table', 'tech_data': '', 'override_mandatory': None}, 'cert_hostmatch': {'name': 'cert_hostmatch', 'label': 'detail web tls cert-hostmatch label', 'status': 1, 'worst_status': 0, 'verdict': 'detail web tls cert-hostmatch verdict good', 'exp': 'detail web tls cert-hostmatch exp', 'tech_type': 'table', 'tech_string': 'detail web tls cert-hostmatch tech table', 'tech_data': '', 'override_mandatory': None}, 'web_caa': {'name': 'web_caa', 'label': 'detail web caa label', 'status': 1, 'worst_status': 5, 'verdict': 'detail web caa verdict good', 'exp': 'detail web caa exp', 'tech_type': 'table_translatable', 'tech_string': 'detail web caa tech table', 'tech_data': [{'msgid': 'detail tech data caa found_host', 'context': {'host': 'internet.nl.'}}], 'override_mandatory': None}, 'dane_exists': {'name': 'dane_exists', 'label': 'detail web tls dane-exists label', 'status': 1, 'worst_status': 5, 'verdict': 'detail web tls dane-exists verdict good', 'exp': 'detail web tls dane-exists exp', 'tech_type': 'table', 'tech_string': 'detail web tls dane-exists tech table', 'tech_data': ['2 1 1 8d02536c887482bc34ff54e41d2ba659bf85b341a0a20afadb5813dcfbcf286d', '2 1 1 919c0df7a787b597ed056ace654b1de9c0387acf349f73734a4fd7b58cf612a4', '2 1 1 cbbc559b44d524d6a132bdac672744da3407f12aae5d5f722c5f6c7913871c75', '2 1 1 d016e1fe311948aca64f2de44ce86c9a51ca041df6103bb52a88eb3f761f57d7', '2 1 1 f1440a9b76e1e41e53a4cb461329bf6337b419726be513e42e19f1c691c5d4b2', '2 1 1 f1647a5ee3efac54c892e930584fe47979b7acd1c76c1271bca1c5076d869888', '2 1 1 025490860b498ab73c6a12f27a49ad5fe230fafe3ac8f6112c9b7d0aad46941d', '2 1 1 2bbad93ab5c79279ec121507f272cbe0c6647a3aae52e22f388afab426b4adba', '2 1 1 3586d4ecf070578cbd27aedce20b964e48bc149faeb9dad72f46b857869172b8', '2 1 1 6ddac18698f7f1f7e1c69b9bce420d974ac6f94ca8b2c761701623f99c767dc7', '2 1 1 885bf0572252c6741dc9a52f5044487fef2a93b811cdedfad7624cc283b7cdd5'], 'override_mandatory': None}, 'dane_valid': {'name': 'dane_valid', 'label': 'detail web tls dane-valid label', 'status': 1, 'worst_status': 2, 'verdict': 'detail web tls dane-valid verdict good', 'exp': 'detail web tls dane-valid exp', 'tech_type': 'table', 'tech_string': 'detail web tls dane-valid tech table', 'tech_data': 'detail tech data yes', 'override_mandatory': None}, 'zero_rtt': {'name': 'zero_rtt', 'label': 'detail web tls zero-rtt label', 'status': 1, 'worst_status': 0, 'verdict': 'detail web tls zero-rtt verdict good', 'exp': 'detail web tls zero-rtt exp', 'tech_type': 'table', 'tech_string': 'detail web tls zero-rtt tech table', 'tech_data': 'detail tech data no', 'override_mandatory': None}, 'ocsp_stapling': {'name': 'ocsp_stapling', 'label': 'detail web tls ocsp-stapling label', 'status': 1, 'worst_status': 2, 'verdict': 'detail web tls ocsp-stapling verdict good', 'exp': 'detail web tls ocsp-stapling exp', 'tech_type': 'table', 'tech_string': 'detail web tls ocsp-stapling tech table', 'tech_data': 'detail tech data yes', 'override_mandatory': None}, 'kex_hash_func': {'name': 'kex_hash_func', 'label': 'detail web tls kex-hash-func label', 'status': 1, 'worst_status': 2, 'verdict': 'detail web tls kex-hash-func verdict good', 'exp': 'detail web tls kex-hash-func exp', 'tech_type': 'table', 'tech_string': 'detail web tls kex-hash-func tech table', 'tech_data': 'detail tech data yes', 'override_mandatory': None}}", + "port": 443, + "maildomain": null, + "webdomain": 9000, + "server_reachable": true, + "tls_enabled": true, + "tls_enabled_score": 0, + "could_not_test_smtp_starttls": false, + "dane_log": "CN=internet.nl dane-validated successfully\n", + "dane_score": 10, + "dane_status": 0, + "dane_records": "['2 1 1 8d02536c887482bc34ff54e41d2ba659bf85b341a0a20afadb5813dcfbcf286d', '2 1 1 919c0df7a787b597ed056ace654b1de9c0387acf349f73734a4fd7b58cf612a4', '2 1 1 cbbc559b44d524d6a132bdac672744da3407f12aae5d5f722c5f6c7913871c75', '2 1 1 d016e1fe311948aca64f2de44ce86c9a51ca041df6103bb52a88eb3f761f57d7', '2 1 1 f1440a9b76e1e41e53a4cb461329bf6337b419726be513e42e19f1c691c5d4b2', '2 1 1 f1647a5ee3efac54c892e930584fe47979b7acd1c76c1271bca1c5076d869888', '2 1 1 025490860b498ab73c6a12f27a49ad5fe230fafe3ac8f6112c9b7d0aad46941d', '2 1 1 2bbad93ab5c79279ec121507f272cbe0c6647a3aae52e22f388afab426b4adba', '2 1 1 3586d4ecf070578cbd27aedce20b964e48bc149faeb9dad72f46b857869172b8', '2 1 1 6ddac18698f7f1f7e1c69b9bce420d974ac6f94ca8b2c761701623f99c767dc7', '2 1 1 885bf0572252c6741dc9a52f5044487fef2a93b811cdedfad7624cc283b7cdd5']", + "dane_rollover": false, + "dh_param": "False", + "ecdh_param": "521", + "fs_bad": "[]", + "fs_phase_out": "[]", + "fs_score": 10, + "ciphers_bad": "[]", + "ciphers_phase_out": "[]", + "ciphers_score": 10, + "cipher_order": 4, + "cipher_order_violation": "[]", + "cipher_order_score": 10, + "protocols_bad": "[]", + "protocols_good": "['TLS 1.3']", + "protocols_phase_out": "[]", + "protocols_score": 10, + "compression": false, + "compression_score": 10, + "secure_reneg": true, + "secure_reneg_score": 10, + "client_reneg": false, + "client_reneg_score": 10, + "zero_rtt": 1, + "zero_rtt_score": 10, + "ocsp_stapling": 1, + "ocsp_stapling_score": 10, + "kex_hash_func": 1, + "kex_hash_func_score": 10, + "forced_https": 1, + "forced_https_score": 10, + "http_compression_enabled": false, + "http_compression_score": 10, + "hsts_enabled": true, + "hsts_policies": "['max-age=31536000;']", + "hsts_score": 10, + "cert_chain": "['internet.nl', 'E5']", + "cert_trusted": 0, + "cert_trusted_score": 10, + "cert_pubkey_bad": "[]", + "cert_pubkey_phase_out": "[]", + "cert_pubkey_score": 10, + "cert_signature_bad": "{}", + "cert_signature_score": 10, + "cert_hostmatch_bad": "[]", + "cert_hostmatch_score": 10, + "caa_enabled": true, + "caa_errors": "[]", + "caa_recommendations": "[]", + "caa_score": 10, + "caa_found_on_domain": "internet.nl.", + "score": 130 + } + }, + { + "model": "checks.domaintesttls", + "pk": 9002, + "fields": { + "timestamp": "2025-03-14T15:14:24.233Z", + "domain": "94.198.159.35", + "report": "{'https_exists': {'name': 'https_exists', 'label': 'detail web tls https-exists label', 'status': 1, 'worst_status': 0, 'verdict': 'detail web tls https-exists verdict good', 'exp': 'detail web tls https-exists exp', 'tech_type': 'table', 'tech_string': 'detail web tls https-exists tech table', 'tech_data': 'detail tech data yes', 'override_mandatory': None}, 'https_forced': {'name': 'https_forced', 'label': 'detail web tls https-forced label', 'status': 1, 'worst_status': 0, 'verdict': 'detail web tls https-forced verdict good', 'exp': 'detail web tls https-forced exp', 'tech_type': 'table', 'tech_string': 'detail web tls https-forced tech table', 'tech_data': 'detail tech data yes', 'override_mandatory': None}, 'https_hsts': {'name': 'https_hsts', 'label': 'detail web tls https-hsts label', 'status': 1, 'worst_status': 0, 'verdict': 'detail web tls https-hsts verdict good', 'exp': 'detail web tls https-hsts exp', 'tech_type': 'table', 'tech_string': 'detail web tls https-hsts tech table', 'tech_data': ['max-age=31622400'], 'override_mandatory': None}, 'http_compression': {'name': 'http_compression', 'label': 'detail web tls http-compression label', 'status': 1, 'worst_status': 5, 'verdict': 'detail web tls http-compression verdict good', 'exp': 'detail web tls http-compression exp', 'tech_type': 'table', 'tech_string': 'detail web tls http-compression tech table', 'tech_data': 'detail tech data no', 'override_mandatory': None}, 'fs_params': {'name': 'fs_params', 'label': 'detail web tls fs-params label', 'status': 1, 'worst_status': 0, 'verdict': 'detail web tls fs-params verdict good', 'exp': 'detail web tls fs-params exp', 'tech_type': 'table_multi_col', 'tech_string': 'detail web tls fs-params tech table', 'tech_data': '', 'override_mandatory': None}, 'tls_ciphers': {'name': 'tls_ciphers', 'label': 'detail web tls ciphers label', 'status': 1, 'worst_status': 0, 'verdict': 'detail web tls ciphers verdict good', 'exp': 'detail web tls ciphers exp', 'tech_type': 'table_multi_col', 'tech_string': 'detail web tls ciphers tech table', 'tech_data': '', 'override_mandatory': None}, 'tls_cipher_order': {'name': 'tls_cipher_order', 'label': 'detail web tls cipher-order label', 'status': 1, 'worst_status': 0, 'verdict': 'detail web tls cipher-order verdict na', 'exp': 'detail web tls cipher-order exp', 'tech_type': 'table_multi_col', 'tech_string': 'detail web tls cipher-order tech table', 'tech_data': '', 'override_mandatory': None}, 'tls_version': {'name': 'tls_version', 'label': 'detail web tls version label', 'status': 1, 'worst_status': 0, 'verdict': 'detail web tls version verdict good', 'exp': 'detail web tls version exp', 'tech_type': 'table_multi_col', 'tech_string': 'detail web tls version tech table', 'tech_data': [['TLS 1.3', 'TLS 1.2'], ['detail tech data good', 'detail tech data sufficient']], 'override_mandatory': None}, 'tls_compression': {'name': 'tls_compression', 'label': 'detail web tls compression label', 'status': 1, 'worst_status': 0, 'verdict': 'detail web tls compression verdict good', 'exp': 'detail web tls compression exp', 'tech_type': 'table', 'tech_string': 'detail web tls compression tech table', 'tech_data': 'detail tech data no', 'override_mandatory': None}, 'renegotiation_secure': {'name': 'renegotiation_secure', 'label': 'detail web tls renegotiation-secure label', 'status': 1, 'worst_status': 0, 'verdict': 'detail web tls renegotiation-secure verdict good', 'exp': 'detail web tls renegotiation-secure exp', 'tech_type': 'table', 'tech_string': 'detail web tls renegotiation-secure tech table', 'tech_data': 'detail tech data yes', 'override_mandatory': None}, 'renegotiation_client': {'name': 'renegotiation_client', 'label': 'detail web tls renegotiation-client label', 'status': 1, 'worst_status': 5, 'verdict': 'detail web tls renegotiation-client verdict good', 'exp': 'detail web tls renegotiation-client exp', 'tech_type': 'table', 'tech_string': 'detail web tls renegotiation-client tech table', 'tech_data': 'detail tech data no', 'override_mandatory': None}, 'cert_trust': {'name': 'cert_trust', 'label': 'detail web tls cert-trust label', 'status': 1, 'worst_status': 0, 'verdict': 'detail web tls cert-trust verdict good', 'exp': 'detail web tls cert-trust exp', 'tech_type': 'table', 'tech_string': 'detail web tls cert-trust tech table', 'tech_data': '', 'override_mandatory': None}, 'cert_pubkey': {'name': 'cert_pubkey', 'label': 'detail web tls cert-pubkey label', 'status': 1, 'worst_status': 0, 'verdict': 'detail web tls cert-pubkey verdict good', 'exp': 'detail web tls cert-pubkey exp', 'tech_type': 'table', 'tech_string': 'detail web tls cert-pubkey tech table', 'tech_data': '', 'override_mandatory': None}, 'cert_signature': {'name': 'cert_signature', 'label': 'detail web tls cert-signature label', 'status': 1, 'worst_status': 0, 'verdict': 'detail web tls cert-signature verdict good', 'exp': 'detail web tls cert-signature exp', 'tech_type': 'table_multi_col', 'tech_string': 'detail web tls cert-signature tech table', 'tech_data': '', 'override_mandatory': None}, 'cert_hostmatch': {'name': 'cert_hostmatch', 'label': 'detail web tls cert-hostmatch label', 'status': 1, 'worst_status': 0, 'verdict': 'detail web tls cert-hostmatch verdict good', 'exp': 'detail web tls cert-hostmatch exp', 'tech_type': 'table', 'tech_string': 'detail web tls cert-hostmatch tech table', 'tech_data': '', 'override_mandatory': None}, 'web_caa': {'name': 'web_caa', 'label': 'detail web caa label', 'status': 1, 'worst_status': 5, 'verdict': 'detail web caa verdict good', 'exp': 'detail web caa exp', 'tech_type': 'table_translatable', 'tech_string': 'detail web caa tech table', 'tech_data': [{'msgid': 'detail tech data caa found_host', 'context': {'host': 'example.nl.'}}], 'override_mandatory': None}, 'dane_exists': {'name': 'dane_exists', 'label': 'detail web tls dane-exists label', 'status': 1, 'worst_status': 5, 'verdict': 'detail web tls dane-exists verdict good', 'exp': 'detail web tls dane-exists exp', 'tech_type': 'table', 'tech_string': 'detail web tls dane-exists tech table', 'tech_data': ['0 0 1 4ff460d54b9c86dabfbcfc5712e0400d2bed3fbc4d4fbdaa86e06adcd2a9ad7a'], 'override_mandatory': None}, 'dane_valid': {'name': 'dane_valid', 'label': 'detail web tls dane-valid label', 'status': 1, 'worst_status': 2, 'verdict': 'detail web tls dane-valid verdict good', 'exp': 'detail web tls dane-valid exp', 'tech_type': 'table', 'tech_string': 'detail web tls dane-valid tech table', 'tech_data': 'detail tech data yes', 'override_mandatory': None}, 'zero_rtt': {'name': 'zero_rtt', 'label': 'detail web tls zero-rtt label', 'status': 1, 'worst_status': 0, 'verdict': 'detail web tls zero-rtt verdict good', 'exp': 'detail web tls zero-rtt exp', 'tech_type': 'table', 'tech_string': 'detail web tls zero-rtt tech table', 'tech_data': 'detail tech data no', 'override_mandatory': None}, 'ocsp_stapling': {'name': 'ocsp_stapling', 'label': 'detail web tls ocsp-stapling label', 'status': 1, 'worst_status': 2, 'verdict': 'detail web tls ocsp-stapling verdict good', 'exp': 'detail web tls ocsp-stapling exp', 'tech_type': 'table', 'tech_string': 'detail web tls ocsp-stapling tech table', 'tech_data': 'detail tech data yes', 'override_mandatory': None}, 'kex_hash_func': {'name': 'kex_hash_func', 'label': 'detail web tls kex-hash-func label', 'status': 1, 'worst_status': 2, 'verdict': 'detail web tls kex-hash-func verdict good', 'exp': 'detail web tls kex-hash-func exp', 'tech_type': 'table', 'tech_string': 'detail web tls kex-hash-func tech table', 'tech_data': 'detail tech data yes', 'override_mandatory': None}}", + "port": 443, + "maildomain": null, + "webdomain": 9001, + "server_reachable": true, + "tls_enabled": true, + "tls_enabled_score": 0, + "could_not_test_smtp_starttls": false, + "dane_log": "C=NL, ST=Gelderland, O=Stichting Internet Domeinregistratie Nederland, CN=example.nl dane-validated successfully\n", + "dane_score": 10, + "dane_status": 0, + "dane_records": "['0 0 1 4ff460d54b9c86dabfbcfc5712e0400d2bed3fbc4d4fbdaa86e06adcd2a9ad7a']", + "dane_rollover": false, + "dh_param": "False", + "ecdh_param": "521", + "fs_bad": "[]", + "fs_phase_out": "[]", + "fs_score": 10, + "ciphers_bad": "[]", + "ciphers_phase_out": "[]", + "ciphers_score": 10, + "cipher_order": 4, + "cipher_order_violation": "[]", + "cipher_order_score": 10, + "protocols_bad": "[]", + "protocols_good": "['TLS 1.3']", + "protocols_phase_out": "[]", + "protocols_score": 10, + "compression": false, + "compression_score": 10, + "secure_reneg": true, + "secure_reneg_score": 10, + "client_reneg": false, + "client_reneg_score": 10, + "zero_rtt": 1, + "zero_rtt_score": 10, + "ocsp_stapling": 1, + "ocsp_stapling_score": 10, + "kex_hash_func": 1, + "kex_hash_func_score": 10, + "forced_https": 1, + "forced_https_score": 10, + "http_compression_enabled": false, + "http_compression_score": 10, + "hsts_enabled": true, + "hsts_policies": "['max-age=31622400']", + "hsts_score": 10, + "cert_chain": "['example.nl', 'GEANT OV ECC CA 4', 'USERTrust ECC Certification Authority']", + "cert_trusted": 0, + "cert_trusted_score": 10, + "cert_pubkey_bad": "[]", + "cert_pubkey_phase_out": "[]", + "cert_pubkey_score": 10, + "cert_signature_bad": "{}", + "cert_signature_score": 10, + "cert_hostmatch_bad": "[]", + "cert_hostmatch_score": 10, + "caa_enabled": true, + "caa_errors": "[]", + "caa_recommendations": "[]", + "caa_score": 10, + "caa_found_on_domain": "example.nl.", + "score": 130 + } + }, + { + "model": "checks.domaintesttls", + "pk": 9003, + "fields": { + "timestamp": "2025-03-14T15:14:24.238Z", + "domain": "2a00:d78:0:712:94:198:159:35", + "report": "{'https_exists': {'name': 'https_exists', 'label': 'detail web tls https-exists label', 'status': 1, 'worst_status': 0, 'verdict': 'detail web tls https-exists verdict good', 'exp': 'detail web tls https-exists exp', 'tech_type': 'table', 'tech_string': 'detail web tls https-exists tech table', 'tech_data': 'detail tech data yes', 'override_mandatory': None}, 'https_forced': {'name': 'https_forced', 'label': 'detail web tls https-forced label', 'status': 1, 'worst_status': 0, 'verdict': 'detail web tls https-forced verdict good', 'exp': 'detail web tls https-forced exp', 'tech_type': 'table', 'tech_string': 'detail web tls https-forced tech table', 'tech_data': 'detail tech data yes', 'override_mandatory': None}, 'https_hsts': {'name': 'https_hsts', 'label': 'detail web tls https-hsts label', 'status': 1, 'worst_status': 0, 'verdict': 'detail web tls https-hsts verdict good', 'exp': 'detail web tls https-hsts exp', 'tech_type': 'table', 'tech_string': 'detail web tls https-hsts tech table', 'tech_data': ['max-age=31622400'], 'override_mandatory': None}, 'http_compression': {'name': 'http_compression', 'label': 'detail web tls http-compression label', 'status': 1, 'worst_status': 5, 'verdict': 'detail web tls http-compression verdict good', 'exp': 'detail web tls http-compression exp', 'tech_type': 'table', 'tech_string': 'detail web tls http-compression tech table', 'tech_data': 'detail tech data no', 'override_mandatory': None}, 'fs_params': {'name': 'fs_params', 'label': 'detail web tls fs-params label', 'status': 1, 'worst_status': 0, 'verdict': 'detail web tls fs-params verdict good', 'exp': 'detail web tls fs-params exp', 'tech_type': 'table_multi_col', 'tech_string': 'detail web tls fs-params tech table', 'tech_data': '', 'override_mandatory': None}, 'tls_ciphers': {'name': 'tls_ciphers', 'label': 'detail web tls ciphers label', 'status': 1, 'worst_status': 0, 'verdict': 'detail web tls ciphers verdict good', 'exp': 'detail web tls ciphers exp', 'tech_type': 'table_multi_col', 'tech_string': 'detail web tls ciphers tech table', 'tech_data': '', 'override_mandatory': None}, 'tls_cipher_order': {'name': 'tls_cipher_order', 'label': 'detail web tls cipher-order label', 'status': 1, 'worst_status': 0, 'verdict': 'detail web tls cipher-order verdict na', 'exp': 'detail web tls cipher-order exp', 'tech_type': 'table_multi_col', 'tech_string': 'detail web tls cipher-order tech table', 'tech_data': '', 'override_mandatory': None}, 'tls_version': {'name': 'tls_version', 'label': 'detail web tls version label', 'status': 1, 'worst_status': 0, 'verdict': 'detail web tls version verdict good', 'exp': 'detail web tls version exp', 'tech_type': 'table_multi_col', 'tech_string': 'detail web tls version tech table', 'tech_data': [['TLS 1.3', 'TLS 1.2'], ['detail tech data good', 'detail tech data sufficient']], 'override_mandatory': None}, 'tls_compression': {'name': 'tls_compression', 'label': 'detail web tls compression label', 'status': 1, 'worst_status': 0, 'verdict': 'detail web tls compression verdict good', 'exp': 'detail web tls compression exp', 'tech_type': 'table', 'tech_string': 'detail web tls compression tech table', 'tech_data': 'detail tech data no', 'override_mandatory': None}, 'renegotiation_secure': {'name': 'renegotiation_secure', 'label': 'detail web tls renegotiation-secure label', 'status': 1, 'worst_status': 0, 'verdict': 'detail web tls renegotiation-secure verdict good', 'exp': 'detail web tls renegotiation-secure exp', 'tech_type': 'table', 'tech_string': 'detail web tls renegotiation-secure tech table', 'tech_data': 'detail tech data yes', 'override_mandatory': None}, 'renegotiation_client': {'name': 'renegotiation_client', 'label': 'detail web tls renegotiation-client label', 'status': 1, 'worst_status': 5, 'verdict': 'detail web tls renegotiation-client verdict good', 'exp': 'detail web tls renegotiation-client exp', 'tech_type': 'table', 'tech_string': 'detail web tls renegotiation-client tech table', 'tech_data': 'detail tech data no', 'override_mandatory': None}, 'cert_trust': {'name': 'cert_trust', 'label': 'detail web tls cert-trust label', 'status': 1, 'worst_status': 0, 'verdict': 'detail web tls cert-trust verdict good', 'exp': 'detail web tls cert-trust exp', 'tech_type': 'table', 'tech_string': 'detail web tls cert-trust tech table', 'tech_data': '', 'override_mandatory': None}, 'cert_pubkey': {'name': 'cert_pubkey', 'label': 'detail web tls cert-pubkey label', 'status': 1, 'worst_status': 0, 'verdict': 'detail web tls cert-pubkey verdict good', 'exp': 'detail web tls cert-pubkey exp', 'tech_type': 'table', 'tech_string': 'detail web tls cert-pubkey tech table', 'tech_data': '', 'override_mandatory': None}, 'cert_signature': {'name': 'cert_signature', 'label': 'detail web tls cert-signature label', 'status': 1, 'worst_status': 0, 'verdict': 'detail web tls cert-signature verdict good', 'exp': 'detail web tls cert-signature exp', 'tech_type': 'table_multi_col', 'tech_string': 'detail web tls cert-signature tech table', 'tech_data': '', 'override_mandatory': None}, 'cert_hostmatch': {'name': 'cert_hostmatch', 'label': 'detail web tls cert-hostmatch label', 'status': 1, 'worst_status': 0, 'verdict': 'detail web tls cert-hostmatch verdict good', 'exp': 'detail web tls cert-hostmatch exp', 'tech_type': 'table', 'tech_string': 'detail web tls cert-hostmatch tech table', 'tech_data': '', 'override_mandatory': None}, 'web_caa': {'name': 'web_caa', 'label': 'detail web caa label', 'status': 1, 'worst_status': 5, 'verdict': 'detail web caa verdict good', 'exp': 'detail web caa exp', 'tech_type': 'table_translatable', 'tech_string': 'detail web caa tech table', 'tech_data': [{'msgid': 'detail tech data caa found_host', 'context': {'host': 'example.nl.'}}], 'override_mandatory': None}, 'dane_exists': {'name': 'dane_exists', 'label': 'detail web tls dane-exists label', 'status': 1, 'worst_status': 5, 'verdict': 'detail web tls dane-exists verdict good', 'exp': 'detail web tls dane-exists exp', 'tech_type': 'table', 'tech_string': 'detail web tls dane-exists tech table', 'tech_data': ['0 0 1 4ff460d54b9c86dabfbcfc5712e0400d2bed3fbc4d4fbdaa86e06adcd2a9ad7a'], 'override_mandatory': None}, 'dane_valid': {'name': 'dane_valid', 'label': 'detail web tls dane-valid label', 'status': 1, 'worst_status': 2, 'verdict': 'detail web tls dane-valid verdict good', 'exp': 'detail web tls dane-valid exp', 'tech_type': 'table', 'tech_string': 'detail web tls dane-valid tech table', 'tech_data': 'detail tech data yes', 'override_mandatory': None}, 'zero_rtt': {'name': 'zero_rtt', 'label': 'detail web tls zero-rtt label', 'status': 1, 'worst_status': 0, 'verdict': 'detail web tls zero-rtt verdict good', 'exp': 'detail web tls zero-rtt exp', 'tech_type': 'table', 'tech_string': 'detail web tls zero-rtt tech table', 'tech_data': 'detail tech data no', 'override_mandatory': None}, 'ocsp_stapling': {'name': 'ocsp_stapling', 'label': 'detail web tls ocsp-stapling label', 'status': 1, 'worst_status': 2, 'verdict': 'detail web tls ocsp-stapling verdict good', 'exp': 'detail web tls ocsp-stapling exp', 'tech_type': 'table', 'tech_string': 'detail web tls ocsp-stapling tech table', 'tech_data': 'detail tech data yes', 'override_mandatory': None}, 'kex_hash_func': {'name': 'kex_hash_func', 'label': 'detail web tls kex-hash-func label', 'status': 1, 'worst_status': 2, 'verdict': 'detail web tls kex-hash-func verdict good', 'exp': 'detail web tls kex-hash-func exp', 'tech_type': 'table', 'tech_string': 'detail web tls kex-hash-func tech table', 'tech_data': 'detail tech data yes', 'override_mandatory': None}}", + "port": 443, + "maildomain": null, + "webdomain": 9001, + "server_reachable": true, + "tls_enabled": true, + "tls_enabled_score": 0, + "could_not_test_smtp_starttls": false, + "dane_log": "C=NL, ST=Gelderland, O=Stichting Internet Domeinregistratie Nederland, CN=example.nl dane-validated successfully\n", + "dane_score": 10, + "dane_status": 0, + "dane_records": "['0 0 1 4ff460d54b9c86dabfbcfc5712e0400d2bed3fbc4d4fbdaa86e06adcd2a9ad7a']", + "dane_rollover": false, + "dh_param": "False", + "ecdh_param": "521", + "fs_bad": "[]", + "fs_phase_out": "[]", + "fs_score": 10, + "ciphers_bad": "[]", + "ciphers_phase_out": "[]", + "ciphers_score": 10, + "cipher_order": 4, + "cipher_order_violation": "[]", + "cipher_order_score": 10, + "protocols_bad": "[]", + "protocols_good": "['TLS 1.3']", + "protocols_phase_out": "[]", + "protocols_score": 10, + "compression": false, + "compression_score": 10, + "secure_reneg": true, + "secure_reneg_score": 10, + "client_reneg": false, + "client_reneg_score": 10, + "zero_rtt": 1, + "zero_rtt_score": 10, + "ocsp_stapling": 1, + "ocsp_stapling_score": 10, + "kex_hash_func": 1, + "kex_hash_func_score": 10, + "forced_https": 1, + "forced_https_score": 10, + "http_compression_enabled": false, + "http_compression_score": 10, + "hsts_enabled": true, + "hsts_policies": "['max-age=31622400']", + "hsts_score": 10, + "cert_chain": "['example.nl', 'GEANT OV ECC CA 4', 'USERTrust ECC Certification Authority']", + "cert_trusted": 0, + "cert_trusted_score": 10, + "cert_pubkey_bad": "[]", + "cert_pubkey_phase_out": "[]", + "cert_pubkey_score": 10, + "cert_signature_bad": "{}", + "cert_signature_score": 10, + "cert_hostmatch_bad": "[]", + "cert_hostmatch_score": 10, + "caa_enabled": true, + "caa_errors": "[]", + "caa_recommendations": "[]", + "caa_score": 10, + "caa_found_on_domain": "example.nl.", + "score": 130 + } + }, + { + "model": "checks.domaintesttls", + "pk": 9004, + "fields": { + "timestamp": "2025-03-14T15:14:32.554Z", + "domain": "2a00:d00:ff:162:62:204:66:10", + "report": "{'https_exists': {'name': 'https_exists', 'label': 'detail web tls https-exists label', 'status': 1, 'worst_status': 0, 'verdict': 'detail web tls https-exists verdict good', 'exp': 'detail web tls https-exists exp', 'tech_type': 'table', 'tech_string': 'detail web tls https-exists tech table', 'tech_data': 'detail tech data yes', 'override_mandatory': None}, 'https_forced': {'name': 'https_forced', 'label': 'detail web tls https-forced label', 'status': 1, 'worst_status': 0, 'verdict': 'detail web tls https-forced verdict good', 'exp': 'detail web tls https-forced exp', 'tech_type': 'table', 'tech_string': 'detail web tls https-forced tech table', 'tech_data': 'detail tech data yes', 'override_mandatory': None}, 'https_hsts': {'name': 'https_hsts', 'label': 'detail web tls https-hsts label', 'status': 1, 'worst_status': 0, 'verdict': 'detail web tls https-hsts verdict good', 'exp': 'detail web tls https-hsts exp', 'tech_type': 'table', 'tech_string': 'detail web tls https-hsts tech table', 'tech_data': ['max-age=31536000;'], 'override_mandatory': None}, 'http_compression': {'name': 'http_compression', 'label': 'detail web tls http-compression label', 'status': 1, 'worst_status': 5, 'verdict': 'detail web tls http-compression verdict good', 'exp': 'detail web tls http-compression exp', 'tech_type': 'table', 'tech_string': 'detail web tls http-compression tech table', 'tech_data': 'detail tech data no', 'override_mandatory': None}, 'fs_params': {'name': 'fs_params', 'label': 'detail web tls fs-params label', 'status': 1, 'worst_status': 0, 'verdict': 'detail web tls fs-params verdict good', 'exp': 'detail web tls fs-params exp', 'tech_type': 'table_multi_col', 'tech_string': 'detail web tls fs-params tech table', 'tech_data': '', 'override_mandatory': None}, 'tls_ciphers': {'name': 'tls_ciphers', 'label': 'detail web tls ciphers label', 'status': 1, 'worst_status': 0, 'verdict': 'detail web tls ciphers verdict good', 'exp': 'detail web tls ciphers exp', 'tech_type': 'table_multi_col', 'tech_string': 'detail web tls ciphers tech table', 'tech_data': '', 'override_mandatory': None}, 'tls_cipher_order': {'name': 'tls_cipher_order', 'label': 'detail web tls cipher-order label', 'status': 1, 'worst_status': 0, 'verdict': 'detail web tls cipher-order verdict na', 'exp': 'detail web tls cipher-order exp', 'tech_type': 'table_multi_col', 'tech_string': 'detail web tls cipher-order tech table', 'tech_data': '', 'override_mandatory': None}, 'tls_version': {'name': 'tls_version', 'label': 'detail web tls version label', 'status': 1, 'worst_status': 0, 'verdict': 'detail web tls version verdict good', 'exp': 'detail web tls version exp', 'tech_type': 'table_multi_col', 'tech_string': 'detail web tls version tech table', 'tech_data': [['TLS 1.3', 'TLS 1.2'], ['detail tech data good', 'detail tech data sufficient']], 'override_mandatory': None}, 'tls_compression': {'name': 'tls_compression', 'label': 'detail web tls compression label', 'status': 1, 'worst_status': 0, 'verdict': 'detail web tls compression verdict good', 'exp': 'detail web tls compression exp', 'tech_type': 'table', 'tech_string': 'detail web tls compression tech table', 'tech_data': 'detail tech data no', 'override_mandatory': None}, 'renegotiation_secure': {'name': 'renegotiation_secure', 'label': 'detail web tls renegotiation-secure label', 'status': 1, 'worst_status': 0, 'verdict': 'detail web tls renegotiation-secure verdict good', 'exp': 'detail web tls renegotiation-secure exp', 'tech_type': 'table', 'tech_string': 'detail web tls renegotiation-secure tech table', 'tech_data': 'detail tech data yes', 'override_mandatory': None}, 'renegotiation_client': {'name': 'renegotiation_client', 'label': 'detail web tls renegotiation-client label', 'status': 1, 'worst_status': 5, 'verdict': 'detail web tls renegotiation-client verdict good', 'exp': 'detail web tls renegotiation-client exp', 'tech_type': 'table', 'tech_string': 'detail web tls renegotiation-client tech table', 'tech_data': 'detail tech data no', 'override_mandatory': None}, 'cert_trust': {'name': 'cert_trust', 'label': 'detail web tls cert-trust label', 'status': 1, 'worst_status': 0, 'verdict': 'detail web tls cert-trust verdict good', 'exp': 'detail web tls cert-trust exp', 'tech_type': 'table', 'tech_string': 'detail web tls cert-trust tech table', 'tech_data': '', 'override_mandatory': None}, 'cert_pubkey': {'name': 'cert_pubkey', 'label': 'detail web tls cert-pubkey label', 'status': 1, 'worst_status': 0, 'verdict': 'detail web tls cert-pubkey verdict good', 'exp': 'detail web tls cert-pubkey exp', 'tech_type': 'table', 'tech_string': 'detail web tls cert-pubkey tech table', 'tech_data': '', 'override_mandatory': None}, 'cert_signature': {'name': 'cert_signature', 'label': 'detail web tls cert-signature label', 'status': 1, 'worst_status': 0, 'verdict': 'detail web tls cert-signature verdict good', 'exp': 'detail web tls cert-signature exp', 'tech_type': 'table_multi_col', 'tech_string': 'detail web tls cert-signature tech table', 'tech_data': '', 'override_mandatory': None}, 'cert_hostmatch': {'name': 'cert_hostmatch', 'label': 'detail web tls cert-hostmatch label', 'status': 1, 'worst_status': 0, 'verdict': 'detail web tls cert-hostmatch verdict good', 'exp': 'detail web tls cert-hostmatch exp', 'tech_type': 'table', 'tech_string': 'detail web tls cert-hostmatch tech table', 'tech_data': '', 'override_mandatory': None}, 'web_caa': {'name': 'web_caa', 'label': 'detail web caa label', 'status': 1, 'worst_status': 5, 'verdict': 'detail web caa verdict good', 'exp': 'detail web caa exp', 'tech_type': 'table_translatable', 'tech_string': 'detail web caa tech table', 'tech_data': [{'msgid': 'detail tech data caa found_host', 'context': {'host': 'internet.nl.'}}], 'override_mandatory': None}, 'dane_exists': {'name': 'dane_exists', 'label': 'detail web tls dane-exists label', 'status': 1, 'worst_status': 5, 'verdict': 'detail web tls dane-exists verdict good', 'exp': 'detail web tls dane-exists exp', 'tech_type': 'table', 'tech_string': 'detail web tls dane-exists tech table', 'tech_data': ['2 1 1 f1647a5ee3efac54c892e930584fe47979b7acd1c76c1271bca1c5076d869888', '2 1 1 025490860b498ab73c6a12f27a49ad5fe230fafe3ac8f6112c9b7d0aad46941d', '2 1 1 2bbad93ab5c79279ec121507f272cbe0c6647a3aae52e22f388afab426b4adba', '2 1 1 3586d4ecf070578cbd27aedce20b964e48bc149faeb9dad72f46b857869172b8', '2 1 1 6ddac18698f7f1f7e1c69b9bce420d974ac6f94ca8b2c761701623f99c767dc7', '2 1 1 885bf0572252c6741dc9a52f5044487fef2a93b811cdedfad7624cc283b7cdd5', '2 1 1 8d02536c887482bc34ff54e41d2ba659bf85b341a0a20afadb5813dcfbcf286d', '2 1 1 919c0df7a787b597ed056ace654b1de9c0387acf349f73734a4fd7b58cf612a4', '2 1 1 cbbc559b44d524d6a132bdac672744da3407f12aae5d5f722c5f6c7913871c75', '2 1 1 d016e1fe311948aca64f2de44ce86c9a51ca041df6103bb52a88eb3f761f57d7', '2 1 1 f1440a9b76e1e41e53a4cb461329bf6337b419726be513e42e19f1c691c5d4b2'], 'override_mandatory': None}, 'dane_valid': {'name': 'dane_valid', 'label': 'detail web tls dane-valid label', 'status': 1, 'worst_status': 2, 'verdict': 'detail web tls dane-valid verdict good', 'exp': 'detail web tls dane-valid exp', 'tech_type': 'table', 'tech_string': 'detail web tls dane-valid tech table', 'tech_data': 'detail tech data yes', 'override_mandatory': None}, 'zero_rtt': {'name': 'zero_rtt', 'label': 'detail web tls zero-rtt label', 'status': 1, 'worst_status': 0, 'verdict': 'detail web tls zero-rtt verdict good', 'exp': 'detail web tls zero-rtt exp', 'tech_type': 'table', 'tech_string': 'detail web tls zero-rtt tech table', 'tech_data': 'detail tech data no', 'override_mandatory': None}, 'ocsp_stapling': {'name': 'ocsp_stapling', 'label': 'detail web tls ocsp-stapling label', 'status': 1, 'worst_status': 2, 'verdict': 'detail web tls ocsp-stapling verdict good', 'exp': 'detail web tls ocsp-stapling exp', 'tech_type': 'table', 'tech_string': 'detail web tls ocsp-stapling tech table', 'tech_data': 'detail tech data yes', 'override_mandatory': None}, 'kex_hash_func': {'name': 'kex_hash_func', 'label': 'detail web tls kex-hash-func label', 'status': 1, 'worst_status': 2, 'verdict': 'detail web tls kex-hash-func verdict good', 'exp': 'detail web tls kex-hash-func exp', 'tech_type': 'table', 'tech_string': 'detail web tls kex-hash-func tech table', 'tech_data': 'detail tech data yes', 'override_mandatory': None}}", + "port": 443, + "maildomain": null, + "webdomain": 9002, + "server_reachable": true, + "tls_enabled": true, + "tls_enabled_score": 0, + "could_not_test_smtp_starttls": false, + "dane_log": "CN=internet.nl dane-validated successfully\n", + "dane_score": 10, + "dane_status": 0, + "dane_records": "['2 1 1 f1647a5ee3efac54c892e930584fe47979b7acd1c76c1271bca1c5076d869888', '2 1 1 025490860b498ab73c6a12f27a49ad5fe230fafe3ac8f6112c9b7d0aad46941d', '2 1 1 2bbad93ab5c79279ec121507f272cbe0c6647a3aae52e22f388afab426b4adba', '2 1 1 3586d4ecf070578cbd27aedce20b964e48bc149faeb9dad72f46b857869172b8', '2 1 1 6ddac18698f7f1f7e1c69b9bce420d974ac6f94ca8b2c761701623f99c767dc7', '2 1 1 885bf0572252c6741dc9a52f5044487fef2a93b811cdedfad7624cc283b7cdd5', '2 1 1 8d02536c887482bc34ff54e41d2ba659bf85b341a0a20afadb5813dcfbcf286d', '2 1 1 919c0df7a787b597ed056ace654b1de9c0387acf349f73734a4fd7b58cf612a4', '2 1 1 cbbc559b44d524d6a132bdac672744da3407f12aae5d5f722c5f6c7913871c75', '2 1 1 d016e1fe311948aca64f2de44ce86c9a51ca041df6103bb52a88eb3f761f57d7', '2 1 1 f1440a9b76e1e41e53a4cb461329bf6337b419726be513e42e19f1c691c5d4b2']", + "dane_rollover": false, + "dh_param": "False", + "ecdh_param": "521", + "fs_bad": "[]", + "fs_phase_out": "[]", + "fs_score": 10, + "ciphers_bad": "[]", + "ciphers_phase_out": "[]", + "ciphers_score": 10, + "cipher_order": 4, + "cipher_order_violation": "[]", + "cipher_order_score": 10, + "protocols_bad": "[]", + "protocols_good": "['TLS 1.3']", + "protocols_phase_out": "[]", + "protocols_score": 10, + "compression": false, + "compression_score": 10, + "secure_reneg": true, + "secure_reneg_score": 10, + "client_reneg": false, + "client_reneg_score": 10, + "zero_rtt": 1, + "zero_rtt_score": 10, + "ocsp_stapling": 1, + "ocsp_stapling_score": 10, + "kex_hash_func": 1, + "kex_hash_func_score": 10, + "forced_https": 1, + "forced_https_score": 10, + "http_compression_enabled": false, + "http_compression_score": 10, + "hsts_enabled": true, + "hsts_policies": "['max-age=31536000;']", + "hsts_score": 10, + "cert_chain": "['internet.nl', 'E5']", + "cert_trusted": 0, + "cert_trusted_score": 10, + "cert_pubkey_bad": "[]", + "cert_pubkey_phase_out": "[]", + "cert_pubkey_score": 10, + "cert_signature_bad": "{}", + "cert_signature_score": 10, + "cert_hostmatch_bad": "[]", + "cert_hostmatch_score": 10, + "caa_enabled": true, + "caa_errors": "[]", + "caa_recommendations": "[]", + "caa_score": 10, + "caa_found_on_domain": "internet.nl.", + "score": 130 + } + }, + { + "model": "checks.domaintesttls", + "pk": 9005, + "fields": { + "timestamp": "2025-03-14T15:14:40.041Z", + "domain": "2a05:1500:600:1:1c00:4aff:fe00:428", + "report": "{'https_exists': {'name': 'https_exists', 'label': 'detail web tls https-exists label', 'status': 1, 'worst_status': 0, 'verdict': 'detail web tls https-exists verdict good', 'exp': 'detail web tls https-exists exp', 'tech_type': 'table', 'tech_string': 'detail web tls https-exists tech table', 'tech_data': 'detail tech data yes', 'override_mandatory': None}, 'https_forced': {'name': 'https_forced', 'label': 'detail web tls https-forced label', 'status': 1, 'worst_status': 0, 'verdict': 'detail web tls https-forced verdict good', 'exp': 'detail web tls https-forced exp', 'tech_type': 'table', 'tech_string': 'detail web tls https-forced tech table', 'tech_data': 'detail tech data yes', 'override_mandatory': None}, 'https_hsts': {'name': 'https_hsts', 'label': 'detail web tls https-hsts label', 'status': 1, 'worst_status': 0, 'verdict': 'detail web tls https-hsts verdict good', 'exp': 'detail web tls https-hsts exp', 'tech_type': 'table', 'tech_string': 'detail web tls https-hsts tech table', 'tech_data': ['max-age=31536000'], 'override_mandatory': None}, 'http_compression': {'name': 'http_compression', 'label': 'detail web tls http-compression label', 'status': 1, 'worst_status': 5, 'verdict': 'detail web tls http-compression verdict good', 'exp': 'detail web tls http-compression exp', 'tech_type': 'table', 'tech_string': 'detail web tls http-compression tech table', 'tech_data': 'detail tech data no', 'override_mandatory': None}, 'fs_params': {'name': 'fs_params', 'label': 'detail web tls fs-params label', 'status': 1, 'worst_status': 0, 'verdict': 'detail web tls fs-params verdict good', 'exp': 'detail web tls fs-params exp', 'tech_type': 'table_multi_col', 'tech_string': 'detail web tls fs-params tech table', 'tech_data': '', 'override_mandatory': None}, 'tls_ciphers': {'name': 'tls_ciphers', 'label': 'detail web tls ciphers label', 'status': 1, 'worst_status': 0, 'verdict': 'detail web tls ciphers verdict good', 'exp': 'detail web tls ciphers exp', 'tech_type': 'table_multi_col', 'tech_string': 'detail web tls ciphers tech table', 'tech_data': '', 'override_mandatory': None}, 'tls_cipher_order': {'name': 'tls_cipher_order', 'label': 'detail web tls cipher-order label', 'status': 1, 'worst_status': 0, 'verdict': 'detail web tls cipher-order verdict na', 'exp': 'detail web tls cipher-order exp', 'tech_type': 'table_multi_col', 'tech_string': 'detail web tls cipher-order tech table', 'tech_data': '', 'override_mandatory': None}, 'tls_version': {'name': 'tls_version', 'label': 'detail web tls version label', 'status': 1, 'worst_status': 0, 'verdict': 'detail web tls version verdict good', 'exp': 'detail web tls version exp', 'tech_type': 'table_multi_col', 'tech_string': 'detail web tls version tech table', 'tech_data': [['TLS 1.3', 'TLS 1.2'], ['detail tech data good', 'detail tech data sufficient']], 'override_mandatory': None}, 'tls_compression': {'name': 'tls_compression', 'label': 'detail web tls compression label', 'status': 1, 'worst_status': 0, 'verdict': 'detail web tls compression verdict good', 'exp': 'detail web tls compression exp', 'tech_type': 'table', 'tech_string': 'detail web tls compression tech table', 'tech_data': 'detail tech data no', 'override_mandatory': None}, 'renegotiation_secure': {'name': 'renegotiation_secure', 'label': 'detail web tls renegotiation-secure label', 'status': 1, 'worst_status': 0, 'verdict': 'detail web tls renegotiation-secure verdict good', 'exp': 'detail web tls renegotiation-secure exp', 'tech_type': 'table', 'tech_string': 'detail web tls renegotiation-secure tech table', 'tech_data': 'detail tech data yes', 'override_mandatory': None}, 'renegotiation_client': {'name': 'renegotiation_client', 'label': 'detail web tls renegotiation-client label', 'status': 1, 'worst_status': 5, 'verdict': 'detail web tls renegotiation-client verdict good', 'exp': 'detail web tls renegotiation-client exp', 'tech_type': 'table', 'tech_string': 'detail web tls renegotiation-client tech table', 'tech_data': 'detail tech data no', 'override_mandatory': None}, 'cert_trust': {'name': 'cert_trust', 'label': 'detail web tls cert-trust label', 'status': 1, 'worst_status': 0, 'verdict': 'detail web tls cert-trust verdict good', 'exp': 'detail web tls cert-trust exp', 'tech_type': 'table', 'tech_string': 'detail web tls cert-trust tech table', 'tech_data': '', 'override_mandatory': None}, 'cert_pubkey': {'name': 'cert_pubkey', 'label': 'detail web tls cert-pubkey label', 'status': 1, 'worst_status': 0, 'verdict': 'detail web tls cert-pubkey verdict good', 'exp': 'detail web tls cert-pubkey exp', 'tech_type': 'table', 'tech_string': 'detail web tls cert-pubkey tech table', 'tech_data': '', 'override_mandatory': None}, 'cert_signature': {'name': 'cert_signature', 'label': 'detail web tls cert-signature label', 'status': 1, 'worst_status': 0, 'verdict': 'detail web tls cert-signature verdict good', 'exp': 'detail web tls cert-signature exp', 'tech_type': 'table_multi_col', 'tech_string': 'detail web tls cert-signature tech table', 'tech_data': '', 'override_mandatory': None}, 'cert_hostmatch': {'name': 'cert_hostmatch', 'label': 'detail web tls cert-hostmatch label', 'status': 1, 'worst_status': 0, 'verdict': 'detail web tls cert-hostmatch verdict good', 'exp': 'detail web tls cert-hostmatch exp', 'tech_type': 'table', 'tech_string': 'detail web tls cert-hostmatch tech table', 'tech_data': '', 'override_mandatory': None}, 'web_caa': {'name': 'web_caa', 'label': 'detail web caa label', 'status': 1, 'worst_status': 5, 'verdict': 'detail web caa verdict good', 'exp': 'detail web caa exp', 'tech_type': 'table_translatable', 'tech_string': 'detail web caa tech table', 'tech_data': [{'msgid': 'detail tech data caa found_host', 'context': {'host': 'forfun.net.'}}], 'override_mandatory': None}, 'dane_exists': {'name': 'dane_exists', 'label': 'detail web tls dane-exists label', 'status': 1, 'worst_status': 5, 'verdict': 'detail web tls dane-exists verdict good', 'exp': 'detail web tls dane-exists exp', 'tech_type': 'table', 'tech_string': 'detail web tls dane-exists tech table', 'tech_data': ['0 1 1 0b9fa5a59eed715c26c1020c711b4f6ec42d58b0015e14337a39dad301c5afc3'], 'override_mandatory': None}, 'dane_valid': {'name': 'dane_valid', 'label': 'detail web tls dane-valid label', 'status': 1, 'worst_status': 2, 'verdict': 'detail web tls dane-valid verdict good', 'exp': 'detail web tls dane-valid exp', 'tech_type': 'table', 'tech_string': 'detail web tls dane-valid tech table', 'tech_data': 'detail tech data yes', 'override_mandatory': None}, 'zero_rtt': {'name': 'zero_rtt', 'label': 'detail web tls zero-rtt label', 'status': 1, 'worst_status': 0, 'verdict': 'detail web tls zero-rtt verdict good', 'exp': 'detail web tls zero-rtt exp', 'tech_type': 'table', 'tech_string': 'detail web tls zero-rtt tech table', 'tech_data': 'detail tech data no', 'override_mandatory': None}, 'ocsp_stapling': {'name': 'ocsp_stapling', 'label': 'detail web tls ocsp-stapling label', 'status': 1, 'worst_status': 2, 'verdict': 'detail web tls ocsp-stapling verdict good', 'exp': 'detail web tls ocsp-stapling exp', 'tech_type': 'table', 'tech_string': 'detail web tls ocsp-stapling tech table', 'tech_data': 'detail tech data yes', 'override_mandatory': None}, 'kex_hash_func': {'name': 'kex_hash_func', 'label': 'detail web tls kex-hash-func label', 'status': 1, 'worst_status': 2, 'verdict': 'detail web tls kex-hash-func verdict good', 'exp': 'detail web tls kex-hash-func exp', 'tech_type': 'table', 'tech_string': 'detail web tls kex-hash-func tech table', 'tech_data': 'detail tech data yes', 'override_mandatory': None}}", + "port": 443, + "maildomain": null, + "webdomain": 9003, + "server_reachable": true, + "tls_enabled": true, + "tls_enabled_score": 0, + "could_not_test_smtp_starttls": false, + "dane_log": "CN=forfun.net dane-validated successfully\n", + "dane_score": 10, + "dane_status": 0, + "dane_records": "['0 1 1 0b9fa5a59eed715c26c1020c711b4f6ec42d58b0015e14337a39dad301c5afc3']", + "dane_rollover": false, + "dh_param": "False", + "ecdh_param": "521", + "fs_bad": "[]", + "fs_phase_out": "[]", + "fs_score": 10, + "ciphers_bad": "[]", + "ciphers_phase_out": "[]", + "ciphers_score": 10, + "cipher_order": 4, + "cipher_order_violation": "[]", + "cipher_order_score": 10, + "protocols_bad": "[]", + "protocols_good": "['TLS 1.3']", + "protocols_phase_out": "[]", + "protocols_score": 10, + "compression": false, + "compression_score": 10, + "secure_reneg": true, + "secure_reneg_score": 10, + "client_reneg": false, + "client_reneg_score": 10, + "zero_rtt": 1, + "zero_rtt_score": 10, + "ocsp_stapling": 1, + "ocsp_stapling_score": 10, + "kex_hash_func": 1, + "kex_hash_func_score": 10, + "forced_https": 1, + "forced_https_score": 10, + "http_compression_enabled": false, + "http_compression_score": 10, + "hsts_enabled": true, + "hsts_policies": "['max-age=31536000']", + "hsts_score": 10, + "cert_chain": "['forfun.net', 'R10']", + "cert_trusted": 0, + "cert_trusted_score": 10, + "cert_pubkey_bad": "[]", + "cert_pubkey_phase_out": "[]", + "cert_pubkey_score": 10, + "cert_signature_bad": "{}", + "cert_signature_score": 10, + "cert_hostmatch_bad": "[]", + "cert_hostmatch_score": 10, + "caa_enabled": true, + "caa_errors": "[]", + "caa_recommendations": "[]", + "caa_score": 10, + "caa_found_on_domain": "forfun.net.", + "score": 130 + } + }, + { + "model": "checks.domaintesttls", + "pk": 9006, + "fields": { + "timestamp": "2025-03-14T15:14:47.230Z", + "domain": "2a00:1450:4026:804::200e", + "report": "{'https_exists': {'name': 'https_exists', 'label': 'detail web tls https-exists label', 'status': 1, 'worst_status': 0, 'verdict': 'detail web tls https-exists verdict good', 'exp': 'detail web tls https-exists exp', 'tech_type': 'table', 'tech_string': 'detail web tls https-exists tech table', 'tech_data': 'detail tech data yes', 'override_mandatory': None}, 'https_forced': {'name': 'https_forced', 'label': 'detail web tls https-forced label', 'status': 0, 'worst_status': 0, 'verdict': 'detail web tls https-forced verdict bad', 'exp': 'detail web tls https-forced exp', 'tech_type': 'table', 'tech_string': 'detail web tls https-forced tech table', 'tech_data': 'detail tech data no', 'override_mandatory': None}, 'https_hsts': {'name': 'https_hsts', 'label': 'detail web tls https-hsts label', 'status': 0, 'worst_status': 0, 'verdict': 'detail web tls https-hsts verdict bad', 'exp': 'detail web tls https-hsts exp', 'tech_type': 'table', 'tech_string': 'detail web tls https-hsts tech table', 'tech_data': '', 'override_mandatory': None}, 'http_compression': {'name': 'http_compression', 'label': 'detail web tls http-compression label', 'status': 5, 'worst_status': 5, 'verdict': 'detail web tls http-compression verdict bad', 'exp': 'detail web tls http-compression exp', 'tech_type': 'table', 'tech_string': 'detail web tls http-compression tech table', 'tech_data': 'detail tech data yes', 'override_mandatory': None}, 'fs_params': {'name': 'fs_params', 'label': 'detail web tls fs-params label', 'status': 1, 'worst_status': 0, 'verdict': 'detail web tls fs-params verdict good', 'exp': 'detail web tls fs-params exp', 'tech_type': 'table_multi_col', 'tech_string': 'detail web tls fs-params tech table', 'tech_data': '', 'override_mandatory': None}, 'tls_ciphers': {'name': 'tls_ciphers', 'label': 'detail web tls ciphers label', 'status': 2, 'worst_status': 0, 'verdict': 'detail web tls ciphers verdict phase-out', 'exp': 'detail web tls ciphers exp', 'tech_type': 'table_multi_col', 'tech_string': 'detail web tls ciphers tech table', 'tech_data': [['AES128-SHA', 'AES256-GCM-SHA384', 'AES128-GCM-SHA256', 'AES256-SHA', 'DES-CBC3-SHA'], ['detail tech data phase-out', 'detail tech data phase-out', 'detail tech data phase-out', 'detail tech data phase-out', 'detail tech data phase-out']], 'override_mandatory': None}, 'tls_cipher_order': {'name': 'tls_cipher_order', 'label': 'detail web tls cipher-order label', 'status': 1, 'worst_status': 0, 'verdict': 'detail web tls cipher-order verdict good', 'exp': 'detail web tls cipher-order exp', 'tech_type': 'table_multi_col', 'tech_string': 'detail web tls cipher-order tech table', 'tech_data': '', 'override_mandatory': None}, 'tls_version': {'name': 'tls_version', 'label': 'detail web tls version label', 'status': 2, 'worst_status': 0, 'verdict': 'detail web tls version verdict phase-out', 'exp': 'detail web tls version exp', 'tech_type': 'table_multi_col', 'tech_string': 'detail web tls version tech table', 'tech_data': [['TLS 1.3', 'TLS 1.2', 'TLS 1.1', 'TLS 1.0'], ['detail tech data good', 'detail tech data sufficient', 'detail tech data phase-out', 'detail tech data phase-out']], 'override_mandatory': None}, 'tls_compression': {'name': 'tls_compression', 'label': 'detail web tls compression label', 'status': 1, 'worst_status': 0, 'verdict': 'detail web tls compression verdict good', 'exp': 'detail web tls compression exp', 'tech_type': 'table', 'tech_string': 'detail web tls compression tech table', 'tech_data': 'detail tech data no', 'override_mandatory': None}, 'renegotiation_secure': {'name': 'renegotiation_secure', 'label': 'detail web tls renegotiation-secure label', 'status': 1, 'worst_status': 0, 'verdict': 'detail web tls renegotiation-secure verdict good', 'exp': 'detail web tls renegotiation-secure exp', 'tech_type': 'table', 'tech_string': 'detail web tls renegotiation-secure tech table', 'tech_data': 'detail tech data yes', 'override_mandatory': None}, 'renegotiation_client': {'name': 'renegotiation_client', 'label': 'detail web tls renegotiation-client label', 'status': 1, 'worst_status': 5, 'verdict': 'detail web tls renegotiation-client verdict good', 'exp': 'detail web tls renegotiation-client exp', 'tech_type': 'table', 'tech_string': 'detail web tls renegotiation-client tech table', 'tech_data': 'detail tech data no', 'override_mandatory': None}, 'cert_trust': {'name': 'cert_trust', 'label': 'detail web tls cert-trust label', 'status': 1, 'worst_status': 0, 'verdict': 'detail web tls cert-trust verdict good', 'exp': 'detail web tls cert-trust exp', 'tech_type': 'table', 'tech_string': 'detail web tls cert-trust tech table', 'tech_data': '', 'override_mandatory': None}, 'cert_pubkey': {'name': 'cert_pubkey', 'label': 'detail web tls cert-pubkey label', 'status': 1, 'worst_status': 0, 'verdict': 'detail web tls cert-pubkey verdict good', 'exp': 'detail web tls cert-pubkey exp', 'tech_type': 'table', 'tech_string': 'detail web tls cert-pubkey tech table', 'tech_data': '', 'override_mandatory': None}, 'cert_signature': {'name': 'cert_signature', 'label': 'detail web tls cert-signature label', 'status': 1, 'worst_status': 0, 'verdict': 'detail web tls cert-signature verdict good', 'exp': 'detail web tls cert-signature exp', 'tech_type': 'table_multi_col', 'tech_string': 'detail web tls cert-signature tech table', 'tech_data': '', 'override_mandatory': None}, 'cert_hostmatch': {'name': 'cert_hostmatch', 'label': 'detail web tls cert-hostmatch label', 'status': 1, 'worst_status': 0, 'verdict': 'detail web tls cert-hostmatch verdict good', 'exp': 'detail web tls cert-hostmatch exp', 'tech_type': 'table', 'tech_string': 'detail web tls cert-hostmatch tech table', 'tech_data': '', 'override_mandatory': None}, 'web_caa': {'name': 'web_caa', 'label': 'detail web caa label', 'status': 1, 'worst_status': 5, 'verdict': 'detail web caa verdict good', 'exp': 'detail web caa exp', 'tech_type': 'table_translatable', 'tech_string': 'detail web caa tech table', 'tech_data': [{'msgid': 'detail tech data caa found_host', 'context': {'host': 'google.com.'}}], 'override_mandatory': None}, 'dane_exists': {'name': 'dane_exists', 'label': 'detail web tls dane-exists label', 'status': 5, 'worst_status': 5, 'verdict': 'detail web tls dane-exists verdict bad', 'exp': 'detail web tls dane-exists exp', 'tech_type': 'table', 'tech_string': 'detail web tls dane-exists tech table', 'tech_data': 'detail tech data no', 'override_mandatory': None}, 'dane_valid': {'name': 'dane_valid', 'label': 'detail web tls dane-valid label', 'status': 4, 'worst_status': 2, 'verdict': 'detail verdict not-tested', 'exp': 'detail web tls dane-valid exp', 'tech_type': 'table', 'tech_string': 'detail web tls dane-valid tech table', 'tech_data': 'detail tech data not-tested', 'override_mandatory': None}, 'zero_rtt': {'name': 'zero_rtt', 'label': 'detail web tls zero-rtt label', 'status': 0, 'worst_status': 0, 'verdict': 'detail web tls zero-rtt verdict bad', 'exp': 'detail web tls zero-rtt exp', 'tech_type': 'table', 'tech_string': 'detail web tls zero-rtt tech table', 'tech_data': 'detail tech data yes', 'override_mandatory': None}, 'ocsp_stapling': {'name': 'ocsp_stapling', 'label': 'detail web tls ocsp-stapling label', 'status': 5, 'worst_status': 2, 'verdict': 'detail web tls ocsp-stapling verdict ok', 'exp': 'detail web tls ocsp-stapling exp', 'tech_type': 'table', 'tech_string': 'detail web tls ocsp-stapling tech table', 'tech_data': 'detail tech data no', 'override_mandatory': None}, 'kex_hash_func': {'name': 'kex_hash_func', 'label': 'detail web tls kex-hash-func label', 'status': 1, 'worst_status': 2, 'verdict': 'detail web tls kex-hash-func verdict good', 'exp': 'detail web tls kex-hash-func exp', 'tech_type': 'table', 'tech_string': 'detail web tls kex-hash-func tech table', 'tech_data': 'detail tech data yes', 'override_mandatory': None}}", + "port": 443, + "maildomain": null, + "webdomain": 9004, + "server_reachable": true, + "tls_enabled": true, + "tls_enabled_score": 0, + "could_not_test_smtp_starttls": false, + "dane_log": "", + "dane_score": 0, + "dane_status": 2, + "dane_records": "[]", + "dane_rollover": false, + "dh_param": "False", + "ecdh_param": "256", + "fs_bad": "[]", + "fs_phase_out": "[]", + "fs_score": 10, + "ciphers_bad": "[]", + "ciphers_phase_out": "['AES128-SHA', 'AES256-GCM-SHA384', 'AES128-GCM-SHA256', 'AES256-SHA', 'DES-CBC3-SHA']", + "ciphers_score": 10, + "cipher_order": 1, + "cipher_order_violation": "[]", + "cipher_order_score": 10, + "protocols_bad": "[]", + "protocols_good": "['TLS 1.3']", + "protocols_phase_out": "['TLS 1.1', 'TLS 1.0']", + "protocols_score": 10, + "compression": false, + "compression_score": 10, + "secure_reneg": true, + "secure_reneg_score": 10, + "client_reneg": false, + "client_reneg_score": 10, + "zero_rtt": 0, + "zero_rtt_score": 0, + "ocsp_stapling": 0, + "ocsp_stapling_score": 10, + "kex_hash_func": 1, + "kex_hash_func_score": 10, + "forced_https": 0, + "forced_https_score": 0, + "http_compression_enabled": true, + "http_compression_score": 0, + "hsts_enabled": false, + "hsts_policies": "[]", + "hsts_score": 0, + "cert_chain": "['*.google.com', 'WR2', 'GTS Root R1']", + "cert_trusted": 0, + "cert_trusted_score": 10, + "cert_pubkey_bad": "[]", + "cert_pubkey_phase_out": "[]", + "cert_pubkey_score": 10, + "cert_signature_bad": "{}", + "cert_signature_score": 10, + "cert_hostmatch_bad": "[]", + "cert_hostmatch_score": 10, + "caa_enabled": true, + "caa_errors": "[]", + "caa_recommendations": "[]", + "caa_score": 10, + "caa_found_on_domain": "google.com.", + "score": 100 + } + }, + { + "model": "checks.domaintesttls", + "pk": 9007, + "fields": { + "timestamp": "2025-03-14T15:14:55.345Z", + "domain": "2a05:1500:600:1:1c00:4aff:fe00:428", + "report": "{'https_exists': {'name': 'https_exists', 'label': 'detail web tls https-exists label', 'status': 1, 'worst_status': 0, 'verdict': 'detail web tls https-exists verdict good', 'exp': 'detail web tls https-exists exp', 'tech_type': 'table', 'tech_string': 'detail web tls https-exists tech table', 'tech_data': 'detail tech data yes', 'override_mandatory': None}, 'https_forced': {'name': 'https_forced', 'label': 'detail web tls https-forced label', 'status': 0, 'worst_status': 0, 'verdict': 'detail web tls https-forced verdict bad', 'exp': 'detail web tls https-forced exp', 'tech_type': 'table', 'tech_string': 'detail web tls https-forced tech table', 'tech_data': 'detail tech data no', 'override_mandatory': None}, 'https_hsts': {'name': 'https_hsts', 'label': 'detail web tls https-hsts label', 'status': 1, 'worst_status': 0, 'verdict': 'detail web tls https-hsts verdict good', 'exp': 'detail web tls https-hsts exp', 'tech_type': 'table', 'tech_string': 'detail web tls https-hsts tech table', 'tech_data': ['max-age=31536000'], 'override_mandatory': None}, 'http_compression': {'name': 'http_compression', 'label': 'detail web tls http-compression label', 'status': 1, 'worst_status': 5, 'verdict': 'detail web tls http-compression verdict good', 'exp': 'detail web tls http-compression exp', 'tech_type': 'table', 'tech_string': 'detail web tls http-compression tech table', 'tech_data': 'detail tech data no', 'override_mandatory': None}, 'fs_params': {'name': 'fs_params', 'label': 'detail web tls fs-params label', 'status': 1, 'worst_status': 0, 'verdict': 'detail web tls fs-params verdict good', 'exp': 'detail web tls fs-params exp', 'tech_type': 'table_multi_col', 'tech_string': 'detail web tls fs-params tech table', 'tech_data': '', 'override_mandatory': None}, 'tls_ciphers': {'name': 'tls_ciphers', 'label': 'detail web tls ciphers label', 'status': 1, 'worst_status': 0, 'verdict': 'detail web tls ciphers verdict good', 'exp': 'detail web tls ciphers exp', 'tech_type': 'table_multi_col', 'tech_string': 'detail web tls ciphers tech table', 'tech_data': '', 'override_mandatory': None}, 'tls_cipher_order': {'name': 'tls_cipher_order', 'label': 'detail web tls cipher-order label', 'status': 1, 'worst_status': 0, 'verdict': 'detail web tls cipher-order verdict na', 'exp': 'detail web tls cipher-order exp', 'tech_type': 'table_multi_col', 'tech_string': 'detail web tls cipher-order tech table', 'tech_data': '', 'override_mandatory': None}, 'tls_version': {'name': 'tls_version', 'label': 'detail web tls version label', 'status': 1, 'worst_status': 0, 'verdict': 'detail web tls version verdict good', 'exp': 'detail web tls version exp', 'tech_type': 'table_multi_col', 'tech_string': 'detail web tls version tech table', 'tech_data': [['TLS 1.3', 'TLS 1.2'], ['detail tech data good', 'detail tech data sufficient']], 'override_mandatory': None}, 'tls_compression': {'name': 'tls_compression', 'label': 'detail web tls compression label', 'status': 1, 'worst_status': 0, 'verdict': 'detail web tls compression verdict good', 'exp': 'detail web tls compression exp', 'tech_type': 'table', 'tech_string': 'detail web tls compression tech table', 'tech_data': 'detail tech data no', 'override_mandatory': None}, 'renegotiation_secure': {'name': 'renegotiation_secure', 'label': 'detail web tls renegotiation-secure label', 'status': 1, 'worst_status': 0, 'verdict': 'detail web tls renegotiation-secure verdict good', 'exp': 'detail web tls renegotiation-secure exp', 'tech_type': 'table', 'tech_string': 'detail web tls renegotiation-secure tech table', 'tech_data': 'detail tech data yes', 'override_mandatory': None}, 'renegotiation_client': {'name': 'renegotiation_client', 'label': 'detail web tls renegotiation-client label', 'status': 1, 'worst_status': 5, 'verdict': 'detail web tls renegotiation-client verdict good', 'exp': 'detail web tls renegotiation-client exp', 'tech_type': 'table', 'tech_string': 'detail web tls renegotiation-client tech table', 'tech_data': 'detail tech data no', 'override_mandatory': None}, 'cert_trust': {'name': 'cert_trust', 'label': 'detail web tls cert-trust label', 'status': 1, 'worst_status': 0, 'verdict': 'detail web tls cert-trust verdict good', 'exp': 'detail web tls cert-trust exp', 'tech_type': 'table', 'tech_string': 'detail web tls cert-trust tech table', 'tech_data': '', 'override_mandatory': None}, 'cert_pubkey': {'name': 'cert_pubkey', 'label': 'detail web tls cert-pubkey label', 'status': 1, 'worst_status': 0, 'verdict': 'detail web tls cert-pubkey verdict good', 'exp': 'detail web tls cert-pubkey exp', 'tech_type': 'table', 'tech_string': 'detail web tls cert-pubkey tech table', 'tech_data': '', 'override_mandatory': None}, 'cert_signature': {'name': 'cert_signature', 'label': 'detail web tls cert-signature label', 'status': 1, 'worst_status': 0, 'verdict': 'detail web tls cert-signature verdict good', 'exp': 'detail web tls cert-signature exp', 'tech_type': 'table_multi_col', 'tech_string': 'detail web tls cert-signature tech table', 'tech_data': '', 'override_mandatory': None}, 'cert_hostmatch': {'name': 'cert_hostmatch', 'label': 'detail web tls cert-hostmatch label', 'status': 0, 'worst_status': 0, 'verdict': 'detail web tls cert-hostmatch verdict bad', 'exp': 'detail web tls cert-hostmatch exp', 'tech_type': 'table', 'tech_string': 'detail web tls cert-hostmatch tech table', 'tech_data': ['forfun.net', 'www.forfun.net'], 'override_mandatory': None}, 'web_caa': {'name': 'web_caa', 'label': 'detail web caa label', 'status': 5, 'worst_status': 5, 'verdict': 'detail web caa verdict bad', 'exp': 'detail web caa exp', 'tech_type': 'table_translatable', 'tech_string': 'detail web caa tech table', 'tech_data': [{'msgid': 'detail tech data caa not_found', 'context': {}}], 'override_mandatory': None}, 'dane_exists': {'name': 'dane_exists', 'label': 'detail web tls dane-exists label', 'status': 5, 'worst_status': 5, 'verdict': 'detail web tls dane-exists verdict bad', 'exp': 'detail web tls dane-exists exp', 'tech_type': 'table', 'tech_string': 'detail web tls dane-exists tech table', 'tech_data': 'detail tech data no', 'override_mandatory': None}, 'dane_valid': {'name': 'dane_valid', 'label': 'detail web tls dane-valid label', 'status': 4, 'worst_status': 2, 'verdict': 'detail verdict not-tested', 'exp': 'detail web tls dane-valid exp', 'tech_type': 'table', 'tech_string': 'detail web tls dane-valid tech table', 'tech_data': 'detail tech data not-tested', 'override_mandatory': None}, 'zero_rtt': {'name': 'zero_rtt', 'label': 'detail web tls zero-rtt label', 'status': 1, 'worst_status': 0, 'verdict': 'detail web tls zero-rtt verdict good', 'exp': 'detail web tls zero-rtt exp', 'tech_type': 'table', 'tech_string': 'detail web tls zero-rtt tech table', 'tech_data': 'detail tech data no', 'override_mandatory': None}, 'ocsp_stapling': {'name': 'ocsp_stapling', 'label': 'detail web tls ocsp-stapling label', 'status': 1, 'worst_status': 2, 'verdict': 'detail web tls ocsp-stapling verdict good', 'exp': 'detail web tls ocsp-stapling exp', 'tech_type': 'table', 'tech_string': 'detail web tls ocsp-stapling tech table', 'tech_data': 'detail tech data yes', 'override_mandatory': None}, 'kex_hash_func': {'name': 'kex_hash_func', 'label': 'detail web tls kex-hash-func label', 'status': 1, 'worst_status': 2, 'verdict': 'detail web tls kex-hash-func verdict good', 'exp': 'detail web tls kex-hash-func exp', 'tech_type': 'table', 'tech_string': 'detail web tls kex-hash-func tech table', 'tech_data': 'detail tech data yes', 'override_mandatory': None}}", + "port": 443, + "maildomain": null, + "webdomain": 9005, + "server_reachable": true, + "tls_enabled": true, + "tls_enabled_score": 0, + "could_not_test_smtp_starttls": false, + "dane_log": "", + "dane_score": 0, + "dane_status": 2, + "dane_records": "[]", + "dane_rollover": false, + "dh_param": "False", + "ecdh_param": "521", + "fs_bad": "[]", + "fs_phase_out": "[]", + "fs_score": 10, + "ciphers_bad": "[]", + "ciphers_phase_out": "[]", + "ciphers_score": 10, + "cipher_order": 4, + "cipher_order_violation": "[]", + "cipher_order_score": 10, + "protocols_bad": "[]", + "protocols_good": "['TLS 1.3']", + "protocols_phase_out": "[]", + "protocols_score": 10, + "compression": false, + "compression_score": 10, + "secure_reneg": true, + "secure_reneg_score": 10, + "client_reneg": false, + "client_reneg_score": 10, + "zero_rtt": 1, + "zero_rtt_score": 10, + "ocsp_stapling": 1, + "ocsp_stapling_score": 10, + "kex_hash_func": 1, + "kex_hash_func_score": 10, + "forced_https": 0, + "forced_https_score": 0, + "http_compression_enabled": false, + "http_compression_score": 10, + "hsts_enabled": true, + "hsts_policies": "['max-age=31536000']", + "hsts_score": 10, + "cert_chain": "['forfun.net', 'R10']", + "cert_trusted": 0, + "cert_trusted_score": 10, + "cert_pubkey_bad": "[]", + "cert_pubkey_phase_out": "[]", + "cert_pubkey_score": 10, + "cert_signature_bad": "{}", + "cert_signature_score": 10, + "cert_hostmatch_bad": "['forfun.net', 'www.forfun.net']", + "cert_hostmatch_score": 0, + "caa_enabled": false, + "caa_errors": "[]", + "caa_recommendations": "[]", + "caa_score": 0, + "caa_found_on_domain": null, + "score": 110 + } + }, + { + "model": "checks.domaintesttls", + "pk": 9008, + "fields": { + "timestamp": "2025-03-14T15:18:50.202Z", + "domain": "104.18.27.110", + "report": "{'https_exists': {'name': 'https_exists', 'label': 'detail web tls https-exists label', 'status': 0, 'worst_status': 0, 'verdict': 'detail web tls https-exists verdict bad', 'exp': 'detail web tls https-exists exp', 'tech_type': 'table', 'tech_string': 'detail web tls https-exists tech table', 'tech_data': 'detail tech data no', 'override_mandatory': None}, 'https_forced': {'name': 'https_forced', 'label': 'detail web tls https-forced label', 'status': 4, 'worst_status': 0, 'verdict': 'detail verdict not-tested', 'exp': 'detail web tls https-forced exp', 'tech_type': 'table', 'tech_string': 'detail web tls https-forced tech table', 'tech_data': 'detail tech data not-tested', 'override_mandatory': None}, 'https_hsts': {'name': 'https_hsts', 'label': 'detail web tls https-hsts label', 'status': 4, 'worst_status': 0, 'verdict': 'detail verdict not-tested', 'exp': 'detail web tls https-hsts exp', 'tech_type': 'table', 'tech_string': 'detail web tls https-hsts tech table', 'tech_data': 'detail tech data not-tested', 'override_mandatory': None}, 'http_compression': {'name': 'http_compression', 'label': 'detail web tls http-compression label', 'status': 4, 'worst_status': 5, 'verdict': 'detail verdict not-tested', 'exp': 'detail web tls http-compression exp', 'tech_type': 'table', 'tech_string': 'detail web tls http-compression tech table', 'tech_data': 'detail tech data not-tested', 'override_mandatory': None}, 'fs_params': {'name': 'fs_params', 'label': 'detail web tls fs-params label', 'status': 4, 'worst_status': 0, 'verdict': 'detail verdict not-tested', 'exp': 'detail web tls fs-params exp', 'tech_type': 'table_multi_col', 'tech_string': 'detail web tls fs-params tech table', 'tech_data': 'detail tech data not-tested', 'override_mandatory': None}, 'tls_ciphers': {'name': 'tls_ciphers', 'label': 'detail web tls ciphers label', 'status': 4, 'worst_status': 0, 'verdict': 'detail verdict not-tested', 'exp': 'detail web tls ciphers exp', 'tech_type': 'table_multi_col', 'tech_string': 'detail web tls ciphers tech table', 'tech_data': 'detail tech data not-tested', 'override_mandatory': None}, 'tls_cipher_order': {'name': 'tls_cipher_order', 'label': 'detail web tls cipher-order label', 'status': 4, 'worst_status': 0, 'verdict': 'detail verdict not-tested', 'exp': 'detail web tls cipher-order exp', 'tech_type': 'table_multi_col', 'tech_string': 'detail web tls cipher-order tech table', 'tech_data': 'detail tech data not-tested', 'override_mandatory': None}, 'tls_version': {'name': 'tls_version', 'label': 'detail web tls version label', 'status': 4, 'worst_status': 0, 'verdict': 'detail verdict not-tested', 'exp': 'detail web tls version exp', 'tech_type': 'table_multi_col', 'tech_string': 'detail web tls version tech table', 'tech_data': 'detail tech data not-tested', 'override_mandatory': None}, 'tls_compression': {'name': 'tls_compression', 'label': 'detail web tls compression label', 'status': 4, 'worst_status': 0, 'verdict': 'detail verdict not-tested', 'exp': 'detail web tls compression exp', 'tech_type': 'table', 'tech_string': 'detail web tls compression tech table', 'tech_data': 'detail tech data not-tested', 'override_mandatory': None}, 'renegotiation_secure': {'name': 'renegotiation_secure', 'label': 'detail web tls renegotiation-secure label', 'status': 4, 'worst_status': 0, 'verdict': 'detail verdict not-tested', 'exp': 'detail web tls renegotiation-secure exp', 'tech_type': 'table', 'tech_string': 'detail web tls renegotiation-secure tech table', 'tech_data': 'detail tech data not-tested', 'override_mandatory': None}, 'renegotiation_client': {'name': 'renegotiation_client', 'label': 'detail web tls renegotiation-client label', 'status': 4, 'worst_status': 5, 'verdict': 'detail verdict not-tested', 'exp': 'detail web tls renegotiation-client exp', 'tech_type': 'table', 'tech_string': 'detail web tls renegotiation-client tech table', 'tech_data': 'detail tech data not-tested', 'override_mandatory': None}, 'cert_trust': {'name': 'cert_trust', 'label': 'detail web tls cert-trust label', 'status': 4, 'worst_status': 0, 'verdict': 'detail verdict not-tested', 'exp': 'detail web tls cert-trust exp', 'tech_type': 'table', 'tech_string': 'detail web tls cert-trust tech table', 'tech_data': 'detail tech data not-tested', 'override_mandatory': None}, 'cert_pubkey': {'name': 'cert_pubkey', 'label': 'detail web tls cert-pubkey label', 'status': 4, 'worst_status': 0, 'verdict': 'detail verdict not-tested', 'exp': 'detail web tls cert-pubkey exp', 'tech_type': 'table', 'tech_string': 'detail web tls cert-pubkey tech table', 'tech_data': 'detail tech data not-tested', 'override_mandatory': None}, 'cert_signature': {'name': 'cert_signature', 'label': 'detail web tls cert-signature label', 'status': 4, 'worst_status': 0, 'verdict': 'detail verdict not-tested', 'exp': 'detail web tls cert-signature exp', 'tech_type': 'table_multi_col', 'tech_string': 'detail web tls cert-signature tech table', 'tech_data': 'detail tech data not-tested', 'override_mandatory': None}, 'cert_hostmatch': {'name': 'cert_hostmatch', 'label': 'detail web tls cert-hostmatch label', 'status': 4, 'worst_status': 0, 'verdict': 'detail verdict not-tested', 'exp': 'detail web tls cert-hostmatch exp', 'tech_type': 'table', 'tech_string': 'detail web tls cert-hostmatch tech table', 'tech_data': 'detail tech data not-tested', 'override_mandatory': None}, 'web_caa': {'name': 'web_caa', 'label': 'detail web caa label', 'status': 4, 'worst_status': 5, 'verdict': 'detail verdict not-tested', 'exp': 'detail web caa exp', 'tech_type': 'table_translatable', 'tech_string': 'detail web caa tech table', 'tech_data': 'detail tech data not-tested', 'override_mandatory': None}, 'dane_exists': {'name': 'dane_exists', 'label': 'detail web tls dane-exists label', 'status': 4, 'worst_status': 5, 'verdict': 'detail verdict not-tested', 'exp': 'detail web tls dane-exists exp', 'tech_type': 'table', 'tech_string': 'detail web tls dane-exists tech table', 'tech_data': 'detail tech data not-tested', 'override_mandatory': None}, 'dane_valid': {'name': 'dane_valid', 'label': 'detail web tls dane-valid label', 'status': 4, 'worst_status': 2, 'verdict': 'detail verdict not-tested', 'exp': 'detail web tls dane-valid exp', 'tech_type': 'table', 'tech_string': 'detail web tls dane-valid tech table', 'tech_data': 'detail tech data not-tested', 'override_mandatory': None}, 'zero_rtt': {'name': 'zero_rtt', 'label': 'detail web tls zero-rtt label', 'status': 4, 'worst_status': 0, 'verdict': 'detail verdict not-tested', 'exp': 'detail web tls zero-rtt exp', 'tech_type': 'table', 'tech_string': 'detail web tls zero-rtt tech table', 'tech_data': 'detail tech data not-tested', 'override_mandatory': None}, 'ocsp_stapling': {'name': 'ocsp_stapling', 'label': 'detail web tls ocsp-stapling label', 'status': 4, 'worst_status': 2, 'verdict': 'detail verdict not-tested', 'exp': 'detail web tls ocsp-stapling exp', 'tech_type': 'table', 'tech_string': 'detail web tls ocsp-stapling tech table', 'tech_data': 'detail tech data not-tested', 'override_mandatory': None}, 'kex_hash_func': {'name': 'kex_hash_func', 'label': 'detail web tls kex-hash-func label', 'status': 4, 'worst_status': 2, 'verdict': 'detail verdict not-tested', 'exp': 'detail web tls kex-hash-func exp', 'tech_type': 'table', 'tech_string': 'detail web tls kex-hash-func tech table', 'tech_data': 'detail tech data not-tested', 'override_mandatory': None}}", + "port": 443, + "maildomain": null, + "webdomain": 9006, + "server_reachable": true, + "tls_enabled": false, + "tls_enabled_score": 0, + "could_not_test_smtp_starttls": false, + "dane_log": "", + "dane_score": null, + "dane_status": 2, + "dane_records": "[]", + "dane_rollover": false, + "dh_param": "", + "ecdh_param": "", + "fs_bad": "[]", + "fs_phase_out": "[]", + "fs_score": null, + "ciphers_bad": "[]", + "ciphers_phase_out": "[]", + "ciphers_score": null, + "cipher_order": 0, + "cipher_order_violation": "[]", + "cipher_order_score": null, + "protocols_bad": "[]", + "protocols_good": "[]", + "protocols_phase_out": "[]", + "protocols_score": null, + "compression": false, + "compression_score": null, + "secure_reneg": false, + "secure_reneg_score": null, + "client_reneg": false, + "client_reneg_score": null, + "zero_rtt": 0, + "zero_rtt_score": null, + "ocsp_stapling": 0, + "ocsp_stapling_score": null, + "kex_hash_func": 0, + "kex_hash_func_score": null, + "forced_https": 3, + "forced_https_score": 0, + "http_compression_enabled": true, + "http_compression_score": 0, + "hsts_enabled": false, + "hsts_policies": "[]", + "hsts_score": 0, + "cert_chain": "[]", + "cert_trusted": null, + "cert_trusted_score": null, + "cert_pubkey_bad": "[]", + "cert_pubkey_phase_out": "[]", + "cert_pubkey_score": null, + "cert_signature_bad": "[]", + "cert_signature_score": null, + "cert_hostmatch_bad": "[]", + "cert_hostmatch_score": null, + "caa_enabled": false, + "caa_errors": "[]", + "caa_recommendations": "[]", + "caa_score": null, + "caa_found_on_domain": null, + "score": 0 + } + }, + { + "model": "checks.domaintesttls", + "pk": 9009, + "fields": { + "timestamp": "2025-03-14T15:19:08.817Z", + "domain": "94.198.159.39", + "report": "{'https_exists': {'name': 'https_exists', 'label': 'detail web tls https-exists label', 'status': 1, 'worst_status': 0, 'verdict': 'detail web tls https-exists verdict good', 'exp': 'detail web tls https-exists exp', 'tech_type': 'table', 'tech_string': 'detail web tls https-exists tech table', 'tech_data': 'detail tech data yes', 'override_mandatory': None}, 'https_forced': {'name': 'https_forced', 'label': 'detail web tls https-forced label', 'status': 0, 'worst_status': 0, 'verdict': 'detail web tls https-forced verdict bad', 'exp': 'detail web tls https-forced exp', 'tech_type': 'table', 'tech_string': 'detail web tls https-forced tech table', 'tech_data': 'detail tech data no', 'override_mandatory': None}, 'https_hsts': {'name': 'https_hsts', 'label': 'detail web tls https-hsts label', 'status': 0, 'worst_status': 0, 'verdict': 'detail web tls https-hsts verdict bad', 'exp': 'detail web tls https-hsts exp', 'tech_type': 'table', 'tech_string': 'detail web tls https-hsts tech table', 'tech_data': '', 'override_mandatory': None}, 'http_compression': {'name': 'http_compression', 'label': 'detail web tls http-compression label', 'status': 5, 'worst_status': 5, 'verdict': 'detail web tls http-compression verdict bad', 'exp': 'detail web tls http-compression exp', 'tech_type': 'table', 'tech_string': 'detail web tls http-compression tech table', 'tech_data': 'detail tech data yes', 'override_mandatory': None}, 'fs_params': {'name': 'fs_params', 'label': 'detail web tls fs-params label', 'status': 1, 'worst_status': 0, 'verdict': 'detail web tls fs-params verdict good', 'exp': 'detail web tls fs-params exp', 'tech_type': 'table_multi_col', 'tech_string': 'detail web tls fs-params tech table', 'tech_data': '', 'override_mandatory': None}, 'tls_ciphers': {'name': 'tls_ciphers', 'label': 'detail web tls ciphers label', 'status': 1, 'worst_status': 0, 'verdict': 'detail web tls ciphers verdict good', 'exp': 'detail web tls ciphers exp', 'tech_type': 'table_multi_col', 'tech_string': 'detail web tls ciphers tech table', 'tech_data': '', 'override_mandatory': None}, 'tls_cipher_order': {'name': 'tls_cipher_order', 'label': 'detail web tls cipher-order label', 'status': 1, 'worst_status': 0, 'verdict': 'detail web tls cipher-order verdict na', 'exp': 'detail web tls cipher-order exp', 'tech_type': 'table_multi_col', 'tech_string': 'detail web tls cipher-order tech table', 'tech_data': '', 'override_mandatory': None}, 'tls_version': {'name': 'tls_version', 'label': 'detail web tls version label', 'status': 1, 'worst_status': 0, 'verdict': 'detail web tls version verdict good', 'exp': 'detail web tls version exp', 'tech_type': 'table_multi_col', 'tech_string': 'detail web tls version tech table', 'tech_data': [['TLS 1.3', 'TLS 1.2'], ['detail tech data good', 'detail tech data sufficient']], 'override_mandatory': None}, 'tls_compression': {'name': 'tls_compression', 'label': 'detail web tls compression label', 'status': 1, 'worst_status': 0, 'verdict': 'detail web tls compression verdict good', 'exp': 'detail web tls compression exp', 'tech_type': 'table', 'tech_string': 'detail web tls compression tech table', 'tech_data': 'detail tech data no', 'override_mandatory': None}, 'renegotiation_secure': {'name': 'renegotiation_secure', 'label': 'detail web tls renegotiation-secure label', 'status': 1, 'worst_status': 0, 'verdict': 'detail web tls renegotiation-secure verdict good', 'exp': 'detail web tls renegotiation-secure exp', 'tech_type': 'table', 'tech_string': 'detail web tls renegotiation-secure tech table', 'tech_data': 'detail tech data yes', 'override_mandatory': None}, 'renegotiation_client': {'name': 'renegotiation_client', 'label': 'detail web tls renegotiation-client label', 'status': 1, 'worst_status': 5, 'verdict': 'detail web tls renegotiation-client verdict good', 'exp': 'detail web tls renegotiation-client exp', 'tech_type': 'table', 'tech_string': 'detail web tls renegotiation-client tech table', 'tech_data': 'detail tech data no', 'override_mandatory': None}, 'cert_trust': {'name': 'cert_trust', 'label': 'detail web tls cert-trust label', 'status': 1, 'worst_status': 0, 'verdict': 'detail web tls cert-trust verdict good', 'exp': 'detail web tls cert-trust exp', 'tech_type': 'table', 'tech_string': 'detail web tls cert-trust tech table', 'tech_data': '', 'override_mandatory': None}, 'cert_pubkey': {'name': 'cert_pubkey', 'label': 'detail web tls cert-pubkey label', 'status': 1, 'worst_status': 0, 'verdict': 'detail web tls cert-pubkey verdict good', 'exp': 'detail web tls cert-pubkey exp', 'tech_type': 'table', 'tech_string': 'detail web tls cert-pubkey tech table', 'tech_data': '', 'override_mandatory': None}, 'cert_signature': {'name': 'cert_signature', 'label': 'detail web tls cert-signature label', 'status': 1, 'worst_status': 0, 'verdict': 'detail web tls cert-signature verdict good', 'exp': 'detail web tls cert-signature exp', 'tech_type': 'table_multi_col', 'tech_string': 'detail web tls cert-signature tech table', 'tech_data': '', 'override_mandatory': None}, 'cert_hostmatch': {'name': 'cert_hostmatch', 'label': 'detail web tls cert-hostmatch label', 'status': 0, 'worst_status': 0, 'verdict': 'detail web tls cert-hostmatch verdict bad', 'exp': 'detail web tls cert-hostmatch exp', 'tech_type': 'table', 'tech_string': 'detail web tls cert-hostmatch tech table', 'tech_data': ['workbench.sidnlabs.nl'], 'override_mandatory': None}, 'web_caa': {'name': 'web_caa', 'label': 'detail web caa label', 'status': 1, 'worst_status': 5, 'verdict': 'detail web caa verdict good', 'exp': 'detail web caa exp', 'tech_type': 'table_translatable', 'tech_string': 'detail web caa tech table', 'tech_data': [{'msgid': 'detail tech data caa found_host', 'context': {'host': 'sidnlabs.nl.'}}], 'override_mandatory': None}, 'dane_exists': {'name': 'dane_exists', 'label': 'detail web tls dane-exists label', 'status': 5, 'worst_status': 5, 'verdict': 'detail web tls dane-exists verdict bad', 'exp': 'detail web tls dane-exists exp', 'tech_type': 'table', 'tech_string': 'detail web tls dane-exists tech table', 'tech_data': 'detail tech data no', 'override_mandatory': None}, 'dane_valid': {'name': 'dane_valid', 'label': 'detail web tls dane-valid label', 'status': 4, 'worst_status': 2, 'verdict': 'detail verdict not-tested', 'exp': 'detail web tls dane-valid exp', 'tech_type': 'table', 'tech_string': 'detail web tls dane-valid tech table', 'tech_data': 'detail tech data not-tested', 'override_mandatory': None}, 'zero_rtt': {'name': 'zero_rtt', 'label': 'detail web tls zero-rtt label', 'status': 1, 'worst_status': 0, 'verdict': 'detail web tls zero-rtt verdict good', 'exp': 'detail web tls zero-rtt exp', 'tech_type': 'table', 'tech_string': 'detail web tls zero-rtt tech table', 'tech_data': 'detail tech data no', 'override_mandatory': None}, 'ocsp_stapling': {'name': 'ocsp_stapling', 'label': 'detail web tls ocsp-stapling label', 'status': 5, 'worst_status': 2, 'verdict': 'detail web tls ocsp-stapling verdict ok', 'exp': 'detail web tls ocsp-stapling exp', 'tech_type': 'table', 'tech_string': 'detail web tls ocsp-stapling tech table', 'tech_data': 'detail tech data no', 'override_mandatory': None}, 'kex_hash_func': {'name': 'kex_hash_func', 'label': 'detail web tls kex-hash-func label', 'status': 1, 'worst_status': 2, 'verdict': 'detail web tls kex-hash-func verdict good', 'exp': 'detail web tls kex-hash-func exp', 'tech_type': 'table', 'tech_string': 'detail web tls kex-hash-func tech table', 'tech_data': 'detail tech data yes', 'override_mandatory': None}}", + "port": 443, + "maildomain": null, + "webdomain": 9007, + "server_reachable": true, + "tls_enabled": true, + "tls_enabled_score": 0, + "could_not_test_smtp_starttls": false, + "dane_log": "", + "dane_score": 0, + "dane_status": 2, + "dane_records": "[]", + "dane_rollover": false, + "dh_param": "False", + "ecdh_param": "256", + "fs_bad": "[]", + "fs_phase_out": "[]", + "fs_score": 10, + "ciphers_bad": "[]", + "ciphers_phase_out": "[]", + "ciphers_score": 10, + "cipher_order": 4, + "cipher_order_violation": "[]", + "cipher_order_score": 10, + "protocols_bad": "[]", + "protocols_good": "['TLS 1.3']", + "protocols_phase_out": "[]", + "protocols_score": 10, + "compression": false, + "compression_score": 10, + "secure_reneg": true, + "secure_reneg_score": 10, + "client_reneg": false, + "client_reneg_score": 10, + "zero_rtt": 1, + "zero_rtt_score": 10, + "ocsp_stapling": 0, + "ocsp_stapling_score": 10, + "kex_hash_func": 1, + "kex_hash_func_score": 10, + "forced_https": 0, + "forced_https_score": 0, + "http_compression_enabled": true, + "http_compression_score": 0, + "hsts_enabled": false, + "hsts_policies": "[]", + "hsts_score": 0, + "cert_chain": "['workbench.sidnlabs.nl', 'E6']", + "cert_trusted": 0, + "cert_trusted_score": 10, + "cert_pubkey_bad": "[]", + "cert_pubkey_phase_out": "[]", + "cert_pubkey_score": 10, + "cert_signature_bad": "{}", + "cert_signature_score": 10, + "cert_hostmatch_bad": "['workbench.sidnlabs.nl']", + "cert_hostmatch_score": 0, + "caa_enabled": true, + "caa_errors": "[]", + "caa_recommendations": "[]", + "caa_score": 10, + "caa_found_on_domain": "sidnlabs.nl.", + "score": 100 + } + }, + { + "model": "checks.domaintesttls", + "pk": 9010, + "fields": { + "timestamp": "2025-03-14T15:19:08.822Z", + "domain": "2a00:d78:0:712:94:198:159:39", + "report": "{'https_exists': {'name': 'https_exists', 'label': 'detail web tls https-exists label', 'status': 1, 'worst_status': 0, 'verdict': 'detail web tls https-exists verdict good', 'exp': 'detail web tls https-exists exp', 'tech_type': 'table', 'tech_string': 'detail web tls https-exists tech table', 'tech_data': 'detail tech data yes', 'override_mandatory': None}, 'https_forced': {'name': 'https_forced', 'label': 'detail web tls https-forced label', 'status': 0, 'worst_status': 0, 'verdict': 'detail web tls https-forced verdict bad', 'exp': 'detail web tls https-forced exp', 'tech_type': 'table', 'tech_string': 'detail web tls https-forced tech table', 'tech_data': 'detail tech data no', 'override_mandatory': None}, 'https_hsts': {'name': 'https_hsts', 'label': 'detail web tls https-hsts label', 'status': 0, 'worst_status': 0, 'verdict': 'detail web tls https-hsts verdict bad', 'exp': 'detail web tls https-hsts exp', 'tech_type': 'table', 'tech_string': 'detail web tls https-hsts tech table', 'tech_data': '', 'override_mandatory': None}, 'http_compression': {'name': 'http_compression', 'label': 'detail web tls http-compression label', 'status': 5, 'worst_status': 5, 'verdict': 'detail web tls http-compression verdict bad', 'exp': 'detail web tls http-compression exp', 'tech_type': 'table', 'tech_string': 'detail web tls http-compression tech table', 'tech_data': 'detail tech data yes', 'override_mandatory': None}, 'fs_params': {'name': 'fs_params', 'label': 'detail web tls fs-params label', 'status': 1, 'worst_status': 0, 'verdict': 'detail web tls fs-params verdict good', 'exp': 'detail web tls fs-params exp', 'tech_type': 'table_multi_col', 'tech_string': 'detail web tls fs-params tech table', 'tech_data': '', 'override_mandatory': None}, 'tls_ciphers': {'name': 'tls_ciphers', 'label': 'detail web tls ciphers label', 'status': 1, 'worst_status': 0, 'verdict': 'detail web tls ciphers verdict good', 'exp': 'detail web tls ciphers exp', 'tech_type': 'table_multi_col', 'tech_string': 'detail web tls ciphers tech table', 'tech_data': '', 'override_mandatory': None}, 'tls_cipher_order': {'name': 'tls_cipher_order', 'label': 'detail web tls cipher-order label', 'status': 1, 'worst_status': 0, 'verdict': 'detail web tls cipher-order verdict na', 'exp': 'detail web tls cipher-order exp', 'tech_type': 'table_multi_col', 'tech_string': 'detail web tls cipher-order tech table', 'tech_data': '', 'override_mandatory': None}, 'tls_version': {'name': 'tls_version', 'label': 'detail web tls version label', 'status': 1, 'worst_status': 0, 'verdict': 'detail web tls version verdict good', 'exp': 'detail web tls version exp', 'tech_type': 'table_multi_col', 'tech_string': 'detail web tls version tech table', 'tech_data': [['TLS 1.3', 'TLS 1.2'], ['detail tech data good', 'detail tech data sufficient']], 'override_mandatory': None}, 'tls_compression': {'name': 'tls_compression', 'label': 'detail web tls compression label', 'status': 1, 'worst_status': 0, 'verdict': 'detail web tls compression verdict good', 'exp': 'detail web tls compression exp', 'tech_type': 'table', 'tech_string': 'detail web tls compression tech table', 'tech_data': 'detail tech data no', 'override_mandatory': None}, 'renegotiation_secure': {'name': 'renegotiation_secure', 'label': 'detail web tls renegotiation-secure label', 'status': 1, 'worst_status': 0, 'verdict': 'detail web tls renegotiation-secure verdict good', 'exp': 'detail web tls renegotiation-secure exp', 'tech_type': 'table', 'tech_string': 'detail web tls renegotiation-secure tech table', 'tech_data': 'detail tech data yes', 'override_mandatory': None}, 'renegotiation_client': {'name': 'renegotiation_client', 'label': 'detail web tls renegotiation-client label', 'status': 1, 'worst_status': 5, 'verdict': 'detail web tls renegotiation-client verdict good', 'exp': 'detail web tls renegotiation-client exp', 'tech_type': 'table', 'tech_string': 'detail web tls renegotiation-client tech table', 'tech_data': 'detail tech data no', 'override_mandatory': None}, 'cert_trust': {'name': 'cert_trust', 'label': 'detail web tls cert-trust label', 'status': 1, 'worst_status': 0, 'verdict': 'detail web tls cert-trust verdict good', 'exp': 'detail web tls cert-trust exp', 'tech_type': 'table', 'tech_string': 'detail web tls cert-trust tech table', 'tech_data': '', 'override_mandatory': None}, 'cert_pubkey': {'name': 'cert_pubkey', 'label': 'detail web tls cert-pubkey label', 'status': 1, 'worst_status': 0, 'verdict': 'detail web tls cert-pubkey verdict good', 'exp': 'detail web tls cert-pubkey exp', 'tech_type': 'table', 'tech_string': 'detail web tls cert-pubkey tech table', 'tech_data': '', 'override_mandatory': None}, 'cert_signature': {'name': 'cert_signature', 'label': 'detail web tls cert-signature label', 'status': 1, 'worst_status': 0, 'verdict': 'detail web tls cert-signature verdict good', 'exp': 'detail web tls cert-signature exp', 'tech_type': 'table_multi_col', 'tech_string': 'detail web tls cert-signature tech table', 'tech_data': '', 'override_mandatory': None}, 'cert_hostmatch': {'name': 'cert_hostmatch', 'label': 'detail web tls cert-hostmatch label', 'status': 0, 'worst_status': 0, 'verdict': 'detail web tls cert-hostmatch verdict bad', 'exp': 'detail web tls cert-hostmatch exp', 'tech_type': 'table', 'tech_string': 'detail web tls cert-hostmatch tech table', 'tech_data': ['workbench.sidnlabs.nl'], 'override_mandatory': None}, 'web_caa': {'name': 'web_caa', 'label': 'detail web caa label', 'status': 1, 'worst_status': 5, 'verdict': 'detail web caa verdict good', 'exp': 'detail web caa exp', 'tech_type': 'table_translatable', 'tech_string': 'detail web caa tech table', 'tech_data': [{'msgid': 'detail tech data caa found_host', 'context': {'host': 'sidnlabs.nl.'}}], 'override_mandatory': None}, 'dane_exists': {'name': 'dane_exists', 'label': 'detail web tls dane-exists label', 'status': 5, 'worst_status': 5, 'verdict': 'detail web tls dane-exists verdict bad', 'exp': 'detail web tls dane-exists exp', 'tech_type': 'table', 'tech_string': 'detail web tls dane-exists tech table', 'tech_data': 'detail tech data no', 'override_mandatory': None}, 'dane_valid': {'name': 'dane_valid', 'label': 'detail web tls dane-valid label', 'status': 4, 'worst_status': 2, 'verdict': 'detail verdict not-tested', 'exp': 'detail web tls dane-valid exp', 'tech_type': 'table', 'tech_string': 'detail web tls dane-valid tech table', 'tech_data': 'detail tech data not-tested', 'override_mandatory': None}, 'zero_rtt': {'name': 'zero_rtt', 'label': 'detail web tls zero-rtt label', 'status': 1, 'worst_status': 0, 'verdict': 'detail web tls zero-rtt verdict good', 'exp': 'detail web tls zero-rtt exp', 'tech_type': 'table', 'tech_string': 'detail web tls zero-rtt tech table', 'tech_data': 'detail tech data no', 'override_mandatory': None}, 'ocsp_stapling': {'name': 'ocsp_stapling', 'label': 'detail web tls ocsp-stapling label', 'status': 5, 'worst_status': 2, 'verdict': 'detail web tls ocsp-stapling verdict ok', 'exp': 'detail web tls ocsp-stapling exp', 'tech_type': 'table', 'tech_string': 'detail web tls ocsp-stapling tech table', 'tech_data': 'detail tech data no', 'override_mandatory': None}, 'kex_hash_func': {'name': 'kex_hash_func', 'label': 'detail web tls kex-hash-func label', 'status': 1, 'worst_status': 2, 'verdict': 'detail web tls kex-hash-func verdict good', 'exp': 'detail web tls kex-hash-func exp', 'tech_type': 'table', 'tech_string': 'detail web tls kex-hash-func tech table', 'tech_data': 'detail tech data yes', 'override_mandatory': None}}", + "port": 443, + "maildomain": null, + "webdomain": 9007, + "server_reachable": true, + "tls_enabled": true, + "tls_enabled_score": 0, + "could_not_test_smtp_starttls": false, + "dane_log": "", + "dane_score": 0, + "dane_status": 2, + "dane_records": "[]", + "dane_rollover": false, + "dh_param": "False", + "ecdh_param": "256", + "fs_bad": "[]", + "fs_phase_out": "[]", + "fs_score": 10, + "ciphers_bad": "[]", + "ciphers_phase_out": "[]", + "ciphers_score": 10, + "cipher_order": 4, + "cipher_order_violation": "[]", + "cipher_order_score": 10, + "protocols_bad": "[]", + "protocols_good": "['TLS 1.3']", + "protocols_phase_out": "[]", + "protocols_score": 10, + "compression": false, + "compression_score": 10, + "secure_reneg": true, + "secure_reneg_score": 10, + "client_reneg": false, + "client_reneg_score": 10, + "zero_rtt": 1, + "zero_rtt_score": 10, + "ocsp_stapling": 0, + "ocsp_stapling_score": 10, + "kex_hash_func": 1, + "kex_hash_func_score": 10, + "forced_https": 0, + "forced_https_score": 0, + "http_compression_enabled": true, + "http_compression_score": 0, + "hsts_enabled": false, + "hsts_policies": "[]", + "hsts_score": 0, + "cert_chain": "['workbench.sidnlabs.nl', 'E6']", + "cert_trusted": 0, + "cert_trusted_score": 10, + "cert_pubkey_bad": "[]", + "cert_pubkey_phase_out": "[]", + "cert_pubkey_score": 10, + "cert_signature_bad": "{}", + "cert_signature_score": 10, + "cert_hostmatch_bad": "['workbench.sidnlabs.nl']", + "cert_hostmatch_score": 0, + "caa_enabled": true, + "caa_errors": "[]", + "caa_recommendations": "[]", + "caa_score": 10, + "caa_found_on_domain": "sidnlabs.nl.", + "score": 100 + } + }, + { + "model": "checks.domaintesttls", + "pk": 9011, + "fields": { + "timestamp": "2025-03-14T15:19:52.506Z", + "domain": "54.200.198.48", + "report": "{'https_exists': {'name': 'https_exists', 'label': 'detail web tls https-exists label', 'status': 1, 'worst_status': 0, 'verdict': 'detail web tls https-exists verdict good', 'exp': 'detail web tls https-exists exp', 'tech_type': 'table', 'tech_string': 'detail web tls https-exists tech table', 'tech_data': 'detail tech data yes', 'override_mandatory': None}, 'https_forced': {'name': 'https_forced', 'label': 'detail web tls https-forced label', 'status': 0, 'worst_status': 0, 'verdict': 'detail web tls https-forced verdict bad', 'exp': 'detail web tls https-forced exp', 'tech_type': 'table', 'tech_string': 'detail web tls https-forced tech table', 'tech_data': 'detail tech data no', 'override_mandatory': None}, 'https_hsts': {'name': 'https_hsts', 'label': 'detail web tls https-hsts label', 'status': 0, 'worst_status': 0, 'verdict': 'detail web tls https-hsts verdict bad', 'exp': 'detail web tls https-hsts exp', 'tech_type': 'table', 'tech_string': 'detail web tls https-hsts tech table', 'tech_data': '', 'override_mandatory': None}, 'http_compression': {'name': 'http_compression', 'label': 'detail web tls http-compression label', 'status': 1, 'worst_status': 5, 'verdict': 'detail web tls http-compression verdict good', 'exp': 'detail web tls http-compression exp', 'tech_type': 'table', 'tech_string': 'detail web tls http-compression tech table', 'tech_data': 'detail tech data no', 'override_mandatory': None}, 'fs_params': {'name': 'fs_params', 'label': 'detail web tls fs-params label', 'status': 0, 'worst_status': 0, 'verdict': 'detail web tls fs-params verdict bad', 'exp': 'detail web tls fs-params exp', 'tech_type': 'table_multi_col', 'tech_string': 'detail web tls fs-params tech table', 'tech_data': [['DH-2048'], ['detail tech data insufficient']], 'override_mandatory': None}, 'tls_ciphers': {'name': 'tls_ciphers', 'label': 'detail web tls ciphers label', 'status': 0, 'worst_status': 0, 'verdict': 'detail web tls ciphers verdict bad', 'exp': 'detail web tls ciphers exp', 'tech_type': 'table_multi_col', 'tech_string': 'detail web tls ciphers tech table', 'tech_data': [['RC4-SHA', 'IDEA-CBC-SHA', 'ECDHE-RSA-RC4-SHA', 'CAMELLIA256-SHA', 'DES-CBC3-SHA', 'DHE-RSA-SEED-SHA', 'AES256-SHA256', 'SEED-SHA', 'CAMELLIA128-SHA', 'AES128-SHA', 'EDH-RSA-DES-CBC3-SHA', 'AES256-SHA', 'AES256-GCM-SHA384', 'AES128-GCM-SHA256', 'ECDHE-RSA-DES-CBC3-SHA', 'DHE-RSA-DES-CBC3-SHA', 'AES128-SHA256'], ['detail tech data insufficient', 'detail tech data insufficient', 'detail tech data insufficient', 'detail tech data phase-out', 'detail tech data phase-out', 'detail tech data phase-out', 'detail tech data phase-out', 'detail tech data phase-out', 'detail tech data phase-out', 'detail tech data phase-out', 'detail tech data phase-out', 'detail tech data phase-out', 'detail tech data phase-out', 'detail tech data phase-out', 'detail tech data phase-out', 'detail tech data phase-out', 'detail tech data phase-out']], 'override_mandatory': None}, 'tls_cipher_order': {'name': 'tls_cipher_order', 'label': 'detail web tls cipher-order label', 'status': 0, 'worst_status': 0, 'verdict': 'detail web tls cipher-order verdict seclevel-bad', 'exp': 'detail web tls cipher-order exp', 'tech_type': 'table_multi_col', 'tech_string': 'detail web tls cipher-order tech table', 'tech_data': [['DHE-RSA-CAMELLIA256-SHA', 'ECDHE-RSA-AES128-GCM-SHA256']], 'override_mandatory': None}, 'tls_version': {'name': 'tls_version', 'label': 'detail web tls version label', 'status': 2, 'worst_status': 0, 'verdict': 'detail web tls version verdict phase-out', 'exp': 'detail web tls version exp', 'tech_type': 'table_multi_col', 'tech_string': 'detail web tls version tech table', 'tech_data': [['TLS 1.2', 'TLS 1.1', 'TLS 1.0'], ['detail tech data sufficient', 'detail tech data phase-out', 'detail tech data phase-out']], 'override_mandatory': None}, 'tls_compression': {'name': 'tls_compression', 'label': 'detail web tls compression label', 'status': 1, 'worst_status': 0, 'verdict': 'detail web tls compression verdict good', 'exp': 'detail web tls compression exp', 'tech_type': 'table', 'tech_string': 'detail web tls compression tech table', 'tech_data': 'detail tech data no', 'override_mandatory': None}, 'renegotiation_secure': {'name': 'renegotiation_secure', 'label': 'detail web tls renegotiation-secure label', 'status': 1, 'worst_status': 0, 'verdict': 'detail web tls renegotiation-secure verdict good', 'exp': 'detail web tls renegotiation-secure exp', 'tech_type': 'table', 'tech_string': 'detail web tls renegotiation-secure tech table', 'tech_data': 'detail tech data yes', 'override_mandatory': None}, 'renegotiation_client': {'name': 'renegotiation_client', 'label': 'detail web tls renegotiation-client label', 'status': 1, 'worst_status': 5, 'verdict': 'detail web tls renegotiation-client verdict good', 'exp': 'detail web tls renegotiation-client exp', 'tech_type': 'table', 'tech_string': 'detail web tls renegotiation-client tech table', 'tech_data': 'detail tech data no', 'override_mandatory': None}, 'cert_trust': {'name': 'cert_trust', 'label': 'detail web tls cert-trust label', 'status': 1, 'worst_status': 0, 'verdict': 'detail web tls cert-trust verdict good', 'exp': 'detail web tls cert-trust exp', 'tech_type': 'table', 'tech_string': 'detail web tls cert-trust tech table', 'tech_data': '', 'override_mandatory': None}, 'cert_pubkey': {'name': 'cert_pubkey', 'label': 'detail web tls cert-pubkey label', 'status': 1, 'worst_status': 0, 'verdict': 'detail web tls cert-pubkey verdict good', 'exp': 'detail web tls cert-pubkey exp', 'tech_type': 'table', 'tech_string': 'detail web tls cert-pubkey tech table', 'tech_data': '', 'override_mandatory': None}, 'cert_signature': {'name': 'cert_signature', 'label': 'detail web tls cert-signature label', 'status': 1, 'worst_status': 0, 'verdict': 'detail web tls cert-signature verdict good', 'exp': 'detail web tls cert-signature exp', 'tech_type': 'table_multi_col', 'tech_string': 'detail web tls cert-signature tech table', 'tech_data': '', 'override_mandatory': None}, 'cert_hostmatch': {'name': 'cert_hostmatch', 'label': 'detail web tls cert-hostmatch label', 'status': 1, 'worst_status': 0, 'verdict': 'detail web tls cert-hostmatch verdict good', 'exp': 'detail web tls cert-hostmatch exp', 'tech_type': 'table', 'tech_string': 'detail web tls cert-hostmatch tech table', 'tech_data': '', 'override_mandatory': None}, 'web_caa': {'name': 'web_caa', 'label': 'detail web caa label', 'status': 5, 'worst_status': 5, 'verdict': 'detail web caa verdict bad', 'exp': 'detail web caa exp', 'tech_type': 'table_translatable', 'tech_string': 'detail web caa tech table', 'tech_data': [{'msgid': 'detail tech data caa not_found', 'context': {}}], 'override_mandatory': None}, 'dane_exists': {'name': 'dane_exists', 'label': 'detail web tls dane-exists label', 'status': 1, 'worst_status': 5, 'verdict': 'detail web tls dane-exists verdict good', 'exp': 'detail web tls dane-exists exp', 'tech_type': 'table', 'tech_string': 'detail web tls dane-exists tech table', 'tech_data': ['3 1 1 b760c12119c388736da724df1224d21dfd23bf03366c286de1a4125369ef7de0'], 'override_mandatory': None}, 'dane_valid': {'name': 'dane_valid', 'label': 'detail web tls dane-valid label', 'status': 2, 'worst_status': 2, 'verdict': 'detail web tls dane-valid verdict bad', 'exp': 'detail web tls dane-valid exp', 'tech_type': 'table', 'tech_string': 'detail web tls dane-valid tech table', 'tech_data': 'detail tech data no', 'override_mandatory': None}, 'zero_rtt': {'name': 'zero_rtt', 'label': 'detail web tls zero-rtt label', 'status': 1, 'worst_status': 0, 'verdict': 'detail web tls zero-rtt verdict na', 'exp': 'detail web tls zero-rtt exp', 'tech_type': 'table', 'tech_string': 'detail web tls zero-rtt tech table', 'tech_data': 'detail tech data no', 'override_mandatory': None}, 'ocsp_stapling': {'name': 'ocsp_stapling', 'label': 'detail web tls ocsp-stapling label', 'status': 5, 'worst_status': 2, 'verdict': 'detail web tls ocsp-stapling verdict ok', 'exp': 'detail web tls ocsp-stapling exp', 'tech_type': 'table', 'tech_string': 'detail web tls ocsp-stapling tech table', 'tech_data': 'detail tech data no', 'override_mandatory': None}, 'kex_hash_func': {'name': 'kex_hash_func', 'label': 'detail web tls kex-hash-func label', 'status': 1, 'worst_status': 2, 'verdict': 'detail web tls kex-hash-func verdict good', 'exp': 'detail web tls kex-hash-func exp', 'tech_type': 'table', 'tech_string': 'detail web tls kex-hash-func tech table', 'tech_data': 'detail tech data yes', 'override_mandatory': None}}", + "port": 443, + "maildomain": null, + "webdomain": 9008, + "server_reachable": true, + "tls_enabled": true, + "tls_enabled_score": 0, + "could_not_test_smtp_starttls": false, + "dane_log": "CN=good.dane.huque.com did not dane-validate, because: No matching DANE TLSA records\n", + "dane_score": 0, + "dane_status": 1, + "dane_records": "['3 1 1 b760c12119c388736da724df1224d21dfd23bf03366c286de1a4125369ef7de0']", + "dane_rollover": false, + "dh_param": "2048", + "ecdh_param": "256", + "fs_bad": "['DH-2048']", + "fs_phase_out": "[]", + "fs_score": 0, + "ciphers_bad": "['RC4-SHA', 'IDEA-CBC-SHA', 'ECDHE-RSA-RC4-SHA']", + "ciphers_phase_out": "['CAMELLIA256-SHA', 'DES-CBC3-SHA', 'DHE-RSA-SEED-SHA', 'AES256-SHA256', 'SEED-SHA', 'CAMELLIA128-SHA', 'AES128-SHA', 'EDH-RSA-DES-CBC3-SHA', 'AES256-SHA', 'AES256-GCM-SHA384', 'AES128-GCM-SHA256', 'ECDHE-RSA-DES-CBC3-SHA', 'DHE-RSA-DES-CBC3-SHA', 'AES128-SHA256']", + "ciphers_score": 0, + "cipher_order": 3, + "cipher_order_violation": "['DHE-RSA-CAMELLIA256-SHA', 'ECDHE-RSA-AES128-GCM-SHA256', '']", + "cipher_order_score": 0, + "protocols_bad": "[]", + "protocols_good": "[]", + "protocols_phase_out": "['TLS 1.1', 'TLS 1.0']", + "protocols_score": 10, + "compression": false, + "compression_score": 10, + "secure_reneg": true, + "secure_reneg_score": 10, + "client_reneg": false, + "client_reneg_score": 10, + "zero_rtt": 2, + "zero_rtt_score": 10, + "ocsp_stapling": 0, + "ocsp_stapling_score": 10, + "kex_hash_func": 1, + "kex_hash_func_score": 10, + "forced_https": 0, + "forced_https_score": 0, + "http_compression_enabled": false, + "http_compression_score": 10, + "hsts_enabled": false, + "hsts_policies": "[]", + "hsts_score": 0, + "cert_chain": "['good.dane.huque.com', 'R11']", + "cert_trusted": 0, + "cert_trusted_score": 10, + "cert_pubkey_bad": "[]", + "cert_pubkey_phase_out": "[]", + "cert_pubkey_score": 10, + "cert_signature_bad": "{}", + "cert_signature_score": 10, + "cert_hostmatch_bad": "[]", + "cert_hostmatch_score": 10, + "caa_enabled": false, + "caa_errors": "[]", + "caa_recommendations": "[]", + "caa_score": 0, + "caa_found_on_domain": null, + "score": 80 + } + }, + { + "model": "checks.domaintesttls", + "pk": 9012, + "fields": { + "timestamp": "2025-03-14T15:20:20.308Z", + "domain": "104.154.89.105", + "report": "{'https_exists': {'name': 'https_exists', 'label': 'detail web tls https-exists label', 'status': 1, 'worst_status': 0, 'verdict': 'detail web tls https-exists verdict good', 'exp': 'detail web tls https-exists exp', 'tech_type': 'table', 'tech_string': 'detail web tls https-exists tech table', 'tech_data': 'detail tech data yes', 'override_mandatory': None}, 'https_forced': {'name': 'https_forced', 'label': 'detail web tls https-forced label', 'status': 1, 'worst_status': 0, 'verdict': 'detail web tls https-forced verdict good', 'exp': 'detail web tls https-forced exp', 'tech_type': 'table', 'tech_string': 'detail web tls https-forced tech table', 'tech_data': 'detail tech data yes', 'override_mandatory': None}, 'https_hsts': {'name': 'https_hsts', 'label': 'detail web tls https-hsts label', 'status': 0, 'worst_status': 0, 'verdict': 'detail web tls https-hsts verdict bad', 'exp': 'detail web tls https-hsts exp', 'tech_type': 'table', 'tech_string': 'detail web tls https-hsts tech table', 'tech_data': '', 'override_mandatory': None}, 'http_compression': {'name': 'http_compression', 'label': 'detail web tls http-compression label', 'status': 5, 'worst_status': 5, 'verdict': 'detail web tls http-compression verdict bad', 'exp': 'detail web tls http-compression exp', 'tech_type': 'table', 'tech_string': 'detail web tls http-compression tech table', 'tech_data': 'detail tech data yes', 'override_mandatory': None}, 'fs_params': {'name': 'fs_params', 'label': 'detail web tls fs-params label', 'status': 0, 'worst_status': 0, 'verdict': 'detail web tls fs-params verdict bad', 'exp': 'detail web tls fs-params exp', 'tech_type': 'table_multi_col', 'tech_string': 'detail web tls fs-params tech table', 'tech_data': [['DH-2048'], ['detail tech data insufficient']], 'override_mandatory': None}, 'tls_ciphers': {'name': 'tls_ciphers', 'label': 'detail web tls ciphers label', 'status': 2, 'worst_status': 0, 'verdict': 'detail web tls ciphers verdict phase-out', 'exp': 'detail web tls ciphers exp', 'tech_type': 'table_multi_col', 'tech_string': 'detail web tls ciphers tech table', 'tech_data': [['CAMELLIA256-SHA', 'DES-CBC3-SHA', 'AES256-SHA256', 'CAMELLIA128-SHA', 'AES128-SHA', 'AES256-GCM-SHA384', 'AES128-GCM-SHA256', 'AES128-SHA256', 'AES256-SHA', 'ECDHE-RSA-DES-CBC3-SHA'], ['detail tech data phase-out', 'detail tech data phase-out', 'detail tech data phase-out', 'detail tech data phase-out', 'detail tech data phase-out', 'detail tech data phase-out', 'detail tech data phase-out', 'detail tech data phase-out', 'detail tech data phase-out', 'detail tech data phase-out']], 'override_mandatory': None}, 'tls_cipher_order': {'name': 'tls_cipher_order', 'label': 'detail web tls cipher-order label', 'status': 1, 'worst_status': 0, 'verdict': 'detail web tls cipher-order verdict good', 'exp': 'detail web tls cipher-order exp', 'tech_type': 'table_multi_col', 'tech_string': 'detail web tls cipher-order tech table', 'tech_data': '', 'override_mandatory': None}, 'tls_version': {'name': 'tls_version', 'label': 'detail web tls version label', 'status': 2, 'worst_status': 0, 'verdict': 'detail web tls version verdict phase-out', 'exp': 'detail web tls version exp', 'tech_type': 'table_multi_col', 'tech_string': 'detail web tls version tech table', 'tech_data': [['TLS 1.2', 'TLS 1.1', 'TLS 1.0'], ['detail tech data sufficient', 'detail tech data phase-out', 'detail tech data phase-out']], 'override_mandatory': None}, 'tls_compression': {'name': 'tls_compression', 'label': 'detail web tls compression label', 'status': 1, 'worst_status': 0, 'verdict': 'detail web tls compression verdict good', 'exp': 'detail web tls compression exp', 'tech_type': 'table', 'tech_string': 'detail web tls compression tech table', 'tech_data': 'detail tech data no', 'override_mandatory': None}, 'renegotiation_secure': {'name': 'renegotiation_secure', 'label': 'detail web tls renegotiation-secure label', 'status': 1, 'worst_status': 0, 'verdict': 'detail web tls renegotiation-secure verdict good', 'exp': 'detail web tls renegotiation-secure exp', 'tech_type': 'table', 'tech_string': 'detail web tls renegotiation-secure tech table', 'tech_data': 'detail tech data yes', 'override_mandatory': None}, 'renegotiation_client': {'name': 'renegotiation_client', 'label': 'detail web tls renegotiation-client label', 'status': 1, 'worst_status': 5, 'verdict': 'detail web tls renegotiation-client verdict good', 'exp': 'detail web tls renegotiation-client exp', 'tech_type': 'table', 'tech_string': 'detail web tls renegotiation-client tech table', 'tech_data': 'detail tech data no', 'override_mandatory': None}, 'cert_trust': {'name': 'cert_trust', 'label': 'detail web tls cert-trust label', 'status': 0, 'worst_status': 0, 'verdict': 'detail web tls cert-trust verdict bad', 'exp': 'detail web tls cert-trust exp', 'tech_type': 'table', 'tech_string': 'detail web tls cert-trust tech table', 'tech_data': ['*.badssl.com', 'COMODO RSA Domain Validation Secure Server CA', 'COMODO RSA Certification Authority'], 'override_mandatory': None}, 'cert_pubkey': {'name': 'cert_pubkey', 'label': 'detail web tls cert-pubkey label', 'status': 1, 'worst_status': 0, 'verdict': 'detail web tls cert-pubkey verdict good', 'exp': 'detail web tls cert-pubkey exp', 'tech_type': 'table', 'tech_string': 'detail web tls cert-pubkey tech table', 'tech_data': '', 'override_mandatory': None}, 'cert_signature': {'name': 'cert_signature', 'label': 'detail web tls cert-signature label', 'status': 1, 'worst_status': 0, 'verdict': 'detail web tls cert-signature verdict good', 'exp': 'detail web tls cert-signature exp', 'tech_type': 'table_multi_col', 'tech_string': 'detail web tls cert-signature tech table', 'tech_data': '', 'override_mandatory': None}, 'cert_hostmatch': {'name': 'cert_hostmatch', 'label': 'detail web tls cert-hostmatch label', 'status': 1, 'worst_status': 0, 'verdict': 'detail web tls cert-hostmatch verdict good', 'exp': 'detail web tls cert-hostmatch exp', 'tech_type': 'table', 'tech_string': 'detail web tls cert-hostmatch tech table', 'tech_data': '', 'override_mandatory': None}, 'web_caa': {'name': 'web_caa', 'label': 'detail web caa label', 'status': 5, 'worst_status': 5, 'verdict': 'detail web caa verdict bad', 'exp': 'detail web caa exp', 'tech_type': 'table_translatable', 'tech_string': 'detail web caa tech table', 'tech_data': [{'msgid': 'detail tech data caa not_found', 'context': {}}], 'override_mandatory': None}, 'dane_exists': {'name': 'dane_exists', 'label': 'detail web tls dane-exists label', 'status': 5, 'worst_status': 5, 'verdict': 'detail web tls dane-exists verdict bad', 'exp': 'detail web tls dane-exists exp', 'tech_type': 'table', 'tech_string': 'detail web tls dane-exists tech table', 'tech_data': 'detail tech data no', 'override_mandatory': None}, 'dane_valid': {'name': 'dane_valid', 'label': 'detail web tls dane-valid label', 'status': 4, 'worst_status': 2, 'verdict': 'detail verdict not-tested', 'exp': 'detail web tls dane-valid exp', 'tech_type': 'table', 'tech_string': 'detail web tls dane-valid tech table', 'tech_data': 'detail tech data not-tested', 'override_mandatory': None}, 'zero_rtt': {'name': 'zero_rtt', 'label': 'detail web tls zero-rtt label', 'status': 1, 'worst_status': 0, 'verdict': 'detail web tls zero-rtt verdict na', 'exp': 'detail web tls zero-rtt exp', 'tech_type': 'table', 'tech_string': 'detail web tls zero-rtt tech table', 'tech_data': 'detail tech data no', 'override_mandatory': None}, 'ocsp_stapling': {'name': 'ocsp_stapling', 'label': 'detail web tls ocsp-stapling label', 'status': 5, 'worst_status': 2, 'verdict': 'detail web tls ocsp-stapling verdict ok', 'exp': 'detail web tls ocsp-stapling exp', 'tech_type': 'table', 'tech_string': 'detail web tls ocsp-stapling tech table', 'tech_data': 'detail tech data no', 'override_mandatory': None}, 'kex_hash_func': {'name': 'kex_hash_func', 'label': 'detail web tls kex-hash-func label', 'status': 1, 'worst_status': 2, 'verdict': 'detail web tls kex-hash-func verdict good', 'exp': 'detail web tls kex-hash-func exp', 'tech_type': 'table', 'tech_string': 'detail web tls kex-hash-func tech table', 'tech_data': 'detail tech data yes', 'override_mandatory': None}}", + "port": 443, + "maildomain": null, + "webdomain": 9009, + "server_reachable": true, + "tls_enabled": true, + "tls_enabled_score": 0, + "could_not_test_smtp_starttls": false, + "dane_log": "", + "dane_score": 0, + "dane_status": 2, + "dane_records": "[]", + "dane_rollover": false, + "dh_param": "2048", + "ecdh_param": "256", + "fs_bad": "['DH-2048']", + "fs_phase_out": "[]", + "fs_score": 0, + "ciphers_bad": "[]", + "ciphers_phase_out": "['CAMELLIA256-SHA', 'DES-CBC3-SHA', 'AES256-SHA256', 'CAMELLIA128-SHA', 'AES128-SHA', 'AES256-GCM-SHA384', 'AES128-GCM-SHA256', 'AES128-SHA256', 'AES256-SHA', 'ECDHE-RSA-DES-CBC3-SHA']", + "ciphers_score": 10, + "cipher_order": 1, + "cipher_order_violation": "[]", + "cipher_order_score": 10, + "protocols_bad": "[]", + "protocols_good": "[]", + "protocols_phase_out": "['TLS 1.1', 'TLS 1.0']", + "protocols_score": 10, + "compression": false, + "compression_score": 10, + "secure_reneg": true, + "secure_reneg_score": 10, + "client_reneg": false, + "client_reneg_score": 10, + "zero_rtt": 2, + "zero_rtt_score": 10, + "ocsp_stapling": 0, + "ocsp_stapling_score": 10, + "kex_hash_func": 1, + "kex_hash_func_score": 10, + "forced_https": 1, + "forced_https_score": 10, + "http_compression_enabled": true, + "http_compression_score": 0, + "hsts_enabled": false, + "hsts_policies": "[]", + "hsts_score": 0, + "cert_chain": "['*.badssl.com', 'COMODO RSA Domain Validation Secure Server CA', 'COMODO RSA Certification Authority']", + "cert_trusted": 10, + "cert_trusted_score": 0, + "cert_pubkey_bad": "[]", + "cert_pubkey_phase_out": "[]", + "cert_pubkey_score": 10, + "cert_signature_bad": "{}", + "cert_signature_score": 10, + "cert_hostmatch_bad": "[]", + "cert_hostmatch_score": 10, + "caa_enabled": false, + "caa_errors": "[]", + "caa_recommendations": "[]", + "caa_score": 0, + "caa_found_on_domain": null, + "score": 100 + } + }, + { + "model": "checks.domaintesttls", + "pk": 9013, + "fields": { + "timestamp": "2025-03-14T15:20:49.000Z", + "domain": "104.154.89.105", + "report": "{'https_exists': {'name': 'https_exists', 'label': 'detail web tls https-exists label', 'status': 1, 'worst_status': 0, 'verdict': 'detail web tls https-exists verdict good', 'exp': 'detail web tls https-exists exp', 'tech_type': 'table', 'tech_string': 'detail web tls https-exists tech table', 'tech_data': 'detail tech data yes', 'override_mandatory': None}, 'https_forced': {'name': 'https_forced', 'label': 'detail web tls https-forced label', 'status': 1, 'worst_status': 0, 'verdict': 'detail web tls https-forced verdict good', 'exp': 'detail web tls https-forced exp', 'tech_type': 'table', 'tech_string': 'detail web tls https-forced tech table', 'tech_data': 'detail tech data yes', 'override_mandatory': None}, 'https_hsts': {'name': 'https_hsts', 'label': 'detail web tls https-hsts label', 'status': 0, 'worst_status': 0, 'verdict': 'detail web tls https-hsts verdict bad', 'exp': 'detail web tls https-hsts exp', 'tech_type': 'table', 'tech_string': 'detail web tls https-hsts tech table', 'tech_data': '', 'override_mandatory': None}, 'http_compression': {'name': 'http_compression', 'label': 'detail web tls http-compression label', 'status': 5, 'worst_status': 5, 'verdict': 'detail web tls http-compression verdict bad', 'exp': 'detail web tls http-compression exp', 'tech_type': 'table', 'tech_string': 'detail web tls http-compression tech table', 'tech_data': 'detail tech data yes', 'override_mandatory': None}, 'fs_params': {'name': 'fs_params', 'label': 'detail web tls fs-params label', 'status': 0, 'worst_status': 0, 'verdict': 'detail web tls fs-params verdict bad', 'exp': 'detail web tls fs-params exp', 'tech_type': 'table_multi_col', 'tech_string': 'detail web tls fs-params tech table', 'tech_data': [['DH-2048'], ['detail tech data insufficient']], 'override_mandatory': None}, 'tls_ciphers': {'name': 'tls_ciphers', 'label': 'detail web tls ciphers label', 'status': 2, 'worst_status': 0, 'verdict': 'detail web tls ciphers verdict phase-out', 'exp': 'detail web tls ciphers exp', 'tech_type': 'table_multi_col', 'tech_string': 'detail web tls ciphers tech table', 'tech_data': [['CAMELLIA256-SHA', 'DES-CBC3-SHA', 'AES256-SHA256', 'CAMELLIA128-SHA', 'AES128-SHA', 'AES256-GCM-SHA384', 'AES128-GCM-SHA256', 'AES128-SHA256', 'AES256-SHA', 'ECDHE-RSA-DES-CBC3-SHA'], ['detail tech data phase-out', 'detail tech data phase-out', 'detail tech data phase-out', 'detail tech data phase-out', 'detail tech data phase-out', 'detail tech data phase-out', 'detail tech data phase-out', 'detail tech data phase-out', 'detail tech data phase-out', 'detail tech data phase-out']], 'override_mandatory': None}, 'tls_cipher_order': {'name': 'tls_cipher_order', 'label': 'detail web tls cipher-order label', 'status': 1, 'worst_status': 0, 'verdict': 'detail web tls cipher-order verdict good', 'exp': 'detail web tls cipher-order exp', 'tech_type': 'table_multi_col', 'tech_string': 'detail web tls cipher-order tech table', 'tech_data': '', 'override_mandatory': None}, 'tls_version': {'name': 'tls_version', 'label': 'detail web tls version label', 'status': 2, 'worst_status': 0, 'verdict': 'detail web tls version verdict phase-out', 'exp': 'detail web tls version exp', 'tech_type': 'table_multi_col', 'tech_string': 'detail web tls version tech table', 'tech_data': [['TLS 1.2', 'TLS 1.1', 'TLS 1.0'], ['detail tech data sufficient', 'detail tech data phase-out', 'detail tech data phase-out']], 'override_mandatory': None}, 'tls_compression': {'name': 'tls_compression', 'label': 'detail web tls compression label', 'status': 1, 'worst_status': 0, 'verdict': 'detail web tls compression verdict good', 'exp': 'detail web tls compression exp', 'tech_type': 'table', 'tech_string': 'detail web tls compression tech table', 'tech_data': 'detail tech data no', 'override_mandatory': None}, 'renegotiation_secure': {'name': 'renegotiation_secure', 'label': 'detail web tls renegotiation-secure label', 'status': 1, 'worst_status': 0, 'verdict': 'detail web tls renegotiation-secure verdict good', 'exp': 'detail web tls renegotiation-secure exp', 'tech_type': 'table', 'tech_string': 'detail web tls renegotiation-secure tech table', 'tech_data': 'detail tech data yes', 'override_mandatory': None}, 'renegotiation_client': {'name': 'renegotiation_client', 'label': 'detail web tls renegotiation-client label', 'status': 1, 'worst_status': 5, 'verdict': 'detail web tls renegotiation-client verdict good', 'exp': 'detail web tls renegotiation-client exp', 'tech_type': 'table', 'tech_string': 'detail web tls renegotiation-client tech table', 'tech_data': 'detail tech data no', 'override_mandatory': None}, 'cert_trust': {'name': 'cert_trust', 'label': 'detail web tls cert-trust label', 'status': 1, 'worst_status': 0, 'verdict': 'detail web tls cert-trust verdict good', 'exp': 'detail web tls cert-trust exp', 'tech_type': 'table', 'tech_string': 'detail web tls cert-trust tech table', 'tech_data': '', 'override_mandatory': None}, 'cert_pubkey': {'name': 'cert_pubkey', 'label': 'detail web tls cert-pubkey label', 'status': 1, 'worst_status': 0, 'verdict': 'detail web tls cert-pubkey verdict good', 'exp': 'detail web tls cert-pubkey exp', 'tech_type': 'table', 'tech_string': 'detail web tls cert-pubkey tech table', 'tech_data': '', 'override_mandatory': None}, 'cert_signature': {'name': 'cert_signature', 'label': 'detail web tls cert-signature label', 'status': 1, 'worst_status': 0, 'verdict': 'detail web tls cert-signature verdict good', 'exp': 'detail web tls cert-signature exp', 'tech_type': 'table_multi_col', 'tech_string': 'detail web tls cert-signature tech table', 'tech_data': '', 'override_mandatory': None}, 'cert_hostmatch': {'name': 'cert_hostmatch', 'label': 'detail web tls cert-hostmatch label', 'status': 0, 'worst_status': 0, 'verdict': 'detail web tls cert-hostmatch verdict bad', 'exp': 'detail web tls cert-hostmatch exp', 'tech_type': 'table', 'tech_string': 'detail web tls cert-hostmatch tech table', 'tech_data': ['*.badssl.com', 'badssl.com'], 'override_mandatory': None}, 'web_caa': {'name': 'web_caa', 'label': 'detail web caa label', 'status': 5, 'worst_status': 5, 'verdict': 'detail web caa verdict bad', 'exp': 'detail web caa exp', 'tech_type': 'table_translatable', 'tech_string': 'detail web caa tech table', 'tech_data': [{'msgid': 'detail tech data caa not_found', 'context': {}}], 'override_mandatory': None}, 'dane_exists': {'name': 'dane_exists', 'label': 'detail web tls dane-exists label', 'status': 5, 'worst_status': 5, 'verdict': 'detail web tls dane-exists verdict bad', 'exp': 'detail web tls dane-exists exp', 'tech_type': 'table', 'tech_string': 'detail web tls dane-exists tech table', 'tech_data': 'detail tech data no', 'override_mandatory': None}, 'dane_valid': {'name': 'dane_valid', 'label': 'detail web tls dane-valid label', 'status': 4, 'worst_status': 2, 'verdict': 'detail verdict not-tested', 'exp': 'detail web tls dane-valid exp', 'tech_type': 'table', 'tech_string': 'detail web tls dane-valid tech table', 'tech_data': 'detail tech data not-tested', 'override_mandatory': None}, 'zero_rtt': {'name': 'zero_rtt', 'label': 'detail web tls zero-rtt label', 'status': 1, 'worst_status': 0, 'verdict': 'detail web tls zero-rtt verdict na', 'exp': 'detail web tls zero-rtt exp', 'tech_type': 'table', 'tech_string': 'detail web tls zero-rtt tech table', 'tech_data': 'detail tech data no', 'override_mandatory': None}, 'ocsp_stapling': {'name': 'ocsp_stapling', 'label': 'detail web tls ocsp-stapling label', 'status': 5, 'worst_status': 2, 'verdict': 'detail web tls ocsp-stapling verdict ok', 'exp': 'detail web tls ocsp-stapling exp', 'tech_type': 'table', 'tech_string': 'detail web tls ocsp-stapling tech table', 'tech_data': 'detail tech data no', 'override_mandatory': None}, 'kex_hash_func': {'name': 'kex_hash_func', 'label': 'detail web tls kex-hash-func label', 'status': 1, 'worst_status': 2, 'verdict': 'detail web tls kex-hash-func verdict good', 'exp': 'detail web tls kex-hash-func exp', 'tech_type': 'table', 'tech_string': 'detail web tls kex-hash-func tech table', 'tech_data': 'detail tech data yes', 'override_mandatory': None}}", + "port": 443, + "maildomain": null, + "webdomain": 9010, + "server_reachable": true, + "tls_enabled": true, + "tls_enabled_score": 0, + "could_not_test_smtp_starttls": false, + "dane_log": "", + "dane_score": 0, + "dane_status": 2, + "dane_records": "[]", + "dane_rollover": false, + "dh_param": "2048", + "ecdh_param": "256", + "fs_bad": "['DH-2048']", + "fs_phase_out": "[]", + "fs_score": 0, + "ciphers_bad": "[]", + "ciphers_phase_out": "['CAMELLIA256-SHA', 'DES-CBC3-SHA', 'AES256-SHA256', 'CAMELLIA128-SHA', 'AES128-SHA', 'AES256-GCM-SHA384', 'AES128-GCM-SHA256', 'AES128-SHA256', 'AES256-SHA', 'ECDHE-RSA-DES-CBC3-SHA']", + "ciphers_score": 10, + "cipher_order": 1, + "cipher_order_violation": "[]", + "cipher_order_score": 10, + "protocols_bad": "[]", + "protocols_good": "[]", + "protocols_phase_out": "['TLS 1.1', 'TLS 1.0']", + "protocols_score": 10, + "compression": false, + "compression_score": 10, + "secure_reneg": true, + "secure_reneg_score": 10, + "client_reneg": false, + "client_reneg_score": 10, + "zero_rtt": 2, + "zero_rtt_score": 10, + "ocsp_stapling": 0, + "ocsp_stapling_score": 10, + "kex_hash_func": 1, + "kex_hash_func_score": 10, + "forced_https": 1, + "forced_https_score": 10, + "http_compression_enabled": true, + "http_compression_score": 0, + "hsts_enabled": false, + "hsts_policies": "[]", + "hsts_score": 0, + "cert_chain": "['*.badssl.com', 'R10']", + "cert_trusted": 0, + "cert_trusted_score": 10, + "cert_pubkey_bad": "[]", + "cert_pubkey_phase_out": "[]", + "cert_pubkey_score": 10, + "cert_signature_bad": "{}", + "cert_signature_score": 10, + "cert_hostmatch_bad": "['*.badssl.com', 'badssl.com']", + "cert_hostmatch_score": 0, + "caa_enabled": false, + "caa_errors": "[]", + "caa_recommendations": "[]", + "caa_score": 0, + "caa_found_on_domain": null, + "score": 100 + } + }, + { + "model": "checks.domaintesttls", + "pk": 9014, + "fields": { + "timestamp": "2025-03-14T15:21:17.330Z", + "domain": "104.154.89.105", + "report": "{'https_exists': {'name': 'https_exists', 'label': 'detail web tls https-exists label', 'status': 1, 'worst_status': 0, 'verdict': 'detail web tls https-exists verdict good', 'exp': 'detail web tls https-exists exp', 'tech_type': 'table', 'tech_string': 'detail web tls https-exists tech table', 'tech_data': 'detail tech data yes', 'override_mandatory': None}, 'https_forced': {'name': 'https_forced', 'label': 'detail web tls https-forced label', 'status': 1, 'worst_status': 0, 'verdict': 'detail web tls https-forced verdict good', 'exp': 'detail web tls https-forced exp', 'tech_type': 'table', 'tech_string': 'detail web tls https-forced tech table', 'tech_data': 'detail tech data yes', 'override_mandatory': None}, 'https_hsts': {'name': 'https_hsts', 'label': 'detail web tls https-hsts label', 'status': 0, 'worst_status': 0, 'verdict': 'detail web tls https-hsts verdict bad', 'exp': 'detail web tls https-hsts exp', 'tech_type': 'table', 'tech_string': 'detail web tls https-hsts tech table', 'tech_data': '', 'override_mandatory': None}, 'http_compression': {'name': 'http_compression', 'label': 'detail web tls http-compression label', 'status': 5, 'worst_status': 5, 'verdict': 'detail web tls http-compression verdict bad', 'exp': 'detail web tls http-compression exp', 'tech_type': 'table', 'tech_string': 'detail web tls http-compression tech table', 'tech_data': 'detail tech data yes', 'override_mandatory': None}, 'fs_params': {'name': 'fs_params', 'label': 'detail web tls fs-params label', 'status': 0, 'worst_status': 0, 'verdict': 'detail web tls fs-params verdict bad', 'exp': 'detail web tls fs-params exp', 'tech_type': 'table_multi_col', 'tech_string': 'detail web tls fs-params tech table', 'tech_data': [['DH-2048'], ['detail tech data insufficient']], 'override_mandatory': None}, 'tls_ciphers': {'name': 'tls_ciphers', 'label': 'detail web tls ciphers label', 'status': 2, 'worst_status': 0, 'verdict': 'detail web tls ciphers verdict phase-out', 'exp': 'detail web tls ciphers exp', 'tech_type': 'table_multi_col', 'tech_string': 'detail web tls ciphers tech table', 'tech_data': [['CAMELLIA256-SHA', 'DES-CBC3-SHA', 'AES256-SHA256', 'CAMELLIA128-SHA', 'AES128-SHA', 'AES256-GCM-SHA384', 'AES128-GCM-SHA256', 'AES128-SHA256', 'AES256-SHA', 'ECDHE-RSA-DES-CBC3-SHA'], ['detail tech data phase-out', 'detail tech data phase-out', 'detail tech data phase-out', 'detail tech data phase-out', 'detail tech data phase-out', 'detail tech data phase-out', 'detail tech data phase-out', 'detail tech data phase-out', 'detail tech data phase-out', 'detail tech data phase-out']], 'override_mandatory': None}, 'tls_cipher_order': {'name': 'tls_cipher_order', 'label': 'detail web tls cipher-order label', 'status': 1, 'worst_status': 0, 'verdict': 'detail web tls cipher-order verdict good', 'exp': 'detail web tls cipher-order exp', 'tech_type': 'table_multi_col', 'tech_string': 'detail web tls cipher-order tech table', 'tech_data': '', 'override_mandatory': None}, 'tls_version': {'name': 'tls_version', 'label': 'detail web tls version label', 'status': 2, 'worst_status': 0, 'verdict': 'detail web tls version verdict phase-out', 'exp': 'detail web tls version exp', 'tech_type': 'table_multi_col', 'tech_string': 'detail web tls version tech table', 'tech_data': [['TLS 1.2', 'TLS 1.1', 'TLS 1.0'], ['detail tech data sufficient', 'detail tech data phase-out', 'detail tech data phase-out']], 'override_mandatory': None}, 'tls_compression': {'name': 'tls_compression', 'label': 'detail web tls compression label', 'status': 1, 'worst_status': 0, 'verdict': 'detail web tls compression verdict good', 'exp': 'detail web tls compression exp', 'tech_type': 'table', 'tech_string': 'detail web tls compression tech table', 'tech_data': 'detail tech data no', 'override_mandatory': None}, 'renegotiation_secure': {'name': 'renegotiation_secure', 'label': 'detail web tls renegotiation-secure label', 'status': 1, 'worst_status': 0, 'verdict': 'detail web tls renegotiation-secure verdict good', 'exp': 'detail web tls renegotiation-secure exp', 'tech_type': 'table', 'tech_string': 'detail web tls renegotiation-secure tech table', 'tech_data': 'detail tech data yes', 'override_mandatory': None}, 'renegotiation_client': {'name': 'renegotiation_client', 'label': 'detail web tls renegotiation-client label', 'status': 1, 'worst_status': 5, 'verdict': 'detail web tls renegotiation-client verdict good', 'exp': 'detail web tls renegotiation-client exp', 'tech_type': 'table', 'tech_string': 'detail web tls renegotiation-client tech table', 'tech_data': 'detail tech data no', 'override_mandatory': None}, 'cert_trust': {'name': 'cert_trust', 'label': 'detail web tls cert-trust label', 'status': 0, 'worst_status': 0, 'verdict': 'detail web tls cert-trust verdict bad', 'exp': 'detail web tls cert-trust exp', 'tech_type': 'table', 'tech_string': 'detail web tls cert-trust tech table', 'tech_data': ['*.badssl.com'], 'override_mandatory': None}, 'cert_pubkey': {'name': 'cert_pubkey', 'label': 'detail web tls cert-pubkey label', 'status': 1, 'worst_status': 0, 'verdict': 'detail web tls cert-pubkey verdict good', 'exp': 'detail web tls cert-pubkey exp', 'tech_type': 'table', 'tech_string': 'detail web tls cert-pubkey tech table', 'tech_data': '', 'override_mandatory': None}, 'cert_signature': {'name': 'cert_signature', 'label': 'detail web tls cert-signature label', 'status': 1, 'worst_status': 0, 'verdict': 'detail web tls cert-signature verdict good', 'exp': 'detail web tls cert-signature exp', 'tech_type': 'table_multi_col', 'tech_string': 'detail web tls cert-signature tech table', 'tech_data': '', 'override_mandatory': None}, 'cert_hostmatch': {'name': 'cert_hostmatch', 'label': 'detail web tls cert-hostmatch label', 'status': 1, 'worst_status': 0, 'verdict': 'detail web tls cert-hostmatch verdict good', 'exp': 'detail web tls cert-hostmatch exp', 'tech_type': 'table', 'tech_string': 'detail web tls cert-hostmatch tech table', 'tech_data': '', 'override_mandatory': None}, 'web_caa': {'name': 'web_caa', 'label': 'detail web caa label', 'status': 5, 'worst_status': 5, 'verdict': 'detail web caa verdict bad', 'exp': 'detail web caa exp', 'tech_type': 'table_translatable', 'tech_string': 'detail web caa tech table', 'tech_data': [{'msgid': 'detail tech data caa not_found', 'context': {}}], 'override_mandatory': None}, 'dane_exists': {'name': 'dane_exists', 'label': 'detail web tls dane-exists label', 'status': 5, 'worst_status': 5, 'verdict': 'detail web tls dane-exists verdict bad', 'exp': 'detail web tls dane-exists exp', 'tech_type': 'table', 'tech_string': 'detail web tls dane-exists tech table', 'tech_data': 'detail tech data no', 'override_mandatory': None}, 'dane_valid': {'name': 'dane_valid', 'label': 'detail web tls dane-valid label', 'status': 4, 'worst_status': 2, 'verdict': 'detail verdict not-tested', 'exp': 'detail web tls dane-valid exp', 'tech_type': 'table', 'tech_string': 'detail web tls dane-valid tech table', 'tech_data': 'detail tech data not-tested', 'override_mandatory': None}, 'zero_rtt': {'name': 'zero_rtt', 'label': 'detail web tls zero-rtt label', 'status': 1, 'worst_status': 0, 'verdict': 'detail web tls zero-rtt verdict na', 'exp': 'detail web tls zero-rtt exp', 'tech_type': 'table', 'tech_string': 'detail web tls zero-rtt tech table', 'tech_data': 'detail tech data no', 'override_mandatory': None}, 'ocsp_stapling': {'name': 'ocsp_stapling', 'label': 'detail web tls ocsp-stapling label', 'status': 5, 'worst_status': 2, 'verdict': 'detail web tls ocsp-stapling verdict ok', 'exp': 'detail web tls ocsp-stapling exp', 'tech_type': 'table', 'tech_string': 'detail web tls ocsp-stapling tech table', 'tech_data': 'detail tech data no', 'override_mandatory': None}, 'kex_hash_func': {'name': 'kex_hash_func', 'label': 'detail web tls kex-hash-func label', 'status': 1, 'worst_status': 2, 'verdict': 'detail web tls kex-hash-func verdict good', 'exp': 'detail web tls kex-hash-func exp', 'tech_type': 'table', 'tech_string': 'detail web tls kex-hash-func tech table', 'tech_data': 'detail tech data yes', 'override_mandatory': None}}", + "port": 443, + "maildomain": null, + "webdomain": 9011, + "server_reachable": true, + "tls_enabled": true, + "tls_enabled_score": 0, + "could_not_test_smtp_starttls": false, + "dane_log": "", + "dane_score": 0, + "dane_status": 2, + "dane_records": "[]", + "dane_rollover": false, + "dh_param": "2048", + "ecdh_param": "256", + "fs_bad": "['DH-2048']", + "fs_phase_out": "[]", + "fs_score": 0, + "ciphers_bad": "[]", + "ciphers_phase_out": "['CAMELLIA256-SHA', 'DES-CBC3-SHA', 'AES256-SHA256', 'CAMELLIA128-SHA', 'AES128-SHA', 'AES256-GCM-SHA384', 'AES128-GCM-SHA256', 'AES128-SHA256', 'AES256-SHA', 'ECDHE-RSA-DES-CBC3-SHA']", + "ciphers_score": 10, + "cipher_order": 1, + "cipher_order_violation": "[]", + "cipher_order_score": 10, + "protocols_bad": "[]", + "protocols_good": "[]", + "protocols_phase_out": "['TLS 1.1', 'TLS 1.0']", + "protocols_score": 10, + "compression": false, + "compression_score": 10, + "secure_reneg": true, + "secure_reneg_score": 10, + "client_reneg": false, + "client_reneg_score": 10, + "zero_rtt": 2, + "zero_rtt_score": 10, + "ocsp_stapling": 0, + "ocsp_stapling_score": 10, + "kex_hash_func": 1, + "kex_hash_func_score": 10, + "forced_https": 1, + "forced_https_score": 10, + "http_compression_enabled": true, + "http_compression_score": 0, + "hsts_enabled": false, + "hsts_policies": "[]", + "hsts_score": 0, + "cert_chain": "['*.badssl.com']", + "cert_trusted": 18, + "cert_trusted_score": 0, + "cert_pubkey_bad": "[]", + "cert_pubkey_phase_out": "[]", + "cert_pubkey_score": 10, + "cert_signature_bad": "{}", + "cert_signature_score": 10, + "cert_hostmatch_bad": "[]", + "cert_hostmatch_score": 10, + "caa_enabled": false, + "caa_errors": "[]", + "caa_recommendations": "[]", + "caa_score": 0, + "caa_found_on_domain": null, + "score": 100 + } + }, + { + "model": "checks.domaintesttls", + "pk": 9015, + "fields": { + "timestamp": "2025-03-14T15:21:45.963Z", + "domain": "104.154.89.105", + "report": "{'https_exists': {'name': 'https_exists', 'label': 'detail web tls https-exists label', 'status': 1, 'worst_status': 0, 'verdict': 'detail web tls https-exists verdict good', 'exp': 'detail web tls https-exists exp', 'tech_type': 'table', 'tech_string': 'detail web tls https-exists tech table', 'tech_data': 'detail tech data yes', 'override_mandatory': None}, 'https_forced': {'name': 'https_forced', 'label': 'detail web tls https-forced label', 'status': 1, 'worst_status': 0, 'verdict': 'detail web tls https-forced verdict good', 'exp': 'detail web tls https-forced exp', 'tech_type': 'table', 'tech_string': 'detail web tls https-forced tech table', 'tech_data': 'detail tech data yes', 'override_mandatory': None}, 'https_hsts': {'name': 'https_hsts', 'label': 'detail web tls https-hsts label', 'status': 0, 'worst_status': 0, 'verdict': 'detail web tls https-hsts verdict bad', 'exp': 'detail web tls https-hsts exp', 'tech_type': 'table', 'tech_string': 'detail web tls https-hsts tech table', 'tech_data': '', 'override_mandatory': None}, 'http_compression': {'name': 'http_compression', 'label': 'detail web tls http-compression label', 'status': 5, 'worst_status': 5, 'verdict': 'detail web tls http-compression verdict bad', 'exp': 'detail web tls http-compression exp', 'tech_type': 'table', 'tech_string': 'detail web tls http-compression tech table', 'tech_data': 'detail tech data yes', 'override_mandatory': None}, 'fs_params': {'name': 'fs_params', 'label': 'detail web tls fs-params label', 'status': 0, 'worst_status': 0, 'verdict': 'detail web tls fs-params verdict bad', 'exp': 'detail web tls fs-params exp', 'tech_type': 'table_multi_col', 'tech_string': 'detail web tls fs-params tech table', 'tech_data': [['DH-2048'], ['detail tech data insufficient']], 'override_mandatory': None}, 'tls_ciphers': {'name': 'tls_ciphers', 'label': 'detail web tls ciphers label', 'status': 2, 'worst_status': 0, 'verdict': 'detail web tls ciphers verdict phase-out', 'exp': 'detail web tls ciphers exp', 'tech_type': 'table_multi_col', 'tech_string': 'detail web tls ciphers tech table', 'tech_data': [['CAMELLIA256-SHA', 'DES-CBC3-SHA', 'AES256-SHA256', 'CAMELLIA128-SHA', 'AES128-SHA', 'AES256-GCM-SHA384', 'AES128-GCM-SHA256', 'AES128-SHA256', 'AES256-SHA', 'ECDHE-RSA-DES-CBC3-SHA'], ['detail tech data phase-out', 'detail tech data phase-out', 'detail tech data phase-out', 'detail tech data phase-out', 'detail tech data phase-out', 'detail tech data phase-out', 'detail tech data phase-out', 'detail tech data phase-out', 'detail tech data phase-out', 'detail tech data phase-out']], 'override_mandatory': None}, 'tls_cipher_order': {'name': 'tls_cipher_order', 'label': 'detail web tls cipher-order label', 'status': 1, 'worst_status': 0, 'verdict': 'detail web tls cipher-order verdict good', 'exp': 'detail web tls cipher-order exp', 'tech_type': 'table_multi_col', 'tech_string': 'detail web tls cipher-order tech table', 'tech_data': '', 'override_mandatory': None}, 'tls_version': {'name': 'tls_version', 'label': 'detail web tls version label', 'status': 2, 'worst_status': 0, 'verdict': 'detail web tls version verdict phase-out', 'exp': 'detail web tls version exp', 'tech_type': 'table_multi_col', 'tech_string': 'detail web tls version tech table', 'tech_data': [['TLS 1.2', 'TLS 1.1', 'TLS 1.0'], ['detail tech data sufficient', 'detail tech data phase-out', 'detail tech data phase-out']], 'override_mandatory': None}, 'tls_compression': {'name': 'tls_compression', 'label': 'detail web tls compression label', 'status': 1, 'worst_status': 0, 'verdict': 'detail web tls compression verdict good', 'exp': 'detail web tls compression exp', 'tech_type': 'table', 'tech_string': 'detail web tls compression tech table', 'tech_data': 'detail tech data no', 'override_mandatory': None}, 'renegotiation_secure': {'name': 'renegotiation_secure', 'label': 'detail web tls renegotiation-secure label', 'status': 1, 'worst_status': 0, 'verdict': 'detail web tls renegotiation-secure verdict good', 'exp': 'detail web tls renegotiation-secure exp', 'tech_type': 'table', 'tech_string': 'detail web tls renegotiation-secure tech table', 'tech_data': 'detail tech data yes', 'override_mandatory': None}, 'renegotiation_client': {'name': 'renegotiation_client', 'label': 'detail web tls renegotiation-client label', 'status': 1, 'worst_status': 5, 'verdict': 'detail web tls renegotiation-client verdict good', 'exp': 'detail web tls renegotiation-client exp', 'tech_type': 'table', 'tech_string': 'detail web tls renegotiation-client tech table', 'tech_data': 'detail tech data no', 'override_mandatory': None}, 'cert_trust': {'name': 'cert_trust', 'label': 'detail web tls cert-trust label', 'status': 0, 'worst_status': 0, 'verdict': 'detail web tls cert-trust verdict bad', 'exp': 'detail web tls cert-trust exp', 'tech_type': 'table', 'tech_string': 'detail web tls cert-trust tech table', 'tech_data': ['*.badssl.com', 'BadSSL Untrusted Root Certificate Authority'], 'override_mandatory': None}, 'cert_pubkey': {'name': 'cert_pubkey', 'label': 'detail web tls cert-pubkey label', 'status': 1, 'worst_status': 0, 'verdict': 'detail web tls cert-pubkey verdict good', 'exp': 'detail web tls cert-pubkey exp', 'tech_type': 'table', 'tech_string': 'detail web tls cert-pubkey tech table', 'tech_data': '', 'override_mandatory': None}, 'cert_signature': {'name': 'cert_signature', 'label': 'detail web tls cert-signature label', 'status': 1, 'worst_status': 0, 'verdict': 'detail web tls cert-signature verdict good', 'exp': 'detail web tls cert-signature exp', 'tech_type': 'table_multi_col', 'tech_string': 'detail web tls cert-signature tech table', 'tech_data': '', 'override_mandatory': None}, 'cert_hostmatch': {'name': 'cert_hostmatch', 'label': 'detail web tls cert-hostmatch label', 'status': 1, 'worst_status': 0, 'verdict': 'detail web tls cert-hostmatch verdict good', 'exp': 'detail web tls cert-hostmatch exp', 'tech_type': 'table', 'tech_string': 'detail web tls cert-hostmatch tech table', 'tech_data': '', 'override_mandatory': None}, 'web_caa': {'name': 'web_caa', 'label': 'detail web caa label', 'status': 5, 'worst_status': 5, 'verdict': 'detail web caa verdict bad', 'exp': 'detail web caa exp', 'tech_type': 'table_translatable', 'tech_string': 'detail web caa tech table', 'tech_data': [{'msgid': 'detail tech data caa not_found', 'context': {}}], 'override_mandatory': None}, 'dane_exists': {'name': 'dane_exists', 'label': 'detail web tls dane-exists label', 'status': 5, 'worst_status': 5, 'verdict': 'detail web tls dane-exists verdict bad', 'exp': 'detail web tls dane-exists exp', 'tech_type': 'table', 'tech_string': 'detail web tls dane-exists tech table', 'tech_data': 'detail tech data no', 'override_mandatory': None}, 'dane_valid': {'name': 'dane_valid', 'label': 'detail web tls dane-valid label', 'status': 4, 'worst_status': 2, 'verdict': 'detail verdict not-tested', 'exp': 'detail web tls dane-valid exp', 'tech_type': 'table', 'tech_string': 'detail web tls dane-valid tech table', 'tech_data': 'detail tech data not-tested', 'override_mandatory': None}, 'zero_rtt': {'name': 'zero_rtt', 'label': 'detail web tls zero-rtt label', 'status': 1, 'worst_status': 0, 'verdict': 'detail web tls zero-rtt verdict na', 'exp': 'detail web tls zero-rtt exp', 'tech_type': 'table', 'tech_string': 'detail web tls zero-rtt tech table', 'tech_data': 'detail tech data no', 'override_mandatory': None}, 'ocsp_stapling': {'name': 'ocsp_stapling', 'label': 'detail web tls ocsp-stapling label', 'status': 5, 'worst_status': 2, 'verdict': 'detail web tls ocsp-stapling verdict ok', 'exp': 'detail web tls ocsp-stapling exp', 'tech_type': 'table', 'tech_string': 'detail web tls ocsp-stapling tech table', 'tech_data': 'detail tech data no', 'override_mandatory': None}, 'kex_hash_func': {'name': 'kex_hash_func', 'label': 'detail web tls kex-hash-func label', 'status': 1, 'worst_status': 2, 'verdict': 'detail web tls kex-hash-func verdict good', 'exp': 'detail web tls kex-hash-func exp', 'tech_type': 'table', 'tech_string': 'detail web tls kex-hash-func tech table', 'tech_data': 'detail tech data yes', 'override_mandatory': None}}", + "port": 443, + "maildomain": null, + "webdomain": 9012, + "server_reachable": true, + "tls_enabled": true, + "tls_enabled_score": 0, + "could_not_test_smtp_starttls": false, + "dane_log": "", + "dane_score": 0, + "dane_status": 2, + "dane_records": "[]", + "dane_rollover": false, + "dh_param": "2048", + "ecdh_param": "256", + "fs_bad": "['DH-2048']", + "fs_phase_out": "[]", + "fs_score": 0, + "ciphers_bad": "[]", + "ciphers_phase_out": "['CAMELLIA256-SHA', 'DES-CBC3-SHA', 'AES256-SHA256', 'CAMELLIA128-SHA', 'AES128-SHA', 'AES256-GCM-SHA384', 'AES128-GCM-SHA256', 'AES128-SHA256', 'AES256-SHA', 'ECDHE-RSA-DES-CBC3-SHA']", + "ciphers_score": 10, + "cipher_order": 1, + "cipher_order_violation": "[]", + "cipher_order_score": 10, + "protocols_bad": "[]", + "protocols_good": "[]", + "protocols_phase_out": "['TLS 1.1', 'TLS 1.0']", + "protocols_score": 10, + "compression": false, + "compression_score": 10, + "secure_reneg": true, + "secure_reneg_score": 10, + "client_reneg": false, + "client_reneg_score": 10, + "zero_rtt": 2, + "zero_rtt_score": 10, + "ocsp_stapling": 0, + "ocsp_stapling_score": 10, + "kex_hash_func": 1, + "kex_hash_func_score": 10, + "forced_https": 1, + "forced_https_score": 10, + "http_compression_enabled": true, + "http_compression_score": 0, + "hsts_enabled": false, + "hsts_policies": "[]", + "hsts_score": 0, + "cert_chain": "['*.badssl.com', 'BadSSL Untrusted Root Certificate Authority']", + "cert_trusted": 19, + "cert_trusted_score": 0, + "cert_pubkey_bad": "[]", + "cert_pubkey_phase_out": "[]", + "cert_pubkey_score": 10, + "cert_signature_bad": "{}", + "cert_signature_score": 10, + "cert_hostmatch_bad": "[]", + "cert_hostmatch_score": 10, + "caa_enabled": false, + "caa_errors": "[]", + "caa_recommendations": "[]", + "caa_score": 0, + "caa_found_on_domain": null, + "score": 100 + } + }, + { + "model": "checks.domaintesttls", + "pk": 9016, + "fields": { + "timestamp": "2025-03-14T15:22:04.663Z", + "domain": "104.154.89.105", + "report": "{'https_exists': {'name': 'https_exists', 'label': 'detail web tls https-exists label', 'status': 1, 'worst_status': 0, 'verdict': 'detail web tls https-exists verdict good', 'exp': 'detail web tls https-exists exp', 'tech_type': 'table', 'tech_string': 'detail web tls https-exists tech table', 'tech_data': 'detail tech data yes', 'override_mandatory': None}, 'https_forced': {'name': 'https_forced', 'label': 'detail web tls https-forced label', 'status': 1, 'worst_status': 0, 'verdict': 'detail web tls https-forced verdict good', 'exp': 'detail web tls https-forced exp', 'tech_type': 'table', 'tech_string': 'detail web tls https-forced tech table', 'tech_data': 'detail tech data yes', 'override_mandatory': None}, 'https_hsts': {'name': 'https_hsts', 'label': 'detail web tls https-hsts label', 'status': 0, 'worst_status': 0, 'verdict': 'detail web tls https-hsts verdict bad', 'exp': 'detail web tls https-hsts exp', 'tech_type': 'table', 'tech_string': 'detail web tls https-hsts tech table', 'tech_data': '', 'override_mandatory': None}, 'http_compression': {'name': 'http_compression', 'label': 'detail web tls http-compression label', 'status': 5, 'worst_status': 5, 'verdict': 'detail web tls http-compression verdict bad', 'exp': 'detail web tls http-compression exp', 'tech_type': 'table', 'tech_string': 'detail web tls http-compression tech table', 'tech_data': 'detail tech data yes', 'override_mandatory': None}, 'fs_params': {'name': 'fs_params', 'label': 'detail web tls fs-params label', 'status': 1, 'worst_status': 0, 'verdict': 'detail web tls fs-params verdict good', 'exp': 'detail web tls fs-params exp', 'tech_type': 'table_multi_col', 'tech_string': 'detail web tls fs-params tech table', 'tech_data': '', 'override_mandatory': None}, 'tls_ciphers': {'name': 'tls_ciphers', 'label': 'detail web tls ciphers label', 'status': 2, 'worst_status': 0, 'verdict': 'detail web tls ciphers verdict phase-out', 'exp': 'detail web tls ciphers exp', 'tech_type': 'table_multi_col', 'tech_string': 'detail web tls ciphers tech table', 'tech_data': [['ECDHE-ECDSA-DES-CBC3-SHA'], ['detail tech data phase-out']], 'override_mandatory': None}, 'tls_cipher_order': {'name': 'tls_cipher_order', 'label': 'detail web tls cipher-order label', 'status': 1, 'worst_status': 0, 'verdict': 'detail web tls cipher-order verdict good', 'exp': 'detail web tls cipher-order exp', 'tech_type': 'table_multi_col', 'tech_string': 'detail web tls cipher-order tech table', 'tech_data': '', 'override_mandatory': None}, 'tls_version': {'name': 'tls_version', 'label': 'detail web tls version label', 'status': 2, 'worst_status': 0, 'verdict': 'detail web tls version verdict phase-out', 'exp': 'detail web tls version exp', 'tech_type': 'table_multi_col', 'tech_string': 'detail web tls version tech table', 'tech_data': [['TLS 1.2', 'TLS 1.1', 'TLS 1.0'], ['detail tech data sufficient', 'detail tech data phase-out', 'detail tech data phase-out']], 'override_mandatory': None}, 'tls_compression': {'name': 'tls_compression', 'label': 'detail web tls compression label', 'status': 1, 'worst_status': 0, 'verdict': 'detail web tls compression verdict good', 'exp': 'detail web tls compression exp', 'tech_type': 'table', 'tech_string': 'detail web tls compression tech table', 'tech_data': 'detail tech data no', 'override_mandatory': None}, 'renegotiation_secure': {'name': 'renegotiation_secure', 'label': 'detail web tls renegotiation-secure label', 'status': 1, 'worst_status': 0, 'verdict': 'detail web tls renegotiation-secure verdict good', 'exp': 'detail web tls renegotiation-secure exp', 'tech_type': 'table', 'tech_string': 'detail web tls renegotiation-secure tech table', 'tech_data': 'detail tech data yes', 'override_mandatory': None}, 'renegotiation_client': {'name': 'renegotiation_client', 'label': 'detail web tls renegotiation-client label', 'status': 1, 'worst_status': 5, 'verdict': 'detail web tls renegotiation-client verdict good', 'exp': 'detail web tls renegotiation-client exp', 'tech_type': 'table', 'tech_string': 'detail web tls renegotiation-client tech table', 'tech_data': 'detail tech data no', 'override_mandatory': None}, 'cert_trust': {'name': 'cert_trust', 'label': 'detail web tls cert-trust label', 'status': 1, 'worst_status': 0, 'verdict': 'detail web tls cert-trust verdict good', 'exp': 'detail web tls cert-trust exp', 'tech_type': 'table', 'tech_string': 'detail web tls cert-trust tech table', 'tech_data': '', 'override_mandatory': None}, 'cert_pubkey': {'name': 'cert_pubkey', 'label': 'detail web tls cert-pubkey label', 'status': 1, 'worst_status': 0, 'verdict': 'detail web tls cert-pubkey verdict good', 'exp': 'detail web tls cert-pubkey exp', 'tech_type': 'table', 'tech_string': 'detail web tls cert-pubkey tech table', 'tech_data': '', 'override_mandatory': None}, 'cert_signature': {'name': 'cert_signature', 'label': 'detail web tls cert-signature label', 'status': 1, 'worst_status': 0, 'verdict': 'detail web tls cert-signature verdict good', 'exp': 'detail web tls cert-signature exp', 'tech_type': 'table_multi_col', 'tech_string': 'detail web tls cert-signature tech table', 'tech_data': '', 'override_mandatory': None}, 'cert_hostmatch': {'name': 'cert_hostmatch', 'label': 'detail web tls cert-hostmatch label', 'status': 1, 'worst_status': 0, 'verdict': 'detail web tls cert-hostmatch verdict good', 'exp': 'detail web tls cert-hostmatch exp', 'tech_type': 'table', 'tech_string': 'detail web tls cert-hostmatch tech table', 'tech_data': '', 'override_mandatory': None}, 'web_caa': {'name': 'web_caa', 'label': 'detail web caa label', 'status': 5, 'worst_status': 5, 'verdict': 'detail web caa verdict bad', 'exp': 'detail web caa exp', 'tech_type': 'table_translatable', 'tech_string': 'detail web caa tech table', 'tech_data': [{'msgid': 'detail tech data caa not_found', 'context': {}}], 'override_mandatory': None}, 'dane_exists': {'name': 'dane_exists', 'label': 'detail web tls dane-exists label', 'status': 5, 'worst_status': 5, 'verdict': 'detail web tls dane-exists verdict bad', 'exp': 'detail web tls dane-exists exp', 'tech_type': 'table', 'tech_string': 'detail web tls dane-exists tech table', 'tech_data': 'detail tech data no', 'override_mandatory': None}, 'dane_valid': {'name': 'dane_valid', 'label': 'detail web tls dane-valid label', 'status': 4, 'worst_status': 2, 'verdict': 'detail verdict not-tested', 'exp': 'detail web tls dane-valid exp', 'tech_type': 'table', 'tech_string': 'detail web tls dane-valid tech table', 'tech_data': 'detail tech data not-tested', 'override_mandatory': None}, 'zero_rtt': {'name': 'zero_rtt', 'label': 'detail web tls zero-rtt label', 'status': 1, 'worst_status': 0, 'verdict': 'detail web tls zero-rtt verdict na', 'exp': 'detail web tls zero-rtt exp', 'tech_type': 'table', 'tech_string': 'detail web tls zero-rtt tech table', 'tech_data': 'detail tech data no', 'override_mandatory': None}, 'ocsp_stapling': {'name': 'ocsp_stapling', 'label': 'detail web tls ocsp-stapling label', 'status': 5, 'worst_status': 2, 'verdict': 'detail web tls ocsp-stapling verdict ok', 'exp': 'detail web tls ocsp-stapling exp', 'tech_type': 'table', 'tech_string': 'detail web tls ocsp-stapling tech table', 'tech_data': 'detail tech data no', 'override_mandatory': None}, 'kex_hash_func': {'name': 'kex_hash_func', 'label': 'detail web tls kex-hash-func label', 'status': 1, 'worst_status': 2, 'verdict': 'detail web tls kex-hash-func verdict good', 'exp': 'detail web tls kex-hash-func exp', 'tech_type': 'table', 'tech_string': 'detail web tls kex-hash-func tech table', 'tech_data': 'detail tech data yes', 'override_mandatory': None}}", + "port": 443, + "maildomain": null, + "webdomain": 9013, + "server_reachable": true, + "tls_enabled": true, + "tls_enabled_score": 0, + "could_not_test_smtp_starttls": false, + "dane_log": "", + "dane_score": 0, + "dane_status": 2, + "dane_records": "[]", + "dane_rollover": false, + "dh_param": "False", + "ecdh_param": "256", + "fs_bad": "[]", + "fs_phase_out": "[]", + "fs_score": 10, + "ciphers_bad": "[]", + "ciphers_phase_out": "['ECDHE-ECDSA-DES-CBC3-SHA']", + "ciphers_score": 10, + "cipher_order": 1, + "cipher_order_violation": "[]", + "cipher_order_score": 10, + "protocols_bad": "[]", + "protocols_good": "[]", + "protocols_phase_out": "['TLS 1.1', 'TLS 1.0']", + "protocols_score": 10, + "compression": false, + "compression_score": 10, + "secure_reneg": true, + "secure_reneg_score": 10, + "client_reneg": false, + "client_reneg_score": 10, + "zero_rtt": 2, + "zero_rtt_score": 10, + "ocsp_stapling": 0, + "ocsp_stapling_score": 10, + "kex_hash_func": 1, + "kex_hash_func_score": 10, + "forced_https": 1, + "forced_https_score": 10, + "http_compression_enabled": true, + "http_compression_score": 0, + "hsts_enabled": false, + "hsts_policies": "[]", + "hsts_score": 0, + "cert_chain": "['revoked.badssl.com', 'E5']", + "cert_trusted": 0, + "cert_trusted_score": 10, + "cert_pubkey_bad": "[]", + "cert_pubkey_phase_out": "[]", + "cert_pubkey_score": 10, + "cert_signature_bad": "{}", + "cert_signature_score": 10, + "cert_hostmatch_bad": "[]", + "cert_hostmatch_score": 10, + "caa_enabled": false, + "caa_errors": "[]", + "caa_recommendations": "[]", + "caa_score": 0, + "caa_found_on_domain": null, + "score": 120 + } + }, + { + "model": "checks.domaintesttls", + "pk": 9017, + "fields": { + "timestamp": "2025-03-14T15:22:34.348Z", + "domain": "104.154.89.105", + "report": "{'https_exists': {'name': 'https_exists', 'label': 'detail web tls https-exists label', 'status': 1, 'worst_status': 0, 'verdict': 'detail web tls https-exists verdict good', 'exp': 'detail web tls https-exists exp', 'tech_type': 'table', 'tech_string': 'detail web tls https-exists tech table', 'tech_data': 'detail tech data yes', 'override_mandatory': None}, 'https_forced': {'name': 'https_forced', 'label': 'detail web tls https-forced label', 'status': 1, 'worst_status': 0, 'verdict': 'detail web tls https-forced verdict good', 'exp': 'detail web tls https-forced exp', 'tech_type': 'table', 'tech_string': 'detail web tls https-forced tech table', 'tech_data': 'detail tech data yes', 'override_mandatory': None}, 'https_hsts': {'name': 'https_hsts', 'label': 'detail web tls https-hsts label', 'status': 0, 'worst_status': 0, 'verdict': 'detail web tls https-hsts verdict bad', 'exp': 'detail web tls https-hsts exp', 'tech_type': 'table', 'tech_string': 'detail web tls https-hsts tech table', 'tech_data': '', 'override_mandatory': None}, 'http_compression': {'name': 'http_compression', 'label': 'detail web tls http-compression label', 'status': 5, 'worst_status': 5, 'verdict': 'detail web tls http-compression verdict bad', 'exp': 'detail web tls http-compression exp', 'tech_type': 'table', 'tech_string': 'detail web tls http-compression tech table', 'tech_data': 'detail tech data yes', 'override_mandatory': None}, 'fs_params': {'name': 'fs_params', 'label': 'detail web tls fs-params label', 'status': 0, 'worst_status': 0, 'verdict': 'detail web tls fs-params verdict bad', 'exp': 'detail web tls fs-params exp', 'tech_type': 'table_multi_col', 'tech_string': 'detail web tls fs-params tech table', 'tech_data': [['DH-2048'], ['detail tech data insufficient']], 'override_mandatory': None}, 'tls_ciphers': {'name': 'tls_ciphers', 'label': 'detail web tls ciphers label', 'status': 2, 'worst_status': 0, 'verdict': 'detail web tls ciphers verdict phase-out', 'exp': 'detail web tls ciphers exp', 'tech_type': 'table_multi_col', 'tech_string': 'detail web tls ciphers tech table', 'tech_data': [['CAMELLIA256-SHA', 'DES-CBC3-SHA', 'AES256-SHA256', 'CAMELLIA128-SHA', 'AES128-SHA', 'AES256-GCM-SHA384', 'AES128-GCM-SHA256', 'AES128-SHA256', 'AES256-SHA', 'ECDHE-RSA-DES-CBC3-SHA'], ['detail tech data phase-out', 'detail tech data phase-out', 'detail tech data phase-out', 'detail tech data phase-out', 'detail tech data phase-out', 'detail tech data phase-out', 'detail tech data phase-out', 'detail tech data phase-out', 'detail tech data phase-out', 'detail tech data phase-out']], 'override_mandatory': None}, 'tls_cipher_order': {'name': 'tls_cipher_order', 'label': 'detail web tls cipher-order label', 'status': 1, 'worst_status': 0, 'verdict': 'detail web tls cipher-order verdict good', 'exp': 'detail web tls cipher-order exp', 'tech_type': 'table_multi_col', 'tech_string': 'detail web tls cipher-order tech table', 'tech_data': '', 'override_mandatory': None}, 'tls_version': {'name': 'tls_version', 'label': 'detail web tls version label', 'status': 2, 'worst_status': 0, 'verdict': 'detail web tls version verdict phase-out', 'exp': 'detail web tls version exp', 'tech_type': 'table_multi_col', 'tech_string': 'detail web tls version tech table', 'tech_data': [['TLS 1.2', 'TLS 1.1', 'TLS 1.0'], ['detail tech data sufficient', 'detail tech data phase-out', 'detail tech data phase-out']], 'override_mandatory': None}, 'tls_compression': {'name': 'tls_compression', 'label': 'detail web tls compression label', 'status': 1, 'worst_status': 0, 'verdict': 'detail web tls compression verdict good', 'exp': 'detail web tls compression exp', 'tech_type': 'table', 'tech_string': 'detail web tls compression tech table', 'tech_data': 'detail tech data no', 'override_mandatory': None}, 'renegotiation_secure': {'name': 'renegotiation_secure', 'label': 'detail web tls renegotiation-secure label', 'status': 1, 'worst_status': 0, 'verdict': 'detail web tls renegotiation-secure verdict good', 'exp': 'detail web tls renegotiation-secure exp', 'tech_type': 'table', 'tech_string': 'detail web tls renegotiation-secure tech table', 'tech_data': 'detail tech data yes', 'override_mandatory': None}, 'renegotiation_client': {'name': 'renegotiation_client', 'label': 'detail web tls renegotiation-client label', 'status': 1, 'worst_status': 5, 'verdict': 'detail web tls renegotiation-client verdict good', 'exp': 'detail web tls renegotiation-client exp', 'tech_type': 'table', 'tech_string': 'detail web tls renegotiation-client tech table', 'tech_data': 'detail tech data no', 'override_mandatory': None}, 'cert_trust': {'name': 'cert_trust', 'label': 'detail web tls cert-trust label', 'status': 1, 'worst_status': 0, 'verdict': 'detail web tls cert-trust verdict good', 'exp': 'detail web tls cert-trust exp', 'tech_type': 'table', 'tech_string': 'detail web tls cert-trust tech table', 'tech_data': '', 'override_mandatory': None}, 'cert_pubkey': {'name': 'cert_pubkey', 'label': 'detail web tls cert-pubkey label', 'status': 1, 'worst_status': 0, 'verdict': 'detail web tls cert-pubkey verdict good', 'exp': 'detail web tls cert-pubkey exp', 'tech_type': 'table', 'tech_string': 'detail web tls cert-pubkey tech table', 'tech_data': '', 'override_mandatory': None}, 'cert_signature': {'name': 'cert_signature', 'label': 'detail web tls cert-signature label', 'status': 1, 'worst_status': 0, 'verdict': 'detail web tls cert-signature verdict good', 'exp': 'detail web tls cert-signature exp', 'tech_type': 'table_multi_col', 'tech_string': 'detail web tls cert-signature tech table', 'tech_data': '', 'override_mandatory': None}, 'cert_hostmatch': {'name': 'cert_hostmatch', 'label': 'detail web tls cert-hostmatch label', 'status': 1, 'worst_status': 0, 'verdict': 'detail web tls cert-hostmatch verdict good', 'exp': 'detail web tls cert-hostmatch exp', 'tech_type': 'table', 'tech_string': 'detail web tls cert-hostmatch tech table', 'tech_data': '', 'override_mandatory': None}, 'web_caa': {'name': 'web_caa', 'label': 'detail web caa label', 'status': 5, 'worst_status': 5, 'verdict': 'detail web caa verdict bad', 'exp': 'detail web caa exp', 'tech_type': 'table_translatable', 'tech_string': 'detail web caa tech table', 'tech_data': [{'msgid': 'detail tech data caa not_found', 'context': {}}], 'override_mandatory': None}, 'dane_exists': {'name': 'dane_exists', 'label': 'detail web tls dane-exists label', 'status': 5, 'worst_status': 5, 'verdict': 'detail web tls dane-exists verdict bad', 'exp': 'detail web tls dane-exists exp', 'tech_type': 'table', 'tech_string': 'detail web tls dane-exists tech table', 'tech_data': 'detail tech data no', 'override_mandatory': None}, 'dane_valid': {'name': 'dane_valid', 'label': 'detail web tls dane-valid label', 'status': 4, 'worst_status': 2, 'verdict': 'detail verdict not-tested', 'exp': 'detail web tls dane-valid exp', 'tech_type': 'table', 'tech_string': 'detail web tls dane-valid tech table', 'tech_data': 'detail tech data not-tested', 'override_mandatory': None}, 'zero_rtt': {'name': 'zero_rtt', 'label': 'detail web tls zero-rtt label', 'status': 1, 'worst_status': 0, 'verdict': 'detail web tls zero-rtt verdict na', 'exp': 'detail web tls zero-rtt exp', 'tech_type': 'table', 'tech_string': 'detail web tls zero-rtt tech table', 'tech_data': 'detail tech data no', 'override_mandatory': None}, 'ocsp_stapling': {'name': 'ocsp_stapling', 'label': 'detail web tls ocsp-stapling label', 'status': 5, 'worst_status': 2, 'verdict': 'detail web tls ocsp-stapling verdict ok', 'exp': 'detail web tls ocsp-stapling exp', 'tech_type': 'table', 'tech_string': 'detail web tls ocsp-stapling tech table', 'tech_data': 'detail tech data no', 'override_mandatory': None}, 'kex_hash_func': {'name': 'kex_hash_func', 'label': 'detail web tls kex-hash-func label', 'status': 1, 'worst_status': 2, 'verdict': 'detail web tls kex-hash-func verdict good', 'exp': 'detail web tls kex-hash-func exp', 'tech_type': 'table', 'tech_string': 'detail web tls kex-hash-func tech table', 'tech_data': 'detail tech data yes', 'override_mandatory': None}}", + "port": 443, + "maildomain": null, + "webdomain": 9014, + "server_reachable": true, + "tls_enabled": true, + "tls_enabled_score": 0, + "could_not_test_smtp_starttls": false, + "dane_log": "", + "dane_score": 0, + "dane_status": 2, + "dane_records": "[]", + "dane_rollover": false, + "dh_param": "2048", + "ecdh_param": "256", + "fs_bad": "['DH-2048']", + "fs_phase_out": "[]", + "fs_score": 0, + "ciphers_bad": "[]", + "ciphers_phase_out": "['CAMELLIA256-SHA', 'DES-CBC3-SHA', 'AES256-SHA256', 'CAMELLIA128-SHA', 'AES128-SHA', 'AES256-GCM-SHA384', 'AES128-GCM-SHA256', 'AES128-SHA256', 'AES256-SHA', 'ECDHE-RSA-DES-CBC3-SHA']", + "ciphers_score": 10, + "cipher_order": 1, + "cipher_order_violation": "[]", + "cipher_order_score": 10, + "protocols_bad": "[]", + "protocols_good": "[]", + "protocols_phase_out": "['TLS 1.1', 'TLS 1.0']", + "protocols_score": 10, + "compression": false, + "compression_score": 10, + "secure_reneg": true, + "secure_reneg_score": 10, + "client_reneg": false, + "client_reneg_score": 10, + "zero_rtt": 2, + "zero_rtt_score": 10, + "ocsp_stapling": 0, + "ocsp_stapling_score": 10, + "kex_hash_func": 1, + "kex_hash_func_score": 10, + "forced_https": 1, + "forced_https_score": 10, + "http_compression_enabled": true, + "http_compression_score": 0, + "hsts_enabled": false, + "hsts_policies": "[]", + "hsts_score": 0, + "cert_chain": "['*.badssl.com', 'R10']", + "cert_trusted": 0, + "cert_trusted_score": 10, + "cert_pubkey_bad": "[]", + "cert_pubkey_phase_out": "[]", + "cert_pubkey_score": 10, + "cert_signature_bad": "{}", + "cert_signature_score": 10, + "cert_hostmatch_bad": "[]", + "cert_hostmatch_score": 10, + "caa_enabled": false, + "caa_errors": "[]", + "caa_recommendations": "[]", + "caa_score": 0, + "caa_found_on_domain": null, + "score": 110 + } + }, + { + "model": "checks.domaintesttls", + "pk": 9018, + "fields": { + "timestamp": "2025-03-14T15:22:41.331Z", + "domain": "103.21.244.8", + "report": "{'https_exists': {'name': 'https_exists', 'label': 'detail web tls https-exists label', 'status': 1, 'worst_status': 0, 'verdict': 'detail web tls https-exists verdict good', 'exp': 'detail web tls https-exists exp', 'tech_type': 'table', 'tech_string': 'detail web tls https-exists tech table', 'tech_data': 'detail tech data yes', 'override_mandatory': None}, 'https_forced': {'name': 'https_forced', 'label': 'detail web tls https-forced label', 'status': 1, 'worst_status': 0, 'verdict': 'detail web tls https-forced verdict good', 'exp': 'detail web tls https-forced exp', 'tech_type': 'table', 'tech_string': 'detail web tls https-forced tech table', 'tech_data': 'detail tech data yes', 'override_mandatory': None}, 'https_hsts': {'name': 'https_hsts', 'label': 'detail web tls https-hsts label', 'status': 1, 'worst_status': 0, 'verdict': 'detail web tls https-hsts verdict good', 'exp': 'detail web tls https-hsts exp', 'tech_type': 'table', 'tech_string': 'detail web tls https-hsts tech table', 'tech_data': ['max-age=31536000'], 'override_mandatory': None}, 'http_compression': {'name': 'http_compression', 'label': 'detail web tls http-compression label', 'status': 5, 'worst_status': 5, 'verdict': 'detail web tls http-compression verdict bad', 'exp': 'detail web tls http-compression exp', 'tech_type': 'table', 'tech_string': 'detail web tls http-compression tech table', 'tech_data': 'detail tech data yes', 'override_mandatory': None}, 'fs_params': {'name': 'fs_params', 'label': 'detail web tls fs-params label', 'status': 1, 'worst_status': 0, 'verdict': 'detail web tls fs-params verdict good', 'exp': 'detail web tls fs-params exp', 'tech_type': 'table_multi_col', 'tech_string': 'detail web tls fs-params tech table', 'tech_data': '', 'override_mandatory': None}, 'tls_ciphers': {'name': 'tls_ciphers', 'label': 'detail web tls ciphers label', 'status': 1, 'worst_status': 0, 'verdict': 'detail web tls ciphers verdict good', 'exp': 'detail web tls ciphers exp', 'tech_type': 'table_multi_col', 'tech_string': 'detail web tls ciphers tech table', 'tech_data': '', 'override_mandatory': None}, 'tls_cipher_order': {'name': 'tls_cipher_order', 'label': 'detail web tls cipher-order label', 'status': 0, 'worst_status': 0, 'verdict': 'detail web tls cipher-order verdict seclevel-bad', 'exp': 'detail web tls cipher-order exp', 'tech_type': 'table_multi_col', 'tech_string': 'detail web tls cipher-order tech table', 'tech_data': [['ECDHE-ECDSA-AES128-SHA', 'ECDHE-ECDSA-AES256-GCM-SHA384']], 'override_mandatory': None}, 'tls_version': {'name': 'tls_version', 'label': 'detail web tls version label', 'status': 1, 'worst_status': 0, 'verdict': 'detail web tls version verdict good', 'exp': 'detail web tls version exp', 'tech_type': 'table_multi_col', 'tech_string': 'detail web tls version tech table', 'tech_data': [['TLS 1.3', 'TLS 1.2'], ['detail tech data good', 'detail tech data sufficient']], 'override_mandatory': None}, 'tls_compression': {'name': 'tls_compression', 'label': 'detail web tls compression label', 'status': 1, 'worst_status': 0, 'verdict': 'detail web tls compression verdict good', 'exp': 'detail web tls compression exp', 'tech_type': 'table', 'tech_string': 'detail web tls compression tech table', 'tech_data': 'detail tech data no', 'override_mandatory': None}, 'renegotiation_secure': {'name': 'renegotiation_secure', 'label': 'detail web tls renegotiation-secure label', 'status': 1, 'worst_status': 0, 'verdict': 'detail web tls renegotiation-secure verdict good', 'exp': 'detail web tls renegotiation-secure exp', 'tech_type': 'table', 'tech_string': 'detail web tls renegotiation-secure tech table', 'tech_data': 'detail tech data yes', 'override_mandatory': None}, 'renegotiation_client': {'name': 'renegotiation_client', 'label': 'detail web tls renegotiation-client label', 'status': 1, 'worst_status': 5, 'verdict': 'detail web tls renegotiation-client verdict good', 'exp': 'detail web tls renegotiation-client exp', 'tech_type': 'table', 'tech_string': 'detail web tls renegotiation-client tech table', 'tech_data': 'detail tech data no', 'override_mandatory': None}, 'cert_trust': {'name': 'cert_trust', 'label': 'detail web tls cert-trust label', 'status': 1, 'worst_status': 0, 'verdict': 'detail web tls cert-trust verdict good', 'exp': 'detail web tls cert-trust exp', 'tech_type': 'table', 'tech_string': 'detail web tls cert-trust tech table', 'tech_data': '', 'override_mandatory': None}, 'cert_pubkey': {'name': 'cert_pubkey', 'label': 'detail web tls cert-pubkey label', 'status': 1, 'worst_status': 0, 'verdict': 'detail web tls cert-pubkey verdict good', 'exp': 'detail web tls cert-pubkey exp', 'tech_type': 'table', 'tech_string': 'detail web tls cert-pubkey tech table', 'tech_data': '', 'override_mandatory': None}, 'cert_signature': {'name': 'cert_signature', 'label': 'detail web tls cert-signature label', 'status': 1, 'worst_status': 0, 'verdict': 'detail web tls cert-signature verdict good', 'exp': 'detail web tls cert-signature exp', 'tech_type': 'table_multi_col', 'tech_string': 'detail web tls cert-signature tech table', 'tech_data': '', 'override_mandatory': None}, 'cert_hostmatch': {'name': 'cert_hostmatch', 'label': 'detail web tls cert-hostmatch label', 'status': 1, 'worst_status': 0, 'verdict': 'detail web tls cert-hostmatch verdict good', 'exp': 'detail web tls cert-hostmatch exp', 'tech_type': 'table', 'tech_string': 'detail web tls cert-hostmatch tech table', 'tech_data': '', 'override_mandatory': None}, 'web_caa': {'name': 'web_caa', 'label': 'detail web caa label', 'status': 5, 'worst_status': 5, 'verdict': 'detail web caa verdict bad', 'exp': 'detail web caa exp', 'tech_type': 'table_translatable', 'tech_string': 'detail web caa tech table', 'tech_data': [{'msgid': 'detail tech data caa not_found', 'context': {}}], 'override_mandatory': None}, 'dane_exists': {'name': 'dane_exists', 'label': 'detail web tls dane-exists label', 'status': 5, 'worst_status': 5, 'verdict': 'detail web tls dane-exists verdict bad', 'exp': 'detail web tls dane-exists exp', 'tech_type': 'table', 'tech_string': 'detail web tls dane-exists tech table', 'tech_data': 'detail tech data no', 'override_mandatory': None}, 'dane_valid': {'name': 'dane_valid', 'label': 'detail web tls dane-valid label', 'status': 4, 'worst_status': 2, 'verdict': 'detail verdict not-tested', 'exp': 'detail web tls dane-valid exp', 'tech_type': 'table', 'tech_string': 'detail web tls dane-valid tech table', 'tech_data': 'detail tech data not-tested', 'override_mandatory': None}, 'zero_rtt': {'name': 'zero_rtt', 'label': 'detail web tls zero-rtt label', 'status': 0, 'worst_status': 0, 'verdict': 'detail web tls zero-rtt verdict bad', 'exp': 'detail web tls zero-rtt exp', 'tech_type': 'table', 'tech_string': 'detail web tls zero-rtt tech table', 'tech_data': 'detail tech data yes', 'override_mandatory': None}, 'ocsp_stapling': {'name': 'ocsp_stapling', 'label': 'detail web tls ocsp-stapling label', 'status': 1, 'worst_status': 2, 'verdict': 'detail web tls ocsp-stapling verdict good', 'exp': 'detail web tls ocsp-stapling exp', 'tech_type': 'table', 'tech_string': 'detail web tls ocsp-stapling tech table', 'tech_data': 'detail tech data yes', 'override_mandatory': None}, 'kex_hash_func': {'name': 'kex_hash_func', 'label': 'detail web tls kex-hash-func label', 'status': 1, 'worst_status': 2, 'verdict': 'detail web tls kex-hash-func verdict good', 'exp': 'detail web tls kex-hash-func exp', 'tech_type': 'table', 'tech_string': 'detail web tls kex-hash-func tech table', 'tech_data': 'detail tech data yes', 'override_mandatory': None}}", + "port": 443, + "maildomain": null, + "webdomain": 9015, + "server_reachable": true, + "tls_enabled": true, + "tls_enabled_score": 0, + "could_not_test_smtp_starttls": false, + "dane_log": "", + "dane_score": 0, + "dane_status": 2, + "dane_records": "[]", + "dane_rollover": false, + "dh_param": "False", + "ecdh_param": "256", + "fs_bad": "[]", + "fs_phase_out": "[]", + "fs_score": 10, + "ciphers_bad": "[]", + "ciphers_phase_out": "[]", + "ciphers_score": 10, + "cipher_order": 3, + "cipher_order_violation": "['ECDHE-ECDSA-AES128-SHA', 'ECDHE-ECDSA-AES256-GCM-SHA384', '']", + "cipher_order_score": 0, + "protocols_bad": "[]", + "protocols_good": "['TLS 1.3']", + "protocols_phase_out": "[]", + "protocols_score": 10, + "compression": false, + "compression_score": 10, + "secure_reneg": true, + "secure_reneg_score": 10, + "client_reneg": false, + "client_reneg_score": 10, + "zero_rtt": 0, + "zero_rtt_score": 0, + "ocsp_stapling": 1, + "ocsp_stapling_score": 10, + "kex_hash_func": 1, + "kex_hash_func_score": 10, + "forced_https": 1, + "forced_https_score": 10, + "http_compression_enabled": true, + "http_compression_score": 0, + "hsts_enabled": true, + "hsts_policies": "['max-age=31536000']", + "hsts_score": 10, + "cert_chain": "['rpki.isbgpsafeyet.com', 'WE1', 'GTS Root R4']", + "cert_trusted": 0, + "cert_trusted_score": 10, + "cert_pubkey_bad": "[]", + "cert_pubkey_phase_out": "[]", + "cert_pubkey_score": 10, + "cert_signature_bad": "{}", + "cert_signature_score": 10, + "cert_hostmatch_bad": "[]", + "cert_hostmatch_score": 10, + "caa_enabled": false, + "caa_errors": "[]", + "caa_recommendations": "[]", + "caa_score": 0, + "caa_found_on_domain": null, + "score": 110 + } + }, + { + "model": "checks.domaintesttls", + "pk": 9019, + "fields": { + "timestamp": "2025-03-14T15:22:41.339Z", + "domain": "2606:4700:7000::6715:f409", + "report": "{'https_exists': {'name': 'https_exists', 'label': 'detail web tls https-exists label', 'status': 1, 'worst_status': 0, 'verdict': 'detail web tls https-exists verdict good', 'exp': 'detail web tls https-exists exp', 'tech_type': 'table', 'tech_string': 'detail web tls https-exists tech table', 'tech_data': 'detail tech data yes', 'override_mandatory': None}, 'https_forced': {'name': 'https_forced', 'label': 'detail web tls https-forced label', 'status': 1, 'worst_status': 0, 'verdict': 'detail web tls https-forced verdict good', 'exp': 'detail web tls https-forced exp', 'tech_type': 'table', 'tech_string': 'detail web tls https-forced tech table', 'tech_data': 'detail tech data yes', 'override_mandatory': None}, 'https_hsts': {'name': 'https_hsts', 'label': 'detail web tls https-hsts label', 'status': 1, 'worst_status': 0, 'verdict': 'detail web tls https-hsts verdict good', 'exp': 'detail web tls https-hsts exp', 'tech_type': 'table', 'tech_string': 'detail web tls https-hsts tech table', 'tech_data': ['max-age=31536000'], 'override_mandatory': None}, 'http_compression': {'name': 'http_compression', 'label': 'detail web tls http-compression label', 'status': 5, 'worst_status': 5, 'verdict': 'detail web tls http-compression verdict bad', 'exp': 'detail web tls http-compression exp', 'tech_type': 'table', 'tech_string': 'detail web tls http-compression tech table', 'tech_data': 'detail tech data yes', 'override_mandatory': None}, 'fs_params': {'name': 'fs_params', 'label': 'detail web tls fs-params label', 'status': 1, 'worst_status': 0, 'verdict': 'detail web tls fs-params verdict good', 'exp': 'detail web tls fs-params exp', 'tech_type': 'table_multi_col', 'tech_string': 'detail web tls fs-params tech table', 'tech_data': '', 'override_mandatory': None}, 'tls_ciphers': {'name': 'tls_ciphers', 'label': 'detail web tls ciphers label', 'status': 1, 'worst_status': 0, 'verdict': 'detail web tls ciphers verdict good', 'exp': 'detail web tls ciphers exp', 'tech_type': 'table_multi_col', 'tech_string': 'detail web tls ciphers tech table', 'tech_data': '', 'override_mandatory': None}, 'tls_cipher_order': {'name': 'tls_cipher_order', 'label': 'detail web tls cipher-order label', 'status': 0, 'worst_status': 0, 'verdict': 'detail web tls cipher-order verdict seclevel-bad', 'exp': 'detail web tls cipher-order exp', 'tech_type': 'table_multi_col', 'tech_string': 'detail web tls cipher-order tech table', 'tech_data': [['ECDHE-ECDSA-AES128-SHA', 'ECDHE-ECDSA-AES256-GCM-SHA384']], 'override_mandatory': None}, 'tls_version': {'name': 'tls_version', 'label': 'detail web tls version label', 'status': 1, 'worst_status': 0, 'verdict': 'detail web tls version verdict good', 'exp': 'detail web tls version exp', 'tech_type': 'table_multi_col', 'tech_string': 'detail web tls version tech table', 'tech_data': [['TLS 1.3', 'TLS 1.2'], ['detail tech data good', 'detail tech data sufficient']], 'override_mandatory': None}, 'tls_compression': {'name': 'tls_compression', 'label': 'detail web tls compression label', 'status': 1, 'worst_status': 0, 'verdict': 'detail web tls compression verdict good', 'exp': 'detail web tls compression exp', 'tech_type': 'table', 'tech_string': 'detail web tls compression tech table', 'tech_data': 'detail tech data no', 'override_mandatory': None}, 'renegotiation_secure': {'name': 'renegotiation_secure', 'label': 'detail web tls renegotiation-secure label', 'status': 1, 'worst_status': 0, 'verdict': 'detail web tls renegotiation-secure verdict good', 'exp': 'detail web tls renegotiation-secure exp', 'tech_type': 'table', 'tech_string': 'detail web tls renegotiation-secure tech table', 'tech_data': 'detail tech data yes', 'override_mandatory': None}, 'renegotiation_client': {'name': 'renegotiation_client', 'label': 'detail web tls renegotiation-client label', 'status': 1, 'worst_status': 5, 'verdict': 'detail web tls renegotiation-client verdict good', 'exp': 'detail web tls renegotiation-client exp', 'tech_type': 'table', 'tech_string': 'detail web tls renegotiation-client tech table', 'tech_data': 'detail tech data no', 'override_mandatory': None}, 'cert_trust': {'name': 'cert_trust', 'label': 'detail web tls cert-trust label', 'status': 1, 'worst_status': 0, 'verdict': 'detail web tls cert-trust verdict good', 'exp': 'detail web tls cert-trust exp', 'tech_type': 'table', 'tech_string': 'detail web tls cert-trust tech table', 'tech_data': '', 'override_mandatory': None}, 'cert_pubkey': {'name': 'cert_pubkey', 'label': 'detail web tls cert-pubkey label', 'status': 1, 'worst_status': 0, 'verdict': 'detail web tls cert-pubkey verdict good', 'exp': 'detail web tls cert-pubkey exp', 'tech_type': 'table', 'tech_string': 'detail web tls cert-pubkey tech table', 'tech_data': '', 'override_mandatory': None}, 'cert_signature': {'name': 'cert_signature', 'label': 'detail web tls cert-signature label', 'status': 1, 'worst_status': 0, 'verdict': 'detail web tls cert-signature verdict good', 'exp': 'detail web tls cert-signature exp', 'tech_type': 'table_multi_col', 'tech_string': 'detail web tls cert-signature tech table', 'tech_data': '', 'override_mandatory': None}, 'cert_hostmatch': {'name': 'cert_hostmatch', 'label': 'detail web tls cert-hostmatch label', 'status': 1, 'worst_status': 0, 'verdict': 'detail web tls cert-hostmatch verdict good', 'exp': 'detail web tls cert-hostmatch exp', 'tech_type': 'table', 'tech_string': 'detail web tls cert-hostmatch tech table', 'tech_data': '', 'override_mandatory': None}, 'web_caa': {'name': 'web_caa', 'label': 'detail web caa label', 'status': 5, 'worst_status': 5, 'verdict': 'detail web caa verdict bad', 'exp': 'detail web caa exp', 'tech_type': 'table_translatable', 'tech_string': 'detail web caa tech table', 'tech_data': [{'msgid': 'detail tech data caa not_found', 'context': {}}], 'override_mandatory': None}, 'dane_exists': {'name': 'dane_exists', 'label': 'detail web tls dane-exists label', 'status': 5, 'worst_status': 5, 'verdict': 'detail web tls dane-exists verdict bad', 'exp': 'detail web tls dane-exists exp', 'tech_type': 'table', 'tech_string': 'detail web tls dane-exists tech table', 'tech_data': 'detail tech data no', 'override_mandatory': None}, 'dane_valid': {'name': 'dane_valid', 'label': 'detail web tls dane-valid label', 'status': 4, 'worst_status': 2, 'verdict': 'detail verdict not-tested', 'exp': 'detail web tls dane-valid exp', 'tech_type': 'table', 'tech_string': 'detail web tls dane-valid tech table', 'tech_data': 'detail tech data not-tested', 'override_mandatory': None}, 'zero_rtt': {'name': 'zero_rtt', 'label': 'detail web tls zero-rtt label', 'status': 0, 'worst_status': 0, 'verdict': 'detail web tls zero-rtt verdict bad', 'exp': 'detail web tls zero-rtt exp', 'tech_type': 'table', 'tech_string': 'detail web tls zero-rtt tech table', 'tech_data': 'detail tech data yes', 'override_mandatory': None}, 'ocsp_stapling': {'name': 'ocsp_stapling', 'label': 'detail web tls ocsp-stapling label', 'status': 1, 'worst_status': 2, 'verdict': 'detail web tls ocsp-stapling verdict good', 'exp': 'detail web tls ocsp-stapling exp', 'tech_type': 'table', 'tech_string': 'detail web tls ocsp-stapling tech table', 'tech_data': 'detail tech data yes', 'override_mandatory': None}, 'kex_hash_func': {'name': 'kex_hash_func', 'label': 'detail web tls kex-hash-func label', 'status': 1, 'worst_status': 2, 'verdict': 'detail web tls kex-hash-func verdict good', 'exp': 'detail web tls kex-hash-func exp', 'tech_type': 'table', 'tech_string': 'detail web tls kex-hash-func tech table', 'tech_data': 'detail tech data yes', 'override_mandatory': None}}", + "port": 443, + "maildomain": null, + "webdomain": 9015, + "server_reachable": true, + "tls_enabled": true, + "tls_enabled_score": 0, + "could_not_test_smtp_starttls": false, + "dane_log": "", + "dane_score": 0, + "dane_status": 2, + "dane_records": "[]", + "dane_rollover": false, + "dh_param": "False", + "ecdh_param": "256", + "fs_bad": "[]", + "fs_phase_out": "[]", + "fs_score": 10, + "ciphers_bad": "[]", + "ciphers_phase_out": "[]", + "ciphers_score": 10, + "cipher_order": 3, + "cipher_order_violation": "['ECDHE-ECDSA-AES128-SHA', 'ECDHE-ECDSA-AES256-GCM-SHA384', '']", + "cipher_order_score": 0, + "protocols_bad": "[]", + "protocols_good": "['TLS 1.3']", + "protocols_phase_out": "[]", + "protocols_score": 10, + "compression": false, + "compression_score": 10, + "secure_reneg": true, + "secure_reneg_score": 10, + "client_reneg": false, + "client_reneg_score": 10, + "zero_rtt": 0, + "zero_rtt_score": 0, + "ocsp_stapling": 1, + "ocsp_stapling_score": 10, + "kex_hash_func": 1, + "kex_hash_func_score": 10, + "forced_https": 1, + "forced_https_score": 10, + "http_compression_enabled": true, + "http_compression_score": 0, + "hsts_enabled": true, + "hsts_policies": "['max-age=31536000']", + "hsts_score": 10, + "cert_chain": "['rpki.isbgpsafeyet.com', 'WE1', 'GTS Root R4']", + "cert_trusted": 0, + "cert_trusted_score": 10, + "cert_pubkey_bad": "[]", + "cert_pubkey_phase_out": "[]", + "cert_pubkey_score": 10, + "cert_signature_bad": "{}", + "cert_signature_score": 10, + "cert_hostmatch_bad": "[]", + "cert_hostmatch_score": 10, + "caa_enabled": false, + "caa_errors": "[]", + "caa_recommendations": "[]", + "caa_score": 0, + "caa_found_on_domain": null, + "score": 110 + } + }, + { + "model": "checks.webtestappsecpriv", + "pk": 9000, + "fields": { + "domain": "internet.nl", + "report": "{'http_x_frame': {'name': 'http_x_frame', 'label': 'detail web appsecpriv http-x-frame label', 'status': 1, 'worst_status': 5, 'verdict': 'detail web appsecpriv http-x-frame verdict good', 'exp': 'detail web appsecpriv http-x-frame exp', 'tech_type': 'table', 'tech_string': 'detail web appsecpriv http-x-frame tech table', 'tech_data': [('62.204.66.10', ['SAMEORIGIN']), ('2a00:d00:ff:162:62:204:66:10', ['SAMEORIGIN'])], 'override_mandatory': None}, 'http_referrer_policy': {'name': 'http_referrer_policy', 'label': 'detail web appsecpriv http-referrer-policy label', 'status': 1, 'worst_status': 2, 'verdict': 'detail web appsecpriv http-referrer-policy verdict good', 'exp': 'detail web appsecpriv http-referrer-policy exp', 'tech_type': 'table_translatable', 'tech_string': 'detail web appsecpriv http-referrer-policy tech table', 'tech_data': [('62.204.66.10', [{'msgid': 'detail tech data http-referrer-policy values', 'context': {'values': ['same-origin']}}]), ('2a00:d00:ff:162:62:204:66:10', [{'msgid': 'detail tech data http-referrer-policy values', 'context': {'values': ['same-origin']}}])], 'override_mandatory': None}, 'http_csp': {'name': 'http_csp', 'label': 'detail web appsecpriv http-csp label', 'status': 1, 'worst_status': 2, 'verdict': 'detail web appsecpriv http-csp verdict good', 'exp': 'detail web appsecpriv http-csp exp', 'tech_type': 'table_translatable', 'tech_string': 'detail web appsecpriv http-csp tech table', 'tech_data': [('62.204.66.10', [{'msgid': 'detail tech data http-csp policy-found', 'context': {'policy': [\"base-uri 'self' https://*.internet.nl; form-action 'self' https://*.internet.nl; frame-ancestors 'none'; default-src 'self' https://*.internet.nl\"]}}]), ('2a00:d00:ff:162:62:204:66:10', [{'msgid': 'detail tech data http-csp policy-found', 'context': {'policy': [\"base-uri 'self' https://*.internet.nl; form-action 'self' https://*.internet.nl; frame-ancestors 'none'; default-src 'self' https://*.internet.nl\"]}}])], 'override_mandatory': None}, 'http_x_content_type': {'name': 'http_x_content_type', 'label': 'detail web appsecpriv http-x-content-type label', 'status': 1, 'worst_status': 2, 'verdict': 'detail web appsecpriv http-x-content-type verdict good', 'exp': 'detail web appsecpriv http-x-content-type exp', 'tech_type': 'table', 'tech_string': 'detail web appsecpriv http-x-content-type tech table', 'tech_data': [('62.204.66.10', ['nosniff']), ('2a00:d00:ff:162:62:204:66:10', ['nosniff'])], 'override_mandatory': None}, 'http_securitytxt': {'name': 'http_securitytxt', 'label': 'detail web appsecpriv http-securitytxt label', 'status': 1, 'worst_status': 2, 'verdict': 'detail web appsecpriv http-securitytxt verdict good', 'exp': 'detail web appsecpriv http-securitytxt exp', 'tech_type': 'table_translatable', 'tech_string': 'detail web appsecpriv http-securitytxt tech table', 'tech_data': [('62.204.66.10', [{'msgid': 'detail tech data http-securitytxt retrieved-from', 'context': {'hostname': 'internet.nl'}}]), ('2a00:d00:ff:162:62:204:66:10', [{'msgid': 'detail tech data http-securitytxt retrieved-from', 'context': {'hostname': 'internet.nl'}}])], 'override_mandatory': None}}", + "score": 0, + "max_score": 0, + "timestamp": "2025-03-14T15:14:03.427Z" + } + }, + { + "model": "checks.webtestappsecpriv", + "pk": 9001, + "fields": { + "domain": "example.nl", + "report": "{'http_x_frame': {'name': 'http_x_frame', 'label': 'detail web appsecpriv http-x-frame label', 'status': 1, 'worst_status': 5, 'verdict': 'detail web appsecpriv http-x-frame verdict good', 'exp': 'detail web appsecpriv http-x-frame exp', 'tech_type': 'table', 'tech_string': 'detail web appsecpriv http-x-frame tech table', 'tech_data': [('94.198.159.35', ['deny']), ('2a00:d78:0:712:94:198:159:35', ['deny'])], 'override_mandatory': None}, 'http_referrer_policy': {'name': 'http_referrer_policy', 'label': 'detail web appsecpriv http-referrer-policy label', 'status': 1, 'worst_status': 2, 'verdict': 'detail web appsecpriv http-referrer-policy verdict good', 'exp': 'detail web appsecpriv http-referrer-policy exp', 'tech_type': 'table_translatable', 'tech_string': 'detail web appsecpriv http-referrer-policy tech table', 'tech_data': [('94.198.159.35', [{'msgid': 'detail tech data http-referrer-policy values', 'context': {'values': ['no-referrer']}}]), ('2a00:d78:0:712:94:198:159:35', [{'msgid': 'detail tech data http-referrer-policy values', 'context': {'values': ['no-referrer']}}])], 'override_mandatory': None}, 'http_csp': {'name': 'http_csp', 'label': 'detail web appsecpriv http-csp label', 'status': 1, 'worst_status': 2, 'verdict': 'detail web appsecpriv http-csp verdict good', 'exp': 'detail web appsecpriv http-csp exp', 'tech_type': 'table_translatable', 'tech_string': 'detail web appsecpriv http-csp tech table', 'tech_data': [('94.198.159.35', [{'msgid': 'detail tech data http-csp policy-found', 'context': {'policy': [\"report-to endpoint-1; report-uri https://check.sidnlabs.nl/csp-report-labs.php; default-src 'none'; img-src 'self'; style-src 'self'; font-src 'self'; frame-ancestors 'none'; form-action https://internet.nl/site/; base-uri 'self'\"]}}]), ('2a00:d78:0:712:94:198:159:35', [{'msgid': 'detail tech data http-csp policy-found', 'context': {'policy': [\"report-to endpoint-1; report-uri https://check.sidnlabs.nl/csp-report-labs.php; default-src 'none'; img-src 'self'; style-src 'self'; font-src 'self'; frame-ancestors 'none'; form-action https://internet.nl/site/; base-uri 'self'\"]}}])], 'override_mandatory': None}, 'http_x_content_type': {'name': 'http_x_content_type', 'label': 'detail web appsecpriv http-x-content-type label', 'status': 1, 'worst_status': 2, 'verdict': 'detail web appsecpriv http-x-content-type verdict good', 'exp': 'detail web appsecpriv http-x-content-type exp', 'tech_type': 'table', 'tech_string': 'detail web appsecpriv http-x-content-type tech table', 'tech_data': [('94.198.159.35', ['nosniff']), ('2a00:d78:0:712:94:198:159:35', ['nosniff'])], 'override_mandatory': None}, 'http_securitytxt': {'name': 'http_securitytxt', 'label': 'detail web appsecpriv http-securitytxt label', 'status': 1, 'worst_status': 2, 'verdict': 'detail web appsecpriv http-securitytxt verdict good', 'exp': 'detail web appsecpriv http-securitytxt exp', 'tech_type': 'table_translatable', 'tech_string': 'detail web appsecpriv http-securitytxt tech table', 'tech_data': [('94.198.159.35', [{'msgid': 'detail tech data http-securitytxt retrieved-from', 'context': {'hostname': 'example.nl'}}]), ('2a00:d78:0:712:94:198:159:35', [{'msgid': 'detail tech data http-securitytxt retrieved-from', 'context': {'hostname': 'example.nl'}}])], 'override_mandatory': None}}", + "score": 0, + "max_score": 0, + "timestamp": "2025-03-14T15:14:21.278Z" + } + }, + { + "model": "checks.webtestappsecpriv", + "pk": 9002, + "fields": { + "domain": "ipv6.internet.nl", + "report": "{'http_x_frame': {'name': 'http_x_frame', 'label': 'detail web appsecpriv http-x-frame label', 'status': 1, 'worst_status': 5, 'verdict': 'detail web appsecpriv http-x-frame verdict good', 'exp': 'detail web appsecpriv http-x-frame exp', 'tech_type': 'table', 'tech_string': 'detail web appsecpriv http-x-frame tech table', 'tech_data': [('2a00:d00:ff:162:62:204:66:10', ['SAMEORIGIN'])], 'override_mandatory': None}, 'http_referrer_policy': {'name': 'http_referrer_policy', 'label': 'detail web appsecpriv http-referrer-policy label', 'status': 1, 'worst_status': 2, 'verdict': 'detail web appsecpriv http-referrer-policy verdict good', 'exp': 'detail web appsecpriv http-referrer-policy exp', 'tech_type': 'table_translatable', 'tech_string': 'detail web appsecpriv http-referrer-policy tech table', 'tech_data': [('2a00:d00:ff:162:62:204:66:10', [{'msgid': 'detail tech data http-referrer-policy values', 'context': {'values': ['same-origin']}}])], 'override_mandatory': None}, 'http_csp': {'name': 'http_csp', 'label': 'detail web appsecpriv http-csp label', 'status': 1, 'worst_status': 2, 'verdict': 'detail web appsecpriv http-csp verdict good', 'exp': 'detail web appsecpriv http-csp exp', 'tech_type': 'table_translatable', 'tech_string': 'detail web appsecpriv http-csp tech table', 'tech_data': [('2a00:d00:ff:162:62:204:66:10', [{'msgid': 'detail tech data http-csp policy-found', 'context': {'policy': [\"base-uri 'self' https://*.internet.nl; form-action 'self' https://*.internet.nl; frame-ancestors 'none'; default-src 'self' https://*.internet.nl\"]}}])], 'override_mandatory': None}, 'http_x_content_type': {'name': 'http_x_content_type', 'label': 'detail web appsecpriv http-x-content-type label', 'status': 1, 'worst_status': 2, 'verdict': 'detail web appsecpriv http-x-content-type verdict good', 'exp': 'detail web appsecpriv http-x-content-type exp', 'tech_type': 'table', 'tech_string': 'detail web appsecpriv http-x-content-type tech table', 'tech_data': [('2a00:d00:ff:162:62:204:66:10', ['nosniff'])], 'override_mandatory': None}, 'http_securitytxt': {'name': 'http_securitytxt', 'label': 'detail web appsecpriv http-securitytxt label', 'status': 1, 'worst_status': 2, 'verdict': 'detail web appsecpriv http-securitytxt verdict good', 'exp': 'detail web appsecpriv http-securitytxt exp', 'tech_type': 'table_translatable', 'tech_string': 'detail web appsecpriv http-securitytxt tech table', 'tech_data': [('2a00:d00:ff:162:62:204:66:10', [{'msgid': 'detail tech data http-securitytxt retrieved-from', 'context': {'hostname': 'ipv6.internet.nl'}}])], 'override_mandatory': None}}", + "score": 0, + "max_score": 0, + "timestamp": "2025-03-14T15:14:31.301Z" + } + }, + { + "model": "checks.webtestappsecpriv", + "pk": 9003, + "fields": { + "domain": "forfun.net", + "report": "{'http_x_frame': {'name': 'http_x_frame', 'label': 'detail web appsecpriv http-x-frame label', 'status': 1, 'worst_status': 5, 'verdict': 'detail web appsecpriv http-x-frame verdict good', 'exp': 'detail web appsecpriv http-x-frame exp', 'tech_type': 'table', 'tech_string': 'detail web appsecpriv http-x-frame tech table', 'tech_data': [('2a05:1500:600:1:1c00:4aff:fe00:428', ['sameorigin'])], 'override_mandatory': None}, 'http_referrer_policy': {'name': 'http_referrer_policy', 'label': 'detail web appsecpriv http-referrer-policy label', 'status': 1, 'worst_status': 2, 'verdict': 'detail web appsecpriv http-referrer-policy verdict good', 'exp': 'detail web appsecpriv http-referrer-policy exp', 'tech_type': 'table_translatable', 'tech_string': 'detail web appsecpriv http-referrer-policy tech table', 'tech_data': [('2a05:1500:600:1:1c00:4aff:fe00:428', [{'msgid': 'detail tech data http-referrer-policy values', 'context': {'values': ['same-origin']}}])], 'override_mandatory': None}, 'http_csp': {'name': 'http_csp', 'label': 'detail web appsecpriv http-csp label', 'status': 1, 'worst_status': 2, 'verdict': 'detail web appsecpriv http-csp verdict good', 'exp': 'detail web appsecpriv http-csp exp', 'tech_type': 'table_translatable', 'tech_string': 'detail web appsecpriv http-csp tech table', 'tech_data': [('2a05:1500:600:1:1c00:4aff:fe00:428', [{'msgid': 'detail tech data http-csp policy-found', 'context': {'policy': [\"default-src 'none'; base-uri 'self'; form-action 'none'; img-src 'self'; style-src 'self'; frame-ancestors 'none'; report-uri https://sidn-nl.uriports.com/reports/report; report-to default\"]}}])], 'override_mandatory': None}, 'http_x_content_type': {'name': 'http_x_content_type', 'label': 'detail web appsecpriv http-x-content-type label', 'status': 1, 'worst_status': 2, 'verdict': 'detail web appsecpriv http-x-content-type verdict good', 'exp': 'detail web appsecpriv http-x-content-type exp', 'tech_type': 'table', 'tech_string': 'detail web appsecpriv http-x-content-type tech table', 'tech_data': [('2a05:1500:600:1:1c00:4aff:fe00:428', ['nosniff'])], 'override_mandatory': None}, 'http_securitytxt': {'name': 'http_securitytxt', 'label': 'detail web appsecpriv http-securitytxt label', 'status': 1, 'worst_status': 2, 'verdict': 'detail web appsecpriv http-securitytxt verdict good', 'exp': 'detail web appsecpriv http-securitytxt exp', 'tech_type': 'table_translatable', 'tech_string': 'detail web appsecpriv http-securitytxt tech table', 'tech_data': [('2a05:1500:600:1:1c00:4aff:fe00:428', [{'msgid': 'detail tech data http-securitytxt retrieved-from', 'context': {'hostname': 'forfun.net'}}])], 'override_mandatory': None}}", + "score": 0, + "max_score": 0, + "timestamp": "2025-03-14T15:14:38.673Z" + } + }, + { + "model": "checks.webtestappsecpriv", + "pk": 9004, + "fields": { + "domain": "ipv6.google.com", + "report": "{'http_x_frame': {'name': 'http_x_frame', 'label': 'detail web appsecpriv http-x-frame label', 'status': 1, 'worst_status': 5, 'verdict': 'detail web appsecpriv http-x-frame verdict good', 'exp': 'detail web appsecpriv http-x-frame exp', 'tech_type': 'table', 'tech_string': 'detail web appsecpriv http-x-frame tech table', 'tech_data': [('2a00:1450:4026:804::200e', ['SAMEORIGIN'])], 'override_mandatory': None}, 'http_referrer_policy': {'name': 'http_referrer_policy', 'label': 'detail web appsecpriv http-referrer-policy label', 'status': 5, 'worst_status': 2, 'verdict': 'detail web appsecpriv http-referrer-policy verdict recommendations', 'exp': 'detail web appsecpriv http-referrer-policy exp', 'tech_type': 'table_translatable', 'tech_string': 'detail web appsecpriv http-referrer-policy tech table', 'tech_data': [('2a00:1450:4026:804::200e', [{'msgid': 'detail tech data http-referrer-policy no-policy', 'context': {}}])], 'override_mandatory': None}, 'http_csp': {'name': 'http_csp', 'label': 'detail web appsecpriv http-csp label', 'status': 2, 'worst_status': 2, 'verdict': 'detail web appsecpriv http-csp verdict bad', 'exp': 'detail web appsecpriv http-csp exp', 'tech_type': 'table_translatable', 'tech_string': 'detail web appsecpriv http-csp tech table', 'tech_data': [('2a00:1450:4026:804::200e', [{'msgid': 'detail tech data http-csp no-policy-found', 'context': {}}])], 'override_mandatory': None}, 'http_x_content_type': {'name': 'http_x_content_type', 'label': 'detail web appsecpriv http-x-content-type label', 'status': 2, 'worst_status': 2, 'verdict': 'detail web appsecpriv http-x-content-type verdict bad', 'exp': 'detail web appsecpriv http-x-content-type exp', 'tech_type': 'table', 'tech_string': 'detail web appsecpriv http-x-content-type tech table', 'tech_data': [('2a00:1450:4026:804::200e', '')], 'override_mandatory': None}, 'http_securitytxt': {'name': 'http_securitytxt', 'label': 'detail web appsecpriv http-securitytxt label', 'status': 5, 'worst_status': 2, 'verdict': 'detail web appsecpriv http-securitytxt verdict recommendations', 'exp': 'detail web appsecpriv http-securitytxt exp', 'tech_type': 'table_translatable', 'tech_string': 'detail web appsecpriv http-securitytxt tech table', 'tech_data': [('2a00:1450:4026:804::200e', [{'msgid': 'detail tech data http-securitytxt retrieved-from', 'context': {'hostname': 'ipv6.google.com'}}, {'msgid': 'detail tech data http-securitytxt not_signed', 'context': {'line_no': None}}])], 'override_mandatory': None}}", + "score": 0, + "max_score": 0, + "timestamp": "2025-03-14T15:14:45.924Z" + } + }, + { + "model": "checks.webtestappsecpriv", + "pk": 9005, + "fields": { + "domain": "servfail.nl", + "report": "{'http_x_frame': {'name': 'http_x_frame', 'label': 'detail web appsecpriv http-x-frame label', 'status': 1, 'worst_status': 5, 'verdict': 'detail web appsecpriv http-x-frame verdict good', 'exp': 'detail web appsecpriv http-x-frame exp', 'tech_type': 'table', 'tech_string': 'detail web appsecpriv http-x-frame tech table', 'tech_data': [('2a05:1500:600:1:1c00:4aff:fe00:428', ['sameorigin'])], 'override_mandatory': None}, 'http_referrer_policy': {'name': 'http_referrer_policy', 'label': 'detail web appsecpriv http-referrer-policy label', 'status': 1, 'worst_status': 2, 'verdict': 'detail web appsecpriv http-referrer-policy verdict good', 'exp': 'detail web appsecpriv http-referrer-policy exp', 'tech_type': 'table_translatable', 'tech_string': 'detail web appsecpriv http-referrer-policy tech table', 'tech_data': [('2a05:1500:600:1:1c00:4aff:fe00:428', [{'msgid': 'detail tech data http-referrer-policy values', 'context': {'values': ['same-origin']}}])], 'override_mandatory': None}, 'http_csp': {'name': 'http_csp', 'label': 'detail web appsecpriv http-csp label', 'status': 1, 'worst_status': 2, 'verdict': 'detail web appsecpriv http-csp verdict good', 'exp': 'detail web appsecpriv http-csp exp', 'tech_type': 'table_translatable', 'tech_string': 'detail web appsecpriv http-csp tech table', 'tech_data': [('2a05:1500:600:1:1c00:4aff:fe00:428', [{'msgid': 'detail tech data http-csp policy-found', 'context': {'policy': [\"default-src 'none'; base-uri 'self'; form-action 'none'; img-src 'self'; style-src 'self'; frame-ancestors 'none'; report-uri https://sidn-nl.uriports.com/reports/report; report-to default\"]}}])], 'override_mandatory': None}, 'http_x_content_type': {'name': 'http_x_content_type', 'label': 'detail web appsecpriv http-x-content-type label', 'status': 1, 'worst_status': 2, 'verdict': 'detail web appsecpriv http-x-content-type verdict good', 'exp': 'detail web appsecpriv http-x-content-type exp', 'tech_type': 'table', 'tech_string': 'detail web appsecpriv http-x-content-type tech table', 'tech_data': [('2a05:1500:600:1:1c00:4aff:fe00:428', ['nosniff'])], 'override_mandatory': None}, 'http_securitytxt': {'name': 'http_securitytxt', 'label': 'detail web appsecpriv http-securitytxt label', 'status': 2, 'worst_status': 2, 'verdict': 'detail web appsecpriv http-securitytxt verdict bad', 'exp': 'detail web appsecpriv http-securitytxt exp', 'tech_type': 'table_translatable', 'tech_string': 'detail web appsecpriv http-securitytxt tech table', 'tech_data': [('2a05:1500:600:1:1c00:4aff:fe00:428', [{'msgid': 'detail tech data http-securitytxt retrieved-from', 'context': {'hostname': 'servfail.nl'}}, {'msgid': 'detail tech data http-securitytxt no_canonical_match', 'context': {'line_no': None}}])], 'override_mandatory': None}}", + "score": 0, + "max_score": 0, + "timestamp": "2025-03-14T15:14:53.980Z" + } + }, + { + "model": "checks.webtestappsecpriv", + "pk": 9006, + "fields": { + "domain": "brokendnssec.net", + "report": "{'http_x_frame': {'name': 'http_x_frame', 'label': 'detail web appsecpriv http-x-frame label', 'status': 4, 'worst_status': 5, 'verdict': 'detail verdict not-tested', 'exp': 'detail web appsecpriv http-x-frame exp', 'tech_type': 'table', 'tech_string': 'detail web appsecpriv http-x-frame tech table', 'tech_data': [('104.18.27.110', 'detail tech data not-tested')], 'override_mandatory': None}, 'http_referrer_policy': {'name': 'http_referrer_policy', 'label': 'detail web appsecpriv http-referrer-policy label', 'status': 4, 'worst_status': 2, 'verdict': 'detail verdict not-tested', 'exp': 'detail web appsecpriv http-referrer-policy exp', 'tech_type': 'table_translatable', 'tech_string': 'detail web appsecpriv http-referrer-policy tech table', 'tech_data': [('104.18.27.110', 'detail tech data not-tested')], 'override_mandatory': None}, 'http_csp': {'name': 'http_csp', 'label': 'detail web appsecpriv http-csp label', 'status': 4, 'worst_status': 2, 'verdict': 'detail verdict not-tested', 'exp': 'detail web appsecpriv http-csp exp', 'tech_type': 'table_translatable', 'tech_string': 'detail web appsecpriv http-csp tech table', 'tech_data': [('104.18.27.110', 'detail tech data not-tested')], 'override_mandatory': None}, 'http_x_content_type': {'name': 'http_x_content_type', 'label': 'detail web appsecpriv http-x-content-type label', 'status': 4, 'worst_status': 2, 'verdict': 'detail verdict not-tested', 'exp': 'detail web appsecpriv http-x-content-type exp', 'tech_type': 'table', 'tech_string': 'detail web appsecpriv http-x-content-type tech table', 'tech_data': [('104.18.27.110', 'detail tech data not-tested')], 'override_mandatory': None}, 'http_securitytxt': {'name': 'http_securitytxt', 'label': 'detail web appsecpriv http-securitytxt label', 'status': 4, 'worst_status': 2, 'verdict': 'detail verdict not-tested', 'exp': 'detail web appsecpriv http-securitytxt exp', 'tech_type': 'table_translatable', 'tech_string': 'detail web appsecpriv http-securitytxt tech table', 'tech_data': [('104.18.27.110', 'detail tech data not-tested')], 'override_mandatory': None}}", + "score": 0, + "max_score": 0, + "timestamp": "2025-03-14T15:18:50.157Z" + } + }, + { + "model": "checks.webtestappsecpriv", + "pk": 9007, + "fields": { + "domain": "ok.bogussig.ok.bad-dnssec.wb.sidnlabs.nl", + "report": "{'http_x_frame': {'name': 'http_x_frame', 'label': 'detail web appsecpriv http-x-frame label', 'status': 5, 'worst_status': 5, 'verdict': 'detail web appsecpriv http-x-frame verdict bad', 'exp': 'detail web appsecpriv http-x-frame exp', 'tech_type': 'table', 'tech_string': 'detail web appsecpriv http-x-frame tech table', 'tech_data': [('94.198.159.39', ''), ('2a00:d78:0:712:94:198:159:39', '')], 'override_mandatory': None}, 'http_referrer_policy': {'name': 'http_referrer_policy', 'label': 'detail web appsecpriv http-referrer-policy label', 'status': 5, 'worst_status': 2, 'verdict': 'detail web appsecpriv http-referrer-policy verdict recommendations', 'exp': 'detail web appsecpriv http-referrer-policy exp', 'tech_type': 'table_translatable', 'tech_string': 'detail web appsecpriv http-referrer-policy tech table', 'tech_data': [('94.198.159.39', [{'msgid': 'detail tech data http-referrer-policy no-policy', 'context': {}}]), ('2a00:d78:0:712:94:198:159:39', [{'msgid': 'detail tech data http-referrer-policy no-policy', 'context': {}}])], 'override_mandatory': None}, 'http_csp': {'name': 'http_csp', 'label': 'detail web appsecpriv http-csp label', 'status': 2, 'worst_status': 2, 'verdict': 'detail web appsecpriv http-csp verdict bad', 'exp': 'detail web appsecpriv http-csp exp', 'tech_type': 'table_translatable', 'tech_string': 'detail web appsecpriv http-csp tech table', 'tech_data': [('94.198.159.39', [{'msgid': 'detail tech data http-csp no-policy-found', 'context': {}}]), ('2a00:d78:0:712:94:198:159:39', [{'msgid': 'detail tech data http-csp no-policy-found', 'context': {}}])], 'override_mandatory': None}, 'http_x_content_type': {'name': 'http_x_content_type', 'label': 'detail web appsecpriv http-x-content-type label', 'status': 2, 'worst_status': 2, 'verdict': 'detail web appsecpriv http-x-content-type verdict bad', 'exp': 'detail web appsecpriv http-x-content-type exp', 'tech_type': 'table', 'tech_string': 'detail web appsecpriv http-x-content-type tech table', 'tech_data': [('94.198.159.39', ''), ('2a00:d78:0:712:94:198:159:39', '')], 'override_mandatory': None}, 'http_securitytxt': {'name': 'http_securitytxt', 'label': 'detail web appsecpriv http-securitytxt label', 'status': 2, 'worst_status': 2, 'verdict': 'detail web appsecpriv http-securitytxt verdict bad', 'exp': 'detail web appsecpriv http-securitytxt exp', 'tech_type': 'table_translatable', 'tech_string': 'detail web appsecpriv http-securitytxt tech table', 'tech_data': [('94.198.159.39', [{'msgid': 'detail tech data http-securitytxt requested-from', 'context': {'hostname': 'ok.bogussig.ok.bad-dnssec.wb.sidnlabs.nl'}}, {'msgid': 'detail tech data http-securitytxt no_security_txt_404', 'context': {}}]), ('2a00:d78:0:712:94:198:159:39', [{'msgid': 'detail tech data http-securitytxt requested-from', 'context': {'hostname': 'ok.bogussig.ok.bad-dnssec.wb.sidnlabs.nl'}}, {'msgid': 'detail tech data http-securitytxt no_security_txt_404', 'context': {}}])], 'override_mandatory': None}}", + "score": 0, + "max_score": 0, + "timestamp": "2025-03-14T15:19:04.324Z" + } + }, + { + "model": "checks.webtestappsecpriv", + "pk": 9008, + "fields": { + "domain": "badhash.dane.huque.com", + "report": "{'http_x_frame': {'name': 'http_x_frame', 'label': 'detail web appsecpriv http-x-frame label', 'status': 5, 'worst_status': 5, 'verdict': 'detail web appsecpriv http-x-frame verdict bad', 'exp': 'detail web appsecpriv http-x-frame exp', 'tech_type': 'table', 'tech_string': 'detail web appsecpriv http-x-frame tech table', 'tech_data': [('54.200.198.48', '')], 'override_mandatory': None}, 'http_referrer_policy': {'name': 'http_referrer_policy', 'label': 'detail web appsecpriv http-referrer-policy label', 'status': 5, 'worst_status': 2, 'verdict': 'detail web appsecpriv http-referrer-policy verdict recommendations', 'exp': 'detail web appsecpriv http-referrer-policy exp', 'tech_type': 'table_translatable', 'tech_string': 'detail web appsecpriv http-referrer-policy tech table', 'tech_data': [('54.200.198.48', [{'msgid': 'detail tech data http-referrer-policy no-policy', 'context': {}}])], 'override_mandatory': None}, 'http_csp': {'name': 'http_csp', 'label': 'detail web appsecpriv http-csp label', 'status': 2, 'worst_status': 2, 'verdict': 'detail web appsecpriv http-csp verdict bad', 'exp': 'detail web appsecpriv http-csp exp', 'tech_type': 'table_translatable', 'tech_string': 'detail web appsecpriv http-csp tech table', 'tech_data': [('54.200.198.48', [{'msgid': 'detail tech data http-csp no-policy-found', 'context': {}}])], 'override_mandatory': None}, 'http_x_content_type': {'name': 'http_x_content_type', 'label': 'detail web appsecpriv http-x-content-type label', 'status': 2, 'worst_status': 2, 'verdict': 'detail web appsecpriv http-x-content-type verdict bad', 'exp': 'detail web appsecpriv http-x-content-type exp', 'tech_type': 'table', 'tech_string': 'detail web appsecpriv http-x-content-type tech table', 'tech_data': [('54.200.198.48', '')], 'override_mandatory': None}, 'http_securitytxt': {'name': 'http_securitytxt', 'label': 'detail web appsecpriv http-securitytxt label', 'status': 2, 'worst_status': 2, 'verdict': 'detail web appsecpriv http-securitytxt verdict bad', 'exp': 'detail web appsecpriv http-securitytxt exp', 'tech_type': 'table_translatable', 'tech_string': 'detail web appsecpriv http-securitytxt tech table', 'tech_data': [('54.200.198.48', [{'msgid': 'detail tech data http-securitytxt requested-from', 'context': {'hostname': 'badhash.dane.huque.com'}}, {'msgid': 'detail tech data http-securitytxt no_security_txt_404', 'context': {}}])], 'override_mandatory': None}}", + "score": 0, + "max_score": 0, + "timestamp": "2025-03-14T15:19:21.686Z" + } + }, + { + "model": "checks.webtestappsecpriv", + "pk": 9009, + "fields": { + "domain": "expired.badssl.com", + "report": "{'http_x_frame': {'name': 'http_x_frame', 'label': 'detail web appsecpriv http-x-frame label', 'status': 5, 'worst_status': 5, 'verdict': 'detail web appsecpriv http-x-frame verdict bad', 'exp': 'detail web appsecpriv http-x-frame exp', 'tech_type': 'table', 'tech_string': 'detail web appsecpriv http-x-frame tech table', 'tech_data': [('104.154.89.105', '')], 'override_mandatory': None}, 'http_referrer_policy': {'name': 'http_referrer_policy', 'label': 'detail web appsecpriv http-referrer-policy label', 'status': 5, 'worst_status': 2, 'verdict': 'detail web appsecpriv http-referrer-policy verdict recommendations', 'exp': 'detail web appsecpriv http-referrer-policy exp', 'tech_type': 'table_translatable', 'tech_string': 'detail web appsecpriv http-referrer-policy tech table', 'tech_data': [('104.154.89.105', [{'msgid': 'detail tech data http-referrer-policy no-policy', 'context': {}}])], 'override_mandatory': None}, 'http_csp': {'name': 'http_csp', 'label': 'detail web appsecpriv http-csp label', 'status': 2, 'worst_status': 2, 'verdict': 'detail web appsecpriv http-csp verdict bad', 'exp': 'detail web appsecpriv http-csp exp', 'tech_type': 'table_translatable', 'tech_string': 'detail web appsecpriv http-csp tech table', 'tech_data': [('104.154.89.105', [{'msgid': 'detail tech data http-csp no-policy-found', 'context': {}}])], 'override_mandatory': None}, 'http_x_content_type': {'name': 'http_x_content_type', 'label': 'detail web appsecpriv http-x-content-type label', 'status': 2, 'worst_status': 2, 'verdict': 'detail web appsecpriv http-x-content-type verdict bad', 'exp': 'detail web appsecpriv http-x-content-type exp', 'tech_type': 'table', 'tech_string': 'detail web appsecpriv http-x-content-type tech table', 'tech_data': [('104.154.89.105', '')], 'override_mandatory': None}, 'http_securitytxt': {'name': 'http_securitytxt', 'label': 'detail web appsecpriv http-securitytxt label', 'status': 2, 'worst_status': 2, 'verdict': 'detail web appsecpriv http-securitytxt verdict bad', 'exp': 'detail web appsecpriv http-securitytxt exp', 'tech_type': 'table_translatable', 'tech_string': 'detail web appsecpriv http-securitytxt tech table', 'tech_data': [('104.154.89.105', [{'msgid': 'detail tech data http-securitytxt requested-from', 'context': {'hostname': 'expired.badssl.com'}}, {'msgid': 'detail tech data http-securitytxt no_security_txt_404', 'context': {}}])], 'override_mandatory': None}}", + "score": 0, + "max_score": 0, + "timestamp": "2025-03-14T15:19:58.833Z" + } + }, + { + "model": "checks.webtestappsecpriv", + "pk": 9010, + "fields": { + "domain": "wrong.host.badssl.com", + "report": "{'http_x_frame': {'name': 'http_x_frame', 'label': 'detail web appsecpriv http-x-frame label', 'status': 5, 'worst_status': 5, 'verdict': 'detail web appsecpriv http-x-frame verdict bad', 'exp': 'detail web appsecpriv http-x-frame exp', 'tech_type': 'table', 'tech_string': 'detail web appsecpriv http-x-frame tech table', 'tech_data': [('104.154.89.105', '')], 'override_mandatory': None}, 'http_referrer_policy': {'name': 'http_referrer_policy', 'label': 'detail web appsecpriv http-referrer-policy label', 'status': 5, 'worst_status': 2, 'verdict': 'detail web appsecpriv http-referrer-policy verdict recommendations', 'exp': 'detail web appsecpriv http-referrer-policy exp', 'tech_type': 'table_translatable', 'tech_string': 'detail web appsecpriv http-referrer-policy tech table', 'tech_data': [('104.154.89.105', [{'msgid': 'detail tech data http-referrer-policy no-policy', 'context': {}}])], 'override_mandatory': None}, 'http_csp': {'name': 'http_csp', 'label': 'detail web appsecpriv http-csp label', 'status': 2, 'worst_status': 2, 'verdict': 'detail web appsecpriv http-csp verdict bad', 'exp': 'detail web appsecpriv http-csp exp', 'tech_type': 'table_translatable', 'tech_string': 'detail web appsecpriv http-csp tech table', 'tech_data': [('104.154.89.105', [{'msgid': 'detail tech data http-csp no-policy-found', 'context': {}}])], 'override_mandatory': None}, 'http_x_content_type': {'name': 'http_x_content_type', 'label': 'detail web appsecpriv http-x-content-type label', 'status': 2, 'worst_status': 2, 'verdict': 'detail web appsecpriv http-x-content-type verdict bad', 'exp': 'detail web appsecpriv http-x-content-type exp', 'tech_type': 'table', 'tech_string': 'detail web appsecpriv http-x-content-type tech table', 'tech_data': [('104.154.89.105', '')], 'override_mandatory': None}, 'http_securitytxt': {'name': 'http_securitytxt', 'label': 'detail web appsecpriv http-securitytxt label', 'status': 2, 'worst_status': 2, 'verdict': 'detail web appsecpriv http-securitytxt verdict bad', 'exp': 'detail web appsecpriv http-securitytxt exp', 'tech_type': 'table_translatable', 'tech_string': 'detail web appsecpriv http-securitytxt tech table', 'tech_data': [('104.154.89.105', [{'msgid': 'detail tech data http-securitytxt requested-from', 'context': {'hostname': 'wrong.host.badssl.com'}}, {'msgid': 'detail tech data http-securitytxt no_security_txt_404', 'context': {}}])], 'override_mandatory': None}}", + "score": 0, + "max_score": 0, + "timestamp": "2025-03-14T15:20:27.453Z" + } + }, + { + "model": "checks.webtestappsecpriv", + "pk": 9011, + "fields": { + "domain": "self-signed.badssl.com", + "report": "{'http_x_frame': {'name': 'http_x_frame', 'label': 'detail web appsecpriv http-x-frame label', 'status': 5, 'worst_status': 5, 'verdict': 'detail web appsecpriv http-x-frame verdict bad', 'exp': 'detail web appsecpriv http-x-frame exp', 'tech_type': 'table', 'tech_string': 'detail web appsecpriv http-x-frame tech table', 'tech_data': [('104.154.89.105', '')], 'override_mandatory': None}, 'http_referrer_policy': {'name': 'http_referrer_policy', 'label': 'detail web appsecpriv http-referrer-policy label', 'status': 5, 'worst_status': 2, 'verdict': 'detail web appsecpriv http-referrer-policy verdict recommendations', 'exp': 'detail web appsecpriv http-referrer-policy exp', 'tech_type': 'table_translatable', 'tech_string': 'detail web appsecpriv http-referrer-policy tech table', 'tech_data': [('104.154.89.105', [{'msgid': 'detail tech data http-referrer-policy no-policy', 'context': {}}])], 'override_mandatory': None}, 'http_csp': {'name': 'http_csp', 'label': 'detail web appsecpriv http-csp label', 'status': 2, 'worst_status': 2, 'verdict': 'detail web appsecpriv http-csp verdict bad', 'exp': 'detail web appsecpriv http-csp exp', 'tech_type': 'table_translatable', 'tech_string': 'detail web appsecpriv http-csp tech table', 'tech_data': [('104.154.89.105', [{'msgid': 'detail tech data http-csp no-policy-found', 'context': {}}])], 'override_mandatory': None}, 'http_x_content_type': {'name': 'http_x_content_type', 'label': 'detail web appsecpriv http-x-content-type label', 'status': 2, 'worst_status': 2, 'verdict': 'detail web appsecpriv http-x-content-type verdict bad', 'exp': 'detail web appsecpriv http-x-content-type exp', 'tech_type': 'table', 'tech_string': 'detail web appsecpriv http-x-content-type tech table', 'tech_data': [('104.154.89.105', '')], 'override_mandatory': None}, 'http_securitytxt': {'name': 'http_securitytxt', 'label': 'detail web appsecpriv http-securitytxt label', 'status': 2, 'worst_status': 2, 'verdict': 'detail web appsecpriv http-securitytxt verdict bad', 'exp': 'detail web appsecpriv http-securitytxt exp', 'tech_type': 'table_translatable', 'tech_string': 'detail web appsecpriv http-securitytxt tech table', 'tech_data': [('104.154.89.105', [{'msgid': 'detail tech data http-securitytxt requested-from', 'context': {'hostname': 'self-signed.badssl.com'}}, {'msgid': 'detail tech data http-securitytxt no_security_txt_404', 'context': {}}])], 'override_mandatory': None}}", + "score": 0, + "max_score": 0, + "timestamp": "2025-03-14T15:20:55.908Z" + } + }, + { + "model": "checks.webtestappsecpriv", + "pk": 9012, + "fields": { + "domain": "untrusted-root.badssl.com", + "report": "{'http_x_frame': {'name': 'http_x_frame', 'label': 'detail web appsecpriv http-x-frame label', 'status': 5, 'worst_status': 5, 'verdict': 'detail web appsecpriv http-x-frame verdict bad', 'exp': 'detail web appsecpriv http-x-frame exp', 'tech_type': 'table', 'tech_string': 'detail web appsecpriv http-x-frame tech table', 'tech_data': [('104.154.89.105', '')], 'override_mandatory': None}, 'http_referrer_policy': {'name': 'http_referrer_policy', 'label': 'detail web appsecpriv http-referrer-policy label', 'status': 5, 'worst_status': 2, 'verdict': 'detail web appsecpriv http-referrer-policy verdict recommendations', 'exp': 'detail web appsecpriv http-referrer-policy exp', 'tech_type': 'table_translatable', 'tech_string': 'detail web appsecpriv http-referrer-policy tech table', 'tech_data': [('104.154.89.105', [{'msgid': 'detail tech data http-referrer-policy no-policy', 'context': {}}])], 'override_mandatory': None}, 'http_csp': {'name': 'http_csp', 'label': 'detail web appsecpriv http-csp label', 'status': 2, 'worst_status': 2, 'verdict': 'detail web appsecpriv http-csp verdict bad', 'exp': 'detail web appsecpriv http-csp exp', 'tech_type': 'table_translatable', 'tech_string': 'detail web appsecpriv http-csp tech table', 'tech_data': [('104.154.89.105', [{'msgid': 'detail tech data http-csp no-policy-found', 'context': {}}])], 'override_mandatory': None}, 'http_x_content_type': {'name': 'http_x_content_type', 'label': 'detail web appsecpriv http-x-content-type label', 'status': 2, 'worst_status': 2, 'verdict': 'detail web appsecpriv http-x-content-type verdict bad', 'exp': 'detail web appsecpriv http-x-content-type exp', 'tech_type': 'table', 'tech_string': 'detail web appsecpriv http-x-content-type tech table', 'tech_data': [('104.154.89.105', '')], 'override_mandatory': None}, 'http_securitytxt': {'name': 'http_securitytxt', 'label': 'detail web appsecpriv http-securitytxt label', 'status': 2, 'worst_status': 2, 'verdict': 'detail web appsecpriv http-securitytxt verdict bad', 'exp': 'detail web appsecpriv http-securitytxt exp', 'tech_type': 'table_translatable', 'tech_string': 'detail web appsecpriv http-securitytxt tech table', 'tech_data': [('104.154.89.105', [{'msgid': 'detail tech data http-securitytxt requested-from', 'context': {'hostname': 'untrusted-root.badssl.com'}}, {'msgid': 'detail tech data http-securitytxt no_security_txt_404', 'context': {}}])], 'override_mandatory': None}}", + "score": 0, + "max_score": 0, + "timestamp": "2025-03-14T15:21:24.505Z" + } + }, + { + "model": "checks.webtestappsecpriv", + "pk": 9013, + "fields": { + "domain": "revoked.badssl.com", + "report": "{'http_x_frame': {'name': 'http_x_frame', 'label': 'detail web appsecpriv http-x-frame label', 'status': 5, 'worst_status': 5, 'verdict': 'detail web appsecpriv http-x-frame verdict bad', 'exp': 'detail web appsecpriv http-x-frame exp', 'tech_type': 'table', 'tech_string': 'detail web appsecpriv http-x-frame tech table', 'tech_data': [('104.154.89.105', '')], 'override_mandatory': None}, 'http_referrer_policy': {'name': 'http_referrer_policy', 'label': 'detail web appsecpriv http-referrer-policy label', 'status': 5, 'worst_status': 2, 'verdict': 'detail web appsecpriv http-referrer-policy verdict recommendations', 'exp': 'detail web appsecpriv http-referrer-policy exp', 'tech_type': 'table_translatable', 'tech_string': 'detail web appsecpriv http-referrer-policy tech table', 'tech_data': [('104.154.89.105', [{'msgid': 'detail tech data http-referrer-policy no-policy', 'context': {}}])], 'override_mandatory': None}, 'http_csp': {'name': 'http_csp', 'label': 'detail web appsecpriv http-csp label', 'status': 2, 'worst_status': 2, 'verdict': 'detail web appsecpriv http-csp verdict bad', 'exp': 'detail web appsecpriv http-csp exp', 'tech_type': 'table_translatable', 'tech_string': 'detail web appsecpriv http-csp tech table', 'tech_data': [('104.154.89.105', [{'msgid': 'detail tech data http-csp no-policy-found', 'context': {}}])], 'override_mandatory': None}, 'http_x_content_type': {'name': 'http_x_content_type', 'label': 'detail web appsecpriv http-x-content-type label', 'status': 2, 'worst_status': 2, 'verdict': 'detail web appsecpriv http-x-content-type verdict bad', 'exp': 'detail web appsecpriv http-x-content-type exp', 'tech_type': 'table', 'tech_string': 'detail web appsecpriv http-x-content-type tech table', 'tech_data': [('104.154.89.105', '')], 'override_mandatory': None}, 'http_securitytxt': {'name': 'http_securitytxt', 'label': 'detail web appsecpriv http-securitytxt label', 'status': 2, 'worst_status': 2, 'verdict': 'detail web appsecpriv http-securitytxt verdict bad', 'exp': 'detail web appsecpriv http-securitytxt exp', 'tech_type': 'table_translatable', 'tech_string': 'detail web appsecpriv http-securitytxt tech table', 'tech_data': [('104.154.89.105', [{'msgid': 'detail tech data http-securitytxt requested-from', 'context': {'hostname': 'revoked.badssl.com'}}, {'msgid': 'detail tech data http-securitytxt no_security_txt_404', 'context': {}}])], 'override_mandatory': None}}", + "score": 0, + "max_score": 0, + "timestamp": "2025-03-14T15:21:53.347Z" + } + }, + { + "model": "checks.webtestappsecpriv", + "pk": 9014, + "fields": { + "domain": "pinning-test.badssl.com", + "report": "{'http_x_frame': {'name': 'http_x_frame', 'label': 'detail web appsecpriv http-x-frame label', 'status': 5, 'worst_status': 5, 'verdict': 'detail web appsecpriv http-x-frame verdict bad', 'exp': 'detail web appsecpriv http-x-frame exp', 'tech_type': 'table', 'tech_string': 'detail web appsecpriv http-x-frame tech table', 'tech_data': [('104.154.89.105', '')], 'override_mandatory': None}, 'http_referrer_policy': {'name': 'http_referrer_policy', 'label': 'detail web appsecpriv http-referrer-policy label', 'status': 5, 'worst_status': 2, 'verdict': 'detail web appsecpriv http-referrer-policy verdict recommendations', 'exp': 'detail web appsecpriv http-referrer-policy exp', 'tech_type': 'table_translatable', 'tech_string': 'detail web appsecpriv http-referrer-policy tech table', 'tech_data': [('104.154.89.105', [{'msgid': 'detail tech data http-referrer-policy no-policy', 'context': {}}])], 'override_mandatory': None}, 'http_csp': {'name': 'http_csp', 'label': 'detail web appsecpriv http-csp label', 'status': 2, 'worst_status': 2, 'verdict': 'detail web appsecpriv http-csp verdict bad', 'exp': 'detail web appsecpriv http-csp exp', 'tech_type': 'table_translatable', 'tech_string': 'detail web appsecpriv http-csp tech table', 'tech_data': [('104.154.89.105', [{'msgid': 'detail tech data http-csp no-policy-found', 'context': {}}])], 'override_mandatory': None}, 'http_x_content_type': {'name': 'http_x_content_type', 'label': 'detail web appsecpriv http-x-content-type label', 'status': 2, 'worst_status': 2, 'verdict': 'detail web appsecpriv http-x-content-type verdict bad', 'exp': 'detail web appsecpriv http-x-content-type exp', 'tech_type': 'table', 'tech_string': 'detail web appsecpriv http-x-content-type tech table', 'tech_data': [('104.154.89.105', '')], 'override_mandatory': None}, 'http_securitytxt': {'name': 'http_securitytxt', 'label': 'detail web appsecpriv http-securitytxt label', 'status': 2, 'worst_status': 2, 'verdict': 'detail web appsecpriv http-securitytxt verdict bad', 'exp': 'detail web appsecpriv http-securitytxt exp', 'tech_type': 'table_translatable', 'tech_string': 'detail web appsecpriv http-securitytxt tech table', 'tech_data': [('104.154.89.105', [{'msgid': 'detail tech data http-securitytxt requested-from', 'context': {'hostname': 'pinning-test.badssl.com'}}, {'msgid': 'detail tech data http-securitytxt no_security_txt_404', 'context': {}}])], 'override_mandatory': None}}", + "score": 0, + "max_score": 0, + "timestamp": "2025-03-14T15:22:12.881Z" + } + }, + { + "model": "checks.webtestappsecpriv", + "pk": 9015, + "fields": { + "domain": "invalid.rpki.isbgpsafeyet.com", + "report": "{'http_x_frame': {'name': 'http_x_frame', 'label': 'detail web appsecpriv http-x-frame label', 'status': 5, 'worst_status': 5, 'verdict': 'detail web appsecpriv http-x-frame verdict bad', 'exp': 'detail web appsecpriv http-x-frame exp', 'tech_type': 'table', 'tech_string': 'detail web appsecpriv http-x-frame tech table', 'tech_data': [('103.21.244.9', ''), ('2606:4700:7000::6715:f409', '')], 'override_mandatory': None}, 'http_referrer_policy': {'name': 'http_referrer_policy', 'label': 'detail web appsecpriv http-referrer-policy label', 'status': 5, 'worst_status': 2, 'verdict': 'detail web appsecpriv http-referrer-policy verdict recommendations', 'exp': 'detail web appsecpriv http-referrer-policy exp', 'tech_type': 'table_translatable', 'tech_string': 'detail web appsecpriv http-referrer-policy tech table', 'tech_data': [('103.21.244.9', [{'msgid': 'detail tech data http-referrer-policy no-policy', 'context': {}}]), ('2606:4700:7000::6715:f409', [{'msgid': 'detail tech data http-referrer-policy no-policy', 'context': {}}])], 'override_mandatory': None}, 'http_csp': {'name': 'http_csp', 'label': 'detail web appsecpriv http-csp label', 'status': 2, 'worst_status': 2, 'verdict': 'detail web appsecpriv http-csp verdict bad', 'exp': 'detail web appsecpriv http-csp exp', 'tech_type': 'table_translatable', 'tech_string': 'detail web appsecpriv http-csp tech table', 'tech_data': [('103.21.244.9', [{'msgid': 'detail tech data http-csp no-policy-found', 'context': {}}]), ('2606:4700:7000::6715:f409', [{'msgid': 'detail tech data http-csp no-policy-found', 'context': {}}])], 'override_mandatory': None}, 'http_x_content_type': {'name': 'http_x_content_type', 'label': 'detail web appsecpriv http-x-content-type label', 'status': 1, 'worst_status': 2, 'verdict': 'detail web appsecpriv http-x-content-type verdict good', 'exp': 'detail web appsecpriv http-x-content-type exp', 'tech_type': 'table', 'tech_string': 'detail web appsecpriv http-x-content-type tech table', 'tech_data': [('103.21.244.9', ['nosniff']), ('2606:4700:7000::6715:f409', ['nosniff'])], 'override_mandatory': None}, 'http_securitytxt': {'name': 'http_securitytxt', 'label': 'detail web appsecpriv http-securitytxt label', 'status': 2, 'worst_status': 2, 'verdict': 'detail web appsecpriv http-securitytxt verdict bad', 'exp': 'detail web appsecpriv http-securitytxt exp', 'tech_type': 'table_translatable', 'tech_string': 'detail web appsecpriv http-securitytxt tech table', 'tech_data': [('103.21.244.9', [{'msgid': 'detail tech data http-securitytxt requested-from', 'context': {'hostname': 'invalid.rpki.isbgpsafeyet.com'}}, {'msgid': 'detail tech data http-securitytxt invalid_media', 'context': {}}]), ('2606:4700:7000::6715:f409', [{'msgid': 'detail tech data http-securitytxt requested-from', 'context': {'hostname': 'invalid.rpki.isbgpsafeyet.com'}}, {'msgid': 'detail tech data http-securitytxt invalid_media', 'context': {}}])], 'override_mandatory': None}}", + "score": 0, + "max_score": 0, + "timestamp": "2025-03-14T15:22:40.059Z" + } + }, + { + "model": "checks.domaintestappsecpriv", + "pk": 9000, + "fields": { + "timestamp": "2025-03-14T15:14:03.429Z", + "domain": "62.204.66.10", + "report": "{'http_x_frame': {'name': 'http_x_frame', 'label': 'detail web appsecpriv http-x-frame label', 'status': 1, 'worst_status': 5, 'verdict': 'detail web appsecpriv http-x-frame verdict good', 'exp': 'detail web appsecpriv http-x-frame exp', 'tech_type': 'table', 'tech_string': 'detail web appsecpriv http-x-frame tech table', 'tech_data': ['SAMEORIGIN'], 'override_mandatory': None}, 'http_referrer_policy': {'name': 'http_referrer_policy', 'label': 'detail web appsecpriv http-referrer-policy label', 'status': 1, 'worst_status': 2, 'verdict': 'detail web appsecpriv http-referrer-policy verdict good', 'exp': 'detail web appsecpriv http-referrer-policy exp', 'tech_type': 'table_translatable', 'tech_string': 'detail web appsecpriv http-referrer-policy tech table', 'tech_data': [{'msgid': 'detail tech data http-referrer-policy values', 'context': {'values': ['same-origin']}}], 'override_mandatory': None}, 'http_csp': {'name': 'http_csp', 'label': 'detail web appsecpriv http-csp label', 'status': 1, 'worst_status': 2, 'verdict': 'detail web appsecpriv http-csp verdict good', 'exp': 'detail web appsecpriv http-csp exp', 'tech_type': 'table_translatable', 'tech_string': 'detail web appsecpriv http-csp tech table', 'tech_data': [{'msgid': 'detail tech data http-csp policy-found', 'context': {'policy': [\"base-uri 'self' https://*.internet.nl; form-action 'self' https://*.internet.nl; frame-ancestors 'none'; default-src 'self' https://*.internet.nl\"]}}], 'override_mandatory': None}, 'http_x_content_type': {'name': 'http_x_content_type', 'label': 'detail web appsecpriv http-x-content-type label', 'status': 1, 'worst_status': 2, 'verdict': 'detail web appsecpriv http-x-content-type verdict good', 'exp': 'detail web appsecpriv http-x-content-type exp', 'tech_type': 'table', 'tech_string': 'detail web appsecpriv http-x-content-type tech table', 'tech_data': ['nosniff'], 'override_mandatory': None}, 'http_securitytxt': {'name': 'http_securitytxt', 'label': 'detail web appsecpriv http-securitytxt label', 'status': 1, 'worst_status': 2, 'verdict': 'detail web appsecpriv http-securitytxt verdict good', 'exp': 'detail web appsecpriv http-securitytxt exp', 'tech_type': 'table_translatable', 'tech_string': 'detail web appsecpriv http-securitytxt tech table', 'tech_data': [{'msgid': 'detail tech data http-securitytxt retrieved-from', 'context': {'hostname': 'internet.nl'}}], 'override_mandatory': None}}", + "webdomain": 9000, + "server_reachable": true, + "score": 0, + "x_frame_options_enabled": true, + "x_frame_options_values": "['SAMEORIGIN']", + "x_frame_options_score": 10, + "x_xss_protection_enabled": false, + "x_xss_protection_values": "[]", + "x_xss_protection_score": null, + "referrer_policy_enabled": true, + "referrer_policy_values": "['same-origin']", + "referrer_policy_errors": "[]", + "referrer_policy_recommendations": "[]", + "referrer_policy_score": 10, + "content_security_policy_enabled": true, + "content_security_policy_values": "[\"base-uri 'self' https://*.internet.nl; form-action 'self' https://*.internet.nl; frame-ancestors 'none'; default-src 'self' https://*.internet.nl\"]", + "content_security_policy_errors": "[]", + "content_security_policy_score": 10, + "x_content_type_options_enabled": true, + "x_content_type_options_values": "['nosniff']", + "x_content_type_options_score": 10, + "securitytxt_enabled": true, + "securitytxt_errors": "[]", + "securitytxt_recommendations": "[]", + "securitytxt_score": 10, + "securitytxt_found_host": "internet.nl" + } + }, + { + "model": "checks.domaintestappsecpriv", + "pk": 9001, + "fields": { + "timestamp": "2025-03-14T15:14:03.470Z", + "domain": "2a00:d00:ff:162:62:204:66:10", + "report": "{'http_x_frame': {'name': 'http_x_frame', 'label': 'detail web appsecpriv http-x-frame label', 'status': 1, 'worst_status': 5, 'verdict': 'detail web appsecpriv http-x-frame verdict good', 'exp': 'detail web appsecpriv http-x-frame exp', 'tech_type': 'table', 'tech_string': 'detail web appsecpriv http-x-frame tech table', 'tech_data': ['SAMEORIGIN'], 'override_mandatory': None}, 'http_referrer_policy': {'name': 'http_referrer_policy', 'label': 'detail web appsecpriv http-referrer-policy label', 'status': 1, 'worst_status': 2, 'verdict': 'detail web appsecpriv http-referrer-policy verdict good', 'exp': 'detail web appsecpriv http-referrer-policy exp', 'tech_type': 'table_translatable', 'tech_string': 'detail web appsecpriv http-referrer-policy tech table', 'tech_data': [{'msgid': 'detail tech data http-referrer-policy values', 'context': {'values': ['same-origin']}}], 'override_mandatory': None}, 'http_csp': {'name': 'http_csp', 'label': 'detail web appsecpriv http-csp label', 'status': 1, 'worst_status': 2, 'verdict': 'detail web appsecpriv http-csp verdict good', 'exp': 'detail web appsecpriv http-csp exp', 'tech_type': 'table_translatable', 'tech_string': 'detail web appsecpriv http-csp tech table', 'tech_data': [{'msgid': 'detail tech data http-csp policy-found', 'context': {'policy': [\"base-uri 'self' https://*.internet.nl; form-action 'self' https://*.internet.nl; frame-ancestors 'none'; default-src 'self' https://*.internet.nl\"]}}], 'override_mandatory': None}, 'http_x_content_type': {'name': 'http_x_content_type', 'label': 'detail web appsecpriv http-x-content-type label', 'status': 1, 'worst_status': 2, 'verdict': 'detail web appsecpriv http-x-content-type verdict good', 'exp': 'detail web appsecpriv http-x-content-type exp', 'tech_type': 'table', 'tech_string': 'detail web appsecpriv http-x-content-type tech table', 'tech_data': ['nosniff'], 'override_mandatory': None}, 'http_securitytxt': {'name': 'http_securitytxt', 'label': 'detail web appsecpriv http-securitytxt label', 'status': 1, 'worst_status': 2, 'verdict': 'detail web appsecpriv http-securitytxt verdict good', 'exp': 'detail web appsecpriv http-securitytxt exp', 'tech_type': 'table_translatable', 'tech_string': 'detail web appsecpriv http-securitytxt tech table', 'tech_data': [{'msgid': 'detail tech data http-securitytxt retrieved-from', 'context': {'hostname': 'internet.nl'}}], 'override_mandatory': None}}", + "webdomain": 9000, + "server_reachable": true, + "score": 0, + "x_frame_options_enabled": true, + "x_frame_options_values": "['SAMEORIGIN']", + "x_frame_options_score": 10, + "x_xss_protection_enabled": false, + "x_xss_protection_values": "[]", + "x_xss_protection_score": null, + "referrer_policy_enabled": true, + "referrer_policy_values": "['same-origin']", + "referrer_policy_errors": "[]", + "referrer_policy_recommendations": "[]", + "referrer_policy_score": 10, + "content_security_policy_enabled": true, + "content_security_policy_values": "[\"base-uri 'self' https://*.internet.nl; form-action 'self' https://*.internet.nl; frame-ancestors 'none'; default-src 'self' https://*.internet.nl\"]", + "content_security_policy_errors": "[]", + "content_security_policy_score": 10, + "x_content_type_options_enabled": true, + "x_content_type_options_values": "['nosniff']", + "x_content_type_options_score": 10, + "securitytxt_enabled": true, + "securitytxt_errors": "[]", + "securitytxt_recommendations": "[]", + "securitytxt_score": 10, + "securitytxt_found_host": "internet.nl" + } + }, + { + "model": "checks.domaintestappsecpriv", + "pk": 9002, + "fields": { + "timestamp": "2025-03-14T15:14:21.280Z", + "domain": "94.198.159.35", + "report": "{'http_x_frame': {'name': 'http_x_frame', 'label': 'detail web appsecpriv http-x-frame label', 'status': 1, 'worst_status': 5, 'verdict': 'detail web appsecpriv http-x-frame verdict good', 'exp': 'detail web appsecpriv http-x-frame exp', 'tech_type': 'table', 'tech_string': 'detail web appsecpriv http-x-frame tech table', 'tech_data': ['deny'], 'override_mandatory': None}, 'http_referrer_policy': {'name': 'http_referrer_policy', 'label': 'detail web appsecpriv http-referrer-policy label', 'status': 1, 'worst_status': 2, 'verdict': 'detail web appsecpriv http-referrer-policy verdict good', 'exp': 'detail web appsecpriv http-referrer-policy exp', 'tech_type': 'table_translatable', 'tech_string': 'detail web appsecpriv http-referrer-policy tech table', 'tech_data': [{'msgid': 'detail tech data http-referrer-policy values', 'context': {'values': ['no-referrer']}}], 'override_mandatory': None}, 'http_csp': {'name': 'http_csp', 'label': 'detail web appsecpriv http-csp label', 'status': 1, 'worst_status': 2, 'verdict': 'detail web appsecpriv http-csp verdict good', 'exp': 'detail web appsecpriv http-csp exp', 'tech_type': 'table_translatable', 'tech_string': 'detail web appsecpriv http-csp tech table', 'tech_data': [{'msgid': 'detail tech data http-csp policy-found', 'context': {'policy': [\"report-to endpoint-1; report-uri https://check.sidnlabs.nl/csp-report-labs.php; default-src 'none'; img-src 'self'; style-src 'self'; font-src 'self'; frame-ancestors 'none'; form-action https://internet.nl/site/; base-uri 'self'\"]}}], 'override_mandatory': None}, 'http_x_content_type': {'name': 'http_x_content_type', 'label': 'detail web appsecpriv http-x-content-type label', 'status': 1, 'worst_status': 2, 'verdict': 'detail web appsecpriv http-x-content-type verdict good', 'exp': 'detail web appsecpriv http-x-content-type exp', 'tech_type': 'table', 'tech_string': 'detail web appsecpriv http-x-content-type tech table', 'tech_data': ['nosniff'], 'override_mandatory': None}, 'http_securitytxt': {'name': 'http_securitytxt', 'label': 'detail web appsecpriv http-securitytxt label', 'status': 1, 'worst_status': 2, 'verdict': 'detail web appsecpriv http-securitytxt verdict good', 'exp': 'detail web appsecpriv http-securitytxt exp', 'tech_type': 'table_translatable', 'tech_string': 'detail web appsecpriv http-securitytxt tech table', 'tech_data': [{'msgid': 'detail tech data http-securitytxt retrieved-from', 'context': {'hostname': 'example.nl'}}], 'override_mandatory': None}}", + "webdomain": 9001, + "server_reachable": true, + "score": 0, + "x_frame_options_enabled": true, + "x_frame_options_values": "['deny']", + "x_frame_options_score": 10, + "x_xss_protection_enabled": false, + "x_xss_protection_values": "[]", + "x_xss_protection_score": null, + "referrer_policy_enabled": true, + "referrer_policy_values": "['no-referrer']", + "referrer_policy_errors": "[]", + "referrer_policy_recommendations": "[]", + "referrer_policy_score": 10, + "content_security_policy_enabled": true, + "content_security_policy_values": "[\"report-to endpoint-1; report-uri https://check.sidnlabs.nl/csp-report-labs.php; default-src 'none'; img-src 'self'; style-src 'self'; font-src 'self'; frame-ancestors 'none'; form-action https://internet.nl/site/; base-uri 'self'\"]", + "content_security_policy_errors": "[]", + "content_security_policy_score": 10, + "x_content_type_options_enabled": true, + "x_content_type_options_values": "['nosniff']", + "x_content_type_options_score": 10, + "securitytxt_enabled": true, + "securitytxt_errors": "[]", + "securitytxt_recommendations": "[]", + "securitytxt_score": 10, + "securitytxt_found_host": "example.nl" + } + }, + { + "model": "checks.domaintestappsecpriv", + "pk": 9003, + "fields": { + "timestamp": "2025-03-14T15:14:21.284Z", + "domain": "2a00:d78:0:712:94:198:159:35", + "report": "{'http_x_frame': {'name': 'http_x_frame', 'label': 'detail web appsecpriv http-x-frame label', 'status': 1, 'worst_status': 5, 'verdict': 'detail web appsecpriv http-x-frame verdict good', 'exp': 'detail web appsecpriv http-x-frame exp', 'tech_type': 'table', 'tech_string': 'detail web appsecpriv http-x-frame tech table', 'tech_data': ['deny'], 'override_mandatory': None}, 'http_referrer_policy': {'name': 'http_referrer_policy', 'label': 'detail web appsecpriv http-referrer-policy label', 'status': 1, 'worst_status': 2, 'verdict': 'detail web appsecpriv http-referrer-policy verdict good', 'exp': 'detail web appsecpriv http-referrer-policy exp', 'tech_type': 'table_translatable', 'tech_string': 'detail web appsecpriv http-referrer-policy tech table', 'tech_data': [{'msgid': 'detail tech data http-referrer-policy values', 'context': {'values': ['no-referrer']}}], 'override_mandatory': None}, 'http_csp': {'name': 'http_csp', 'label': 'detail web appsecpriv http-csp label', 'status': 1, 'worst_status': 2, 'verdict': 'detail web appsecpriv http-csp verdict good', 'exp': 'detail web appsecpriv http-csp exp', 'tech_type': 'table_translatable', 'tech_string': 'detail web appsecpriv http-csp tech table', 'tech_data': [{'msgid': 'detail tech data http-csp policy-found', 'context': {'policy': [\"report-to endpoint-1; report-uri https://check.sidnlabs.nl/csp-report-labs.php; default-src 'none'; img-src 'self'; style-src 'self'; font-src 'self'; frame-ancestors 'none'; form-action https://internet.nl/site/; base-uri 'self'\"]}}], 'override_mandatory': None}, 'http_x_content_type': {'name': 'http_x_content_type', 'label': 'detail web appsecpriv http-x-content-type label', 'status': 1, 'worst_status': 2, 'verdict': 'detail web appsecpriv http-x-content-type verdict good', 'exp': 'detail web appsecpriv http-x-content-type exp', 'tech_type': 'table', 'tech_string': 'detail web appsecpriv http-x-content-type tech table', 'tech_data': ['nosniff'], 'override_mandatory': None}, 'http_securitytxt': {'name': 'http_securitytxt', 'label': 'detail web appsecpriv http-securitytxt label', 'status': 1, 'worst_status': 2, 'verdict': 'detail web appsecpriv http-securitytxt verdict good', 'exp': 'detail web appsecpriv http-securitytxt exp', 'tech_type': 'table_translatable', 'tech_string': 'detail web appsecpriv http-securitytxt tech table', 'tech_data': [{'msgid': 'detail tech data http-securitytxt retrieved-from', 'context': {'hostname': 'example.nl'}}], 'override_mandatory': None}}", + "webdomain": 9001, + "server_reachable": true, + "score": 0, + "x_frame_options_enabled": true, + "x_frame_options_values": "['deny']", + "x_frame_options_score": 10, + "x_xss_protection_enabled": false, + "x_xss_protection_values": "[]", + "x_xss_protection_score": null, + "referrer_policy_enabled": true, + "referrer_policy_values": "['no-referrer']", + "referrer_policy_errors": "[]", + "referrer_policy_recommendations": "[]", + "referrer_policy_score": 10, + "content_security_policy_enabled": true, + "content_security_policy_values": "[\"report-to endpoint-1; report-uri https://check.sidnlabs.nl/csp-report-labs.php; default-src 'none'; img-src 'self'; style-src 'self'; font-src 'self'; frame-ancestors 'none'; form-action https://internet.nl/site/; base-uri 'self'\"]", + "content_security_policy_errors": "[]", + "content_security_policy_score": 10, + "x_content_type_options_enabled": true, + "x_content_type_options_values": "['nosniff']", + "x_content_type_options_score": 10, + "securitytxt_enabled": true, + "securitytxt_errors": "[]", + "securitytxt_recommendations": "[]", + "securitytxt_score": 10, + "securitytxt_found_host": "example.nl" + } + }, + { + "model": "checks.domaintestappsecpriv", + "pk": 9004, + "fields": { + "timestamp": "2025-03-14T15:14:31.303Z", + "domain": "2a00:d00:ff:162:62:204:66:10", + "report": "{'http_x_frame': {'name': 'http_x_frame', 'label': 'detail web appsecpriv http-x-frame label', 'status': 1, 'worst_status': 5, 'verdict': 'detail web appsecpriv http-x-frame verdict good', 'exp': 'detail web appsecpriv http-x-frame exp', 'tech_type': 'table', 'tech_string': 'detail web appsecpriv http-x-frame tech table', 'tech_data': ['SAMEORIGIN'], 'override_mandatory': None}, 'http_referrer_policy': {'name': 'http_referrer_policy', 'label': 'detail web appsecpriv http-referrer-policy label', 'status': 1, 'worst_status': 2, 'verdict': 'detail web appsecpriv http-referrer-policy verdict good', 'exp': 'detail web appsecpriv http-referrer-policy exp', 'tech_type': 'table_translatable', 'tech_string': 'detail web appsecpriv http-referrer-policy tech table', 'tech_data': [{'msgid': 'detail tech data http-referrer-policy values', 'context': {'values': ['same-origin']}}], 'override_mandatory': None}, 'http_csp': {'name': 'http_csp', 'label': 'detail web appsecpriv http-csp label', 'status': 1, 'worst_status': 2, 'verdict': 'detail web appsecpriv http-csp verdict good', 'exp': 'detail web appsecpriv http-csp exp', 'tech_type': 'table_translatable', 'tech_string': 'detail web appsecpriv http-csp tech table', 'tech_data': [{'msgid': 'detail tech data http-csp policy-found', 'context': {'policy': [\"base-uri 'self' https://*.internet.nl; form-action 'self' https://*.internet.nl; frame-ancestors 'none'; default-src 'self' https://*.internet.nl\"]}}], 'override_mandatory': None}, 'http_x_content_type': {'name': 'http_x_content_type', 'label': 'detail web appsecpriv http-x-content-type label', 'status': 1, 'worst_status': 2, 'verdict': 'detail web appsecpriv http-x-content-type verdict good', 'exp': 'detail web appsecpriv http-x-content-type exp', 'tech_type': 'table', 'tech_string': 'detail web appsecpriv http-x-content-type tech table', 'tech_data': ['nosniff'], 'override_mandatory': None}, 'http_securitytxt': {'name': 'http_securitytxt', 'label': 'detail web appsecpriv http-securitytxt label', 'status': 1, 'worst_status': 2, 'verdict': 'detail web appsecpriv http-securitytxt verdict good', 'exp': 'detail web appsecpriv http-securitytxt exp', 'tech_type': 'table_translatable', 'tech_string': 'detail web appsecpriv http-securitytxt tech table', 'tech_data': [{'msgid': 'detail tech data http-securitytxt retrieved-from', 'context': {'hostname': 'ipv6.internet.nl'}}], 'override_mandatory': None}}", + "webdomain": 9002, + "server_reachable": true, + "score": 0, + "x_frame_options_enabled": true, + "x_frame_options_values": "['SAMEORIGIN']", + "x_frame_options_score": 10, + "x_xss_protection_enabled": false, + "x_xss_protection_values": "[]", + "x_xss_protection_score": null, + "referrer_policy_enabled": true, + "referrer_policy_values": "['same-origin']", + "referrer_policy_errors": "[]", + "referrer_policy_recommendations": "[]", + "referrer_policy_score": 10, + "content_security_policy_enabled": true, + "content_security_policy_values": "[\"base-uri 'self' https://*.internet.nl; form-action 'self' https://*.internet.nl; frame-ancestors 'none'; default-src 'self' https://*.internet.nl\"]", + "content_security_policy_errors": "[]", + "content_security_policy_score": 10, + "x_content_type_options_enabled": true, + "x_content_type_options_values": "['nosniff']", + "x_content_type_options_score": 10, + "securitytxt_enabled": true, + "securitytxt_errors": "[]", + "securitytxt_recommendations": "[]", + "securitytxt_score": 10, + "securitytxt_found_host": "ipv6.internet.nl" + } + }, + { + "model": "checks.domaintestappsecpriv", + "pk": 9005, + "fields": { + "timestamp": "2025-03-14T15:14:38.676Z", + "domain": "2a05:1500:600:1:1c00:4aff:fe00:428", + "report": "{'http_x_frame': {'name': 'http_x_frame', 'label': 'detail web appsecpriv http-x-frame label', 'status': 1, 'worst_status': 5, 'verdict': 'detail web appsecpriv http-x-frame verdict good', 'exp': 'detail web appsecpriv http-x-frame exp', 'tech_type': 'table', 'tech_string': 'detail web appsecpriv http-x-frame tech table', 'tech_data': ['sameorigin'], 'override_mandatory': None}, 'http_referrer_policy': {'name': 'http_referrer_policy', 'label': 'detail web appsecpriv http-referrer-policy label', 'status': 1, 'worst_status': 2, 'verdict': 'detail web appsecpriv http-referrer-policy verdict good', 'exp': 'detail web appsecpriv http-referrer-policy exp', 'tech_type': 'table_translatable', 'tech_string': 'detail web appsecpriv http-referrer-policy tech table', 'tech_data': [{'msgid': 'detail tech data http-referrer-policy values', 'context': {'values': ['same-origin']}}], 'override_mandatory': None}, 'http_csp': {'name': 'http_csp', 'label': 'detail web appsecpriv http-csp label', 'status': 1, 'worst_status': 2, 'verdict': 'detail web appsecpriv http-csp verdict good', 'exp': 'detail web appsecpriv http-csp exp', 'tech_type': 'table_translatable', 'tech_string': 'detail web appsecpriv http-csp tech table', 'tech_data': [{'msgid': 'detail tech data http-csp policy-found', 'context': {'policy': [\"default-src 'none'; base-uri 'self'; form-action 'none'; img-src 'self'; style-src 'self'; frame-ancestors 'none'; report-uri https://sidn-nl.uriports.com/reports/report; report-to default\"]}}], 'override_mandatory': None}, 'http_x_content_type': {'name': 'http_x_content_type', 'label': 'detail web appsecpriv http-x-content-type label', 'status': 1, 'worst_status': 2, 'verdict': 'detail web appsecpriv http-x-content-type verdict good', 'exp': 'detail web appsecpriv http-x-content-type exp', 'tech_type': 'table', 'tech_string': 'detail web appsecpriv http-x-content-type tech table', 'tech_data': ['nosniff'], 'override_mandatory': None}, 'http_securitytxt': {'name': 'http_securitytxt', 'label': 'detail web appsecpriv http-securitytxt label', 'status': 1, 'worst_status': 2, 'verdict': 'detail web appsecpriv http-securitytxt verdict good', 'exp': 'detail web appsecpriv http-securitytxt exp', 'tech_type': 'table_translatable', 'tech_string': 'detail web appsecpriv http-securitytxt tech table', 'tech_data': [{'msgid': 'detail tech data http-securitytxt retrieved-from', 'context': {'hostname': 'forfun.net'}}], 'override_mandatory': None}}", + "webdomain": 9003, + "server_reachable": true, + "score": 0, + "x_frame_options_enabled": true, + "x_frame_options_values": "['sameorigin']", + "x_frame_options_score": 10, + "x_xss_protection_enabled": false, + "x_xss_protection_values": "[]", + "x_xss_protection_score": null, + "referrer_policy_enabled": true, + "referrer_policy_values": "['same-origin']", + "referrer_policy_errors": "[]", + "referrer_policy_recommendations": "[]", + "referrer_policy_score": 10, + "content_security_policy_enabled": true, + "content_security_policy_values": "[\"default-src 'none'; base-uri 'self'; form-action 'none'; img-src 'self'; style-src 'self'; frame-ancestors 'none'; report-uri https://sidn-nl.uriports.com/reports/report; report-to default\"]", + "content_security_policy_errors": "[]", + "content_security_policy_score": 10, + "x_content_type_options_enabled": true, + "x_content_type_options_values": "['nosniff']", + "x_content_type_options_score": 10, + "securitytxt_enabled": true, + "securitytxt_errors": "[]", + "securitytxt_recommendations": "[]", + "securitytxt_score": 10, + "securitytxt_found_host": "forfun.net" + } + }, + { + "model": "checks.domaintestappsecpriv", + "pk": 9006, + "fields": { + "timestamp": "2025-03-14T15:14:45.928Z", + "domain": "2a00:1450:4026:804::200e", + "report": "{'http_x_frame': {'name': 'http_x_frame', 'label': 'detail web appsecpriv http-x-frame label', 'status': 1, 'worst_status': 5, 'verdict': 'detail web appsecpriv http-x-frame verdict good', 'exp': 'detail web appsecpriv http-x-frame exp', 'tech_type': 'table', 'tech_string': 'detail web appsecpriv http-x-frame tech table', 'tech_data': ['SAMEORIGIN'], 'override_mandatory': None}, 'http_referrer_policy': {'name': 'http_referrer_policy', 'label': 'detail web appsecpriv http-referrer-policy label', 'status': 5, 'worst_status': 2, 'verdict': 'detail web appsecpriv http-referrer-policy verdict recommendations', 'exp': 'detail web appsecpriv http-referrer-policy exp', 'tech_type': 'table_translatable', 'tech_string': 'detail web appsecpriv http-referrer-policy tech table', 'tech_data': [{'msgid': 'detail tech data http-referrer-policy no-policy', 'context': {}}], 'override_mandatory': None}, 'http_csp': {'name': 'http_csp', 'label': 'detail web appsecpriv http-csp label', 'status': 2, 'worst_status': 2, 'verdict': 'detail web appsecpriv http-csp verdict bad', 'exp': 'detail web appsecpriv http-csp exp', 'tech_type': 'table_translatable', 'tech_string': 'detail web appsecpriv http-csp tech table', 'tech_data': [{'msgid': 'detail tech data http-csp no-policy-found', 'context': {}}], 'override_mandatory': None}, 'http_x_content_type': {'name': 'http_x_content_type', 'label': 'detail web appsecpriv http-x-content-type label', 'status': 2, 'worst_status': 2, 'verdict': 'detail web appsecpriv http-x-content-type verdict bad', 'exp': 'detail web appsecpriv http-x-content-type exp', 'tech_type': 'table', 'tech_string': 'detail web appsecpriv http-x-content-type tech table', 'tech_data': '', 'override_mandatory': None}, 'http_securitytxt': {'name': 'http_securitytxt', 'label': 'detail web appsecpriv http-securitytxt label', 'status': 5, 'worst_status': 2, 'verdict': 'detail web appsecpriv http-securitytxt verdict recommendations', 'exp': 'detail web appsecpriv http-securitytxt exp', 'tech_type': 'table_translatable', 'tech_string': 'detail web appsecpriv http-securitytxt tech table', 'tech_data': [{'msgid': 'detail tech data http-securitytxt retrieved-from', 'context': {'hostname': 'ipv6.google.com'}}, {'msgid': 'detail tech data http-securitytxt not_signed', 'context': {'line_no': None}}], 'override_mandatory': None}}", + "webdomain": 9004, + "server_reachable": true, + "score": 0, + "x_frame_options_enabled": true, + "x_frame_options_values": "['SAMEORIGIN']", + "x_frame_options_score": 10, + "x_xss_protection_enabled": false, + "x_xss_protection_values": "[]", + "x_xss_protection_score": null, + "referrer_policy_enabled": true, + "referrer_policy_values": "[]", + "referrer_policy_errors": "[]", + "referrer_policy_recommendations": "[{'msgid': 'no-policy'}]", + "referrer_policy_score": 10, + "content_security_policy_enabled": false, + "content_security_policy_values": "[]", + "content_security_policy_errors": "[]", + "content_security_policy_score": 0, + "x_content_type_options_enabled": false, + "x_content_type_options_values": "[]", + "x_content_type_options_score": 0, + "securitytxt_enabled": true, + "securitytxt_errors": "[]", + "securitytxt_recommendations": "[{'msgid': 'not_signed', 'context': {'line_no': None}}]", + "securitytxt_score": 10, + "securitytxt_found_host": "ipv6.google.com" + } + }, + { + "model": "checks.domaintestappsecpriv", + "pk": 9007, + "fields": { + "timestamp": "2025-03-14T15:14:53.983Z", + "domain": "2a05:1500:600:1:1c00:4aff:fe00:428", + "report": "{'http_x_frame': {'name': 'http_x_frame', 'label': 'detail web appsecpriv http-x-frame label', 'status': 1, 'worst_status': 5, 'verdict': 'detail web appsecpriv http-x-frame verdict good', 'exp': 'detail web appsecpriv http-x-frame exp', 'tech_type': 'table', 'tech_string': 'detail web appsecpriv http-x-frame tech table', 'tech_data': ['sameorigin'], 'override_mandatory': None}, 'http_referrer_policy': {'name': 'http_referrer_policy', 'label': 'detail web appsecpriv http-referrer-policy label', 'status': 1, 'worst_status': 2, 'verdict': 'detail web appsecpriv http-referrer-policy verdict good', 'exp': 'detail web appsecpriv http-referrer-policy exp', 'tech_type': 'table_translatable', 'tech_string': 'detail web appsecpriv http-referrer-policy tech table', 'tech_data': [{'msgid': 'detail tech data http-referrer-policy values', 'context': {'values': ['same-origin']}}], 'override_mandatory': None}, 'http_csp': {'name': 'http_csp', 'label': 'detail web appsecpriv http-csp label', 'status': 1, 'worst_status': 2, 'verdict': 'detail web appsecpriv http-csp verdict good', 'exp': 'detail web appsecpriv http-csp exp', 'tech_type': 'table_translatable', 'tech_string': 'detail web appsecpriv http-csp tech table', 'tech_data': [{'msgid': 'detail tech data http-csp policy-found', 'context': {'policy': [\"default-src 'none'; base-uri 'self'; form-action 'none'; img-src 'self'; style-src 'self'; frame-ancestors 'none'; report-uri https://sidn-nl.uriports.com/reports/report; report-to default\"]}}], 'override_mandatory': None}, 'http_x_content_type': {'name': 'http_x_content_type', 'label': 'detail web appsecpriv http-x-content-type label', 'status': 1, 'worst_status': 2, 'verdict': 'detail web appsecpriv http-x-content-type verdict good', 'exp': 'detail web appsecpriv http-x-content-type exp', 'tech_type': 'table', 'tech_string': 'detail web appsecpriv http-x-content-type tech table', 'tech_data': ['nosniff'], 'override_mandatory': None}, 'http_securitytxt': {'name': 'http_securitytxt', 'label': 'detail web appsecpriv http-securitytxt label', 'status': 2, 'worst_status': 2, 'verdict': 'detail web appsecpriv http-securitytxt verdict bad', 'exp': 'detail web appsecpriv http-securitytxt exp', 'tech_type': 'table_translatable', 'tech_string': 'detail web appsecpriv http-securitytxt tech table', 'tech_data': [{'msgid': 'detail tech data http-securitytxt retrieved-from', 'context': {'hostname': 'servfail.nl'}}, {'msgid': 'detail tech data http-securitytxt no_canonical_match', 'context': {'line_no': None}}], 'override_mandatory': None}}", + "webdomain": 9005, + "server_reachable": true, + "score": 0, + "x_frame_options_enabled": true, + "x_frame_options_values": "['sameorigin']", + "x_frame_options_score": 10, + "x_xss_protection_enabled": false, + "x_xss_protection_values": "[]", + "x_xss_protection_score": null, + "referrer_policy_enabled": true, + "referrer_policy_values": "['same-origin']", + "referrer_policy_errors": "[]", + "referrer_policy_recommendations": "[]", + "referrer_policy_score": 10, + "content_security_policy_enabled": true, + "content_security_policy_values": "[\"default-src 'none'; base-uri 'self'; form-action 'none'; img-src 'self'; style-src 'self'; frame-ancestors 'none'; report-uri https://sidn-nl.uriports.com/reports/report; report-to default\"]", + "content_security_policy_errors": "[]", + "content_security_policy_score": 10, + "x_content_type_options_enabled": true, + "x_content_type_options_values": "['nosniff']", + "x_content_type_options_score": 10, + "securitytxt_enabled": true, + "securitytxt_errors": "[{'msgid': 'no_canonical_match', 'context': {'line_no': None}}]", + "securitytxt_recommendations": "[]", + "securitytxt_score": 10, + "securitytxt_found_host": "servfail.nl" + } + }, + { + "model": "checks.domaintestappsecpriv", + "pk": 9008, + "fields": { + "timestamp": "2025-03-14T15:18:50.161Z", + "domain": "104.18.27.110", + "report": "{'http_x_frame': {'name': 'http_x_frame', 'label': 'detail web appsecpriv http-x-frame label', 'status': 4, 'worst_status': 5, 'verdict': 'detail verdict not-tested', 'exp': 'detail web appsecpriv http-x-frame exp', 'tech_type': 'table', 'tech_string': 'detail web appsecpriv http-x-frame tech table', 'tech_data': 'detail tech data not-tested', 'override_mandatory': None}, 'http_referrer_policy': {'name': 'http_referrer_policy', 'label': 'detail web appsecpriv http-referrer-policy label', 'status': 4, 'worst_status': 2, 'verdict': 'detail verdict not-tested', 'exp': 'detail web appsecpriv http-referrer-policy exp', 'tech_type': 'table_translatable', 'tech_string': 'detail web appsecpriv http-referrer-policy tech table', 'tech_data': 'detail tech data not-tested', 'override_mandatory': None}, 'http_csp': {'name': 'http_csp', 'label': 'detail web appsecpriv http-csp label', 'status': 4, 'worst_status': 2, 'verdict': 'detail verdict not-tested', 'exp': 'detail web appsecpriv http-csp exp', 'tech_type': 'table_translatable', 'tech_string': 'detail web appsecpriv http-csp tech table', 'tech_data': 'detail tech data not-tested', 'override_mandatory': None}, 'http_x_content_type': {'name': 'http_x_content_type', 'label': 'detail web appsecpriv http-x-content-type label', 'status': 4, 'worst_status': 2, 'verdict': 'detail verdict not-tested', 'exp': 'detail web appsecpriv http-x-content-type exp', 'tech_type': 'table', 'tech_string': 'detail web appsecpriv http-x-content-type tech table', 'tech_data': 'detail tech data not-tested', 'override_mandatory': None}, 'http_securitytxt': {'name': 'http_securitytxt', 'label': 'detail web appsecpriv http-securitytxt label', 'status': 4, 'worst_status': 2, 'verdict': 'detail verdict not-tested', 'exp': 'detail web appsecpriv http-securitytxt exp', 'tech_type': 'table_translatable', 'tech_string': 'detail web appsecpriv http-securitytxt tech table', 'tech_data': 'detail tech data not-tested', 'override_mandatory': None}}", + "webdomain": 9006, + "server_reachable": false, + "score": 0, + "x_frame_options_enabled": false, + "x_frame_options_values": "[]", + "x_frame_options_score": null, + "x_xss_protection_enabled": false, + "x_xss_protection_values": "[]", + "x_xss_protection_score": null, + "referrer_policy_enabled": false, + "referrer_policy_values": "[]", + "referrer_policy_errors": "[]", + "referrer_policy_recommendations": "[]", + "referrer_policy_score": null, + "content_security_policy_enabled": false, + "content_security_policy_values": "[]", + "content_security_policy_errors": "[]", + "content_security_policy_score": null, + "x_content_type_options_enabled": false, + "x_content_type_options_values": "[]", + "x_content_type_options_score": null, + "securitytxt_enabled": false, + "securitytxt_errors": "[]", + "securitytxt_recommendations": "[]", + "securitytxt_score": null, + "securitytxt_found_host": null + } + }, + { + "model": "checks.domaintestappsecpriv", + "pk": 9009, + "fields": { + "timestamp": "2025-03-14T15:19:04.326Z", + "domain": "94.198.159.39", + "report": "{'http_x_frame': {'name': 'http_x_frame', 'label': 'detail web appsecpriv http-x-frame label', 'status': 5, 'worst_status': 5, 'verdict': 'detail web appsecpriv http-x-frame verdict bad', 'exp': 'detail web appsecpriv http-x-frame exp', 'tech_type': 'table', 'tech_string': 'detail web appsecpriv http-x-frame tech table', 'tech_data': '', 'override_mandatory': None}, 'http_referrer_policy': {'name': 'http_referrer_policy', 'label': 'detail web appsecpriv http-referrer-policy label', 'status': 5, 'worst_status': 2, 'verdict': 'detail web appsecpriv http-referrer-policy verdict recommendations', 'exp': 'detail web appsecpriv http-referrer-policy exp', 'tech_type': 'table_translatable', 'tech_string': 'detail web appsecpriv http-referrer-policy tech table', 'tech_data': [{'msgid': 'detail tech data http-referrer-policy no-policy', 'context': {}}], 'override_mandatory': None}, 'http_csp': {'name': 'http_csp', 'label': 'detail web appsecpriv http-csp label', 'status': 2, 'worst_status': 2, 'verdict': 'detail web appsecpriv http-csp verdict bad', 'exp': 'detail web appsecpriv http-csp exp', 'tech_type': 'table_translatable', 'tech_string': 'detail web appsecpriv http-csp tech table', 'tech_data': [{'msgid': 'detail tech data http-csp no-policy-found', 'context': {}}], 'override_mandatory': None}, 'http_x_content_type': {'name': 'http_x_content_type', 'label': 'detail web appsecpriv http-x-content-type label', 'status': 2, 'worst_status': 2, 'verdict': 'detail web appsecpriv http-x-content-type verdict bad', 'exp': 'detail web appsecpriv http-x-content-type exp', 'tech_type': 'table', 'tech_string': 'detail web appsecpriv http-x-content-type tech table', 'tech_data': '', 'override_mandatory': None}, 'http_securitytxt': {'name': 'http_securitytxt', 'label': 'detail web appsecpriv http-securitytxt label', 'status': 2, 'worst_status': 2, 'verdict': 'detail web appsecpriv http-securitytxt verdict bad', 'exp': 'detail web appsecpriv http-securitytxt exp', 'tech_type': 'table_translatable', 'tech_string': 'detail web appsecpriv http-securitytxt tech table', 'tech_data': [{'msgid': 'detail tech data http-securitytxt requested-from', 'context': {'hostname': 'ok.bogussig.ok.bad-dnssec.wb.sidnlabs.nl'}}, {'msgid': 'detail tech data http-securitytxt no_security_txt_404', 'context': {}}], 'override_mandatory': None}}", + "webdomain": 9007, + "server_reachable": true, + "score": 0, + "x_frame_options_enabled": false, + "x_frame_options_values": "[]", + "x_frame_options_score": 0, + "x_xss_protection_enabled": false, + "x_xss_protection_values": "[]", + "x_xss_protection_score": null, + "referrer_policy_enabled": true, + "referrer_policy_values": "[]", + "referrer_policy_errors": "[]", + "referrer_policy_recommendations": "[{'msgid': 'no-policy'}]", + "referrer_policy_score": 10, + "content_security_policy_enabled": false, + "content_security_policy_values": "[]", + "content_security_policy_errors": "[]", + "content_security_policy_score": 0, + "x_content_type_options_enabled": false, + "x_content_type_options_values": "[]", + "x_content_type_options_score": 0, + "securitytxt_enabled": false, + "securitytxt_errors": "[{'msgid': 'no_security_txt_404'}]", + "securitytxt_recommendations": "[]", + "securitytxt_score": 10, + "securitytxt_found_host": "ok.bogussig.ok.bad-dnssec.wb.sidnlabs.nl" + } + }, + { + "model": "checks.domaintestappsecpriv", + "pk": 9010, + "fields": { + "timestamp": "2025-03-14T15:19:04.329Z", + "domain": "2a00:d78:0:712:94:198:159:39", + "report": "{'http_x_frame': {'name': 'http_x_frame', 'label': 'detail web appsecpriv http-x-frame label', 'status': 5, 'worst_status': 5, 'verdict': 'detail web appsecpriv http-x-frame verdict bad', 'exp': 'detail web appsecpriv http-x-frame exp', 'tech_type': 'table', 'tech_string': 'detail web appsecpriv http-x-frame tech table', 'tech_data': '', 'override_mandatory': None}, 'http_referrer_policy': {'name': 'http_referrer_policy', 'label': 'detail web appsecpriv http-referrer-policy label', 'status': 5, 'worst_status': 2, 'verdict': 'detail web appsecpriv http-referrer-policy verdict recommendations', 'exp': 'detail web appsecpriv http-referrer-policy exp', 'tech_type': 'table_translatable', 'tech_string': 'detail web appsecpriv http-referrer-policy tech table', 'tech_data': [{'msgid': 'detail tech data http-referrer-policy no-policy', 'context': {}}], 'override_mandatory': None}, 'http_csp': {'name': 'http_csp', 'label': 'detail web appsecpriv http-csp label', 'status': 2, 'worst_status': 2, 'verdict': 'detail web appsecpriv http-csp verdict bad', 'exp': 'detail web appsecpriv http-csp exp', 'tech_type': 'table_translatable', 'tech_string': 'detail web appsecpriv http-csp tech table', 'tech_data': [{'msgid': 'detail tech data http-csp no-policy-found', 'context': {}}], 'override_mandatory': None}, 'http_x_content_type': {'name': 'http_x_content_type', 'label': 'detail web appsecpriv http-x-content-type label', 'status': 2, 'worst_status': 2, 'verdict': 'detail web appsecpriv http-x-content-type verdict bad', 'exp': 'detail web appsecpriv http-x-content-type exp', 'tech_type': 'table', 'tech_string': 'detail web appsecpriv http-x-content-type tech table', 'tech_data': '', 'override_mandatory': None}, 'http_securitytxt': {'name': 'http_securitytxt', 'label': 'detail web appsecpriv http-securitytxt label', 'status': 2, 'worst_status': 2, 'verdict': 'detail web appsecpriv http-securitytxt verdict bad', 'exp': 'detail web appsecpriv http-securitytxt exp', 'tech_type': 'table_translatable', 'tech_string': 'detail web appsecpriv http-securitytxt tech table', 'tech_data': [{'msgid': 'detail tech data http-securitytxt requested-from', 'context': {'hostname': 'ok.bogussig.ok.bad-dnssec.wb.sidnlabs.nl'}}, {'msgid': 'detail tech data http-securitytxt no_security_txt_404', 'context': {}}], 'override_mandatory': None}}", + "webdomain": 9007, + "server_reachable": true, + "score": 0, + "x_frame_options_enabled": false, + "x_frame_options_values": "[]", + "x_frame_options_score": 0, + "x_xss_protection_enabled": false, + "x_xss_protection_values": "[]", + "x_xss_protection_score": null, + "referrer_policy_enabled": true, + "referrer_policy_values": "[]", + "referrer_policy_errors": "[]", + "referrer_policy_recommendations": "[{'msgid': 'no-policy'}]", + "referrer_policy_score": 10, + "content_security_policy_enabled": false, + "content_security_policy_values": "[]", + "content_security_policy_errors": "[]", + "content_security_policy_score": 0, + "x_content_type_options_enabled": false, + "x_content_type_options_values": "[]", + "x_content_type_options_score": 0, + "securitytxt_enabled": false, + "securitytxt_errors": "[{'msgid': 'no_security_txt_404'}]", + "securitytxt_recommendations": "[]", + "securitytxt_score": 10, + "securitytxt_found_host": "ok.bogussig.ok.bad-dnssec.wb.sidnlabs.nl" + } + }, + { + "model": "checks.domaintestappsecpriv", + "pk": 9011, + "fields": { + "timestamp": "2025-03-14T15:19:21.688Z", + "domain": "54.200.198.48", + "report": "{'http_x_frame': {'name': 'http_x_frame', 'label': 'detail web appsecpriv http-x-frame label', 'status': 5, 'worst_status': 5, 'verdict': 'detail web appsecpriv http-x-frame verdict bad', 'exp': 'detail web appsecpriv http-x-frame exp', 'tech_type': 'table', 'tech_string': 'detail web appsecpriv http-x-frame tech table', 'tech_data': '', 'override_mandatory': None}, 'http_referrer_policy': {'name': 'http_referrer_policy', 'label': 'detail web appsecpriv http-referrer-policy label', 'status': 5, 'worst_status': 2, 'verdict': 'detail web appsecpriv http-referrer-policy verdict recommendations', 'exp': 'detail web appsecpriv http-referrer-policy exp', 'tech_type': 'table_translatable', 'tech_string': 'detail web appsecpriv http-referrer-policy tech table', 'tech_data': [{'msgid': 'detail tech data http-referrer-policy no-policy', 'context': {}}], 'override_mandatory': None}, 'http_csp': {'name': 'http_csp', 'label': 'detail web appsecpriv http-csp label', 'status': 2, 'worst_status': 2, 'verdict': 'detail web appsecpriv http-csp verdict bad', 'exp': 'detail web appsecpriv http-csp exp', 'tech_type': 'table_translatable', 'tech_string': 'detail web appsecpriv http-csp tech table', 'tech_data': [{'msgid': 'detail tech data http-csp no-policy-found', 'context': {}}], 'override_mandatory': None}, 'http_x_content_type': {'name': 'http_x_content_type', 'label': 'detail web appsecpriv http-x-content-type label', 'status': 2, 'worst_status': 2, 'verdict': 'detail web appsecpriv http-x-content-type verdict bad', 'exp': 'detail web appsecpriv http-x-content-type exp', 'tech_type': 'table', 'tech_string': 'detail web appsecpriv http-x-content-type tech table', 'tech_data': '', 'override_mandatory': None}, 'http_securitytxt': {'name': 'http_securitytxt', 'label': 'detail web appsecpriv http-securitytxt label', 'status': 2, 'worst_status': 2, 'verdict': 'detail web appsecpriv http-securitytxt verdict bad', 'exp': 'detail web appsecpriv http-securitytxt exp', 'tech_type': 'table_translatable', 'tech_string': 'detail web appsecpriv http-securitytxt tech table', 'tech_data': [{'msgid': 'detail tech data http-securitytxt requested-from', 'context': {'hostname': 'badhash.dane.huque.com'}}, {'msgid': 'detail tech data http-securitytxt no_security_txt_404', 'context': {}}], 'override_mandatory': None}}", + "webdomain": 9008, + "server_reachable": true, + "score": 0, + "x_frame_options_enabled": false, + "x_frame_options_values": "[]", + "x_frame_options_score": 0, + "x_xss_protection_enabled": false, + "x_xss_protection_values": "[]", + "x_xss_protection_score": null, + "referrer_policy_enabled": true, + "referrer_policy_values": "[]", + "referrer_policy_errors": "[]", + "referrer_policy_recommendations": "[{'msgid': 'no-policy'}]", + "referrer_policy_score": 10, + "content_security_policy_enabled": false, + "content_security_policy_values": "[]", + "content_security_policy_errors": "[]", + "content_security_policy_score": 0, + "x_content_type_options_enabled": false, + "x_content_type_options_values": "[]", + "x_content_type_options_score": 0, + "securitytxt_enabled": false, + "securitytxt_errors": "[{'msgid': 'no_security_txt_404'}]", + "securitytxt_recommendations": "[]", + "securitytxt_score": 10, + "securitytxt_found_host": "badhash.dane.huque.com" + } + }, + { + "model": "checks.domaintestappsecpriv", + "pk": 9012, + "fields": { + "timestamp": "2025-03-14T15:19:58.836Z", + "domain": "104.154.89.105", + "report": "{'http_x_frame': {'name': 'http_x_frame', 'label': 'detail web appsecpriv http-x-frame label', 'status': 5, 'worst_status': 5, 'verdict': 'detail web appsecpriv http-x-frame verdict bad', 'exp': 'detail web appsecpriv http-x-frame exp', 'tech_type': 'table', 'tech_string': 'detail web appsecpriv http-x-frame tech table', 'tech_data': '', 'override_mandatory': None}, 'http_referrer_policy': {'name': 'http_referrer_policy', 'label': 'detail web appsecpriv http-referrer-policy label', 'status': 5, 'worst_status': 2, 'verdict': 'detail web appsecpriv http-referrer-policy verdict recommendations', 'exp': 'detail web appsecpriv http-referrer-policy exp', 'tech_type': 'table_translatable', 'tech_string': 'detail web appsecpriv http-referrer-policy tech table', 'tech_data': [{'msgid': 'detail tech data http-referrer-policy no-policy', 'context': {}}], 'override_mandatory': None}, 'http_csp': {'name': 'http_csp', 'label': 'detail web appsecpriv http-csp label', 'status': 2, 'worst_status': 2, 'verdict': 'detail web appsecpriv http-csp verdict bad', 'exp': 'detail web appsecpriv http-csp exp', 'tech_type': 'table_translatable', 'tech_string': 'detail web appsecpriv http-csp tech table', 'tech_data': [{'msgid': 'detail tech data http-csp no-policy-found', 'context': {}}], 'override_mandatory': None}, 'http_x_content_type': {'name': 'http_x_content_type', 'label': 'detail web appsecpriv http-x-content-type label', 'status': 2, 'worst_status': 2, 'verdict': 'detail web appsecpriv http-x-content-type verdict bad', 'exp': 'detail web appsecpriv http-x-content-type exp', 'tech_type': 'table', 'tech_string': 'detail web appsecpriv http-x-content-type tech table', 'tech_data': '', 'override_mandatory': None}, 'http_securitytxt': {'name': 'http_securitytxt', 'label': 'detail web appsecpriv http-securitytxt label', 'status': 2, 'worst_status': 2, 'verdict': 'detail web appsecpriv http-securitytxt verdict bad', 'exp': 'detail web appsecpriv http-securitytxt exp', 'tech_type': 'table_translatable', 'tech_string': 'detail web appsecpriv http-securitytxt tech table', 'tech_data': [{'msgid': 'detail tech data http-securitytxt requested-from', 'context': {'hostname': 'expired.badssl.com'}}, {'msgid': 'detail tech data http-securitytxt no_security_txt_404', 'context': {}}], 'override_mandatory': None}}", + "webdomain": 9009, + "server_reachable": true, + "score": 0, + "x_frame_options_enabled": false, + "x_frame_options_values": "[]", + "x_frame_options_score": 0, + "x_xss_protection_enabled": false, + "x_xss_protection_values": "[]", + "x_xss_protection_score": null, + "referrer_policy_enabled": true, + "referrer_policy_values": "[]", + "referrer_policy_errors": "[]", + "referrer_policy_recommendations": "[{'msgid': 'no-policy'}]", + "referrer_policy_score": 10, + "content_security_policy_enabled": false, + "content_security_policy_values": "[]", + "content_security_policy_errors": "[]", + "content_security_policy_score": 0, + "x_content_type_options_enabled": false, + "x_content_type_options_values": "[]", + "x_content_type_options_score": 0, + "securitytxt_enabled": false, + "securitytxt_errors": "[{'msgid': 'no_security_txt_404'}]", + "securitytxt_recommendations": "[]", + "securitytxt_score": 10, + "securitytxt_found_host": "expired.badssl.com" + } + }, + { + "model": "checks.domaintestappsecpriv", + "pk": 9013, + "fields": { + "timestamp": "2025-03-14T15:20:27.455Z", + "domain": "104.154.89.105", + "report": "{'http_x_frame': {'name': 'http_x_frame', 'label': 'detail web appsecpriv http-x-frame label', 'status': 5, 'worst_status': 5, 'verdict': 'detail web appsecpriv http-x-frame verdict bad', 'exp': 'detail web appsecpriv http-x-frame exp', 'tech_type': 'table', 'tech_string': 'detail web appsecpriv http-x-frame tech table', 'tech_data': '', 'override_mandatory': None}, 'http_referrer_policy': {'name': 'http_referrer_policy', 'label': 'detail web appsecpriv http-referrer-policy label', 'status': 5, 'worst_status': 2, 'verdict': 'detail web appsecpriv http-referrer-policy verdict recommendations', 'exp': 'detail web appsecpriv http-referrer-policy exp', 'tech_type': 'table_translatable', 'tech_string': 'detail web appsecpriv http-referrer-policy tech table', 'tech_data': [{'msgid': 'detail tech data http-referrer-policy no-policy', 'context': {}}], 'override_mandatory': None}, 'http_csp': {'name': 'http_csp', 'label': 'detail web appsecpriv http-csp label', 'status': 2, 'worst_status': 2, 'verdict': 'detail web appsecpriv http-csp verdict bad', 'exp': 'detail web appsecpriv http-csp exp', 'tech_type': 'table_translatable', 'tech_string': 'detail web appsecpriv http-csp tech table', 'tech_data': [{'msgid': 'detail tech data http-csp no-policy-found', 'context': {}}], 'override_mandatory': None}, 'http_x_content_type': {'name': 'http_x_content_type', 'label': 'detail web appsecpriv http-x-content-type label', 'status': 2, 'worst_status': 2, 'verdict': 'detail web appsecpriv http-x-content-type verdict bad', 'exp': 'detail web appsecpriv http-x-content-type exp', 'tech_type': 'table', 'tech_string': 'detail web appsecpriv http-x-content-type tech table', 'tech_data': '', 'override_mandatory': None}, 'http_securitytxt': {'name': 'http_securitytxt', 'label': 'detail web appsecpriv http-securitytxt label', 'status': 2, 'worst_status': 2, 'verdict': 'detail web appsecpriv http-securitytxt verdict bad', 'exp': 'detail web appsecpriv http-securitytxt exp', 'tech_type': 'table_translatable', 'tech_string': 'detail web appsecpriv http-securitytxt tech table', 'tech_data': [{'msgid': 'detail tech data http-securitytxt requested-from', 'context': {'hostname': 'wrong.host.badssl.com'}}, {'msgid': 'detail tech data http-securitytxt no_security_txt_404', 'context': {}}], 'override_mandatory': None}}", + "webdomain": 9010, + "server_reachable": true, + "score": 0, + "x_frame_options_enabled": false, + "x_frame_options_values": "[]", + "x_frame_options_score": 0, + "x_xss_protection_enabled": false, + "x_xss_protection_values": "[]", + "x_xss_protection_score": null, + "referrer_policy_enabled": true, + "referrer_policy_values": "[]", + "referrer_policy_errors": "[]", + "referrer_policy_recommendations": "[{'msgid': 'no-policy'}]", + "referrer_policy_score": 10, + "content_security_policy_enabled": false, + "content_security_policy_values": "[]", + "content_security_policy_errors": "[]", + "content_security_policy_score": 0, + "x_content_type_options_enabled": false, + "x_content_type_options_values": "[]", + "x_content_type_options_score": 0, + "securitytxt_enabled": false, + "securitytxt_errors": "[{'msgid': 'no_security_txt_404'}]", + "securitytxt_recommendations": "[]", + "securitytxt_score": 10, + "securitytxt_found_host": "wrong.host.badssl.com" + } + }, + { + "model": "checks.domaintestappsecpriv", + "pk": 9014, + "fields": { + "timestamp": "2025-03-14T15:20:55.911Z", + "domain": "104.154.89.105", + "report": "{'http_x_frame': {'name': 'http_x_frame', 'label': 'detail web appsecpriv http-x-frame label', 'status': 5, 'worst_status': 5, 'verdict': 'detail web appsecpriv http-x-frame verdict bad', 'exp': 'detail web appsecpriv http-x-frame exp', 'tech_type': 'table', 'tech_string': 'detail web appsecpriv http-x-frame tech table', 'tech_data': '', 'override_mandatory': None}, 'http_referrer_policy': {'name': 'http_referrer_policy', 'label': 'detail web appsecpriv http-referrer-policy label', 'status': 5, 'worst_status': 2, 'verdict': 'detail web appsecpriv http-referrer-policy verdict recommendations', 'exp': 'detail web appsecpriv http-referrer-policy exp', 'tech_type': 'table_translatable', 'tech_string': 'detail web appsecpriv http-referrer-policy tech table', 'tech_data': [{'msgid': 'detail tech data http-referrer-policy no-policy', 'context': {}}], 'override_mandatory': None}, 'http_csp': {'name': 'http_csp', 'label': 'detail web appsecpriv http-csp label', 'status': 2, 'worst_status': 2, 'verdict': 'detail web appsecpriv http-csp verdict bad', 'exp': 'detail web appsecpriv http-csp exp', 'tech_type': 'table_translatable', 'tech_string': 'detail web appsecpriv http-csp tech table', 'tech_data': [{'msgid': 'detail tech data http-csp no-policy-found', 'context': {}}], 'override_mandatory': None}, 'http_x_content_type': {'name': 'http_x_content_type', 'label': 'detail web appsecpriv http-x-content-type label', 'status': 2, 'worst_status': 2, 'verdict': 'detail web appsecpriv http-x-content-type verdict bad', 'exp': 'detail web appsecpriv http-x-content-type exp', 'tech_type': 'table', 'tech_string': 'detail web appsecpriv http-x-content-type tech table', 'tech_data': '', 'override_mandatory': None}, 'http_securitytxt': {'name': 'http_securitytxt', 'label': 'detail web appsecpriv http-securitytxt label', 'status': 2, 'worst_status': 2, 'verdict': 'detail web appsecpriv http-securitytxt verdict bad', 'exp': 'detail web appsecpriv http-securitytxt exp', 'tech_type': 'table_translatable', 'tech_string': 'detail web appsecpriv http-securitytxt tech table', 'tech_data': [{'msgid': 'detail tech data http-securitytxt requested-from', 'context': {'hostname': 'self-signed.badssl.com'}}, {'msgid': 'detail tech data http-securitytxt no_security_txt_404', 'context': {}}], 'override_mandatory': None}}", + "webdomain": 9011, + "server_reachable": true, + "score": 0, + "x_frame_options_enabled": false, + "x_frame_options_values": "[]", + "x_frame_options_score": 0, + "x_xss_protection_enabled": false, + "x_xss_protection_values": "[]", + "x_xss_protection_score": null, + "referrer_policy_enabled": true, + "referrer_policy_values": "[]", + "referrer_policy_errors": "[]", + "referrer_policy_recommendations": "[{'msgid': 'no-policy'}]", + "referrer_policy_score": 10, + "content_security_policy_enabled": false, + "content_security_policy_values": "[]", + "content_security_policy_errors": "[]", + "content_security_policy_score": 0, + "x_content_type_options_enabled": false, + "x_content_type_options_values": "[]", + "x_content_type_options_score": 0, + "securitytxt_enabled": false, + "securitytxt_errors": "[{'msgid': 'no_security_txt_404'}]", + "securitytxt_recommendations": "[]", + "securitytxt_score": 10, + "securitytxt_found_host": "self-signed.badssl.com" + } + }, + { + "model": "checks.domaintestappsecpriv", + "pk": 9015, + "fields": { + "timestamp": "2025-03-14T15:21:24.508Z", + "domain": "104.154.89.105", + "report": "{'http_x_frame': {'name': 'http_x_frame', 'label': 'detail web appsecpriv http-x-frame label', 'status': 5, 'worst_status': 5, 'verdict': 'detail web appsecpriv http-x-frame verdict bad', 'exp': 'detail web appsecpriv http-x-frame exp', 'tech_type': 'table', 'tech_string': 'detail web appsecpriv http-x-frame tech table', 'tech_data': '', 'override_mandatory': None}, 'http_referrer_policy': {'name': 'http_referrer_policy', 'label': 'detail web appsecpriv http-referrer-policy label', 'status': 5, 'worst_status': 2, 'verdict': 'detail web appsecpriv http-referrer-policy verdict recommendations', 'exp': 'detail web appsecpriv http-referrer-policy exp', 'tech_type': 'table_translatable', 'tech_string': 'detail web appsecpriv http-referrer-policy tech table', 'tech_data': [{'msgid': 'detail tech data http-referrer-policy no-policy', 'context': {}}], 'override_mandatory': None}, 'http_csp': {'name': 'http_csp', 'label': 'detail web appsecpriv http-csp label', 'status': 2, 'worst_status': 2, 'verdict': 'detail web appsecpriv http-csp verdict bad', 'exp': 'detail web appsecpriv http-csp exp', 'tech_type': 'table_translatable', 'tech_string': 'detail web appsecpriv http-csp tech table', 'tech_data': [{'msgid': 'detail tech data http-csp no-policy-found', 'context': {}}], 'override_mandatory': None}, 'http_x_content_type': {'name': 'http_x_content_type', 'label': 'detail web appsecpriv http-x-content-type label', 'status': 2, 'worst_status': 2, 'verdict': 'detail web appsecpriv http-x-content-type verdict bad', 'exp': 'detail web appsecpriv http-x-content-type exp', 'tech_type': 'table', 'tech_string': 'detail web appsecpriv http-x-content-type tech table', 'tech_data': '', 'override_mandatory': None}, 'http_securitytxt': {'name': 'http_securitytxt', 'label': 'detail web appsecpriv http-securitytxt label', 'status': 2, 'worst_status': 2, 'verdict': 'detail web appsecpriv http-securitytxt verdict bad', 'exp': 'detail web appsecpriv http-securitytxt exp', 'tech_type': 'table_translatable', 'tech_string': 'detail web appsecpriv http-securitytxt tech table', 'tech_data': [{'msgid': 'detail tech data http-securitytxt requested-from', 'context': {'hostname': 'untrusted-root.badssl.com'}}, {'msgid': 'detail tech data http-securitytxt no_security_txt_404', 'context': {}}], 'override_mandatory': None}}", + "webdomain": 9012, + "server_reachable": true, + "score": 0, + "x_frame_options_enabled": false, + "x_frame_options_values": "[]", + "x_frame_options_score": 0, + "x_xss_protection_enabled": false, + "x_xss_protection_values": "[]", + "x_xss_protection_score": null, + "referrer_policy_enabled": true, + "referrer_policy_values": "[]", + "referrer_policy_errors": "[]", + "referrer_policy_recommendations": "[{'msgid': 'no-policy'}]", + "referrer_policy_score": 10, + "content_security_policy_enabled": false, + "content_security_policy_values": "[]", + "content_security_policy_errors": "[]", + "content_security_policy_score": 0, + "x_content_type_options_enabled": false, + "x_content_type_options_values": "[]", + "x_content_type_options_score": 0, + "securitytxt_enabled": false, + "securitytxt_errors": "[{'msgid': 'no_security_txt_404'}]", + "securitytxt_recommendations": "[]", + "securitytxt_score": 10, + "securitytxt_found_host": "untrusted-root.badssl.com" + } + }, + { + "model": "checks.domaintestappsecpriv", + "pk": 9016, + "fields": { + "timestamp": "2025-03-14T15:21:53.349Z", + "domain": "104.154.89.105", + "report": "{'http_x_frame': {'name': 'http_x_frame', 'label': 'detail web appsecpriv http-x-frame label', 'status': 5, 'worst_status': 5, 'verdict': 'detail web appsecpriv http-x-frame verdict bad', 'exp': 'detail web appsecpriv http-x-frame exp', 'tech_type': 'table', 'tech_string': 'detail web appsecpriv http-x-frame tech table', 'tech_data': '', 'override_mandatory': None}, 'http_referrer_policy': {'name': 'http_referrer_policy', 'label': 'detail web appsecpriv http-referrer-policy label', 'status': 5, 'worst_status': 2, 'verdict': 'detail web appsecpriv http-referrer-policy verdict recommendations', 'exp': 'detail web appsecpriv http-referrer-policy exp', 'tech_type': 'table_translatable', 'tech_string': 'detail web appsecpriv http-referrer-policy tech table', 'tech_data': [{'msgid': 'detail tech data http-referrer-policy no-policy', 'context': {}}], 'override_mandatory': None}, 'http_csp': {'name': 'http_csp', 'label': 'detail web appsecpriv http-csp label', 'status': 2, 'worst_status': 2, 'verdict': 'detail web appsecpriv http-csp verdict bad', 'exp': 'detail web appsecpriv http-csp exp', 'tech_type': 'table_translatable', 'tech_string': 'detail web appsecpriv http-csp tech table', 'tech_data': [{'msgid': 'detail tech data http-csp no-policy-found', 'context': {}}], 'override_mandatory': None}, 'http_x_content_type': {'name': 'http_x_content_type', 'label': 'detail web appsecpriv http-x-content-type label', 'status': 2, 'worst_status': 2, 'verdict': 'detail web appsecpriv http-x-content-type verdict bad', 'exp': 'detail web appsecpriv http-x-content-type exp', 'tech_type': 'table', 'tech_string': 'detail web appsecpriv http-x-content-type tech table', 'tech_data': '', 'override_mandatory': None}, 'http_securitytxt': {'name': 'http_securitytxt', 'label': 'detail web appsecpriv http-securitytxt label', 'status': 2, 'worst_status': 2, 'verdict': 'detail web appsecpriv http-securitytxt verdict bad', 'exp': 'detail web appsecpriv http-securitytxt exp', 'tech_type': 'table_translatable', 'tech_string': 'detail web appsecpriv http-securitytxt tech table', 'tech_data': [{'msgid': 'detail tech data http-securitytxt requested-from', 'context': {'hostname': 'revoked.badssl.com'}}, {'msgid': 'detail tech data http-securitytxt no_security_txt_404', 'context': {}}], 'override_mandatory': None}}", + "webdomain": 9013, + "server_reachable": true, + "score": 0, + "x_frame_options_enabled": false, + "x_frame_options_values": "[]", + "x_frame_options_score": 0, + "x_xss_protection_enabled": false, + "x_xss_protection_values": "[]", + "x_xss_protection_score": null, + "referrer_policy_enabled": true, + "referrer_policy_values": "[]", + "referrer_policy_errors": "[]", + "referrer_policy_recommendations": "[{'msgid': 'no-policy'}]", + "referrer_policy_score": 10, + "content_security_policy_enabled": false, + "content_security_policy_values": "[]", + "content_security_policy_errors": "[]", + "content_security_policy_score": 0, + "x_content_type_options_enabled": false, + "x_content_type_options_values": "[]", + "x_content_type_options_score": 0, + "securitytxt_enabled": false, + "securitytxt_errors": "[{'msgid': 'no_security_txt_404'}]", + "securitytxt_recommendations": "[]", + "securitytxt_score": 10, + "securitytxt_found_host": "revoked.badssl.com" + } + }, + { + "model": "checks.domaintestappsecpriv", + "pk": 9017, + "fields": { + "timestamp": "2025-03-14T15:22:12.883Z", + "domain": "104.154.89.105", + "report": "{'http_x_frame': {'name': 'http_x_frame', 'label': 'detail web appsecpriv http-x-frame label', 'status': 5, 'worst_status': 5, 'verdict': 'detail web appsecpriv http-x-frame verdict bad', 'exp': 'detail web appsecpriv http-x-frame exp', 'tech_type': 'table', 'tech_string': 'detail web appsecpriv http-x-frame tech table', 'tech_data': '', 'override_mandatory': None}, 'http_referrer_policy': {'name': 'http_referrer_policy', 'label': 'detail web appsecpriv http-referrer-policy label', 'status': 5, 'worst_status': 2, 'verdict': 'detail web appsecpriv http-referrer-policy verdict recommendations', 'exp': 'detail web appsecpriv http-referrer-policy exp', 'tech_type': 'table_translatable', 'tech_string': 'detail web appsecpriv http-referrer-policy tech table', 'tech_data': [{'msgid': 'detail tech data http-referrer-policy no-policy', 'context': {}}], 'override_mandatory': None}, 'http_csp': {'name': 'http_csp', 'label': 'detail web appsecpriv http-csp label', 'status': 2, 'worst_status': 2, 'verdict': 'detail web appsecpriv http-csp verdict bad', 'exp': 'detail web appsecpriv http-csp exp', 'tech_type': 'table_translatable', 'tech_string': 'detail web appsecpriv http-csp tech table', 'tech_data': [{'msgid': 'detail tech data http-csp no-policy-found', 'context': {}}], 'override_mandatory': None}, 'http_x_content_type': {'name': 'http_x_content_type', 'label': 'detail web appsecpriv http-x-content-type label', 'status': 2, 'worst_status': 2, 'verdict': 'detail web appsecpriv http-x-content-type verdict bad', 'exp': 'detail web appsecpriv http-x-content-type exp', 'tech_type': 'table', 'tech_string': 'detail web appsecpriv http-x-content-type tech table', 'tech_data': '', 'override_mandatory': None}, 'http_securitytxt': {'name': 'http_securitytxt', 'label': 'detail web appsecpriv http-securitytxt label', 'status': 2, 'worst_status': 2, 'verdict': 'detail web appsecpriv http-securitytxt verdict bad', 'exp': 'detail web appsecpriv http-securitytxt exp', 'tech_type': 'table_translatable', 'tech_string': 'detail web appsecpriv http-securitytxt tech table', 'tech_data': [{'msgid': 'detail tech data http-securitytxt requested-from', 'context': {'hostname': 'pinning-test.badssl.com'}}, {'msgid': 'detail tech data http-securitytxt no_security_txt_404', 'context': {}}], 'override_mandatory': None}}", + "webdomain": 9014, + "server_reachable": true, + "score": 0, + "x_frame_options_enabled": false, + "x_frame_options_values": "[]", + "x_frame_options_score": 0, + "x_xss_protection_enabled": false, + "x_xss_protection_values": "[]", + "x_xss_protection_score": null, + "referrer_policy_enabled": true, + "referrer_policy_values": "[]", + "referrer_policy_errors": "[]", + "referrer_policy_recommendations": "[{'msgid': 'no-policy'}]", + "referrer_policy_score": 10, + "content_security_policy_enabled": false, + "content_security_policy_values": "[]", + "content_security_policy_errors": "[]", + "content_security_policy_score": 0, + "x_content_type_options_enabled": false, + "x_content_type_options_values": "[]", + "x_content_type_options_score": 0, + "securitytxt_enabled": false, + "securitytxt_errors": "[{'msgid': 'no_security_txt_404'}]", + "securitytxt_recommendations": "[]", + "securitytxt_score": 10, + "securitytxt_found_host": "pinning-test.badssl.com" + } + }, + { + "model": "checks.domaintestappsecpriv", + "pk": 9018, + "fields": { + "timestamp": "2025-03-14T15:22:40.061Z", + "domain": "103.21.244.9", + "report": "{'http_x_frame': {'name': 'http_x_frame', 'label': 'detail web appsecpriv http-x-frame label', 'status': 5, 'worst_status': 5, 'verdict': 'detail web appsecpriv http-x-frame verdict bad', 'exp': 'detail web appsecpriv http-x-frame exp', 'tech_type': 'table', 'tech_string': 'detail web appsecpriv http-x-frame tech table', 'tech_data': '', 'override_mandatory': None}, 'http_referrer_policy': {'name': 'http_referrer_policy', 'label': 'detail web appsecpriv http-referrer-policy label', 'status': 5, 'worst_status': 2, 'verdict': 'detail web appsecpriv http-referrer-policy verdict recommendations', 'exp': 'detail web appsecpriv http-referrer-policy exp', 'tech_type': 'table_translatable', 'tech_string': 'detail web appsecpriv http-referrer-policy tech table', 'tech_data': [{'msgid': 'detail tech data http-referrer-policy no-policy', 'context': {}}], 'override_mandatory': None}, 'http_csp': {'name': 'http_csp', 'label': 'detail web appsecpriv http-csp label', 'status': 2, 'worst_status': 2, 'verdict': 'detail web appsecpriv http-csp verdict bad', 'exp': 'detail web appsecpriv http-csp exp', 'tech_type': 'table_translatable', 'tech_string': 'detail web appsecpriv http-csp tech table', 'tech_data': [{'msgid': 'detail tech data http-csp no-policy-found', 'context': {}}], 'override_mandatory': None}, 'http_x_content_type': {'name': 'http_x_content_type', 'label': 'detail web appsecpriv http-x-content-type label', 'status': 1, 'worst_status': 2, 'verdict': 'detail web appsecpriv http-x-content-type verdict good', 'exp': 'detail web appsecpriv http-x-content-type exp', 'tech_type': 'table', 'tech_string': 'detail web appsecpriv http-x-content-type tech table', 'tech_data': ['nosniff'], 'override_mandatory': None}, 'http_securitytxt': {'name': 'http_securitytxt', 'label': 'detail web appsecpriv http-securitytxt label', 'status': 2, 'worst_status': 2, 'verdict': 'detail web appsecpriv http-securitytxt verdict bad', 'exp': 'detail web appsecpriv http-securitytxt exp', 'tech_type': 'table_translatable', 'tech_string': 'detail web appsecpriv http-securitytxt tech table', 'tech_data': [{'msgid': 'detail tech data http-securitytxt requested-from', 'context': {'hostname': 'invalid.rpki.isbgpsafeyet.com'}}, {'msgid': 'detail tech data http-securitytxt invalid_media', 'context': {}}], 'override_mandatory': None}}", + "webdomain": 9015, + "server_reachable": true, + "score": 0, + "x_frame_options_enabled": false, + "x_frame_options_values": "[]", + "x_frame_options_score": 0, + "x_xss_protection_enabled": false, + "x_xss_protection_values": "[]", + "x_xss_protection_score": null, + "referrer_policy_enabled": true, + "referrer_policy_values": "[]", + "referrer_policy_errors": "[]", + "referrer_policy_recommendations": "[{'msgid': 'no-policy'}]", + "referrer_policy_score": 10, + "content_security_policy_enabled": false, + "content_security_policy_values": "[]", + "content_security_policy_errors": "[]", + "content_security_policy_score": 0, + "x_content_type_options_enabled": true, + "x_content_type_options_values": "['nosniff']", + "x_content_type_options_score": 10, + "securitytxt_enabled": false, + "securitytxt_errors": "[{'msgid': 'invalid_media'}]", + "securitytxt_recommendations": "[]", + "securitytxt_score": 10, + "securitytxt_found_host": "invalid.rpki.isbgpsafeyet.com" + } + }, + { + "model": "checks.domaintestappsecpriv", + "pk": 9019, + "fields": { + "timestamp": "2025-03-14T15:22:40.066Z", + "domain": "2606:4700:7000::6715:f409", + "report": "{'http_x_frame': {'name': 'http_x_frame', 'label': 'detail web appsecpriv http-x-frame label', 'status': 5, 'worst_status': 5, 'verdict': 'detail web appsecpriv http-x-frame verdict bad', 'exp': 'detail web appsecpriv http-x-frame exp', 'tech_type': 'table', 'tech_string': 'detail web appsecpriv http-x-frame tech table', 'tech_data': '', 'override_mandatory': None}, 'http_referrer_policy': {'name': 'http_referrer_policy', 'label': 'detail web appsecpriv http-referrer-policy label', 'status': 5, 'worst_status': 2, 'verdict': 'detail web appsecpriv http-referrer-policy verdict recommendations', 'exp': 'detail web appsecpriv http-referrer-policy exp', 'tech_type': 'table_translatable', 'tech_string': 'detail web appsecpriv http-referrer-policy tech table', 'tech_data': [{'msgid': 'detail tech data http-referrer-policy no-policy', 'context': {}}], 'override_mandatory': None}, 'http_csp': {'name': 'http_csp', 'label': 'detail web appsecpriv http-csp label', 'status': 2, 'worst_status': 2, 'verdict': 'detail web appsecpriv http-csp verdict bad', 'exp': 'detail web appsecpriv http-csp exp', 'tech_type': 'table_translatable', 'tech_string': 'detail web appsecpriv http-csp tech table', 'tech_data': [{'msgid': 'detail tech data http-csp no-policy-found', 'context': {}}], 'override_mandatory': None}, 'http_x_content_type': {'name': 'http_x_content_type', 'label': 'detail web appsecpriv http-x-content-type label', 'status': 1, 'worst_status': 2, 'verdict': 'detail web appsecpriv http-x-content-type verdict good', 'exp': 'detail web appsecpriv http-x-content-type exp', 'tech_type': 'table', 'tech_string': 'detail web appsecpriv http-x-content-type tech table', 'tech_data': ['nosniff'], 'override_mandatory': None}, 'http_securitytxt': {'name': 'http_securitytxt', 'label': 'detail web appsecpriv http-securitytxt label', 'status': 2, 'worst_status': 2, 'verdict': 'detail web appsecpriv http-securitytxt verdict bad', 'exp': 'detail web appsecpriv http-securitytxt exp', 'tech_type': 'table_translatable', 'tech_string': 'detail web appsecpriv http-securitytxt tech table', 'tech_data': [{'msgid': 'detail tech data http-securitytxt requested-from', 'context': {'hostname': 'invalid.rpki.isbgpsafeyet.com'}}, {'msgid': 'detail tech data http-securitytxt invalid_media', 'context': {}}], 'override_mandatory': None}}", + "webdomain": 9015, + "server_reachable": true, + "score": 0, + "x_frame_options_enabled": false, + "x_frame_options_values": "[]", + "x_frame_options_score": 0, + "x_xss_protection_enabled": false, + "x_xss_protection_values": "[]", + "x_xss_protection_score": null, + "referrer_policy_enabled": true, + "referrer_policy_values": "[]", + "referrer_policy_errors": "[]", + "referrer_policy_recommendations": "[{'msgid': 'no-policy'}]", + "referrer_policy_score": 10, + "content_security_policy_enabled": false, + "content_security_policy_values": "[]", + "content_security_policy_errors": "[]", + "content_security_policy_score": 0, + "x_content_type_options_enabled": true, + "x_content_type_options_values": "['nosniff']", + "x_content_type_options_score": 10, + "securitytxt_enabled": false, + "securitytxt_errors": "[{'msgid': 'invalid_media'}]", + "securitytxt_recommendations": "[]", + "securitytxt_score": 10, + "securitytxt_found_host": "invalid.rpki.isbgpsafeyet.com" + } + }, + { + "model": "checks.webtestrpki", + "pk": 9000, + "fields": { + "timestamp": "2025-03-14T15:14:08.203Z", + "domain": "internet.nl", + "report": "{'web_rpki_exists': {'name': 'web_rpki_exists', 'label': 'detail web rpki exists label', 'status': 1, 'worst_status': 0, 'verdict': 'detail web rpki exists verdict good', 'exp': 'detail web rpki exists exp', 'tech_type': 'table_multi_col', 'tech_string': 'detail web rpki exists tech table', 'tech_data': [['internet.nl', '62.204.66.10', 'detail tech data yes'], ['...', '2a00:d00:ff:162:62:204:66:10', 'detail tech data yes']], 'override_mandatory': False}, 'web_rpki_valid': {'name': 'web_rpki_valid', 'label': 'detail web rpki valid label', 'status': 1, 'worst_status': 0, 'verdict': 'detail web rpki valid verdict good', 'exp': 'detail web rpki valid exp', 'tech_type': 'table', 'tech_string': 'detail web rpki valid tech table', 'tech_data': [['internet.nl', '62.204.64.0/19', 'AS41887', 'valid'], ['...', '62.204.64.0/20', 'AS41887', 'valid'], ['...', '2a00:d00::/32', 'AS41887', 'valid'], ['...', '2a00:d00::/29', 'AS41887', 'valid']], 'override_mandatory': False}, 'ns_rpki_exists': {'name': 'ns_rpki_exists', 'label': 'detail web-mail rpki ns-exists label', 'status': 1, 'worst_status': 0, 'verdict': 'detail web-mail rpki ns-exists verdict good', 'exp': 'detail web-mail rpki ns-exists exp', 'tech_type': 'table_multi_col', 'tech_string': 'detail web-mail rpki ns-exists tech table', 'tech_data': [['ns1.sidnlabs.nl.', '94.198.159.8', 'detail tech data yes'], ['...', '2a00:d78:0:712:94:198:159:8', 'detail tech data yes'], ['ns2.sidnlabs.nl.', '194.0.28.11', 'detail tech data yes'], ['...', '2001:678:2c:0:194:0:28:11', 'detail tech data yes'], ['ns5.sidn.nl.', '145.40.68.55', 'detail tech data yes'], ['...', '2604:1380:4601:6300::1', 'detail tech data yes']], 'override_mandatory': False}, 'ns_rpki_valid': {'name': 'ns_rpki_valid', 'label': 'detail web-mail rpki ns-valid label', 'status': 1, 'worst_status': 0, 'verdict': 'detail web-mail rpki ns-valid verdict good', 'exp': 'detail web-mail rpki ns-valid exp', 'tech_type': 'table', 'tech_string': 'detail web-mail rpki ns-valid tech table', 'tech_data': [['ns1.sidnlabs.nl.', '94.198.152.0/21', 'AS1140', 'valid'], ['...', '2a00:d78::/32', 'AS1140', 'valid'], ['ns2.sidnlabs.nl.', '194.0.28.0/24', 'AS48283', 'valid'], ['...', '2001:678:2c::/48', 'AS48283', 'valid'], ['ns5.sidn.nl.', '145.40.68.0/24', 'AS54825', 'valid'], ['...', '2604:1380:4600::/44', 'AS54825', 'valid']], 'override_mandatory': False}}", + "web_exists_score": 5, + "web_valid_score": 10, + "ns_exists_score": 5, + "ns_valid_score": 10, + "score": 30, + "max_score": 30 + } + }, + { + "model": "checks.webtestrpki", + "pk": 9001, + "fields": { + "timestamp": "2025-03-14T15:14:22.163Z", + "domain": "example.nl", + "report": "{'web_rpki_exists': {'name': 'web_rpki_exists', 'label': 'detail web rpki exists label', 'status': 1, 'worst_status': 0, 'verdict': 'detail web rpki exists verdict good', 'exp': 'detail web rpki exists exp', 'tech_type': 'table_multi_col', 'tech_string': 'detail web rpki exists tech table', 'tech_data': [['example.nl', '94.198.159.35', 'detail tech data yes'], ['...', '2a00:d78:0:712:94:198:159:35', 'detail tech data yes']], 'override_mandatory': False}, 'web_rpki_valid': {'name': 'web_rpki_valid', 'label': 'detail web rpki valid label', 'status': 1, 'worst_status': 0, 'verdict': 'detail web rpki valid verdict good', 'exp': 'detail web rpki valid exp', 'tech_type': 'table', 'tech_string': 'detail web rpki valid tech table', 'tech_data': [['example.nl', '94.198.152.0/21', 'AS1140', 'valid'], ['...', '2a00:d78::/32', 'AS1140', 'valid']], 'override_mandatory': False}, 'ns_rpki_exists': {'name': 'ns_rpki_exists', 'label': 'detail web-mail rpki ns-exists label', 'status': 1, 'worst_status': 0, 'verdict': 'detail web-mail rpki ns-exists verdict good', 'exp': 'detail web-mail rpki ns-exists exp', 'tech_type': 'table_multi_col', 'tech_string': 'detail web-mail rpki ns-exists tech table', 'tech_data': [['anytest1.sidnlabs.nl.', '194.0.5.53', 'detail tech data yes'], ['...', '2001:678:8::53', 'detail tech data yes'], ['ex1.sidnlabs.nl.', '94.198.159.8', 'detail tech data yes'], ['...', '2a00:d78:0:712:94:198:159:8', 'detail tech data yes'], ['ex2.sidnlabs.nl.', '145.40.68.55', 'detail tech data yes'], ['...', '2604:1380:4601:6300::1', 'detail tech data yes']], 'override_mandatory': False}, 'ns_rpki_valid': {'name': 'ns_rpki_valid', 'label': 'detail web-mail rpki ns-valid label', 'status': 1, 'worst_status': 0, 'verdict': 'detail web-mail rpki ns-valid verdict good', 'exp': 'detail web-mail rpki ns-valid exp', 'tech_type': 'table', 'tech_string': 'detail web-mail rpki ns-valid tech table', 'tech_data': [['anytest1.sidnlabs.nl.', '194.0.5.0/24', 'AS210004', 'valid'], ['...', '2001:678:8::/48', 'AS210004', 'valid'], ['ex1.sidnlabs.nl.', '94.198.152.0/21', 'AS1140', 'valid'], ['...', '2a00:d78::/32', 'AS1140', 'valid'], ['ex2.sidnlabs.nl.', '145.40.68.0/24', 'AS54825', 'valid'], ['...', '2604:1380:4600::/44', 'AS54825', 'valid']], 'override_mandatory': False}}", + "web_exists_score": 5, + "web_valid_score": 10, + "ns_exists_score": 5, + "ns_valid_score": 10, + "score": 30, + "max_score": 30 + } + }, + { + "model": "checks.webtestrpki", + "pk": 9002, + "fields": { + "timestamp": "2025-03-14T15:14:31.950Z", + "domain": "ipv6.internet.nl", + "report": "{'web_rpki_exists': {'name': 'web_rpki_exists', 'label': 'detail web rpki exists label', 'status': 1, 'worst_status': 0, 'verdict': 'detail web rpki exists verdict good', 'exp': 'detail web rpki exists exp', 'tech_type': 'table_multi_col', 'tech_string': 'detail web rpki exists tech table', 'tech_data': [['ipv6.internet.nl', '2a00:d00:ff:162:62:204:66:10', 'detail tech data yes']], 'override_mandatory': False}, 'web_rpki_valid': {'name': 'web_rpki_valid', 'label': 'detail web rpki valid label', 'status': 1, 'worst_status': 0, 'verdict': 'detail web rpki valid verdict good', 'exp': 'detail web rpki valid exp', 'tech_type': 'table', 'tech_string': 'detail web rpki valid tech table', 'tech_data': [['ipv6.internet.nl', '2a00:d00::/29', 'AS41887', 'valid'], ['...', '2a00:d00::/32', 'AS41887', 'valid']], 'override_mandatory': False}, 'ns_rpki_exists': {'name': 'ns_rpki_exists', 'label': 'detail web-mail rpki ns-exists label', 'status': 1, 'worst_status': 0, 'verdict': 'detail web-mail rpki ns-exists verdict good', 'exp': 'detail web-mail rpki ns-exists exp', 'tech_type': 'table_multi_col', 'tech_string': 'detail web-mail rpki ns-exists tech table', 'tech_data': [['ns1.sidnlabs.nl.', '94.198.159.8', 'detail tech data yes'], ['...', '2a00:d78:0:712:94:198:159:8', 'detail tech data yes'], ['ns2.sidnlabs.nl.', '194.0.28.11', 'detail tech data yes'], ['...', '2001:678:2c:0:194:0:28:11', 'detail tech data yes'], ['ns5.sidn.nl.', '145.40.68.55', 'detail tech data yes'], ['...', '2604:1380:4601:6300::1', 'detail tech data yes']], 'override_mandatory': False}, 'ns_rpki_valid': {'name': 'ns_rpki_valid', 'label': 'detail web-mail rpki ns-valid label', 'status': 1, 'worst_status': 0, 'verdict': 'detail web-mail rpki ns-valid verdict good', 'exp': 'detail web-mail rpki ns-valid exp', 'tech_type': 'table', 'tech_string': 'detail web-mail rpki ns-valid tech table', 'tech_data': [['ns1.sidnlabs.nl.', '94.198.152.0/21', 'AS1140', 'valid'], ['...', '2a00:d78::/32', 'AS1140', 'valid'], ['ns2.sidnlabs.nl.', '194.0.28.0/24', 'AS48283', 'valid'], ['...', '2001:678:2c::/48', 'AS48283', 'valid'], ['ns5.sidn.nl.', '145.40.68.0/24', 'AS54825', 'valid'], ['...', '2604:1380:4600::/44', 'AS54825', 'valid']], 'override_mandatory': False}}", + "web_exists_score": 5, + "web_valid_score": 10, + "ns_exists_score": 5, + "ns_valid_score": 10, + "score": 30, + "max_score": 30 + } + }, + { + "model": "checks.webtestrpki", + "pk": 9003, + "fields": { + "timestamp": "2025-03-14T15:14:40.730Z", + "domain": "forfun.net", + "report": "{'web_rpki_exists': {'name': 'web_rpki_exists', 'label': 'detail web rpki exists label', 'status': 1, 'worst_status': 0, 'verdict': 'detail web rpki exists verdict good', 'exp': 'detail web rpki exists exp', 'tech_type': 'table_multi_col', 'tech_string': 'detail web rpki exists tech table', 'tech_data': [['forfun.net', '2a05:1500:600:1:1c00:4aff:fe00:428', 'detail tech data yes']], 'override_mandatory': False}, 'web_rpki_valid': {'name': 'web_rpki_valid', 'label': 'detail web rpki valid label', 'status': 1, 'worst_status': 0, 'verdict': 'detail web rpki valid verdict good', 'exp': 'detail web rpki valid exp', 'tech_type': 'table', 'tech_string': 'detail web rpki valid tech table', 'tech_data': [['forfun.net', '2a05:1500:600::/40', 'AS48635', 'valid']], 'override_mandatory': False}, 'ns_rpki_exists': {'name': 'ns_rpki_exists', 'label': 'detail web-mail rpki ns-exists label', 'status': 1, 'worst_status': 0, 'verdict': 'detail web-mail rpki ns-exists verdict good', 'exp': 'detail web-mail rpki ns-exists exp', 'tech_type': 'table_multi_col', 'tech_string': 'detail web-mail rpki ns-exists tech table', 'tech_data': [['li1.forfun.net.', '96.126.104.187', 'detail tech data yes'], ['...', '2600:3c03::f03c:91ff:fedf:1e98', 'detail tech data yes'], ['ns3.surfnet.nl.', '195.169.124.71', 'detail tech data yes'], ['...', '2001:610:0:800c:195:169:124:71', 'detail tech data yes'], ['pdns-public-ns2.powerdns.com.', '45.55.10.200', 'detail tech data yes'], ['...', '2604:a880:1:20::132:5001', 'detail tech data yes']], 'override_mandatory': False}, 'ns_rpki_valid': {'name': 'ns_rpki_valid', 'label': 'detail web-mail rpki ns-valid label', 'status': 1, 'worst_status': 0, 'verdict': 'detail web-mail rpki ns-valid verdict good', 'exp': 'detail web-mail rpki ns-valid exp', 'tech_type': 'table', 'tech_string': 'detail web-mail rpki ns-valid tech table', 'tech_data': [['li1.forfun.net.', '96.126.104.0/21', 'AS63949', 'valid'], ['...', '2600:3c03::/32', 'AS63949', 'valid'], ['ns3.surfnet.nl.', '195.169.0.0/16', 'AS1103', 'valid'], ['...', '2001:610::/29', 'AS1103', 'valid'], ['pdns-public-ns2.powerdns.com.', '45.55.0.0/19', 'AS14061', 'valid'], ['...', '2604:a880:1::/48', 'AS14061', 'valid']], 'override_mandatory': False}}", + "web_exists_score": 5, + "web_valid_score": 10, + "ns_exists_score": 5, + "ns_valid_score": 10, + "score": 30, + "max_score": 30 + } + }, + { + "model": "checks.webtestrpki", + "pk": 9004, + "fields": { + "timestamp": "2025-03-14T15:14:48.657Z", + "domain": "ipv6.google.com", + "report": "{'web_rpki_exists': {'name': 'web_rpki_exists', 'label': 'detail web rpki exists label', 'status': 1, 'worst_status': 0, 'verdict': 'detail web rpki exists verdict good', 'exp': 'detail web rpki exists exp', 'tech_type': 'table_multi_col', 'tech_string': 'detail web rpki exists tech table', 'tech_data': [['ipv6.google.com', '2a00:1450:4026:804::200e', 'detail tech data yes']], 'override_mandatory': False}, 'web_rpki_valid': {'name': 'web_rpki_valid', 'label': 'detail web rpki valid label', 'status': 1, 'worst_status': 0, 'verdict': 'detail web rpki valid verdict good', 'exp': 'detail web rpki valid exp', 'tech_type': 'table', 'tech_string': 'detail web rpki valid tech table', 'tech_data': [['ipv6.google.com', '2a00:1450::/32', 'AS15169', 'valid']], 'override_mandatory': False}, 'ns_rpki_exists': {'name': 'ns_rpki_exists', 'label': 'detail web-mail rpki ns-exists label', 'status': 1, 'worst_status': 0, 'verdict': 'detail web-mail rpki ns-exists verdict good', 'exp': 'detail web-mail rpki ns-exists exp', 'tech_type': 'table_multi_col', 'tech_string': 'detail web-mail rpki ns-exists tech table', 'tech_data': [['ns1.google.com.', '216.239.32.10', 'detail tech data yes'], ['...', '2001:4860:4802:32::a', 'detail tech data yes'], ['ns2.google.com.', '216.239.34.10', 'detail tech data yes'], ['...', '2001:4860:4802:34::a', 'detail tech data yes'], ['ns3.google.com.', '216.239.36.10', 'detail tech data yes'], ['...', '2001:4860:4802:36::a', 'detail tech data yes'], ['ns4.google.com.', '216.239.38.10', 'detail tech data yes'], ['...', '2001:4860:4802:38::a', 'detail tech data yes']], 'override_mandatory': False}, 'ns_rpki_valid': {'name': 'ns_rpki_valid', 'label': 'detail web-mail rpki ns-valid label', 'status': 1, 'worst_status': 0, 'verdict': 'detail web-mail rpki ns-valid verdict good', 'exp': 'detail web-mail rpki ns-valid exp', 'tech_type': 'table', 'tech_string': 'detail web-mail rpki ns-valid tech table', 'tech_data': [['ns1.google.com.', '216.239.32.0/24', 'AS15169', 'valid'], ['...', '216.239.32.0/19', 'AS15169', 'valid'], ['...', '2001:4860::/32', 'AS15169', 'valid'], ['ns2.google.com.', '216.239.34.0/24', 'AS15169', 'valid'], ['...', '216.239.32.0/19', 'AS15169', 'valid'], ['...', '2001:4860::/32', 'AS15169', 'valid'], ['ns3.google.com.', '216.239.32.0/19', 'AS15169', 'valid'], ['...', '216.239.36.0/24', 'AS15169', 'valid'], ['...', '2001:4860::/32', 'AS15169', 'valid'], ['ns4.google.com.', '216.239.32.0/19', 'AS15169', 'valid'], ['...', '216.239.38.0/24', 'AS15169', 'valid'], ['...', '2001:4860::/32', 'AS15169', 'valid']], 'override_mandatory': False}}", + "web_exists_score": 5, + "web_valid_score": 10, + "ns_exists_score": 5, + "ns_valid_score": 10, + "score": 30, + "max_score": 30 + } + }, + { + "model": "checks.webtestrpki", + "pk": 9005, + "fields": { + "timestamp": "2025-03-14T15:14:55.558Z", + "domain": "servfail.nl", + "report": "{'web_rpki_exists': {'name': 'web_rpki_exists', 'label': 'detail web rpki exists label', 'status': 1, 'worst_status': 0, 'verdict': 'detail web rpki exists verdict good', 'exp': 'detail web rpki exists exp', 'tech_type': 'table_multi_col', 'tech_string': 'detail web rpki exists tech table', 'tech_data': [['servfail.nl', '2a05:1500:600:1:1c00:4aff:fe00:428', 'detail tech data yes']], 'override_mandatory': False}, 'web_rpki_valid': {'name': 'web_rpki_valid', 'label': 'detail web rpki valid label', 'status': 1, 'worst_status': 0, 'verdict': 'detail web rpki valid verdict good', 'exp': 'detail web rpki valid exp', 'tech_type': 'table', 'tech_string': 'detail web rpki valid tech table', 'tech_data': [['servfail.nl', '2a05:1500:600::/40', 'AS48635', 'valid']], 'override_mandatory': False}, 'ns_rpki_exists': {'name': 'ns_rpki_exists', 'label': 'detail web-mail rpki ns-exists label', 'status': 1, 'worst_status': 0, 'verdict': 'detail web-mail rpki ns-exists verdict good', 'exp': 'detail web-mail rpki ns-exists exp', 'tech_type': 'table_multi_col', 'tech_string': 'detail web-mail rpki ns-exists tech table', 'tech_data': [['li1.forfun.net.', '96.126.104.187', 'detail tech data yes'], ['...', '2600:3c03::f03c:91ff:fedf:1e98', 'detail tech data yes'], ['ns1.transip.nl.', '195.8.195.195', 'detail tech data yes'], ['...', '2a01:7c8:7000:195::195', 'detail tech data yes'], ['ns2.transip.eu.', '37.97.199.195', 'detail tech data yes'], ['...', '2a01:7c8:f:c1f::195', 'detail tech data yes']], 'override_mandatory': False}, 'ns_rpki_valid': {'name': 'ns_rpki_valid', 'label': 'detail web-mail rpki ns-valid label', 'status': 1, 'worst_status': 0, 'verdict': 'detail web-mail rpki ns-valid verdict good', 'exp': 'detail web-mail rpki ns-valid exp', 'tech_type': 'table', 'tech_string': 'detail web-mail rpki ns-valid tech table', 'tech_data': [['li1.forfun.net.', '96.126.104.0/21', 'AS63949', 'valid'], ['...', '2600:3c03::/32', 'AS63949', 'valid'], ['ns1.transip.nl.', '195.8.195.0/24', 'AS20857', 'valid'], ['...', '2a01:7c8:7000::/36', 'AS20857', 'valid'], ['ns2.transip.eu.', '37.97.128.0/17', 'AS20857', 'valid'], ['...', '2a01:7c8::/32', 'AS20857', 'valid']], 'override_mandatory': False}}", + "web_exists_score": 5, + "web_valid_score": 10, + "ns_exists_score": 5, + "ns_valid_score": 10, + "score": 30, + "max_score": 30 + } + }, + { + "model": "checks.webtestrpki", + "pk": 9006, + "fields": { + "timestamp": "2025-03-14T15:18:55.194Z", + "domain": "brokendnssec.net", + "report": "{'web_rpki_exists': {'name': 'web_rpki_exists', 'label': 'detail web rpki exists label', 'status': 1, 'worst_status': 0, 'verdict': 'detail web rpki exists verdict good', 'exp': 'detail web rpki exists exp', 'tech_type': 'table_multi_col', 'tech_string': 'detail web rpki exists tech table', 'tech_data': [['brokendnssec.net', '104.18.26.110', 'detail tech data yes'], ['...', '104.18.27.110', 'detail tech data yes']], 'override_mandatory': False}, 'web_rpki_valid': {'name': 'web_rpki_valid', 'label': 'detail web rpki valid label', 'status': 1, 'worst_status': 0, 'verdict': 'detail web rpki valid verdict good', 'exp': 'detail web rpki valid exp', 'tech_type': 'table', 'tech_string': 'detail web rpki valid tech table', 'tech_data': [['brokendnssec.net', '104.18.16.0/20', 'AS13335', 'valid']], 'override_mandatory': False}, 'ns_rpki_exists': {'name': 'ns_rpki_exists', 'label': 'detail web-mail rpki ns-exists label', 'status': 1, 'worst_status': 0, 'verdict': 'detail web-mail rpki ns-exists verdict good', 'exp': 'detail web-mail rpki ns-exists exp', 'tech_type': 'table_multi_col', 'tech_string': 'detail web-mail rpki ns-exists tech table', 'tech_data': [['carl.ns.cloudflare.com.', '173.245.59.106', 'detail tech data yes'], ['...', '172.64.33.106', 'detail tech data yes'], ['...', '108.162.193.106', 'detail tech data yes'], ['...', '2606:4700:58::adf5:3b6a', 'detail tech data yes'], ['...', '2803:f800:50::6ca2:c16a', 'detail tech data yes'], ['...', '2a06:98c1:50::ac40:216a', 'detail tech data yes'], ['cruz.ns.cloudflare.com.', '172.64.32.88', 'detail tech data yes'], ['...', '108.162.192.88', 'detail tech data yes'], ['...', '173.245.58.88', 'detail tech data yes'], ['...', '2a06:98c1:50::ac40:2058', 'detail tech data yes'], ['...', '2606:4700:50::adf5:3a58', 'detail tech data yes'], ['...', '2803:f800:50::6ca2:c058', 'detail tech data yes']], 'override_mandatory': False}, 'ns_rpki_valid': {'name': 'ns_rpki_valid', 'label': 'detail web-mail rpki ns-valid label', 'status': 1, 'worst_status': 0, 'verdict': 'detail web-mail rpki ns-valid verdict good', 'exp': 'detail web-mail rpki ns-valid exp', 'tech_type': 'table', 'tech_string': 'detail web-mail rpki ns-valid tech table', 'tech_data': [['carl.ns.cloudflare.com.', '173.245.59.0/24', 'AS13335', 'valid'], ['...', '172.64.32.0/20', 'AS13335', 'valid'], ['...', '172.64.33.0/24', 'AS13335', 'valid'], ['...', '108.162.193.0/24', 'AS13335', 'valid'], ['...', '108.162.192.0/20', 'AS13335', 'valid'], ['...', '2606:4700:50::/44', 'AS13335', 'valid'], ['...', '2803:f800:50::/45', 'AS13335', 'valid'], ['...', '2a06:98c1:50::/45', 'AS13335', 'valid'], ['cruz.ns.cloudflare.com.', '172.64.32.0/20', 'AS13335', 'valid'], ['...', '172.64.32.0/24', 'AS13335', 'valid'], ['...', '108.162.192.0/24', 'AS13335', 'valid'], ['...', '108.162.192.0/20', 'AS13335', 'valid'], ['...', '173.245.58.0/24', 'AS13335', 'valid'], ['...', '2a06:98c1:50::/45', 'AS13335', 'valid'], ['...', '2606:4700:50::/44', 'AS13335', 'valid'], ['...', '2803:f800:50::/45', 'AS13335', 'valid']], 'override_mandatory': False}}", + "web_exists_score": 5, + "web_valid_score": 10, + "ns_exists_score": 5, + "ns_valid_score": 10, + "score": 30, + "max_score": 30 + } + }, + { + "model": "checks.webtestrpki", + "pk": 9007, + "fields": { + "timestamp": "2025-03-14T15:19:07.318Z", + "domain": "ok.bogussig.ok.bad-dnssec.wb.sidnlabs.nl", + "report": "{'web_rpki_exists': {'name': 'web_rpki_exists', 'label': 'detail web rpki exists label', 'status': 1, 'worst_status': 0, 'verdict': 'detail web rpki exists verdict good', 'exp': 'detail web rpki exists exp', 'tech_type': 'table_multi_col', 'tech_string': 'detail web rpki exists tech table', 'tech_data': [['ok.bogussig.ok.bad-dnssec.wb.sidnlabs.nl', '94.198.159.39', 'detail tech data yes'], ['...', '2a00:d78:0:712:94:198:159:39', 'detail tech data yes']], 'override_mandatory': False}, 'web_rpki_valid': {'name': 'web_rpki_valid', 'label': 'detail web rpki valid label', 'status': 1, 'worst_status': 0, 'verdict': 'detail web rpki valid verdict good', 'exp': 'detail web rpki valid exp', 'tech_type': 'table', 'tech_string': 'detail web rpki valid tech table', 'tech_data': [['ok.bogussig.ok.bad-dnssec.wb.sidnlabs.nl', '94.198.152.0/21', 'AS1140', 'valid'], ['...', '2a00:d78::/32', 'AS1140', 'valid']], 'override_mandatory': False}, 'ns_rpki_exists': {'name': 'ns_rpki_exists', 'label': 'detail web-mail rpki ns-exists label', 'status': 1, 'worst_status': 0, 'verdict': 'detail web-mail rpki ns-exists verdict good', 'exp': 'detail web-mail rpki ns-exists exp', 'tech_type': 'table_multi_col', 'tech_string': 'detail web-mail rpki ns-exists tech table', 'tech_data': [['bind9.sidnlabs.nl.', '94.198.159.39', 'detail tech data yes'], ['...', '2a00:d78:0:712:94:198:159:39', 'detail tech data yes'], ['knot.sidnlabs.nl.', '94.198.159.27', 'detail tech data yes'], ['...', '2a00:d78:0:712:94:198:159:27', 'detail tech data yes'], ['nsd4.sidnlabs.nl.', '94.198.159.33', 'detail tech data yes'], ['...', '2a00:d78:0:712:94:198:159:33', 'detail tech data yes'], ['powerdns.sidnlabs.nl.', '94.198.159.26', 'detail tech data yes'], ['...', '2a00:d78:0:712:94:198:159:26', 'detail tech data yes'], ['yadifa.sidnlabs.nl.', '94.198.159.28', 'detail tech data yes'], ['...', '2a00:d78:0:712:94:198:159:28', 'detail tech data yes']], 'override_mandatory': False}, 'ns_rpki_valid': {'name': 'ns_rpki_valid', 'label': 'detail web-mail rpki ns-valid label', 'status': 1, 'worst_status': 0, 'verdict': 'detail web-mail rpki ns-valid verdict good', 'exp': 'detail web-mail rpki ns-valid exp', 'tech_type': 'table', 'tech_string': 'detail web-mail rpki ns-valid tech table', 'tech_data': [['bind9.sidnlabs.nl.', '94.198.152.0/21', 'AS1140', 'valid'], ['...', '2a00:d78::/32', 'AS1140', 'valid'], ['knot.sidnlabs.nl.', '94.198.152.0/21', 'AS1140', 'valid'], ['...', '2a00:d78::/32', 'AS1140', 'valid'], ['nsd4.sidnlabs.nl.', '94.198.152.0/21', 'AS1140', 'valid'], ['...', '2a00:d78::/32', 'AS1140', 'valid'], ['powerdns.sidnlabs.nl.', '94.198.152.0/21', 'AS1140', 'valid'], ['...', '2a00:d78::/32', 'AS1140', 'valid'], ['yadifa.sidnlabs.nl.', '94.198.152.0/21', 'AS1140', 'valid'], ['...', '2a00:d78::/32', 'AS1140', 'valid']], 'override_mandatory': False}}", + "web_exists_score": 5, + "web_valid_score": 10, + "ns_exists_score": 5, + "ns_valid_score": 10, + "score": 30, + "max_score": 30 + } + }, + { + "model": "checks.webtestrpki", + "pk": 9008, + "fields": { + "timestamp": "2025-03-14T15:19:26.771Z", + "domain": "badhash.dane.huque.com", + "report": "{'web_rpki_exists': {'name': 'web_rpki_exists', 'label': 'detail web rpki exists label', 'status': 1, 'worst_status': 0, 'verdict': 'detail web rpki exists verdict good', 'exp': 'detail web rpki exists exp', 'tech_type': 'table_multi_col', 'tech_string': 'detail web rpki exists tech table', 'tech_data': [['badhash.dane.huque.com', '54.200.198.48', 'detail tech data yes']], 'override_mandatory': False}, 'web_rpki_valid': {'name': 'web_rpki_valid', 'label': 'detail web rpki valid label', 'status': 1, 'worst_status': 0, 'verdict': 'detail web rpki valid verdict good', 'exp': 'detail web rpki valid exp', 'tech_type': 'table', 'tech_string': 'detail web rpki valid tech table', 'tech_data': [['badhash.dane.huque.com', '54.192.0.0/12', 'AS16509', 'valid'], ['...', '54.200.0.0/15', 'AS16509', 'valid']], 'override_mandatory': False}, 'ns_rpki_exists': {'name': 'ns_rpki_exists', 'label': 'detail web-mail rpki ns-exists label', 'status': 1, 'worst_status': 0, 'verdict': 'detail web-mail rpki ns-exists verdict good', 'exp': 'detail web-mail rpki ns-exists exp', 'tech_type': 'table_multi_col', 'tech_string': 'detail web-mail rpki ns-exists tech table', 'tech_data': [['adns1.dnsrakuda.com.', '3.225.161.117', 'detail tech data yes'], ['...', '2600:1f18:6296:8902::c0de', 'detail tech data yes'], ['adns1.nnn.upenn.edu.', '128.91.2.53', 'detail tech data yes'], ['...', '2607:f470:1001::ad:1', 'detail tech data yes'], ['adns2.dnsrakuda.com.', '52.88.78.179', 'detail tech data yes'], ['...', '2600:1f14:990:2e01::bad', 'detail tech data yes'], ['adns2.nnn.upenn.edu.', '128.91.254.53', 'detail tech data yes'], ['...', '2607:f470:1002::ad:2', 'detail tech data yes'], ['adns3.nnn.upenn.edu.', '128.91.251.53', 'detail tech data yes'], ['...', '2607:f470:1003::ad:3', 'detail tech data yes']], 'override_mandatory': False}, 'ns_rpki_valid': {'name': 'ns_rpki_valid', 'label': 'detail web-mail rpki ns-valid label', 'status': 1, 'worst_status': 0, 'verdict': 'detail web-mail rpki ns-valid verdict good', 'exp': 'detail web-mail rpki ns-valid exp', 'tech_type': 'table', 'tech_string': 'detail web-mail rpki ns-valid tech table', 'tech_data': [['adns1.dnsrakuda.com.', '3.224.0.0/12', 'AS14618', 'valid'], ['...', '3.192.0.0/10', 'AS16509', 'valid'], ['...', '2600:1f18::/33', 'AS14618', 'valid'], ['...', '2600:1f18:6000::/35', 'AS14618', 'valid'], ['adns1.nnn.upenn.edu.', '128.91.0.0/16', 'AS55', 'valid'], ['...', '2607:f470::/32', 'AS55', 'valid'], ['adns2.dnsrakuda.com.', '52.88.0.0/15', 'AS16509', 'valid'], ['...', '52.88.0.0/13', 'AS16509', 'valid'], ['...', '2600:1f14:800::/37', 'AS16509', 'valid'], ['adns2.nnn.upenn.edu.', '128.91.0.0/16', 'AS55', 'valid'], ['...', '2607:f470::/32', 'AS55', 'valid'], ['adns3.nnn.upenn.edu.', '128.91.0.0/16', 'AS55', 'valid'], ['...', '2607:f470::/32', 'AS55', 'valid']], 'override_mandatory': False}}", + "web_exists_score": 5, + "web_valid_score": 10, + "ns_exists_score": 5, + "ns_valid_score": 10, + "score": 30, + "max_score": 30 + } + }, + { + "model": "checks.webtestrpki", + "pk": 9009, + "fields": { + "timestamp": "2025-03-14T15:20:00.299Z", + "domain": "expired.badssl.com", + "report": "{'web_rpki_exists': {'name': 'web_rpki_exists', 'label': 'detail web rpki exists label', 'status': 1, 'worst_status': 0, 'verdict': 'detail web rpki exists verdict good', 'exp': 'detail web rpki exists exp', 'tech_type': 'table_multi_col', 'tech_string': 'detail web rpki exists tech table', 'tech_data': [['expired.badssl.com', '104.154.89.105', 'detail tech data yes']], 'override_mandatory': False}, 'web_rpki_valid': {'name': 'web_rpki_valid', 'label': 'detail web rpki valid label', 'status': 1, 'worst_status': 0, 'verdict': 'detail web rpki valid verdict good', 'exp': 'detail web rpki valid exp', 'tech_type': 'table', 'tech_string': 'detail web rpki valid tech table', 'tech_data': [['expired.badssl.com', '104.154.64.0/19', 'AS15169', 'valid'], ['...', '104.154.80.0/20', 'AS396982', 'valid']], 'override_mandatory': False}, 'ns_rpki_exists': {'name': 'ns_rpki_exists', 'label': 'detail web-mail rpki ns-exists label', 'status': 1, 'worst_status': 0, 'verdict': 'detail web-mail rpki ns-exists verdict good', 'exp': 'detail web-mail rpki ns-exists exp', 'tech_type': 'table_multi_col', 'tech_string': 'detail web-mail rpki ns-exists tech table', 'tech_data': [['ns-cloud-c1.googledomains.com.', '216.239.32.108', 'detail tech data yes'], ['...', '2001:4860:4802:32::6c', 'detail tech data yes'], ['ns-cloud-c2.googledomains.com.', '216.239.34.108', 'detail tech data yes'], ['...', '2001:4860:4802:34::6c', 'detail tech data yes'], ['ns-cloud-c3.googledomains.com.', '216.239.36.108', 'detail tech data yes'], ['...', '2001:4860:4802:36::6c', 'detail tech data yes'], ['ns-cloud-c4.googledomains.com.', '216.239.38.108', 'detail tech data yes'], ['...', '2001:4860:4802:38::6c', 'detail tech data yes']], 'override_mandatory': False}, 'ns_rpki_valid': {'name': 'ns_rpki_valid', 'label': 'detail web-mail rpki ns-valid label', 'status': 1, 'worst_status': 0, 'verdict': 'detail web-mail rpki ns-valid verdict good', 'exp': 'detail web-mail rpki ns-valid exp', 'tech_type': 'table', 'tech_string': 'detail web-mail rpki ns-valid tech table', 'tech_data': [['ns-cloud-c1.googledomains.com.', '216.239.32.0/24', 'AS15169', 'valid'], ['...', '216.239.32.0/19', 'AS15169', 'valid'], ['...', '2001:4860::/32', 'AS15169', 'valid'], ['ns-cloud-c2.googledomains.com.', '216.239.32.0/19', 'AS15169', 'valid'], ['...', '216.239.34.0/24', 'AS15169', 'valid'], ['...', '2001:4860::/32', 'AS15169', 'valid'], ['ns-cloud-c3.googledomains.com.', '216.239.36.0/24', 'AS15169', 'valid'], ['...', '216.239.32.0/19', 'AS15169', 'valid'], ['...', '2001:4860::/32', 'AS15169', 'valid'], ['ns-cloud-c4.googledomains.com.', '216.239.38.0/24', 'AS15169', 'valid'], ['...', '216.239.32.0/19', 'AS15169', 'valid'], ['...', '2001:4860::/32', 'AS15169', 'valid']], 'override_mandatory': False}}", + "web_exists_score": 5, + "web_valid_score": 10, + "ns_exists_score": 5, + "ns_valid_score": 10, + "score": 30, + "max_score": 30 + } + }, + { + "model": "checks.webtestrpki", + "pk": 9010, + "fields": { + "timestamp": "2025-03-14T15:20:27.576Z", + "domain": "wrong.host.badssl.com", + "report": "{'web_rpki_exists': {'name': 'web_rpki_exists', 'label': 'detail web rpki exists label', 'status': 1, 'worst_status': 0, 'verdict': 'detail web rpki exists verdict good', 'exp': 'detail web rpki exists exp', 'tech_type': 'table_multi_col', 'tech_string': 'detail web rpki exists tech table', 'tech_data': [['wrong.host.badssl.com', '104.154.89.105', 'detail tech data yes']], 'override_mandatory': False}, 'web_rpki_valid': {'name': 'web_rpki_valid', 'label': 'detail web rpki valid label', 'status': 1, 'worst_status': 0, 'verdict': 'detail web rpki valid verdict good', 'exp': 'detail web rpki valid exp', 'tech_type': 'table', 'tech_string': 'detail web rpki valid tech table', 'tech_data': [['wrong.host.badssl.com', '104.154.80.0/20', 'AS396982', 'valid'], ['...', '104.154.64.0/19', 'AS15169', 'valid']], 'override_mandatory': False}, 'ns_rpki_exists': {'name': 'ns_rpki_exists', 'label': 'detail web-mail rpki ns-exists label', 'status': 1, 'worst_status': 0, 'verdict': 'detail web-mail rpki ns-exists verdict good', 'exp': 'detail web-mail rpki ns-exists exp', 'tech_type': 'table_multi_col', 'tech_string': 'detail web-mail rpki ns-exists tech table', 'tech_data': [['ns-cloud-c1.googledomains.com.', '216.239.32.108', 'detail tech data yes'], ['...', '2001:4860:4802:32::6c', 'detail tech data yes'], ['ns-cloud-c2.googledomains.com.', '216.239.34.108', 'detail tech data yes'], ['...', '2001:4860:4802:34::6c', 'detail tech data yes'], ['ns-cloud-c3.googledomains.com.', '216.239.36.108', 'detail tech data yes'], ['...', '2001:4860:4802:36::6c', 'detail tech data yes'], ['ns-cloud-c4.googledomains.com.', '216.239.38.108', 'detail tech data yes'], ['...', '2001:4860:4802:38::6c', 'detail tech data yes']], 'override_mandatory': False}, 'ns_rpki_valid': {'name': 'ns_rpki_valid', 'label': 'detail web-mail rpki ns-valid label', 'status': 1, 'worst_status': 0, 'verdict': 'detail web-mail rpki ns-valid verdict good', 'exp': 'detail web-mail rpki ns-valid exp', 'tech_type': 'table', 'tech_string': 'detail web-mail rpki ns-valid tech table', 'tech_data': [['ns-cloud-c1.googledomains.com.', '216.239.32.0/24', 'AS15169', 'valid'], ['...', '216.239.32.0/19', 'AS15169', 'valid'], ['...', '2001:4860::/32', 'AS15169', 'valid'], ['ns-cloud-c2.googledomains.com.', '216.239.34.0/24', 'AS15169', 'valid'], ['...', '216.239.32.0/19', 'AS15169', 'valid'], ['...', '2001:4860::/32', 'AS15169', 'valid'], ['ns-cloud-c3.googledomains.com.', '216.239.32.0/19', 'AS15169', 'valid'], ['...', '216.239.36.0/24', 'AS15169', 'valid'], ['...', '2001:4860::/32', 'AS15169', 'valid'], ['ns-cloud-c4.googledomains.com.', '216.239.32.0/19', 'AS15169', 'valid'], ['...', '216.239.38.0/24', 'AS15169', 'valid'], ['...', '2001:4860::/32', 'AS15169', 'valid']], 'override_mandatory': False}}", + "web_exists_score": 5, + "web_valid_score": 10, + "ns_exists_score": 5, + "ns_valid_score": 10, + "score": 30, + "max_score": 30 + } + }, + { + "model": "checks.webtestrpki", + "pk": 9011, + "fields": { + "timestamp": "2025-03-14T15:20:56.058Z", + "domain": "self-signed.badssl.com", + "report": "{'web_rpki_exists': {'name': 'web_rpki_exists', 'label': 'detail web rpki exists label', 'status': 1, 'worst_status': 0, 'verdict': 'detail web rpki exists verdict good', 'exp': 'detail web rpki exists exp', 'tech_type': 'table_multi_col', 'tech_string': 'detail web rpki exists tech table', 'tech_data': [['self-signed.badssl.com', '104.154.89.105', 'detail tech data yes']], 'override_mandatory': False}, 'web_rpki_valid': {'name': 'web_rpki_valid', 'label': 'detail web rpki valid label', 'status': 1, 'worst_status': 0, 'verdict': 'detail web rpki valid verdict good', 'exp': 'detail web rpki valid exp', 'tech_type': 'table', 'tech_string': 'detail web rpki valid tech table', 'tech_data': [['self-signed.badssl.com', '104.154.80.0/20', 'AS396982', 'valid'], ['...', '104.154.64.0/19', 'AS15169', 'valid']], 'override_mandatory': False}, 'ns_rpki_exists': {'name': 'ns_rpki_exists', 'label': 'detail web-mail rpki ns-exists label', 'status': 1, 'worst_status': 0, 'verdict': 'detail web-mail rpki ns-exists verdict good', 'exp': 'detail web-mail rpki ns-exists exp', 'tech_type': 'table_multi_col', 'tech_string': 'detail web-mail rpki ns-exists tech table', 'tech_data': [['ns-cloud-c1.googledomains.com.', '216.239.32.108', 'detail tech data yes'], ['...', '2001:4860:4802:32::6c', 'detail tech data yes'], ['ns-cloud-c2.googledomains.com.', '216.239.34.108', 'detail tech data yes'], ['...', '2001:4860:4802:34::6c', 'detail tech data yes'], ['ns-cloud-c3.googledomains.com.', '216.239.36.108', 'detail tech data yes'], ['...', '2001:4860:4802:36::6c', 'detail tech data yes'], ['ns-cloud-c4.googledomains.com.', '216.239.38.108', 'detail tech data yes'], ['...', '2001:4860:4802:38::6c', 'detail tech data yes']], 'override_mandatory': False}, 'ns_rpki_valid': {'name': 'ns_rpki_valid', 'label': 'detail web-mail rpki ns-valid label', 'status': 1, 'worst_status': 0, 'verdict': 'detail web-mail rpki ns-valid verdict good', 'exp': 'detail web-mail rpki ns-valid exp', 'tech_type': 'table', 'tech_string': 'detail web-mail rpki ns-valid tech table', 'tech_data': [['ns-cloud-c1.googledomains.com.', '216.239.32.0/24', 'AS15169', 'valid'], ['...', '216.239.32.0/19', 'AS15169', 'valid'], ['...', '2001:4860::/32', 'AS15169', 'valid'], ['ns-cloud-c2.googledomains.com.', '216.239.34.0/24', 'AS15169', 'valid'], ['...', '216.239.32.0/19', 'AS15169', 'valid'], ['...', '2001:4860::/32', 'AS15169', 'valid'], ['ns-cloud-c3.googledomains.com.', '216.239.36.0/24', 'AS15169', 'valid'], ['...', '216.239.32.0/19', 'AS15169', 'valid'], ['...', '2001:4860::/32', 'AS15169', 'valid'], ['ns-cloud-c4.googledomains.com.', '216.239.38.0/24', 'AS15169', 'valid'], ['...', '216.239.32.0/19', 'AS15169', 'valid'], ['...', '2001:4860::/32', 'AS15169', 'valid']], 'override_mandatory': False}}", + "web_exists_score": 5, + "web_valid_score": 10, + "ns_exists_score": 5, + "ns_valid_score": 10, + "score": 30, + "max_score": 30 + } + }, + { + "model": "checks.webtestrpki", + "pk": 9012, + "fields": { + "timestamp": "2025-03-14T15:21:24.665Z", + "domain": "untrusted-root.badssl.com", + "report": "{'web_rpki_exists': {'name': 'web_rpki_exists', 'label': 'detail web rpki exists label', 'status': 1, 'worst_status': 0, 'verdict': 'detail web rpki exists verdict good', 'exp': 'detail web rpki exists exp', 'tech_type': 'table_multi_col', 'tech_string': 'detail web rpki exists tech table', 'tech_data': [['untrusted-root.badssl.com', '104.154.89.105', 'detail tech data yes']], 'override_mandatory': False}, 'web_rpki_valid': {'name': 'web_rpki_valid', 'label': 'detail web rpki valid label', 'status': 1, 'worst_status': 0, 'verdict': 'detail web rpki valid verdict good', 'exp': 'detail web rpki valid exp', 'tech_type': 'table', 'tech_string': 'detail web rpki valid tech table', 'tech_data': [['untrusted-root.badssl.com', '104.154.64.0/19', 'AS15169', 'valid'], ['...', '104.154.80.0/20', 'AS396982', 'valid']], 'override_mandatory': False}, 'ns_rpki_exists': {'name': 'ns_rpki_exists', 'label': 'detail web-mail rpki ns-exists label', 'status': 1, 'worst_status': 0, 'verdict': 'detail web-mail rpki ns-exists verdict good', 'exp': 'detail web-mail rpki ns-exists exp', 'tech_type': 'table_multi_col', 'tech_string': 'detail web-mail rpki ns-exists tech table', 'tech_data': [['ns-cloud-c1.googledomains.com.', '216.239.32.108', 'detail tech data yes'], ['...', '2001:4860:4802:32::6c', 'detail tech data yes'], ['ns-cloud-c2.googledomains.com.', '216.239.34.108', 'detail tech data yes'], ['...', '2001:4860:4802:34::6c', 'detail tech data yes'], ['ns-cloud-c3.googledomains.com.', '216.239.36.108', 'detail tech data yes'], ['...', '2001:4860:4802:36::6c', 'detail tech data yes'], ['ns-cloud-c4.googledomains.com.', '216.239.38.108', 'detail tech data yes'], ['...', '2001:4860:4802:38::6c', 'detail tech data yes']], 'override_mandatory': False}, 'ns_rpki_valid': {'name': 'ns_rpki_valid', 'label': 'detail web-mail rpki ns-valid label', 'status': 1, 'worst_status': 0, 'verdict': 'detail web-mail rpki ns-valid verdict good', 'exp': 'detail web-mail rpki ns-valid exp', 'tech_type': 'table', 'tech_string': 'detail web-mail rpki ns-valid tech table', 'tech_data': [['ns-cloud-c1.googledomains.com.', '216.239.32.0/24', 'AS15169', 'valid'], ['...', '216.239.32.0/19', 'AS15169', 'valid'], ['...', '2001:4860::/32', 'AS15169', 'valid'], ['ns-cloud-c2.googledomains.com.', '216.239.34.0/24', 'AS15169', 'valid'], ['...', '216.239.32.0/19', 'AS15169', 'valid'], ['...', '2001:4860::/32', 'AS15169', 'valid'], ['ns-cloud-c3.googledomains.com.', '216.239.32.0/19', 'AS15169', 'valid'], ['...', '216.239.36.0/24', 'AS15169', 'valid'], ['...', '2001:4860::/32', 'AS15169', 'valid'], ['ns-cloud-c4.googledomains.com.', '216.239.38.0/24', 'AS15169', 'valid'], ['...', '216.239.32.0/19', 'AS15169', 'valid'], ['...', '2001:4860::/32', 'AS15169', 'valid']], 'override_mandatory': False}}", + "web_exists_score": 5, + "web_valid_score": 10, + "ns_exists_score": 5, + "ns_valid_score": 10, + "score": 30, + "max_score": 30 + } + }, + { + "model": "checks.webtestrpki", + "pk": 9013, + "fields": { + "timestamp": "2025-03-14T15:21:53.584Z", + "domain": "revoked.badssl.com", + "report": "{'web_rpki_exists': {'name': 'web_rpki_exists', 'label': 'detail web rpki exists label', 'status': 1, 'worst_status': 0, 'verdict': 'detail web rpki exists verdict good', 'exp': 'detail web rpki exists exp', 'tech_type': 'table_multi_col', 'tech_string': 'detail web rpki exists tech table', 'tech_data': [['revoked.badssl.com', '104.154.89.105', 'detail tech data yes']], 'override_mandatory': False}, 'web_rpki_valid': {'name': 'web_rpki_valid', 'label': 'detail web rpki valid label', 'status': 1, 'worst_status': 0, 'verdict': 'detail web rpki valid verdict good', 'exp': 'detail web rpki valid exp', 'tech_type': 'table', 'tech_string': 'detail web rpki valid tech table', 'tech_data': [['revoked.badssl.com', '104.154.64.0/19', 'AS15169', 'valid'], ['...', '104.154.80.0/20', 'AS396982', 'valid']], 'override_mandatory': False}, 'ns_rpki_exists': {'name': 'ns_rpki_exists', 'label': 'detail web-mail rpki ns-exists label', 'status': 1, 'worst_status': 0, 'verdict': 'detail web-mail rpki ns-exists verdict good', 'exp': 'detail web-mail rpki ns-exists exp', 'tech_type': 'table_multi_col', 'tech_string': 'detail web-mail rpki ns-exists tech table', 'tech_data': [['ns-cloud-c1.googledomains.com.', '216.239.32.108', 'detail tech data yes'], ['...', '2001:4860:4802:32::6c', 'detail tech data yes'], ['ns-cloud-c2.googledomains.com.', '216.239.34.108', 'detail tech data yes'], ['...', '2001:4860:4802:34::6c', 'detail tech data yes'], ['ns-cloud-c3.googledomains.com.', '216.239.36.108', 'detail tech data yes'], ['...', '2001:4860:4802:36::6c', 'detail tech data yes'], ['ns-cloud-c4.googledomains.com.', '216.239.38.108', 'detail tech data yes'], ['...', '2001:4860:4802:38::6c', 'detail tech data yes']], 'override_mandatory': False}, 'ns_rpki_valid': {'name': 'ns_rpki_valid', 'label': 'detail web-mail rpki ns-valid label', 'status': 1, 'worst_status': 0, 'verdict': 'detail web-mail rpki ns-valid verdict good', 'exp': 'detail web-mail rpki ns-valid exp', 'tech_type': 'table', 'tech_string': 'detail web-mail rpki ns-valid tech table', 'tech_data': [['ns-cloud-c1.googledomains.com.', '216.239.32.0/24', 'AS15169', 'valid'], ['...', '216.239.32.0/19', 'AS15169', 'valid'], ['...', '2001:4860::/32', 'AS15169', 'valid'], ['ns-cloud-c2.googledomains.com.', '216.239.32.0/19', 'AS15169', 'valid'], ['...', '216.239.34.0/24', 'AS15169', 'valid'], ['...', '2001:4860::/32', 'AS15169', 'valid'], ['ns-cloud-c3.googledomains.com.', '216.239.32.0/19', 'AS15169', 'valid'], ['...', '216.239.36.0/24', 'AS15169', 'valid'], ['...', '2001:4860::/32', 'AS15169', 'valid'], ['ns-cloud-c4.googledomains.com.', '216.239.32.0/19', 'AS15169', 'valid'], ['...', '216.239.38.0/24', 'AS15169', 'valid'], ['...', '2001:4860::/32', 'AS15169', 'valid']], 'override_mandatory': False}}", + "web_exists_score": 5, + "web_valid_score": 10, + "ns_exists_score": 5, + "ns_valid_score": 10, + "score": 30, + "max_score": 30 + } + }, + { + "model": "checks.webtestrpki", + "pk": 9014, + "fields": { + "timestamp": "2025-03-14T15:22:13.207Z", + "domain": "pinning-test.badssl.com", + "report": "{'web_rpki_exists': {'name': 'web_rpki_exists', 'label': 'detail web rpki exists label', 'status': 1, 'worst_status': 0, 'verdict': 'detail web rpki exists verdict good', 'exp': 'detail web rpki exists exp', 'tech_type': 'table_multi_col', 'tech_string': 'detail web rpki exists tech table', 'tech_data': [['pinning-test.badssl.com', '104.154.89.105', 'detail tech data yes']], 'override_mandatory': False}, 'web_rpki_valid': {'name': 'web_rpki_valid', 'label': 'detail web rpki valid label', 'status': 1, 'worst_status': 0, 'verdict': 'detail web rpki valid verdict good', 'exp': 'detail web rpki valid exp', 'tech_type': 'table', 'tech_string': 'detail web rpki valid tech table', 'tech_data': [['pinning-test.badssl.com', '104.154.80.0/20', 'AS396982', 'valid'], ['...', '104.154.64.0/19', 'AS15169', 'valid']], 'override_mandatory': False}, 'ns_rpki_exists': {'name': 'ns_rpki_exists', 'label': 'detail web-mail rpki ns-exists label', 'status': 1, 'worst_status': 0, 'verdict': 'detail web-mail rpki ns-exists verdict good', 'exp': 'detail web-mail rpki ns-exists exp', 'tech_type': 'table_multi_col', 'tech_string': 'detail web-mail rpki ns-exists tech table', 'tech_data': [['ns-cloud-c1.googledomains.com.', '216.239.32.108', 'detail tech data yes'], ['...', '2001:4860:4802:32::6c', 'detail tech data yes'], ['ns-cloud-c2.googledomains.com.', '216.239.34.108', 'detail tech data yes'], ['...', '2001:4860:4802:34::6c', 'detail tech data yes'], ['ns-cloud-c3.googledomains.com.', '216.239.36.108', 'detail tech data yes'], ['...', '2001:4860:4802:36::6c', 'detail tech data yes'], ['ns-cloud-c4.googledomains.com.', '216.239.38.108', 'detail tech data yes'], ['...', '2001:4860:4802:38::6c', 'detail tech data yes']], 'override_mandatory': False}, 'ns_rpki_valid': {'name': 'ns_rpki_valid', 'label': 'detail web-mail rpki ns-valid label', 'status': 1, 'worst_status': 0, 'verdict': 'detail web-mail rpki ns-valid verdict good', 'exp': 'detail web-mail rpki ns-valid exp', 'tech_type': 'table', 'tech_string': 'detail web-mail rpki ns-valid tech table', 'tech_data': [['ns-cloud-c1.googledomains.com.', '216.239.32.0/24', 'AS15169', 'valid'], ['...', '216.239.32.0/19', 'AS15169', 'valid'], ['...', '2001:4860::/32', 'AS15169', 'valid'], ['ns-cloud-c2.googledomains.com.', '216.239.34.0/24', 'AS15169', 'valid'], ['...', '216.239.32.0/19', 'AS15169', 'valid'], ['...', '2001:4860::/32', 'AS15169', 'valid'], ['ns-cloud-c3.googledomains.com.', '216.239.32.0/19', 'AS15169', 'valid'], ['...', '216.239.36.0/24', 'AS15169', 'valid'], ['...', '2001:4860::/32', 'AS15169', 'valid'], ['ns-cloud-c4.googledomains.com.', '216.239.32.0/19', 'AS15169', 'valid'], ['...', '216.239.38.0/24', 'AS15169', 'valid'], ['...', '2001:4860::/32', 'AS15169', 'valid']], 'override_mandatory': False}}", + "web_exists_score": 5, + "web_valid_score": 10, + "ns_exists_score": 5, + "ns_valid_score": 10, + "score": 30, + "max_score": 30 + } + }, + { + "model": "checks.webtestrpki", + "pk": 9015, + "fields": { + "timestamp": "2025-03-14T15:22:44.553Z", + "domain": "invalid.rpki.isbgpsafeyet.com", + "report": "{'web_rpki_exists': {'name': 'web_rpki_exists', 'label': 'detail web rpki exists label', 'status': 1, 'worst_status': 0, 'verdict': 'detail web rpki exists verdict good', 'exp': 'detail web rpki exists exp', 'tech_type': 'table_multi_col', 'tech_string': 'detail web rpki exists tech table', 'tech_data': [['invalid.rpki.isbgpsafeyet.com', '103.21.244.8', 'detail tech data yes'], ['...', '103.21.244.9', 'detail tech data yes'], ['...', '2606:4700:7000::6715:f409', 'detail tech data yes'], ['...', '2606:4700:7000::6715:f408', 'detail tech data yes']], 'override_mandatory': False}, 'web_rpki_valid': {'name': 'web_rpki_valid', 'label': 'detail web rpki valid label', 'status': 0, 'worst_status': 0, 'verdict': 'detail web rpki valid verdict invalid', 'exp': 'detail web rpki valid exp', 'tech_type': 'table', 'tech_string': 'detail web rpki valid tech table', 'tech_data': [['invalid.rpki.isbgpsafeyet.com', '103.21.244.0/24', 'AS13335', 'invalid (length)'], ['...', '2606:4700:7000::/48', 'AS13335', 'invalid (as)']], 'override_mandatory': False}, 'ns_rpki_exists': {'name': 'ns_rpki_exists', 'label': 'detail web-mail rpki ns-exists label', 'status': 1, 'worst_status': 0, 'verdict': 'detail web-mail rpki ns-exists verdict good', 'exp': 'detail web-mail rpki ns-exists exp', 'tech_type': 'table_multi_col', 'tech_string': 'detail web-mail rpki ns-exists tech table', 'tech_data': [['jerry.ns.cloudflare.com.', '172.64.33.182', 'detail tech data yes'], ['...', '108.162.193.182', 'detail tech data yes'], ['...', '173.245.59.182', 'detail tech data yes'], ['...', '2606:4700:58::adf5:3bb6', 'detail tech data yes'], ['...', '2803:f800:50::6ca2:c1b6', 'detail tech data yes'], ['...', '2a06:98c1:50::ac40:21b6', 'detail tech data yes'], ['meera.ns.cloudflare.com.', '172.64.32.195', 'detail tech data yes'], ['...', '108.162.192.195', 'detail tech data yes'], ['...', '173.245.58.195', 'detail tech data yes'], ['...', '2803:f800:50::6ca2:c0c3', 'detail tech data yes'], ['...', '2a06:98c1:50::ac40:20c3', 'detail tech data yes'], ['...', '2606:4700:50::adf5:3ac3', 'detail tech data yes']], 'override_mandatory': False}, 'ns_rpki_valid': {'name': 'ns_rpki_valid', 'label': 'detail web-mail rpki ns-valid label', 'status': 1, 'worst_status': 0, 'verdict': 'detail web-mail rpki ns-valid verdict good', 'exp': 'detail web-mail rpki ns-valid exp', 'tech_type': 'table', 'tech_string': 'detail web-mail rpki ns-valid tech table', 'tech_data': [['jerry.ns.cloudflare.com.', '172.64.32.0/20', 'AS13335', 'valid'], ['...', '172.64.33.0/24', 'AS13335', 'valid'], ['...', '108.162.193.0/24', 'AS13335', 'valid'], ['...', '108.162.192.0/20', 'AS13335', 'valid'], ['...', '173.245.59.0/24', 'AS13335', 'valid'], ['...', '2606:4700:50::/44', 'AS13335', 'valid'], ['...', '2803:f800:50::/45', 'AS13335', 'valid'], ['...', '2a06:98c1:50::/45', 'AS13335', 'valid'], ['meera.ns.cloudflare.com.', '172.64.32.0/20', 'AS13335', 'valid'], ['...', '172.64.32.0/24', 'AS13335', 'valid'], ['...', '108.162.192.0/24', 'AS13335', 'valid'], ['...', '108.162.192.0/20', 'AS13335', 'valid'], ['...', '173.245.58.0/24', 'AS13335', 'valid'], ['...', '2803:f800:50::/45', 'AS13335', 'valid'], ['...', '2a06:98c1:50::/45', 'AS13335', 'valid'], ['...', '2606:4700:50::/44', 'AS13335', 'valid']], 'override_mandatory': False}}", + "web_exists_score": 5, + "web_valid_score": 0, + "ns_exists_score": 5, + "ns_valid_score": 10, + "score": 20, + "max_score": 30 + } + }, + { + "model": "checks.rpkinshost", + "pk": 9000, + "fields": { + "host": "ns5.sidn.nl.", + "score": null, + "routing": "[{'ip': '145.40.68.55', 'routes': [('54825', '145.40.68.0/24')], 'validity': {('54825', '145.40.68.0/24'): {'state': 'valid', 'reason': None, 'vrps': [{'asn': '54825', 'prefix': '145.40.68.0/24', 'max_length': '24'}]}}, 'errors': []}, {'ip': '2604:1380:4601:6300::1', 'routes': [('54825', '2604:1380:4600::/44')], 'validity': {('54825', '2604:1380:4600::/44'): {'state': 'valid', 'reason': None, 'vrps': [{'asn': '54825', 'prefix': '2604:1380::/32', 'max_length': '44'}, {'asn': '54825', 'prefix': '2604:1380::/32', 'max_length': '48'}]}}, 'errors': []}]", + "webtestrpki": 9000, + "mailtestrpki": null + } + }, + { + "model": "checks.rpkinshost", + "pk": 9001, + "fields": { + "host": "ns1.sidnlabs.nl.", + "score": null, + "routing": "[{'ip': '94.198.159.8', 'routes': [('1140', '94.198.152.0/21')], 'validity': {('1140', '94.198.152.0/21'): {'state': 'valid', 'reason': None, 'vrps': [{'asn': '1140', 'prefix': '94.198.152.0/21', 'max_length': '21'}]}}, 'errors': []}, {'ip': '2a00:d78:0:712:94:198:159:8', 'routes': [('1140', '2a00:d78::/32')], 'validity': {('1140', '2a00:d78::/32'): {'state': 'valid', 'reason': None, 'vrps': [{'asn': '1140', 'prefix': '2a00:d78::/32', 'max_length': '32'}]}}, 'errors': []}]", + "webtestrpki": 9000, + "mailtestrpki": null + } + }, + { + "model": "checks.rpkinshost", + "pk": 9002, + "fields": { + "host": "ns2.sidnlabs.nl.", + "score": null, + "routing": "[{'ip': '194.0.28.11', 'routes': [('48283', '194.0.28.0/24')], 'validity': {('48283', '194.0.28.0/24'): {'state': 'valid', 'reason': None, 'vrps': [{'asn': '48283', 'prefix': '194.0.28.0/24', 'max_length': '24'}]}}, 'errors': []}, {'ip': '2001:678:2c:0:194:0:28:11', 'routes': [('48283', '2001:678:2c::/48')], 'validity': {('48283', '2001:678:2c::/48'): {'state': 'valid', 'reason': None, 'vrps': [{'asn': '48283', 'prefix': '2001:678:2c::/48', 'max_length': '48'}]}}, 'errors': []}]", + "webtestrpki": 9000, + "mailtestrpki": null + } + }, + { + "model": "checks.rpkinshost", + "pk": 9003, + "fields": { + "host": "ex1.sidnlabs.nl.", + "score": null, + "routing": "[{'ip': '94.198.159.8', 'routes': [('1140', '94.198.152.0/21')], 'validity': {('1140', '94.198.152.0/21'): {'state': 'valid', 'reason': None, 'vrps': [{'asn': '1140', 'prefix': '94.198.152.0/21', 'max_length': '21'}]}}, 'errors': []}, {'ip': '2a00:d78:0:712:94:198:159:8', 'routes': [('1140', '2a00:d78::/32')], 'validity': {('1140', '2a00:d78::/32'): {'state': 'valid', 'reason': None, 'vrps': [{'asn': '1140', 'prefix': '2a00:d78::/32', 'max_length': '32'}]}}, 'errors': []}]", + "webtestrpki": 9001, + "mailtestrpki": null + } + }, + { + "model": "checks.rpkinshost", + "pk": 9004, + "fields": { + "host": "anytest1.sidnlabs.nl.", + "score": null, + "routing": "[{'ip': '194.0.5.53', 'routes': [('210004', '194.0.5.0/24')], 'validity': {('210004', '194.0.5.0/24'): {'state': 'valid', 'reason': None, 'vrps': [{'asn': '210004', 'prefix': '194.0.5.0/24', 'max_length': '24'}]}}, 'errors': []}, {'ip': '2001:678:8::53', 'routes': [('210004', '2001:678:8::/48')], 'validity': {('210004', '2001:678:8::/48'): {'state': 'valid', 'reason': None, 'vrps': [{'asn': '210004', 'prefix': '2001:678:8::/48', 'max_length': '48'}]}}, 'errors': []}]", + "webtestrpki": 9001, + "mailtestrpki": null + } + }, + { + "model": "checks.rpkinshost", + "pk": 9005, + "fields": { + "host": "ex2.sidnlabs.nl.", + "score": null, + "routing": "[{'ip': '145.40.68.55', 'routes': [('54825', '145.40.68.0/24')], 'validity': {('54825', '145.40.68.0/24'): {'state': 'valid', 'reason': None, 'vrps': [{'asn': '54825', 'prefix': '145.40.68.0/24', 'max_length': '24'}]}}, 'errors': []}, {'ip': '2604:1380:4601:6300::1', 'routes': [('54825', '2604:1380:4600::/44')], 'validity': {('54825', '2604:1380:4600::/44'): {'state': 'valid', 'reason': None, 'vrps': [{'asn': '54825', 'prefix': '2604:1380::/32', 'max_length': '44'}, {'asn': '54825', 'prefix': '2604:1380::/32', 'max_length': '48'}]}}, 'errors': []}]", + "webtestrpki": 9001, + "mailtestrpki": null + } + }, + { + "model": "checks.rpkinshost", + "pk": 9006, + "fields": { + "host": "ns2.sidnlabs.nl.", + "score": null, + "routing": "[{'ip': '194.0.28.11', 'routes': [('48283', '194.0.28.0/24')], 'validity': {('48283', '194.0.28.0/24'): {'state': 'valid', 'reason': None, 'vrps': [{'asn': '48283', 'prefix': '194.0.28.0/24', 'max_length': '24'}]}}, 'errors': []}, {'ip': '2001:678:2c:0:194:0:28:11', 'routes': [('48283', '2001:678:2c::/48')], 'validity': {('48283', '2001:678:2c::/48'): {'state': 'valid', 'reason': None, 'vrps': [{'asn': '48283', 'prefix': '2001:678:2c::/48', 'max_length': '48'}]}}, 'errors': []}]", + "webtestrpki": 9002, + "mailtestrpki": null + } + }, + { + "model": "checks.rpkinshost", + "pk": 9007, + "fields": { + "host": "ns5.sidn.nl.", + "score": null, + "routing": "[{'ip': '145.40.68.55', 'routes': [('54825', '145.40.68.0/24')], 'validity': {('54825', '145.40.68.0/24'): {'state': 'valid', 'reason': None, 'vrps': [{'asn': '54825', 'prefix': '145.40.68.0/24', 'max_length': '24'}]}}, 'errors': []}, {'ip': '2604:1380:4601:6300::1', 'routes': [('54825', '2604:1380:4600::/44')], 'validity': {('54825', '2604:1380:4600::/44'): {'state': 'valid', 'reason': None, 'vrps': [{'asn': '54825', 'prefix': '2604:1380::/32', 'max_length': '44'}, {'asn': '54825', 'prefix': '2604:1380::/32', 'max_length': '48'}]}}, 'errors': []}]", + "webtestrpki": 9002, + "mailtestrpki": null + } + }, + { + "model": "checks.rpkinshost", + "pk": 9008, + "fields": { + "host": "ns1.sidnlabs.nl.", + "score": null, + "routing": "[{'ip': '94.198.159.8', 'routes': [('1140', '94.198.152.0/21')], 'validity': {('1140', '94.198.152.0/21'): {'state': 'valid', 'reason': None, 'vrps': [{'asn': '1140', 'prefix': '94.198.152.0/21', 'max_length': '21'}]}}, 'errors': []}, {'ip': '2a00:d78:0:712:94:198:159:8', 'routes': [('1140', '2a00:d78::/32')], 'validity': {('1140', '2a00:d78::/32'): {'state': 'valid', 'reason': None, 'vrps': [{'asn': '1140', 'prefix': '2a00:d78::/32', 'max_length': '32'}]}}, 'errors': []}]", + "webtestrpki": 9002, + "mailtestrpki": null + } + }, + { + "model": "checks.rpkinshost", + "pk": 9009, + "fields": { + "host": "pdns-public-ns2.powerdns.com.", + "score": null, + "routing": "[{'ip': '45.55.10.200', 'routes': [('14061', '45.55.0.0/19')], 'validity': {('14061', '45.55.0.0/19'): {'state': 'valid', 'reason': None, 'vrps': [{'asn': '14061', 'prefix': '45.55.0.0/16', 'max_length': '22'}]}}, 'errors': []}, {'ip': '2604:a880:1:20::132:5001', 'routes': [('14061', '2604:a880:1::/48')], 'validity': {('14061', '2604:a880:1::/48'): {'state': 'valid', 'reason': None, 'vrps': [{'asn': '14061', 'prefix': '2604:a880::/32', 'max_length': '48'}]}}, 'errors': []}]", + "webtestrpki": 9003, + "mailtestrpki": null + } + }, + { + "model": "checks.rpkinshost", + "pk": 9010, + "fields": { + "host": "ns3.surfnet.nl.", + "score": null, + "routing": "[{'ip': '195.169.124.71', 'routes': [('1103', '195.169.0.0/16')], 'validity': {('1103', '195.169.0.0/16'): {'state': 'valid', 'reason': None, 'vrps': [{'asn': '1103', 'prefix': '195.169.0.0/16', 'max_length': '24'}]}}, 'errors': []}, {'ip': '2001:610:0:800c:195:169:124:71', 'routes': [('1103', '2001:610::/29')], 'validity': {('1103', '2001:610::/29'): {'state': 'valid', 'reason': None, 'vrps': [{'asn': '1103', 'prefix': '2001:610::/29', 'max_length': '29'}]}}, 'errors': []}]", + "webtestrpki": 9003, + "mailtestrpki": null + } + }, + { + "model": "checks.rpkinshost", + "pk": 9011, + "fields": { + "host": "li1.forfun.net.", + "score": null, + "routing": "[{'ip': '96.126.104.187', 'routes': [('63949', '96.126.104.0/21')], 'validity': {('63949', '96.126.104.0/21'): {'state': 'valid', 'reason': None, 'vrps': [{'asn': '63949', 'prefix': '96.126.96.0/19', 'max_length': '24'}]}}, 'errors': []}, {'ip': '2600:3c03::f03c:91ff:fedf:1e98', 'routes': [('63949', '2600:3c03::/32')], 'validity': {('63949', '2600:3c03::/32'): {'state': 'valid', 'reason': None, 'vrps': [{'asn': '63949', 'prefix': '2600:3c00::/28', 'max_length': '48'}]}}, 'errors': []}]", + "webtestrpki": 9003, + "mailtestrpki": null + } + }, + { + "model": "checks.rpkinshost", + "pk": 9012, + "fields": { + "host": "ns4.google.com.", + "score": null, + "routing": "[{'ip': '216.239.38.10', 'routes': [('15169', '216.239.32.0/19'), ('15169', '216.239.38.0/24')], 'validity': {('15169', '216.239.32.0/19'): {'state': 'valid', 'reason': None, 'vrps': [{'asn': '15169', 'prefix': '216.239.32.0/19', 'max_length': '19'}]}, ('15169', '216.239.38.0/24'): {'state': 'valid', 'reason': None, 'vrps': [{'asn': '15169', 'prefix': '216.239.38.0/24', 'max_length': '24'}]}}, 'errors': []}, {'ip': '2001:4860:4802:38::a', 'routes': [('15169', '2001:4860::/32')], 'validity': {('15169', '2001:4860::/32'): {'state': 'valid', 'reason': None, 'vrps': [{'asn': '15169', 'prefix': '2001:4860::/32', 'max_length': '32'}]}}, 'errors': []}]", + "webtestrpki": 9004, + "mailtestrpki": null + } + }, + { + "model": "checks.rpkinshost", + "pk": 9013, + "fields": { + "host": "ns3.google.com.", + "score": null, + "routing": "[{'ip': '216.239.36.10', 'routes': [('15169', '216.239.32.0/19'), ('15169', '216.239.36.0/24')], 'validity': {('15169', '216.239.32.0/19'): {'state': 'valid', 'reason': None, 'vrps': [{'asn': '15169', 'prefix': '216.239.32.0/19', 'max_length': '19'}]}, ('15169', '216.239.36.0/24'): {'state': 'valid', 'reason': None, 'vrps': [{'asn': '15169', 'prefix': '216.239.36.0/24', 'max_length': '24'}]}}, 'errors': []}, {'ip': '2001:4860:4802:36::a', 'routes': [('15169', '2001:4860::/32')], 'validity': {('15169', '2001:4860::/32'): {'state': 'valid', 'reason': None, 'vrps': [{'asn': '15169', 'prefix': '2001:4860::/32', 'max_length': '32'}]}}, 'errors': []}]", + "webtestrpki": 9004, + "mailtestrpki": null + } + }, + { + "model": "checks.rpkinshost", + "pk": 9014, + "fields": { + "host": "ns1.google.com.", + "score": null, + "routing": "[{'ip': '216.239.32.10', 'routes': [('15169', '216.239.32.0/24'), ('15169', '216.239.32.0/19')], 'validity': {('15169', '216.239.32.0/24'): {'state': 'valid', 'reason': None, 'vrps': [{'asn': '15169', 'prefix': '216.239.32.0/24', 'max_length': '24'}]}, ('15169', '216.239.32.0/19'): {'state': 'valid', 'reason': None, 'vrps': [{'asn': '15169', 'prefix': '216.239.32.0/19', 'max_length': '19'}]}}, 'errors': []}, {'ip': '2001:4860:4802:32::a', 'routes': [('15169', '2001:4860::/32')], 'validity': {('15169', '2001:4860::/32'): {'state': 'valid', 'reason': None, 'vrps': [{'asn': '15169', 'prefix': '2001:4860::/32', 'max_length': '32'}]}}, 'errors': []}]", + "webtestrpki": 9004, + "mailtestrpki": null + } + }, + { + "model": "checks.rpkinshost", + "pk": 9015, + "fields": { + "host": "ns2.google.com.", + "score": null, + "routing": "[{'ip': '216.239.34.10', 'routes': [('15169', '216.239.34.0/24'), ('15169', '216.239.32.0/19')], 'validity': {('15169', '216.239.34.0/24'): {'state': 'valid', 'reason': None, 'vrps': [{'asn': '15169', 'prefix': '216.239.34.0/24', 'max_length': '24'}]}, ('15169', '216.239.32.0/19'): {'state': 'valid', 'reason': None, 'vrps': [{'asn': '15169', 'prefix': '216.239.32.0/19', 'max_length': '19'}]}}, 'errors': []}, {'ip': '2001:4860:4802:34::a', 'routes': [('15169', '2001:4860::/32')], 'validity': {('15169', '2001:4860::/32'): {'state': 'valid', 'reason': None, 'vrps': [{'asn': '15169', 'prefix': '2001:4860::/32', 'max_length': '32'}]}}, 'errors': []}]", + "webtestrpki": 9004, + "mailtestrpki": null + } + }, + { + "model": "checks.rpkinshost", + "pk": 9016, + "fields": { + "host": "ns2.transip.eu.", + "score": null, + "routing": "[{'ip': '37.97.199.195', 'routes': [('20857', '37.97.128.0/17')], 'validity': {('20857', '37.97.128.0/17'): {'state': 'valid', 'reason': None, 'vrps': [{'asn': '20857', 'prefix': '37.97.128.0/17', 'max_length': '24'}]}}, 'errors': []}, {'ip': '2a01:7c8:f:c1f::195', 'routes': [('20857', '2a01:7c8::/32')], 'validity': {('20857', '2a01:7c8::/32'): {'state': 'valid', 'reason': None, 'vrps': [{'asn': '20857', 'prefix': '2a01:7c8::/32', 'max_length': '32'}]}}, 'errors': []}]", + "webtestrpki": 9005, + "mailtestrpki": null + } + }, + { + "model": "checks.rpkinshost", + "pk": 9017, + "fields": { + "host": "ns1.transip.nl.", + "score": null, + "routing": "[{'ip': '195.8.195.195', 'routes': [('20857', '195.8.195.0/24')], 'validity': {('20857', '195.8.195.0/24'): {'state': 'valid', 'reason': None, 'vrps': [{'asn': '20857', 'prefix': '195.8.195.0/24', 'max_length': '24'}]}}, 'errors': []}, {'ip': '2a01:7c8:7000:195::195', 'routes': [('20857', '2a01:7c8:7000::/36')], 'validity': {('20857', '2a01:7c8:7000::/36'): {'state': 'valid', 'reason': None, 'vrps': [{'asn': '20857', 'prefix': '2a01:7c8:7000::/36', 'max_length': '36'}]}}, 'errors': []}]", + "webtestrpki": 9005, + "mailtestrpki": null + } + }, + { + "model": "checks.rpkinshost", + "pk": 9018, + "fields": { + "host": "li1.forfun.net.", + "score": null, + "routing": "[{'ip': '96.126.104.187', 'routes': [('63949', '96.126.104.0/21')], 'validity': {('63949', '96.126.104.0/21'): {'state': 'valid', 'reason': None, 'vrps': [{'asn': '63949', 'prefix': '96.126.96.0/19', 'max_length': '24'}]}}, 'errors': []}, {'ip': '2600:3c03::f03c:91ff:fedf:1e98', 'routes': [('63949', '2600:3c03::/32')], 'validity': {('63949', '2600:3c03::/32'): {'state': 'valid', 'reason': None, 'vrps': [{'asn': '63949', 'prefix': '2600:3c00::/28', 'max_length': '48'}]}}, 'errors': []}]", + "webtestrpki": 9005, + "mailtestrpki": null + } + }, + { + "model": "checks.rpkinshost", + "pk": 9019, + "fields": { + "host": "cruz.ns.cloudflare.com.", + "score": null, + "routing": "[{'ip': '172.64.32.88', 'routes': [('13335', '172.64.32.0/20'), ('13335', '172.64.32.0/24')], 'validity': {('13335', '172.64.32.0/20'): {'state': 'valid', 'reason': None, 'vrps': [{'asn': '13335', 'prefix': '172.64.32.0/20', 'max_length': '20'}]}, ('13335', '172.64.32.0/24'): {'state': 'valid', 'reason': None, 'vrps': [{'asn': '13335', 'prefix': '172.64.32.0/24', 'max_length': '24'}]}}, 'errors': []}, {'ip': '108.162.192.88', 'routes': [('13335', '108.162.192.0/24'), ('13335', '108.162.192.0/20')], 'validity': {('13335', '108.162.192.0/24'): {'state': 'valid', 'reason': None, 'vrps': [{'asn': '13335', 'prefix': '108.162.192.0/24', 'max_length': '24'}]}, ('13335', '108.162.192.0/20'): {'state': 'valid', 'reason': None, 'vrps': [{'asn': '13335', 'prefix': '108.162.192.0/20', 'max_length': '20'}]}}, 'errors': []}, {'ip': '173.245.58.88', 'routes': [('13335', '173.245.58.0/24')], 'validity': {('13335', '173.245.58.0/24'): {'state': 'valid', 'reason': None, 'vrps': [{'asn': '13335', 'prefix': '173.245.58.0/24', 'max_length': '24'}]}}, 'errors': []}, {'ip': '2a06:98c1:50::ac40:2058', 'routes': [('13335', '2a06:98c1:50::/45')], 'validity': {('13335', '2a06:98c1:50::/45'): {'state': 'valid', 'reason': None, 'vrps': [{'asn': '13335', 'prefix': '2a06:98c1:50::/45', 'max_length': '45'}]}}, 'errors': []}, {'ip': '2606:4700:50::adf5:3a58', 'routes': [('13335', '2606:4700:50::/44')], 'validity': {('13335', '2606:4700:50::/44'): {'state': 'valid', 'reason': None, 'vrps': [{'asn': '13335', 'prefix': '2606:4700:50::/44', 'max_length': '44'}]}}, 'errors': []}, {'ip': '2803:f800:50::6ca2:c058', 'routes': [('13335', '2803:f800:50::/45')], 'validity': {('13335', '2803:f800:50::/45'): {'state': 'valid', 'reason': None, 'vrps': [{'asn': '13335', 'prefix': '2803:f800:50::/45', 'max_length': '48'}, {'asn': '13335', 'prefix': '2803:f800::/32', 'max_length': '48'}]}}, 'errors': []}]", + "webtestrpki": 9006, + "mailtestrpki": null + } + }, + { + "model": "checks.rpkinshost", + "pk": 9020, + "fields": { + "host": "carl.ns.cloudflare.com.", + "score": null, + "routing": "[{'ip': '173.245.59.106', 'routes': [('13335', '173.245.59.0/24')], 'validity': {('13335', '173.245.59.0/24'): {'state': 'valid', 'reason': None, 'vrps': [{'asn': '13335', 'prefix': '173.245.59.0/24', 'max_length': '24'}]}}, 'errors': []}, {'ip': '172.64.33.106', 'routes': [('13335', '172.64.32.0/20'), ('13335', '172.64.33.0/24')], 'validity': {('13335', '172.64.32.0/20'): {'state': 'valid', 'reason': None, 'vrps': [{'asn': '13335', 'prefix': '172.64.32.0/20', 'max_length': '20'}]}, ('13335', '172.64.33.0/24'): {'state': 'valid', 'reason': None, 'vrps': [{'asn': '13335', 'prefix': '172.64.33.0/24', 'max_length': '24'}]}}, 'errors': []}, {'ip': '108.162.193.106', 'routes': [('13335', '108.162.193.0/24'), ('13335', '108.162.192.0/20')], 'validity': {('13335', '108.162.193.0/24'): {'state': 'valid', 'reason': None, 'vrps': [{'asn': '13335', 'prefix': '108.162.193.0/24', 'max_length': '24'}]}, ('13335', '108.162.192.0/20'): {'state': 'valid', 'reason': None, 'vrps': [{'asn': '13335', 'prefix': '108.162.192.0/20', 'max_length': '20'}]}}, 'errors': []}, {'ip': '2606:4700:58::adf5:3b6a', 'routes': [('13335', '2606:4700:50::/44')], 'validity': {('13335', '2606:4700:50::/44'): {'state': 'valid', 'reason': None, 'vrps': [{'asn': '13335', 'prefix': '2606:4700:50::/44', 'max_length': '44'}]}}, 'errors': []}, {'ip': '2803:f800:50::6ca2:c16a', 'routes': [('13335', '2803:f800:50::/45')], 'validity': {('13335', '2803:f800:50::/45'): {'state': 'valid', 'reason': None, 'vrps': [{'asn': '13335', 'prefix': '2803:f800:50::/45', 'max_length': '48'}, {'asn': '13335', 'prefix': '2803:f800::/32', 'max_length': '48'}]}}, 'errors': []}, {'ip': '2a06:98c1:50::ac40:216a', 'routes': [('13335', '2a06:98c1:50::/45')], 'validity': {('13335', '2a06:98c1:50::/45'): {'state': 'valid', 'reason': None, 'vrps': [{'asn': '13335', 'prefix': '2a06:98c1:50::/45', 'max_length': '45'}]}}, 'errors': []}]", + "webtestrpki": 9006, + "mailtestrpki": null + } + }, + { + "model": "checks.rpkinshost", + "pk": 9021, + "fields": { + "host": "knot.sidnlabs.nl.", + "score": null, + "routing": "[{'ip': '94.198.159.27', 'routes': [('1140', '94.198.152.0/21')], 'validity': {('1140', '94.198.152.0/21'): {'state': 'valid', 'reason': None, 'vrps': [{'asn': '1140', 'prefix': '94.198.152.0/21', 'max_length': '21'}]}}, 'errors': []}, {'ip': '2a00:d78:0:712:94:198:159:27', 'routes': [('1140', '2a00:d78::/32')], 'validity': {('1140', '2a00:d78::/32'): {'state': 'valid', 'reason': None, 'vrps': [{'asn': '1140', 'prefix': '2a00:d78::/32', 'max_length': '32'}]}}, 'errors': []}]", + "webtestrpki": 9007, + "mailtestrpki": null + } + }, + { + "model": "checks.rpkinshost", + "pk": 9022, + "fields": { + "host": "nsd4.sidnlabs.nl.", + "score": null, + "routing": "[{'ip': '94.198.159.33', 'routes': [('1140', '94.198.152.0/21')], 'validity': {('1140', '94.198.152.0/21'): {'state': 'valid', 'reason': None, 'vrps': [{'asn': '1140', 'prefix': '94.198.152.0/21', 'max_length': '21'}]}}, 'errors': []}, {'ip': '2a00:d78:0:712:94:198:159:33', 'routes': [('1140', '2a00:d78::/32')], 'validity': {('1140', '2a00:d78::/32'): {'state': 'valid', 'reason': None, 'vrps': [{'asn': '1140', 'prefix': '2a00:d78::/32', 'max_length': '32'}]}}, 'errors': []}]", + "webtestrpki": 9007, + "mailtestrpki": null + } + }, + { + "model": "checks.rpkinshost", + "pk": 9023, + "fields": { + "host": "bind9.sidnlabs.nl.", + "score": null, + "routing": "[{'ip': '94.198.159.39', 'routes': [('1140', '94.198.152.0/21')], 'validity': {('1140', '94.198.152.0/21'): {'state': 'valid', 'reason': None, 'vrps': [{'asn': '1140', 'prefix': '94.198.152.0/21', 'max_length': '21'}]}}, 'errors': []}, {'ip': '2a00:d78:0:712:94:198:159:39', 'routes': [('1140', '2a00:d78::/32')], 'validity': {('1140', '2a00:d78::/32'): {'state': 'valid', 'reason': None, 'vrps': [{'asn': '1140', 'prefix': '2a00:d78::/32', 'max_length': '32'}]}}, 'errors': []}]", + "webtestrpki": 9007, + "mailtestrpki": null + } + }, + { + "model": "checks.rpkinshost", + "pk": 9024, + "fields": { + "host": "yadifa.sidnlabs.nl.", + "score": null, + "routing": "[{'ip': '94.198.159.28', 'routes': [('1140', '94.198.152.0/21')], 'validity': {('1140', '94.198.152.0/21'): {'state': 'valid', 'reason': None, 'vrps': [{'asn': '1140', 'prefix': '94.198.152.0/21', 'max_length': '21'}]}}, 'errors': []}, {'ip': '2a00:d78:0:712:94:198:159:28', 'routes': [('1140', '2a00:d78::/32')], 'validity': {('1140', '2a00:d78::/32'): {'state': 'valid', 'reason': None, 'vrps': [{'asn': '1140', 'prefix': '2a00:d78::/32', 'max_length': '32'}]}}, 'errors': []}]", + "webtestrpki": 9007, + "mailtestrpki": null + } + }, + { + "model": "checks.rpkinshost", + "pk": 9025, + "fields": { + "host": "powerdns.sidnlabs.nl.", + "score": null, + "routing": "[{'ip': '94.198.159.26', 'routes': [('1140', '94.198.152.0/21')], 'validity': {('1140', '94.198.152.0/21'): {'state': 'valid', 'reason': None, 'vrps': [{'asn': '1140', 'prefix': '94.198.152.0/21', 'max_length': '21'}]}}, 'errors': []}, {'ip': '2a00:d78:0:712:94:198:159:26', 'routes': [('1140', '2a00:d78::/32')], 'validity': {('1140', '2a00:d78::/32'): {'state': 'valid', 'reason': None, 'vrps': [{'asn': '1140', 'prefix': '2a00:d78::/32', 'max_length': '32'}]}}, 'errors': []}]", + "webtestrpki": 9007, + "mailtestrpki": null + } + }, + { + "model": "checks.rpkinshost", + "pk": 9026, + "fields": { + "host": "adns1.dnsrakuda.com.", + "score": null, + "routing": "[{'ip': '3.225.161.117', 'routes': [('14618', '3.224.0.0/12'), ('16509', '3.192.0.0/10')], 'validity': {('14618', '3.224.0.0/12'): {'state': 'valid', 'reason': None, 'vrps': [{'asn': '14618', 'prefix': '3.224.0.0/12', 'max_length': '12'}]}, ('16509', '3.192.0.0/10'): {'state': 'valid', 'reason': None, 'vrps': [{'asn': '16509', 'prefix': '3.192.0.0/10', 'max_length': '10'}]}}, 'errors': []}, {'ip': '2600:1f18:6296:8902::c0de', 'routes': [('14618', '2600:1f18::/33'), ('14618', '2600:1f18:6000::/35')], 'validity': {('14618', '2600:1f18::/33'): {'state': 'valid', 'reason': None, 'vrps': [{'asn': '14618', 'prefix': '2600:1f18::/33', 'max_length': '33'}]}, ('14618', '2600:1f18:6000::/35'): {'state': 'valid', 'reason': None, 'vrps': [{'asn': '14618', 'prefix': '2600:1f18:6000::/35', 'max_length': '35'}]}}, 'errors': []}]", + "webtestrpki": 9008, + "mailtestrpki": null + } + }, + { + "model": "checks.rpkinshost", + "pk": 9027, + "fields": { + "host": "adns1.nnn.upenn.edu.", + "score": null, + "routing": "[{'ip': '128.91.2.53', 'routes': [('55', '128.91.0.0/16')], 'validity': {('55', '128.91.0.0/16'): {'state': 'valid', 'reason': None, 'vrps': [{'asn': '55', 'prefix': '128.91.0.0/16', 'max_length': '16'}]}}, 'errors': []}, {'ip': '2607:f470:1001::ad:1', 'routes': [('55', '2607:f470::/32')], 'validity': {('55', '2607:f470::/32'): {'state': 'valid', 'reason': None, 'vrps': [{'asn': '55', 'prefix': '2607:f470::/32', 'max_length': '32'}]}}, 'errors': []}]", + "webtestrpki": 9008, + "mailtestrpki": null + } + }, + { + "model": "checks.rpkinshost", + "pk": 9028, + "fields": { + "host": "adns2.dnsrakuda.com.", + "score": null, + "routing": "[{'ip': '52.88.78.179', 'routes': [('16509', '52.88.0.0/15'), ('16509', '52.88.0.0/13')], 'validity': {('16509', '52.88.0.0/15'): {'state': 'valid', 'reason': None, 'vrps': [{'asn': '16509', 'prefix': '52.88.0.0/15', 'max_length': '15'}]}, ('16509', '52.88.0.0/13'): {'state': 'valid', 'reason': None, 'vrps': [{'asn': '16509', 'prefix': '52.88.0.0/13', 'max_length': '13'}]}}, 'errors': []}, {'ip': '2600:1f14:990:2e01::bad', 'routes': [('16509', '2600:1f14:800::/37')], 'validity': {('16509', '2600:1f14:800::/37'): {'state': 'valid', 'reason': None, 'vrps': [{'asn': '16509', 'prefix': '2600:1f14:800::/37', 'max_length': '37'}]}}, 'errors': []}]", + "webtestrpki": 9008, + "mailtestrpki": null + } + }, + { + "model": "checks.rpkinshost", + "pk": 9029, + "fields": { + "host": "adns2.nnn.upenn.edu.", + "score": null, + "routing": "[{'ip': '128.91.254.53', 'routes': [('55', '128.91.0.0/16')], 'validity': {('55', '128.91.0.0/16'): {'state': 'valid', 'reason': None, 'vrps': [{'asn': '55', 'prefix': '128.91.0.0/16', 'max_length': '16'}]}}, 'errors': []}, {'ip': '2607:f470:1002::ad:2', 'routes': [('55', '2607:f470::/32')], 'validity': {('55', '2607:f470::/32'): {'state': 'valid', 'reason': None, 'vrps': [{'asn': '55', 'prefix': '2607:f470::/32', 'max_length': '32'}]}}, 'errors': []}]", + "webtestrpki": 9008, + "mailtestrpki": null + } + }, + { + "model": "checks.rpkinshost", + "pk": 9030, + "fields": { + "host": "adns3.nnn.upenn.edu.", + "score": null, + "routing": "[{'ip': '128.91.251.53', 'routes': [('55', '128.91.0.0/16')], 'validity': {('55', '128.91.0.0/16'): {'state': 'valid', 'reason': None, 'vrps': [{'asn': '55', 'prefix': '128.91.0.0/16', 'max_length': '16'}]}}, 'errors': []}, {'ip': '2607:f470:1003::ad:3', 'routes': [('55', '2607:f470::/32')], 'validity': {('55', '2607:f470::/32'): {'state': 'valid', 'reason': None, 'vrps': [{'asn': '55', 'prefix': '2607:f470::/32', 'max_length': '32'}]}}, 'errors': []}]", + "webtestrpki": 9008, + "mailtestrpki": null + } + }, + { + "model": "checks.rpkinshost", + "pk": 9031, + "fields": { + "host": "ns-cloud-c1.googledomains.com.", + "score": null, + "routing": "[{'ip': '216.239.32.108', 'routes': [('15169', '216.239.32.0/24'), ('15169', '216.239.32.0/19')], 'validity': {('15169', '216.239.32.0/24'): {'state': 'valid', 'reason': None, 'vrps': [{'asn': '15169', 'prefix': '216.239.32.0/24', 'max_length': '24'}]}, ('15169', '216.239.32.0/19'): {'state': 'valid', 'reason': None, 'vrps': [{'asn': '15169', 'prefix': '216.239.32.0/19', 'max_length': '19'}]}}, 'errors': []}, {'ip': '2001:4860:4802:32::6c', 'routes': [('15169', '2001:4860::/32')], 'validity': {('15169', '2001:4860::/32'): {'state': 'valid', 'reason': None, 'vrps': [{'asn': '15169', 'prefix': '2001:4860::/32', 'max_length': '32'}]}}, 'errors': []}]", + "webtestrpki": 9009, + "mailtestrpki": null + } + }, + { + "model": "checks.rpkinshost", + "pk": 9032, + "fields": { + "host": "ns-cloud-c2.googledomains.com.", + "score": null, + "routing": "[{'ip': '216.239.34.108', 'routes': [('15169', '216.239.32.0/19'), ('15169', '216.239.34.0/24')], 'validity': {('15169', '216.239.32.0/19'): {'state': 'valid', 'reason': None, 'vrps': [{'asn': '15169', 'prefix': '216.239.32.0/19', 'max_length': '19'}]}, ('15169', '216.239.34.0/24'): {'state': 'valid', 'reason': None, 'vrps': [{'asn': '15169', 'prefix': '216.239.34.0/24', 'max_length': '24'}]}}, 'errors': []}, {'ip': '2001:4860:4802:34::6c', 'routes': [('15169', '2001:4860::/32')], 'validity': {('15169', '2001:4860::/32'): {'state': 'valid', 'reason': None, 'vrps': [{'asn': '15169', 'prefix': '2001:4860::/32', 'max_length': '32'}]}}, 'errors': []}]", + "webtestrpki": 9009, + "mailtestrpki": null + } + }, + { + "model": "checks.rpkinshost", + "pk": 9033, + "fields": { + "host": "ns-cloud-c4.googledomains.com.", + "score": null, + "routing": "[{'ip': '216.239.38.108', 'routes': [('15169', '216.239.38.0/24'), ('15169', '216.239.32.0/19')], 'validity': {('15169', '216.239.38.0/24'): {'state': 'valid', 'reason': None, 'vrps': [{'asn': '15169', 'prefix': '216.239.38.0/24', 'max_length': '24'}]}, ('15169', '216.239.32.0/19'): {'state': 'valid', 'reason': None, 'vrps': [{'asn': '15169', 'prefix': '216.239.32.0/19', 'max_length': '19'}]}}, 'errors': []}, {'ip': '2001:4860:4802:38::6c', 'routes': [('15169', '2001:4860::/32')], 'validity': {('15169', '2001:4860::/32'): {'state': 'valid', 'reason': None, 'vrps': [{'asn': '15169', 'prefix': '2001:4860::/32', 'max_length': '32'}]}}, 'errors': []}]", + "webtestrpki": 9009, + "mailtestrpki": null + } + }, + { + "model": "checks.rpkinshost", + "pk": 9034, + "fields": { + "host": "ns-cloud-c3.googledomains.com.", + "score": null, + "routing": "[{'ip': '216.239.36.108', 'routes': [('15169', '216.239.36.0/24'), ('15169', '216.239.32.0/19')], 'validity': {('15169', '216.239.36.0/24'): {'state': 'valid', 'reason': None, 'vrps': [{'asn': '15169', 'prefix': '216.239.36.0/24', 'max_length': '24'}]}, ('15169', '216.239.32.0/19'): {'state': 'valid', 'reason': None, 'vrps': [{'asn': '15169', 'prefix': '216.239.32.0/19', 'max_length': '19'}]}}, 'errors': []}, {'ip': '2001:4860:4802:36::6c', 'routes': [('15169', '2001:4860::/32')], 'validity': {('15169', '2001:4860::/32'): {'state': 'valid', 'reason': None, 'vrps': [{'asn': '15169', 'prefix': '2001:4860::/32', 'max_length': '32'}]}}, 'errors': []}]", + "webtestrpki": 9009, + "mailtestrpki": null + } + }, + { + "model": "checks.rpkinshost", + "pk": 9035, + "fields": { + "host": "ns-cloud-c3.googledomains.com.", + "score": null, + "routing": "[{'ip': '216.239.36.108', 'routes': [('15169', '216.239.32.0/19'), ('15169', '216.239.36.0/24')], 'validity': {('15169', '216.239.32.0/19'): {'state': 'valid', 'reason': None, 'vrps': [{'asn': '15169', 'prefix': '216.239.32.0/19', 'max_length': '19'}]}, ('15169', '216.239.36.0/24'): {'state': 'valid', 'reason': None, 'vrps': [{'asn': '15169', 'prefix': '216.239.36.0/24', 'max_length': '24'}]}}, 'errors': []}, {'ip': '2001:4860:4802:36::6c', 'routes': [('15169', '2001:4860::/32')], 'validity': {('15169', '2001:4860::/32'): {'state': 'valid', 'reason': None, 'vrps': [{'asn': '15169', 'prefix': '2001:4860::/32', 'max_length': '32'}]}}, 'errors': []}]", + "webtestrpki": 9010, + "mailtestrpki": null + } + }, + { + "model": "checks.rpkinshost", + "pk": 9036, + "fields": { + "host": "ns-cloud-c1.googledomains.com.", + "score": null, + "routing": "[{'ip': '216.239.32.108', 'routes': [('15169', '216.239.32.0/24'), ('15169', '216.239.32.0/19')], 'validity': {('15169', '216.239.32.0/24'): {'state': 'valid', 'reason': None, 'vrps': [{'asn': '15169', 'prefix': '216.239.32.0/24', 'max_length': '24'}]}, ('15169', '216.239.32.0/19'): {'state': 'valid', 'reason': None, 'vrps': [{'asn': '15169', 'prefix': '216.239.32.0/19', 'max_length': '19'}]}}, 'errors': []}, {'ip': '2001:4860:4802:32::6c', 'routes': [('15169', '2001:4860::/32')], 'validity': {('15169', '2001:4860::/32'): {'state': 'valid', 'reason': None, 'vrps': [{'asn': '15169', 'prefix': '2001:4860::/32', 'max_length': '32'}]}}, 'errors': []}]", + "webtestrpki": 9010, + "mailtestrpki": null + } + }, + { + "model": "checks.rpkinshost", + "pk": 9037, + "fields": { + "host": "ns-cloud-c2.googledomains.com.", + "score": null, + "routing": "[{'ip': '216.239.34.108', 'routes': [('15169', '216.239.34.0/24'), ('15169', '216.239.32.0/19')], 'validity': {('15169', '216.239.34.0/24'): {'state': 'valid', 'reason': None, 'vrps': [{'asn': '15169', 'prefix': '216.239.34.0/24', 'max_length': '24'}]}, ('15169', '216.239.32.0/19'): {'state': 'valid', 'reason': None, 'vrps': [{'asn': '15169', 'prefix': '216.239.32.0/19', 'max_length': '19'}]}}, 'errors': []}, {'ip': '2001:4860:4802:34::6c', 'routes': [('15169', '2001:4860::/32')], 'validity': {('15169', '2001:4860::/32'): {'state': 'valid', 'reason': None, 'vrps': [{'asn': '15169', 'prefix': '2001:4860::/32', 'max_length': '32'}]}}, 'errors': []}]", + "webtestrpki": 9010, + "mailtestrpki": null + } + }, + { + "model": "checks.rpkinshost", + "pk": 9038, + "fields": { + "host": "ns-cloud-c4.googledomains.com.", + "score": null, + "routing": "[{'ip': '216.239.38.108', 'routes': [('15169', '216.239.32.0/19'), ('15169', '216.239.38.0/24')], 'validity': {('15169', '216.239.32.0/19'): {'state': 'valid', 'reason': None, 'vrps': [{'asn': '15169', 'prefix': '216.239.32.0/19', 'max_length': '19'}]}, ('15169', '216.239.38.0/24'): {'state': 'valid', 'reason': None, 'vrps': [{'asn': '15169', 'prefix': '216.239.38.0/24', 'max_length': '24'}]}}, 'errors': []}, {'ip': '2001:4860:4802:38::6c', 'routes': [('15169', '2001:4860::/32')], 'validity': {('15169', '2001:4860::/32'): {'state': 'valid', 'reason': None, 'vrps': [{'asn': '15169', 'prefix': '2001:4860::/32', 'max_length': '32'}]}}, 'errors': []}]", + "webtestrpki": 9010, + "mailtestrpki": null + } + }, + { + "model": "checks.rpkinshost", + "pk": 9039, + "fields": { + "host": "ns-cloud-c1.googledomains.com.", + "score": null, + "routing": "[{'ip': '216.239.32.108', 'routes': [('15169', '216.239.32.0/24'), ('15169', '216.239.32.0/19')], 'validity': {('15169', '216.239.32.0/24'): {'state': 'valid', 'reason': None, 'vrps': [{'asn': '15169', 'prefix': '216.239.32.0/24', 'max_length': '24'}]}, ('15169', '216.239.32.0/19'): {'state': 'valid', 'reason': None, 'vrps': [{'asn': '15169', 'prefix': '216.239.32.0/19', 'max_length': '19'}]}}, 'errors': []}, {'ip': '2001:4860:4802:32::6c', 'routes': [('15169', '2001:4860::/32')], 'validity': {('15169', '2001:4860::/32'): {'state': 'valid', 'reason': None, 'vrps': [{'asn': '15169', 'prefix': '2001:4860::/32', 'max_length': '32'}]}}, 'errors': []}]", + "webtestrpki": 9011, + "mailtestrpki": null + } + }, + { + "model": "checks.rpkinshost", + "pk": 9040, + "fields": { + "host": "ns-cloud-c2.googledomains.com.", + "score": null, + "routing": "[{'ip': '216.239.34.108', 'routes': [('15169', '216.239.34.0/24'), ('15169', '216.239.32.0/19')], 'validity': {('15169', '216.239.34.0/24'): {'state': 'valid', 'reason': None, 'vrps': [{'asn': '15169', 'prefix': '216.239.34.0/24', 'max_length': '24'}]}, ('15169', '216.239.32.0/19'): {'state': 'valid', 'reason': None, 'vrps': [{'asn': '15169', 'prefix': '216.239.32.0/19', 'max_length': '19'}]}}, 'errors': []}, {'ip': '2001:4860:4802:34::6c', 'routes': [('15169', '2001:4860::/32')], 'validity': {('15169', '2001:4860::/32'): {'state': 'valid', 'reason': None, 'vrps': [{'asn': '15169', 'prefix': '2001:4860::/32', 'max_length': '32'}]}}, 'errors': []}]", + "webtestrpki": 9011, + "mailtestrpki": null + } + }, + { + "model": "checks.rpkinshost", + "pk": 9041, + "fields": { + "host": "ns-cloud-c4.googledomains.com.", + "score": null, + "routing": "[{'ip': '216.239.38.108', 'routes': [('15169', '216.239.38.0/24'), ('15169', '216.239.32.0/19')], 'validity': {('15169', '216.239.38.0/24'): {'state': 'valid', 'reason': None, 'vrps': [{'asn': '15169', 'prefix': '216.239.38.0/24', 'max_length': '24'}]}, ('15169', '216.239.32.0/19'): {'state': 'valid', 'reason': None, 'vrps': [{'asn': '15169', 'prefix': '216.239.32.0/19', 'max_length': '19'}]}}, 'errors': []}, {'ip': '2001:4860:4802:38::6c', 'routes': [('15169', '2001:4860::/32')], 'validity': {('15169', '2001:4860::/32'): {'state': 'valid', 'reason': None, 'vrps': [{'asn': '15169', 'prefix': '2001:4860::/32', 'max_length': '32'}]}}, 'errors': []}]", + "webtestrpki": 9011, + "mailtestrpki": null + } + }, + { + "model": "checks.rpkinshost", + "pk": 9042, + "fields": { + "host": "ns-cloud-c3.googledomains.com.", + "score": null, + "routing": "[{'ip': '216.239.36.108', 'routes': [('15169', '216.239.36.0/24'), ('15169', '216.239.32.0/19')], 'validity': {('15169', '216.239.36.0/24'): {'state': 'valid', 'reason': None, 'vrps': [{'asn': '15169', 'prefix': '216.239.36.0/24', 'max_length': '24'}]}, ('15169', '216.239.32.0/19'): {'state': 'valid', 'reason': None, 'vrps': [{'asn': '15169', 'prefix': '216.239.32.0/19', 'max_length': '19'}]}}, 'errors': []}, {'ip': '2001:4860:4802:36::6c', 'routes': [('15169', '2001:4860::/32')], 'validity': {('15169', '2001:4860::/32'): {'state': 'valid', 'reason': None, 'vrps': [{'asn': '15169', 'prefix': '2001:4860::/32', 'max_length': '32'}]}}, 'errors': []}]", + "webtestrpki": 9011, + "mailtestrpki": null + } + }, + { + "model": "checks.rpkinshost", + "pk": 9043, + "fields": { + "host": "ns-cloud-c1.googledomains.com.", + "score": null, + "routing": "[{'ip': '216.239.32.108', 'routes': [('15169', '216.239.32.0/24'), ('15169', '216.239.32.0/19')], 'validity': {('15169', '216.239.32.0/24'): {'state': 'valid', 'reason': None, 'vrps': [{'asn': '15169', 'prefix': '216.239.32.0/24', 'max_length': '24'}]}, ('15169', '216.239.32.0/19'): {'state': 'valid', 'reason': None, 'vrps': [{'asn': '15169', 'prefix': '216.239.32.0/19', 'max_length': '19'}]}}, 'errors': []}, {'ip': '2001:4860:4802:32::6c', 'routes': [('15169', '2001:4860::/32')], 'validity': {('15169', '2001:4860::/32'): {'state': 'valid', 'reason': None, 'vrps': [{'asn': '15169', 'prefix': '2001:4860::/32', 'max_length': '32'}]}}, 'errors': []}]", + "webtestrpki": 9012, + "mailtestrpki": null + } + }, + { + "model": "checks.rpkinshost", + "pk": 9044, + "fields": { + "host": "ns-cloud-c2.googledomains.com.", + "score": null, + "routing": "[{'ip': '216.239.34.108', 'routes': [('15169', '216.239.34.0/24'), ('15169', '216.239.32.0/19')], 'validity': {('15169', '216.239.34.0/24'): {'state': 'valid', 'reason': None, 'vrps': [{'asn': '15169', 'prefix': '216.239.34.0/24', 'max_length': '24'}]}, ('15169', '216.239.32.0/19'): {'state': 'valid', 'reason': None, 'vrps': [{'asn': '15169', 'prefix': '216.239.32.0/19', 'max_length': '19'}]}}, 'errors': []}, {'ip': '2001:4860:4802:34::6c', 'routes': [('15169', '2001:4860::/32')], 'validity': {('15169', '2001:4860::/32'): {'state': 'valid', 'reason': None, 'vrps': [{'asn': '15169', 'prefix': '2001:4860::/32', 'max_length': '32'}]}}, 'errors': []}]", + "webtestrpki": 9012, + "mailtestrpki": null + } + }, + { + "model": "checks.rpkinshost", + "pk": 9045, + "fields": { + "host": "ns-cloud-c4.googledomains.com.", + "score": null, + "routing": "[{'ip': '216.239.38.108', 'routes': [('15169', '216.239.38.0/24'), ('15169', '216.239.32.0/19')], 'validity': {('15169', '216.239.38.0/24'): {'state': 'valid', 'reason': None, 'vrps': [{'asn': '15169', 'prefix': '216.239.38.0/24', 'max_length': '24'}]}, ('15169', '216.239.32.0/19'): {'state': 'valid', 'reason': None, 'vrps': [{'asn': '15169', 'prefix': '216.239.32.0/19', 'max_length': '19'}]}}, 'errors': []}, {'ip': '2001:4860:4802:38::6c', 'routes': [('15169', '2001:4860::/32')], 'validity': {('15169', '2001:4860::/32'): {'state': 'valid', 'reason': None, 'vrps': [{'asn': '15169', 'prefix': '2001:4860::/32', 'max_length': '32'}]}}, 'errors': []}]", + "webtestrpki": 9012, + "mailtestrpki": null + } + }, + { + "model": "checks.rpkinshost", + "pk": 9046, + "fields": { + "host": "ns-cloud-c3.googledomains.com.", + "score": null, + "routing": "[{'ip': '216.239.36.108', 'routes': [('15169', '216.239.32.0/19'), ('15169', '216.239.36.0/24')], 'validity': {('15169', '216.239.32.0/19'): {'state': 'valid', 'reason': None, 'vrps': [{'asn': '15169', 'prefix': '216.239.32.0/19', 'max_length': '19'}]}, ('15169', '216.239.36.0/24'): {'state': 'valid', 'reason': None, 'vrps': [{'asn': '15169', 'prefix': '216.239.36.0/24', 'max_length': '24'}]}}, 'errors': []}, {'ip': '2001:4860:4802:36::6c', 'routes': [('15169', '2001:4860::/32')], 'validity': {('15169', '2001:4860::/32'): {'state': 'valid', 'reason': None, 'vrps': [{'asn': '15169', 'prefix': '2001:4860::/32', 'max_length': '32'}]}}, 'errors': []}]", + "webtestrpki": 9012, + "mailtestrpki": null + } + }, + { + "model": "checks.rpkinshost", + "pk": 9047, + "fields": { + "host": "ns-cloud-c2.googledomains.com.", + "score": null, + "routing": "[{'ip': '216.239.34.108', 'routes': [('15169', '216.239.32.0/19'), ('15169', '216.239.34.0/24')], 'validity': {('15169', '216.239.32.0/19'): {'state': 'valid', 'reason': None, 'vrps': [{'asn': '15169', 'prefix': '216.239.32.0/19', 'max_length': '19'}]}, ('15169', '216.239.34.0/24'): {'state': 'valid', 'reason': None, 'vrps': [{'asn': '15169', 'prefix': '216.239.34.0/24', 'max_length': '24'}]}}, 'errors': []}, {'ip': '2001:4860:4802:34::6c', 'routes': [('15169', '2001:4860::/32')], 'validity': {('15169', '2001:4860::/32'): {'state': 'valid', 'reason': None, 'vrps': [{'asn': '15169', 'prefix': '2001:4860::/32', 'max_length': '32'}]}}, 'errors': []}]", + "webtestrpki": 9013, + "mailtestrpki": null + } + }, + { + "model": "checks.rpkinshost", + "pk": 9048, + "fields": { + "host": "ns-cloud-c4.googledomains.com.", + "score": null, + "routing": "[{'ip': '216.239.38.108', 'routes': [('15169', '216.239.32.0/19'), ('15169', '216.239.38.0/24')], 'validity': {('15169', '216.239.32.0/19'): {'state': 'valid', 'reason': None, 'vrps': [{'asn': '15169', 'prefix': '216.239.32.0/19', 'max_length': '19'}]}, ('15169', '216.239.38.0/24'): {'state': 'valid', 'reason': None, 'vrps': [{'asn': '15169', 'prefix': '216.239.38.0/24', 'max_length': '24'}]}}, 'errors': []}, {'ip': '2001:4860:4802:38::6c', 'routes': [('15169', '2001:4860::/32')], 'validity': {('15169', '2001:4860::/32'): {'state': 'valid', 'reason': None, 'vrps': [{'asn': '15169', 'prefix': '2001:4860::/32', 'max_length': '32'}]}}, 'errors': []}]", + "webtestrpki": 9013, + "mailtestrpki": null + } + }, + { + "model": "checks.rpkinshost", + "pk": 9049, + "fields": { + "host": "ns-cloud-c3.googledomains.com.", + "score": null, + "routing": "[{'ip': '216.239.36.108', 'routes': [('15169', '216.239.32.0/19'), ('15169', '216.239.36.0/24')], 'validity': {('15169', '216.239.32.0/19'): {'state': 'valid', 'reason': None, 'vrps': [{'asn': '15169', 'prefix': '216.239.32.0/19', 'max_length': '19'}]}, ('15169', '216.239.36.0/24'): {'state': 'valid', 'reason': None, 'vrps': [{'asn': '15169', 'prefix': '216.239.36.0/24', 'max_length': '24'}]}}, 'errors': []}, {'ip': '2001:4860:4802:36::6c', 'routes': [('15169', '2001:4860::/32')], 'validity': {('15169', '2001:4860::/32'): {'state': 'valid', 'reason': None, 'vrps': [{'asn': '15169', 'prefix': '2001:4860::/32', 'max_length': '32'}]}}, 'errors': []}]", + "webtestrpki": 9013, + "mailtestrpki": null + } + }, + { + "model": "checks.rpkinshost", + "pk": 9050, + "fields": { + "host": "ns-cloud-c1.googledomains.com.", + "score": null, + "routing": "[{'ip': '216.239.32.108', 'routes': [('15169', '216.239.32.0/24'), ('15169', '216.239.32.0/19')], 'validity': {('15169', '216.239.32.0/24'): {'state': 'valid', 'reason': None, 'vrps': [{'asn': '15169', 'prefix': '216.239.32.0/24', 'max_length': '24'}]}, ('15169', '216.239.32.0/19'): {'state': 'valid', 'reason': None, 'vrps': [{'asn': '15169', 'prefix': '216.239.32.0/19', 'max_length': '19'}]}}, 'errors': []}, {'ip': '2001:4860:4802:32::6c', 'routes': [('15169', '2001:4860::/32')], 'validity': {('15169', '2001:4860::/32'): {'state': 'valid', 'reason': None, 'vrps': [{'asn': '15169', 'prefix': '2001:4860::/32', 'max_length': '32'}]}}, 'errors': []}]", + "webtestrpki": 9013, + "mailtestrpki": null + } + }, + { + "model": "checks.rpkinshost", + "pk": 9051, + "fields": { + "host": "ns-cloud-c1.googledomains.com.", + "score": null, + "routing": "[{'ip': '216.239.32.108', 'routes': [('15169', '216.239.32.0/24'), ('15169', '216.239.32.0/19')], 'validity': {('15169', '216.239.32.0/24'): {'state': 'valid', 'reason': None, 'vrps': [{'asn': '15169', 'prefix': '216.239.32.0/24', 'max_length': '24'}]}, ('15169', '216.239.32.0/19'): {'state': 'valid', 'reason': None, 'vrps': [{'asn': '15169', 'prefix': '216.239.32.0/19', 'max_length': '19'}]}}, 'errors': []}, {'ip': '2001:4860:4802:32::6c', 'routes': [('15169', '2001:4860::/32')], 'validity': {('15169', '2001:4860::/32'): {'state': 'valid', 'reason': None, 'vrps': [{'asn': '15169', 'prefix': '2001:4860::/32', 'max_length': '32'}]}}, 'errors': []}]", + "webtestrpki": 9014, + "mailtestrpki": null + } + }, + { + "model": "checks.rpkinshost", + "pk": 9052, + "fields": { + "host": "ns-cloud-c2.googledomains.com.", + "score": null, + "routing": "[{'ip': '216.239.34.108', 'routes': [('15169', '216.239.34.0/24'), ('15169', '216.239.32.0/19')], 'validity': {('15169', '216.239.34.0/24'): {'state': 'valid', 'reason': None, 'vrps': [{'asn': '15169', 'prefix': '216.239.34.0/24', 'max_length': '24'}]}, ('15169', '216.239.32.0/19'): {'state': 'valid', 'reason': None, 'vrps': [{'asn': '15169', 'prefix': '216.239.32.0/19', 'max_length': '19'}]}}, 'errors': []}, {'ip': '2001:4860:4802:34::6c', 'routes': [('15169', '2001:4860::/32')], 'validity': {('15169', '2001:4860::/32'): {'state': 'valid', 'reason': None, 'vrps': [{'asn': '15169', 'prefix': '2001:4860::/32', 'max_length': '32'}]}}, 'errors': []}]", + "webtestrpki": 9014, + "mailtestrpki": null + } + }, + { + "model": "checks.rpkinshost", + "pk": 9053, + "fields": { + "host": "ns-cloud-c4.googledomains.com.", + "score": null, + "routing": "[{'ip': '216.239.38.108', 'routes': [('15169', '216.239.32.0/19'), ('15169', '216.239.38.0/24')], 'validity': {('15169', '216.239.32.0/19'): {'state': 'valid', 'reason': None, 'vrps': [{'asn': '15169', 'prefix': '216.239.32.0/19', 'max_length': '19'}]}, ('15169', '216.239.38.0/24'): {'state': 'valid', 'reason': None, 'vrps': [{'asn': '15169', 'prefix': '216.239.38.0/24', 'max_length': '24'}]}}, 'errors': []}, {'ip': '2001:4860:4802:38::6c', 'routes': [('15169', '2001:4860::/32')], 'validity': {('15169', '2001:4860::/32'): {'state': 'valid', 'reason': None, 'vrps': [{'asn': '15169', 'prefix': '2001:4860::/32', 'max_length': '32'}]}}, 'errors': []}]", + "webtestrpki": 9014, + "mailtestrpki": null + } + }, + { + "model": "checks.rpkinshost", + "pk": 9054, + "fields": { + "host": "ns-cloud-c3.googledomains.com.", + "score": null, + "routing": "[{'ip': '216.239.36.108', 'routes': [('15169', '216.239.32.0/19'), ('15169', '216.239.36.0/24')], 'validity': {('15169', '216.239.32.0/19'): {'state': 'valid', 'reason': None, 'vrps': [{'asn': '15169', 'prefix': '216.239.32.0/19', 'max_length': '19'}]}, ('15169', '216.239.36.0/24'): {'state': 'valid', 'reason': None, 'vrps': [{'asn': '15169', 'prefix': '216.239.36.0/24', 'max_length': '24'}]}}, 'errors': []}, {'ip': '2001:4860:4802:36::6c', 'routes': [('15169', '2001:4860::/32')], 'validity': {('15169', '2001:4860::/32'): {'state': 'valid', 'reason': None, 'vrps': [{'asn': '15169', 'prefix': '2001:4860::/32', 'max_length': '32'}]}}, 'errors': []}]", + "webtestrpki": 9014, + "mailtestrpki": null + } + }, + { + "model": "checks.rpkinshost", + "pk": 9055, + "fields": { + "host": "jerry.ns.cloudflare.com.", + "score": null, + "routing": "[{'ip': '172.64.33.182', 'routes': [('13335', '172.64.32.0/20'), ('13335', '172.64.33.0/24')], 'validity': {('13335', '172.64.32.0/20'): {'state': 'valid', 'reason': None, 'vrps': [{'asn': '13335', 'prefix': '172.64.32.0/20', 'max_length': '20'}]}, ('13335', '172.64.33.0/24'): {'state': 'valid', 'reason': None, 'vrps': [{'asn': '13335', 'prefix': '172.64.33.0/24', 'max_length': '24'}]}}, 'errors': []}, {'ip': '108.162.193.182', 'routes': [('13335', '108.162.193.0/24'), ('13335', '108.162.192.0/20')], 'validity': {('13335', '108.162.193.0/24'): {'state': 'valid', 'reason': None, 'vrps': [{'asn': '13335', 'prefix': '108.162.193.0/24', 'max_length': '24'}]}, ('13335', '108.162.192.0/20'): {'state': 'valid', 'reason': None, 'vrps': [{'asn': '13335', 'prefix': '108.162.192.0/20', 'max_length': '20'}]}}, 'errors': []}, {'ip': '173.245.59.182', 'routes': [('13335', '173.245.59.0/24')], 'validity': {('13335', '173.245.59.0/24'): {'state': 'valid', 'reason': None, 'vrps': [{'asn': '13335', 'prefix': '173.245.59.0/24', 'max_length': '24'}]}}, 'errors': []}, {'ip': '2606:4700:58::adf5:3bb6', 'routes': [('13335', '2606:4700:50::/44')], 'validity': {('13335', '2606:4700:50::/44'): {'state': 'valid', 'reason': None, 'vrps': [{'asn': '13335', 'prefix': '2606:4700:50::/44', 'max_length': '44'}]}}, 'errors': []}, {'ip': '2803:f800:50::6ca2:c1b6', 'routes': [('13335', '2803:f800:50::/45')], 'validity': {('13335', '2803:f800:50::/45'): {'state': 'valid', 'reason': None, 'vrps': [{'asn': '13335', 'prefix': '2803:f800:50::/45', 'max_length': '48'}, {'asn': '13335', 'prefix': '2803:f800::/32', 'max_length': '48'}]}}, 'errors': []}, {'ip': '2a06:98c1:50::ac40:21b6', 'routes': [('13335', '2a06:98c1:50::/45')], 'validity': {('13335', '2a06:98c1:50::/45'): {'state': 'valid', 'reason': None, 'vrps': [{'asn': '13335', 'prefix': '2a06:98c1:50::/45', 'max_length': '45'}]}}, 'errors': []}]", + "webtestrpki": 9015, + "mailtestrpki": null + } + }, + { + "model": "checks.rpkinshost", + "pk": 9056, + "fields": { + "host": "meera.ns.cloudflare.com.", + "score": null, + "routing": "[{'ip': '172.64.32.195', 'routes': [('13335', '172.64.32.0/20'), ('13335', '172.64.32.0/24')], 'validity': {('13335', '172.64.32.0/20'): {'state': 'valid', 'reason': None, 'vrps': [{'asn': '13335', 'prefix': '172.64.32.0/20', 'max_length': '20'}]}, ('13335', '172.64.32.0/24'): {'state': 'valid', 'reason': None, 'vrps': [{'asn': '13335', 'prefix': '172.64.32.0/24', 'max_length': '24'}]}}, 'errors': []}, {'ip': '108.162.192.195', 'routes': [('13335', '108.162.192.0/24'), ('13335', '108.162.192.0/20')], 'validity': {('13335', '108.162.192.0/24'): {'state': 'valid', 'reason': None, 'vrps': [{'asn': '13335', 'prefix': '108.162.192.0/24', 'max_length': '24'}]}, ('13335', '108.162.192.0/20'): {'state': 'valid', 'reason': None, 'vrps': [{'asn': '13335', 'prefix': '108.162.192.0/20', 'max_length': '20'}]}}, 'errors': []}, {'ip': '173.245.58.195', 'routes': [('13335', '173.245.58.0/24')], 'validity': {('13335', '173.245.58.0/24'): {'state': 'valid', 'reason': None, 'vrps': [{'asn': '13335', 'prefix': '173.245.58.0/24', 'max_length': '24'}]}}, 'errors': []}, {'ip': '2803:f800:50::6ca2:c0c3', 'routes': [('13335', '2803:f800:50::/45')], 'validity': {('13335', '2803:f800:50::/45'): {'state': 'valid', 'reason': None, 'vrps': [{'asn': '13335', 'prefix': '2803:f800:50::/45', 'max_length': '48'}, {'asn': '13335', 'prefix': '2803:f800::/32', 'max_length': '48'}]}}, 'errors': []}, {'ip': '2a06:98c1:50::ac40:20c3', 'routes': [('13335', '2a06:98c1:50::/45')], 'validity': {('13335', '2a06:98c1:50::/45'): {'state': 'valid', 'reason': None, 'vrps': [{'asn': '13335', 'prefix': '2a06:98c1:50::/45', 'max_length': '45'}]}}, 'errors': []}, {'ip': '2606:4700:50::adf5:3ac3', 'routes': [('13335', '2606:4700:50::/44')], 'validity': {('13335', '2606:4700:50::/44'): {'state': 'valid', 'reason': None, 'vrps': [{'asn': '13335', 'prefix': '2606:4700:50::/44', 'max_length': '44'}]}}, 'errors': []}]", + "webtestrpki": 9015, + "mailtestrpki": null + } + }, + { + "model": "checks.rpkiwebhost", + "pk": 9000, + "fields": { + "host": "internet.nl", + "score": null, + "routing": "[{'ip': '62.204.66.10', 'routes': [('41887', '62.204.64.0/19'), ('41887', '62.204.64.0/20')], 'validity': {('41887', '62.204.64.0/19'): {'state': 'valid', 'reason': None, 'vrps': [{'asn': '41887', 'prefix': '62.204.64.0/19', 'max_length': '24'}]}, ('41887', '62.204.64.0/20'): {'state': 'valid', 'reason': None, 'vrps': [{'asn': '41887', 'prefix': '62.204.64.0/20', 'max_length': '24'}, {'asn': '41887', 'prefix': '62.204.64.0/19', 'max_length': '24'}]}}, 'errors': []}, {'ip': '2a00:d00:ff:162:62:204:66:10', 'routes': [('41887', '2a00:d00::/32'), ('41887', '2a00:d00::/29')], 'validity': {('41887', '2a00:d00::/32'): {'state': 'valid', 'reason': None, 'vrps': [{'asn': '41887', 'prefix': '2a00:d00::/29', 'max_length': '48'}]}, ('41887', '2a00:d00::/29'): {'state': 'valid', 'reason': None, 'vrps': [{'asn': '41887', 'prefix': '2a00:d00::/29', 'max_length': '48'}]}}, 'errors': []}]", + "webtestrpki": 9000 + } + }, + { + "model": "checks.rpkiwebhost", + "pk": 9001, + "fields": { + "host": "example.nl", + "score": null, + "routing": "[{'ip': '94.198.159.35', 'routes': [('1140', '94.198.152.0/21')], 'validity': {('1140', '94.198.152.0/21'): {'state': 'valid', 'reason': None, 'vrps': [{'asn': '1140', 'prefix': '94.198.152.0/21', 'max_length': '21'}]}}, 'errors': []}, {'ip': '2a00:d78:0:712:94:198:159:35', 'routes': [('1140', '2a00:d78::/32')], 'validity': {('1140', '2a00:d78::/32'): {'state': 'valid', 'reason': None, 'vrps': [{'asn': '1140', 'prefix': '2a00:d78::/32', 'max_length': '32'}]}}, 'errors': []}]", + "webtestrpki": 9001 + } + }, + { + "model": "checks.rpkiwebhost", + "pk": 9002, + "fields": { + "host": "ipv6.internet.nl", + "score": null, + "routing": "[{'ip': '2a00:d00:ff:162:62:204:66:10', 'routes': [('41887', '2a00:d00::/29'), ('41887', '2a00:d00::/32')], 'validity': {('41887', '2a00:d00::/29'): {'state': 'valid', 'reason': None, 'vrps': [{'asn': '41887', 'prefix': '2a00:d00::/29', 'max_length': '48'}]}, ('41887', '2a00:d00::/32'): {'state': 'valid', 'reason': None, 'vrps': [{'asn': '41887', 'prefix': '2a00:d00::/29', 'max_length': '48'}]}}, 'errors': []}]", + "webtestrpki": 9002 + } + }, + { + "model": "checks.rpkiwebhost", + "pk": 9003, + "fields": { + "host": "forfun.net", + "score": null, + "routing": "[{'ip': '2a05:1500:600:1:1c00:4aff:fe00:428', 'routes': [('48635', '2a05:1500:600::/40')], 'validity': {('48635', '2a05:1500:600::/40'): {'state': 'valid', 'reason': None, 'vrps': [{'asn': '48635', 'prefix': '2a05:1500::/29', 'max_length': '48'}]}}, 'errors': []}]", + "webtestrpki": 9003 + } + }, + { + "model": "checks.rpkiwebhost", + "pk": 9004, + "fields": { + "host": "ipv6.google.com", + "score": null, + "routing": "[{'ip': '2a00:1450:4026:804::200e', 'routes': [('15169', '2a00:1450::/32')], 'validity': {('15169', '2a00:1450::/32'): {'state': 'valid', 'reason': None, 'vrps': [{'asn': '15169', 'prefix': '2a00:1450::/32', 'max_length': '32'}]}}, 'errors': []}]", + "webtestrpki": 9004 + } + }, + { + "model": "checks.rpkiwebhost", + "pk": 9005, + "fields": { + "host": "servfail.nl", + "score": null, + "routing": "[{'ip': '2a05:1500:600:1:1c00:4aff:fe00:428', 'routes': [('48635', '2a05:1500:600::/40')], 'validity': {('48635', '2a05:1500:600::/40'): {'state': 'valid', 'reason': None, 'vrps': [{'asn': '48635', 'prefix': '2a05:1500::/29', 'max_length': '48'}]}}, 'errors': []}]", + "webtestrpki": 9005 + } + }, + { + "model": "checks.rpkiwebhost", + "pk": 9006, + "fields": { + "host": "brokendnssec.net", + "score": null, + "routing": "[{'ip': '104.18.26.110', 'routes': [('13335', '104.18.16.0/20')], 'validity': {('13335', '104.18.16.0/20'): {'state': 'valid', 'reason': None, 'vrps': [{'asn': '13335', 'prefix': '104.18.16.0/20', 'max_length': '20'}]}}, 'errors': []}, {'ip': '104.18.27.110', 'routes': [('13335', '104.18.16.0/20')], 'validity': {('13335', '104.18.16.0/20'): {'state': 'valid', 'reason': None, 'vrps': [{'asn': '13335', 'prefix': '104.18.16.0/20', 'max_length': '20'}]}}, 'errors': []}]", + "webtestrpki": 9006 + } + }, + { + "model": "checks.rpkiwebhost", + "pk": 9007, + "fields": { + "host": "ok.bogussig.ok.bad-dnssec.wb.sidnlabs.nl", + "score": null, + "routing": "[{'ip': '94.198.159.39', 'routes': [('1140', '94.198.152.0/21')], 'validity': {('1140', '94.198.152.0/21'): {'state': 'valid', 'reason': None, 'vrps': [{'asn': '1140', 'prefix': '94.198.152.0/21', 'max_length': '21'}]}}, 'errors': []}, {'ip': '2a00:d78:0:712:94:198:159:39', 'routes': [('1140', '2a00:d78::/32')], 'validity': {('1140', '2a00:d78::/32'): {'state': 'valid', 'reason': None, 'vrps': [{'asn': '1140', 'prefix': '2a00:d78::/32', 'max_length': '32'}]}}, 'errors': []}]", + "webtestrpki": 9007 + } + }, + { + "model": "checks.rpkiwebhost", + "pk": 9008, + "fields": { + "host": "badhash.dane.huque.com", + "score": null, + "routing": "[{'ip': '54.200.198.48', 'routes': [('16509', '54.192.0.0/12'), ('16509', '54.200.0.0/15')], 'validity': {('16509', '54.192.0.0/12'): {'state': 'valid', 'reason': None, 'vrps': [{'asn': '16509', 'prefix': '54.192.0.0/12', 'max_length': '12'}]}, ('16509', '54.200.0.0/15'): {'state': 'valid', 'reason': None, 'vrps': [{'asn': '16509', 'prefix': '54.200.0.0/15', 'max_length': '15'}]}}, 'errors': []}]", + "webtestrpki": 9008 + } + }, + { + "model": "checks.rpkiwebhost", + "pk": 9009, + "fields": { + "host": "expired.badssl.com", + "score": null, + "routing": "[{'ip': '104.154.89.105', 'routes': [('15169', '104.154.64.0/19'), ('396982', '104.154.80.0/20')], 'validity': {('15169', '104.154.64.0/19'): {'state': 'valid', 'reason': None, 'vrps': [{'asn': '15169', 'prefix': '104.154.64.0/19', 'max_length': '19'}]}, ('396982', '104.154.80.0/20'): {'state': 'valid', 'reason': None, 'vrps': [{'asn': '396982', 'prefix': '104.154.80.0/20', 'max_length': '20'}]}}, 'errors': []}]", + "webtestrpki": 9009 + } + }, + { + "model": "checks.rpkiwebhost", + "pk": 9010, + "fields": { + "host": "wrong.host.badssl.com", + "score": null, + "routing": "[{'ip': '104.154.89.105', 'routes': [('396982', '104.154.80.0/20'), ('15169', '104.154.64.0/19')], 'validity': {('396982', '104.154.80.0/20'): {'state': 'valid', 'reason': None, 'vrps': [{'asn': '396982', 'prefix': '104.154.80.0/20', 'max_length': '20'}]}, ('15169', '104.154.64.0/19'): {'state': 'valid', 'reason': None, 'vrps': [{'asn': '15169', 'prefix': '104.154.64.0/19', 'max_length': '19'}]}}, 'errors': []}]", + "webtestrpki": 9010 + } + }, + { + "model": "checks.rpkiwebhost", + "pk": 9011, + "fields": { + "host": "self-signed.badssl.com", + "score": null, + "routing": "[{'ip': '104.154.89.105', 'routes': [('396982', '104.154.80.0/20'), ('15169', '104.154.64.0/19')], 'validity': {('396982', '104.154.80.0/20'): {'state': 'valid', 'reason': None, 'vrps': [{'asn': '396982', 'prefix': '104.154.80.0/20', 'max_length': '20'}]}, ('15169', '104.154.64.0/19'): {'state': 'valid', 'reason': None, 'vrps': [{'asn': '15169', 'prefix': '104.154.64.0/19', 'max_length': '19'}]}}, 'errors': []}]", + "webtestrpki": 9011 + } + }, + { + "model": "checks.rpkiwebhost", + "pk": 9012, + "fields": { + "host": "untrusted-root.badssl.com", + "score": null, + "routing": "[{'ip': '104.154.89.105', 'routes': [('15169', '104.154.64.0/19'), ('396982', '104.154.80.0/20')], 'validity': {('15169', '104.154.64.0/19'): {'state': 'valid', 'reason': None, 'vrps': [{'asn': '15169', 'prefix': '104.154.64.0/19', 'max_length': '19'}]}, ('396982', '104.154.80.0/20'): {'state': 'valid', 'reason': None, 'vrps': [{'asn': '396982', 'prefix': '104.154.80.0/20', 'max_length': '20'}]}}, 'errors': []}]", + "webtestrpki": 9012 + } + }, + { + "model": "checks.rpkiwebhost", + "pk": 9013, + "fields": { + "host": "revoked.badssl.com", + "score": null, + "routing": "[{'ip': '104.154.89.105', 'routes': [('15169', '104.154.64.0/19'), ('396982', '104.154.80.0/20')], 'validity': {('15169', '104.154.64.0/19'): {'state': 'valid', 'reason': None, 'vrps': [{'asn': '15169', 'prefix': '104.154.64.0/19', 'max_length': '19'}]}, ('396982', '104.154.80.0/20'): {'state': 'valid', 'reason': None, 'vrps': [{'asn': '396982', 'prefix': '104.154.80.0/20', 'max_length': '20'}]}}, 'errors': []}]", + "webtestrpki": 9013 + } + }, + { + "model": "checks.rpkiwebhost", + "pk": 9014, + "fields": { + "host": "pinning-test.badssl.com", + "score": null, + "routing": "[{'ip': '104.154.89.105', 'routes': [('396982', '104.154.80.0/20'), ('15169', '104.154.64.0/19')], 'validity': {('396982', '104.154.80.0/20'): {'state': 'valid', 'reason': None, 'vrps': [{'asn': '396982', 'prefix': '104.154.80.0/20', 'max_length': '20'}]}, ('15169', '104.154.64.0/19'): {'state': 'valid', 'reason': None, 'vrps': [{'asn': '15169', 'prefix': '104.154.64.0/19', 'max_length': '19'}]}}, 'errors': []}]", + "webtestrpki": 9014 + } + }, + { + "model": "checks.rpkiwebhost", + "pk": 9015, + "fields": { + "host": "invalid.rpki.isbgpsafeyet.com", + "score": null, + "routing": "[{'ip': '103.21.244.8', 'routes': [('13335', '103.21.244.0/24')], 'validity': {('13335', '103.21.244.0/24'): {'state': 'invalid', 'reason': 'length', 'vrps': [{'asn': '0', 'prefix': '103.21.244.0/23', 'max_length': '23'}]}}, 'errors': []}, {'ip': '103.21.244.9', 'routes': [('13335', '103.21.244.0/24')], 'validity': {('13335', '103.21.244.0/24'): {'state': 'invalid', 'reason': 'length', 'vrps': [{'asn': '0', 'prefix': '103.21.244.0/23', 'max_length': '23'}]}}, 'errors': []}, {'ip': '2606:4700:7000::6715:f409', 'routes': [('13335', '2606:4700:7000::/48')], 'validity': {('13335', '2606:4700:7000::/48'): {'state': 'invalid', 'reason': 'as', 'vrps': [{'asn': '0', 'prefix': '2606:4700:7000::/48', 'max_length': '48'}]}}, 'errors': []}, {'ip': '2606:4700:7000::6715:f408', 'routes': [('13335', '2606:4700:7000::/48')], 'validity': {('13335', '2606:4700:7000::/48'): {'state': 'invalid', 'reason': 'as', 'vrps': [{'asn': '0', 'prefix': '2606:4700:7000::/48', 'max_length': '48'}]}}, 'errors': []}]", + "webtestrpki": 9015 + } + }, + { + "model": "checks.domaintestreport", + "pk": 9000, + "fields": { + "timestamp": "2025-03-14T15:14:09.198Z", + "domain": "internet.nl", + "registrar": "Stichting Internet Domeinregistratie Nederland, SIDN BV", + "score": 100, + "ipv6": 9000, + "dnssec": 9000, + "tls": 9000, + "appsecpriv": 9000, + "rpki": 9000 + } + }, + { + "model": "checks.domaintestreport", + "pk": 9001, + "fields": { + "timestamp": "2025-03-14T15:14:27.106Z", + "domain": "example.nl", + "registrar": "Stichting Internet Domeinregistratie Nederland, SIDN BV", + "score": 100, + "ipv6": 9001, + "dnssec": 9001, + "tls": 9001, + "appsecpriv": 9001, + "rpki": 9001 + } + }, + { + "model": "checks.domaintestreport", + "pk": 9002, + "fields": { + "timestamp": "2025-03-14T15:14:34.281Z", + "domain": "ipv6.internet.nl", + "registrar": "Stichting Internet Domeinregistratie Nederland, SIDN BV", + "score": 100, + "ipv6": 9002, + "dnssec": 9002, + "tls": 9002, + "appsecpriv": 9002, + "rpki": 9002 + } + }, + { + "model": "checks.domaintestreport", + "pk": 9003, + "fields": { + "timestamp": "2025-03-14T15:14:41.662Z", + "domain": "forfun.net", + "registrar": "Key-Systems GmbH", + "score": 100, + "ipv6": 9003, + "dnssec": 9003, + "tls": 9003, + "appsecpriv": 9003, + "rpki": 9003 + } + }, + { + "model": "checks.domaintestreport", + "pk": 9004, + "fields": { + "timestamp": "2025-03-14T15:14:49.004Z", + "domain": "ipv6.google.com", + "registrar": "MarkMonitor Inc.", + "score": 74, + "ipv6": 9004, + "dnssec": 9004, + "tls": 9004, + "appsecpriv": 9004, + "rpki": 9004 + } + }, + { + "model": "checks.domaintestreport", + "pk": 9005, + "fields": { + "timestamp": "2025-03-14T15:18:56.310Z", + "domain": "brokendnssec.net", + "registrar": "Cloudflare, Inc.", + "score": 36, + "ipv6": 9005, + "dnssec": 9006, + "tls": 9006, + "appsecpriv": 9006, + "rpki": 9006 + } + }, + { + "model": "checks.domaintestreport", + "pk": 9006, + "fields": { + "timestamp": "2025-03-14T15:19:14.763Z", + "domain": "ok.bogussig.ok.bad-dnssec.wb.sidnlabs.nl", + "registrar": "Stichting Internet Domeinregistratie Nederland, SIDN BV", + "score": 66, + "ipv6": 9006, + "dnssec": 9007, + "tls": 9007, + "appsecpriv": 9007, + "rpki": 9007 + } + }, + { + "model": "checks.domaintestreport", + "pk": 9007, + "fields": { + "timestamp": "2025-03-14T15:19:53.048Z", + "domain": "badhash.dane.huque.com", + "registrar": "GKG.Net, Inc.", + "score": 76, + "ipv6": 9007, + "dnssec": 9008, + "tls": 9008, + "appsecpriv": 9008, + "rpki": 9008 + } + }, + { + "model": "checks.domaintestreport", + "pk": 9008, + "fields": { + "timestamp": "2025-03-14T15:20:21.784Z", + "domain": "expired.badssl.com", + "registrar": "MarkMonitor Inc.", + "score": 60, + "ipv6": 9008, + "dnssec": 9009, + "tls": 9009, + "appsecpriv": 9009, + "rpki": 9009 + } + }, + { + "model": "checks.domaintestreport", + "pk": 9009, + "fields": { + "timestamp": "2025-03-14T15:20:50.417Z", + "domain": "wrong.host.badssl.com", + "registrar": "MarkMonitor Inc.", + "score": 60, + "ipv6": 9009, + "dnssec": 9010, + "tls": 9010, + "appsecpriv": 9010, + "rpki": 9010 + } + }, + { + "model": "checks.domaintestreport", + "pk": 9010, + "fields": { + "timestamp": "2025-03-14T15:21:18.878Z", + "domain": "self-signed.badssl.com", + "registrar": "MarkMonitor Inc.", + "score": 60, + "ipv6": 9010, + "dnssec": 9011, + "tls": 9011, + "appsecpriv": 9011, + "rpki": 9011 + } + }, + { + "model": "checks.domaintestreport", + "pk": 9011, + "fields": { + "timestamp": "2025-03-14T15:21:47.501Z", + "domain": "untrusted-root.badssl.com", + "registrar": "MarkMonitor Inc.", + "score": 60, + "ipv6": 9011, + "dnssec": 9012, + "tls": 9012, + "appsecpriv": 9012, + "rpki": 9012 + } + }, + { + "model": "checks.domaintestreport", + "pk": 9012, + "fields": { + "timestamp": "2025-03-14T15:22:07.094Z", + "domain": "revoked.badssl.com", + "registrar": "MarkMonitor Inc.", + "score": 64, + "ipv6": 9012, + "dnssec": 9013, + "tls": 9013, + "appsecpriv": 9013, + "rpki": 9013 + } + }, + { + "model": "checks.domaintestreport", + "pk": 9013, + "fields": { + "timestamp": "2025-03-14T15:22:35.808Z", + "domain": "pinning-test.badssl.com", + "registrar": "MarkMonitor Inc.", + "score": 62, + "ipv6": 9013, + "dnssec": 9014, + "tls": 9014, + "appsecpriv": 9014, + "rpki": 9014 + } + }, + { + "model": "checks.domaintestreport", + "pk": 9014, + "fields": { + "timestamp": "2025-03-14T15:22:46.089Z", + "domain": "invalid.rpki.isbgpsafeyet.com", + "registrar": "Cloudflare, Inc.", + "score": 87, + "ipv6": 9014, + "dnssec": 9015, + "tls": 9015, + "appsecpriv": 9015, + "rpki": 9015 + } + }, + { + "model": "checks.nsdomain", + "pk": 9000, + "fields": { + "domain": "ns2.sidnlabs.nl.", + "v6_good": "['2001:678:2c:0:194:0:28:11']", + "v6_bad": "[]", + "v4_good": "['194.0.28.11']", + "v4_bad": "[]", + "score": 10, + "domaintestipv6": 9000, + "mailtestipv6": null + } + }, + { + "model": "checks.nsdomain", + "pk": 9001, + "fields": { + "domain": "ns5.sidn.nl.", + "v6_good": "['2604:1380:4601:6300::1']", + "v6_bad": "[]", + "v4_good": "['145.40.68.55']", + "v4_bad": "[]", + "score": 10, + "domaintestipv6": 9000, + "mailtestipv6": null + } + }, + { + "model": "checks.nsdomain", + "pk": 9002, + "fields": { + "domain": "ns1.sidnlabs.nl.", + "v6_good": "['2a00:d78:0:712:94:198:159:8']", + "v6_bad": "[]", + "v4_good": "['94.198.159.8']", + "v4_bad": "[]", + "score": 10, + "domaintestipv6": 9000, + "mailtestipv6": null + } + }, + { + "model": "checks.nsdomain", + "pk": 9003, + "fields": { + "domain": "ex2.sidnlabs.nl.", + "v6_good": "['2604:1380:4601:6300::1']", + "v6_bad": "[]", + "v4_good": "['145.40.68.55']", + "v4_bad": "[]", + "score": 10, + "domaintestipv6": 9001, + "mailtestipv6": null + } + }, + { + "model": "checks.nsdomain", + "pk": 9004, + "fields": { + "domain": "ex1.sidnlabs.nl.", + "v6_good": "['2a00:d78:0:712:94:198:159:8']", + "v6_bad": "[]", + "v4_good": "['94.198.159.8']", + "v4_bad": "[]", + "score": 10, + "domaintestipv6": 9001, + "mailtestipv6": null + } + }, + { + "model": "checks.nsdomain", + "pk": 9005, + "fields": { + "domain": "anytest1.sidnlabs.nl.", + "v6_good": "['2001:678:8::53']", + "v6_bad": "[]", + "v4_good": "['194.0.5.53']", + "v4_bad": "[]", + "score": 10, + "domaintestipv6": 9001, + "mailtestipv6": null + } + }, + { + "model": "checks.nsdomain", + "pk": 9006, + "fields": { + "domain": "ns5.sidn.nl.", + "v6_good": "['2604:1380:4601:6300::1']", + "v6_bad": "[]", + "v4_good": "['145.40.68.55']", + "v4_bad": "[]", + "score": 10, + "domaintestipv6": 9002, + "mailtestipv6": null + } + }, + { + "model": "checks.nsdomain", + "pk": 9007, + "fields": { + "domain": "ns1.sidnlabs.nl.", + "v6_good": "['2a00:d78:0:712:94:198:159:8']", + "v6_bad": "[]", + "v4_good": "['94.198.159.8']", + "v4_bad": "[]", + "score": 10, + "domaintestipv6": 9002, + "mailtestipv6": null + } + }, + { + "model": "checks.nsdomain", + "pk": 9008, + "fields": { + "domain": "ns2.sidnlabs.nl.", + "v6_good": "['2001:678:2c:0:194:0:28:11']", + "v6_bad": "[]", + "v4_good": "['194.0.28.11']", + "v4_bad": "[]", + "score": 10, + "domaintestipv6": 9002, + "mailtestipv6": null + } + }, + { + "model": "checks.nsdomain", + "pk": 9009, + "fields": { + "domain": "ns3.surfnet.nl.", + "v6_good": "['2001:610:0:800c:195:169:124:71']", + "v6_bad": "[]", + "v4_good": "['195.169.124.71']", + "v4_bad": "[]", + "score": 10, + "domaintestipv6": 9003, + "mailtestipv6": null + } + }, + { + "model": "checks.nsdomain", + "pk": 9010, + "fields": { + "domain": "li1.forfun.net.", + "v6_good": "['2600:3c03::f03c:91ff:fedf:1e98']", + "v6_bad": "[]", + "v4_good": "['96.126.104.187']", + "v4_bad": "[]", + "score": 10, + "domaintestipv6": 9003, + "mailtestipv6": null + } + }, + { + "model": "checks.nsdomain", + "pk": 9011, + "fields": { + "domain": "pdns-public-ns2.powerdns.com.", + "v6_good": "['2604:a880:1:20::132:5001']", + "v6_bad": "[]", + "v4_good": "['45.55.10.200']", + "v4_bad": "[]", + "score": 10, + "domaintestipv6": 9003, + "mailtestipv6": null + } + }, + { + "model": "checks.nsdomain", + "pk": 9012, + "fields": { + "domain": "ns2.google.com.", + "v6_good": "['2001:4860:4802:34::a']", + "v6_bad": "[]", + "v4_good": "['216.239.34.10']", + "v4_bad": "[]", + "score": 10, + "domaintestipv6": 9004, + "mailtestipv6": null + } + }, + { + "model": "checks.nsdomain", + "pk": 9013, + "fields": { + "domain": "ns4.google.com.", + "v6_good": "['2001:4860:4802:38::a']", + "v6_bad": "[]", + "v4_good": "['216.239.38.10']", + "v4_bad": "[]", + "score": 10, + "domaintestipv6": 9004, + "mailtestipv6": null + } + }, + { + "model": "checks.nsdomain", + "pk": 9014, + "fields": { + "domain": "ns3.google.com.", + "v6_good": "['2001:4860:4802:36::a']", + "v6_bad": "[]", + "v4_good": "['216.239.36.10']", + "v4_bad": "[]", + "score": 10, + "domaintestipv6": 9004, + "mailtestipv6": null + } + }, + { + "model": "checks.nsdomain", + "pk": 9015, + "fields": { + "domain": "ns1.google.com.", + "v6_good": "['2001:4860:4802:32::a']", + "v6_bad": "[]", + "v4_good": "['216.239.32.10']", + "v4_bad": "[]", + "score": 10, + "domaintestipv6": 9004, + "mailtestipv6": null + } + }, + { + "model": "checks.nsdomain", + "pk": 9016, + "fields": { + "domain": "carl.ns.cloudflare.com.", + "v6_good": "['2606:4700:58::adf5:3b6a', '2a06:98c1:50::ac40:216a', '2803:f800:50::6ca2:c16a']", + "v6_bad": "[]", + "v4_good": "['172.64.33.106', '173.245.59.106', '108.162.193.106']", + "v4_bad": "[]", + "score": 10, + "domaintestipv6": 9005, + "mailtestipv6": null + } + }, + { + "model": "checks.nsdomain", + "pk": 9017, + "fields": { + "domain": "cruz.ns.cloudflare.com.", + "v6_good": "['2606:4700:50::adf5:3a58', '2a06:98c1:50::ac40:2058', '2803:f800:50::6ca2:c058']", + "v6_bad": "[]", + "v4_good": "['173.245.58.88', '108.162.192.88', '172.64.32.88']", + "v4_bad": "[]", + "score": 10, + "domaintestipv6": 9005, + "mailtestipv6": null + } + }, + { + "model": "checks.nsdomain", + "pk": 9018, + "fields": { + "domain": "bind9.sidnlabs.nl.", + "v6_good": "['2a00:d78:0:712:94:198:159:39']", + "v6_bad": "[]", + "v4_good": "['94.198.159.39']", + "v4_bad": "[]", + "score": 10, + "domaintestipv6": 9006, + "mailtestipv6": null + } + }, + { + "model": "checks.nsdomain", + "pk": 9019, + "fields": { + "domain": "yadifa.sidnlabs.nl.", + "v6_good": "[]", + "v6_bad": "['2a00:d78:0:712:94:198:159:28']", + "v4_good": "[]", + "v4_bad": "['94.198.159.28']", + "score": 0, + "domaintestipv6": 9006, + "mailtestipv6": null + } + }, + { + "model": "checks.nsdomain", + "pk": 9020, + "fields": { + "domain": "powerdns.sidnlabs.nl.", + "v6_good": "['2a00:d78:0:712:94:198:159:26']", + "v6_bad": "[]", + "v4_good": "['94.198.159.26']", + "v4_bad": "[]", + "score": 10, + "domaintestipv6": 9006, + "mailtestipv6": null + } + }, + { + "model": "checks.nsdomain", + "pk": 9021, + "fields": { + "domain": "knot.sidnlabs.nl.", + "v6_good": "['2a00:d78:0:712:94:198:159:27']", + "v6_bad": "[]", + "v4_good": "['94.198.159.27']", + "v4_bad": "[]", + "score": 10, + "domaintestipv6": 9006, + "mailtestipv6": null + } + }, + { + "model": "checks.nsdomain", + "pk": 9022, + "fields": { + "domain": "nsd4.sidnlabs.nl.", + "v6_good": "['2a00:d78:0:712:94:198:159:33']", + "v6_bad": "[]", + "v4_good": "['94.198.159.33']", + "v4_bad": "[]", + "score": 10, + "domaintestipv6": 9006, + "mailtestipv6": null + } + }, + { + "model": "checks.nsdomain", + "pk": 9023, + "fields": { + "domain": "adns1.nnn.upenn.edu.", + "v6_good": "['2607:f470:1001::ad:1']", + "v6_bad": "[]", + "v4_good": "['128.91.2.53']", + "v4_bad": "[]", + "score": 10, + "domaintestipv6": 9007, + "mailtestipv6": null + } + }, + { + "model": "checks.nsdomain", + "pk": 9024, + "fields": { + "domain": "adns2.dnsrakuda.com.", + "v6_good": "['2600:1f14:990:2e01::bad']", + "v6_bad": "[]", + "v4_good": "['52.88.78.179']", + "v4_bad": "[]", + "score": 10, + "domaintestipv6": 9007, + "mailtestipv6": null + } + }, + { + "model": "checks.nsdomain", + "pk": 9025, + "fields": { + "domain": "adns3.nnn.upenn.edu.", + "v6_good": "['2607:f470:1003::ad:3']", + "v6_bad": "[]", + "v4_good": "['128.91.251.53']", + "v4_bad": "[]", + "score": 10, + "domaintestipv6": 9007, + "mailtestipv6": null + } + }, + { + "model": "checks.nsdomain", + "pk": 9026, + "fields": { + "domain": "adns1.dnsrakuda.com.", + "v6_good": "['2600:1f18:6296:8902::c0de']", + "v6_bad": "[]", + "v4_good": "['3.225.161.117']", + "v4_bad": "[]", + "score": 10, + "domaintestipv6": 9007, + "mailtestipv6": null + } + }, + { + "model": "checks.nsdomain", + "pk": 9027, + "fields": { + "domain": "adns2.nnn.upenn.edu.", + "v6_good": "['2607:f470:1002::ad:2']", + "v6_bad": "[]", + "v4_good": "['128.91.254.53']", + "v4_bad": "[]", + "score": 10, + "domaintestipv6": 9007, + "mailtestipv6": null + } + }, + { + "model": "checks.nsdomain", + "pk": 9028, + "fields": { + "domain": "ns-cloud-c3.googledomains.com.", + "v6_good": "['2001:4860:4802:36::6c']", + "v6_bad": "[]", + "v4_good": "['216.239.36.108']", + "v4_bad": "[]", + "score": 10, + "domaintestipv6": 9008, + "mailtestipv6": null + } + }, + { + "model": "checks.nsdomain", + "pk": 9029, + "fields": { + "domain": "ns-cloud-c1.googledomains.com.", + "v6_good": "['2001:4860:4802:32::6c']", + "v6_bad": "[]", + "v4_good": "['216.239.32.108']", + "v4_bad": "[]", + "score": 10, + "domaintestipv6": 9008, + "mailtestipv6": null + } + }, + { + "model": "checks.nsdomain", + "pk": 9030, + "fields": { + "domain": "ns-cloud-c2.googledomains.com.", + "v6_good": "['2001:4860:4802:34::6c']", + "v6_bad": "[]", + "v4_good": "['216.239.34.108']", + "v4_bad": "[]", + "score": 10, + "domaintestipv6": 9008, + "mailtestipv6": null + } + }, + { + "model": "checks.nsdomain", + "pk": 9031, + "fields": { + "domain": "ns-cloud-c4.googledomains.com.", + "v6_good": "['2001:4860:4802:38::6c']", + "v6_bad": "[]", + "v4_good": "['216.239.38.108']", + "v4_bad": "[]", + "score": 10, + "domaintestipv6": 9008, + "mailtestipv6": null + } + }, + { + "model": "checks.nsdomain", + "pk": 9032, + "fields": { + "domain": "ns-cloud-c2.googledomains.com.", + "v6_good": "['2001:4860:4802:34::6c']", + "v6_bad": "[]", + "v4_good": "['216.239.34.108']", + "v4_bad": "[]", + "score": 10, + "domaintestipv6": 9009, + "mailtestipv6": null + } + }, + { + "model": "checks.nsdomain", + "pk": 9033, + "fields": { + "domain": "ns-cloud-c4.googledomains.com.", + "v6_good": "['2001:4860:4802:38::6c']", + "v6_bad": "[]", + "v4_good": "['216.239.38.108']", + "v4_bad": "[]", + "score": 10, + "domaintestipv6": 9009, + "mailtestipv6": null + } + }, + { + "model": "checks.nsdomain", + "pk": 9034, + "fields": { + "domain": "ns-cloud-c3.googledomains.com.", + "v6_good": "['2001:4860:4802:36::6c']", + "v6_bad": "[]", + "v4_good": "['216.239.36.108']", + "v4_bad": "[]", + "score": 10, + "domaintestipv6": 9009, + "mailtestipv6": null + } + }, + { + "model": "checks.nsdomain", + "pk": 9035, + "fields": { + "domain": "ns-cloud-c1.googledomains.com.", + "v6_good": "['2001:4860:4802:32::6c']", + "v6_bad": "[]", + "v4_good": "['216.239.32.108']", + "v4_bad": "[]", + "score": 10, + "domaintestipv6": 9009, + "mailtestipv6": null + } + }, + { + "model": "checks.nsdomain", + "pk": 9036, + "fields": { + "domain": "ns-cloud-c4.googledomains.com.", + "v6_good": "['2001:4860:4802:38::6c']", + "v6_bad": "[]", + "v4_good": "['216.239.38.108']", + "v4_bad": "[]", + "score": 10, + "domaintestipv6": 9010, + "mailtestipv6": null + } + }, + { + "model": "checks.nsdomain", + "pk": 9037, + "fields": { + "domain": "ns-cloud-c3.googledomains.com.", + "v6_good": "['2001:4860:4802:36::6c']", + "v6_bad": "[]", + "v4_good": "['216.239.36.108']", + "v4_bad": "[]", + "score": 10, + "domaintestipv6": 9010, + "mailtestipv6": null + } + }, + { + "model": "checks.nsdomain", + "pk": 9038, + "fields": { + "domain": "ns-cloud-c1.googledomains.com.", + "v6_good": "['2001:4860:4802:32::6c']", + "v6_bad": "[]", + "v4_good": "['216.239.32.108']", + "v4_bad": "[]", + "score": 10, + "domaintestipv6": 9010, + "mailtestipv6": null + } + }, + { + "model": "checks.nsdomain", + "pk": 9039, + "fields": { + "domain": "ns-cloud-c2.googledomains.com.", + "v6_good": "['2001:4860:4802:34::6c']", + "v6_bad": "[]", + "v4_good": "['216.239.34.108']", + "v4_bad": "[]", + "score": 10, + "domaintestipv6": 9010, + "mailtestipv6": null + } + }, + { + "model": "checks.nsdomain", + "pk": 9040, + "fields": { + "domain": "ns-cloud-c3.googledomains.com.", + "v6_good": "['2001:4860:4802:36::6c']", + "v6_bad": "[]", + "v4_good": "['216.239.36.108']", + "v4_bad": "[]", + "score": 10, + "domaintestipv6": 9011, + "mailtestipv6": null + } + }, + { + "model": "checks.nsdomain", + "pk": 9041, + "fields": { + "domain": "ns-cloud-c1.googledomains.com.", + "v6_good": "['2001:4860:4802:32::6c']", + "v6_bad": "[]", + "v4_good": "['216.239.32.108']", + "v4_bad": "[]", + "score": 10, + "domaintestipv6": 9011, + "mailtestipv6": null + } + }, + { + "model": "checks.nsdomain", + "pk": 9042, + "fields": { + "domain": "ns-cloud-c2.googledomains.com.", + "v6_good": "['2001:4860:4802:34::6c']", + "v6_bad": "[]", + "v4_good": "['216.239.34.108']", + "v4_bad": "[]", + "score": 10, + "domaintestipv6": 9011, + "mailtestipv6": null + } + }, + { + "model": "checks.nsdomain", + "pk": 9043, + "fields": { + "domain": "ns-cloud-c4.googledomains.com.", + "v6_good": "['2001:4860:4802:38::6c']", + "v6_bad": "[]", + "v4_good": "['216.239.38.108']", + "v4_bad": "[]", + "score": 10, + "domaintestipv6": 9011, + "mailtestipv6": null + } + }, + { + "model": "checks.nsdomain", + "pk": 9044, + "fields": { + "domain": "ns-cloud-c1.googledomains.com.", + "v6_good": "['2001:4860:4802:32::6c']", + "v6_bad": "[]", + "v4_good": "['216.239.32.108']", + "v4_bad": "[]", + "score": 10, + "domaintestipv6": 9012, + "mailtestipv6": null + } + }, + { + "model": "checks.nsdomain", + "pk": 9045, + "fields": { + "domain": "ns-cloud-c2.googledomains.com.", + "v6_good": "['2001:4860:4802:34::6c']", + "v6_bad": "[]", + "v4_good": "['216.239.34.108']", + "v4_bad": "[]", + "score": 10, + "domaintestipv6": 9012, + "mailtestipv6": null + } + }, + { + "model": "checks.nsdomain", + "pk": 9046, + "fields": { + "domain": "ns-cloud-c4.googledomains.com.", + "v6_good": "['2001:4860:4802:38::6c']", + "v6_bad": "[]", + "v4_good": "['216.239.38.108']", + "v4_bad": "[]", + "score": 10, + "domaintestipv6": 9012, + "mailtestipv6": null + } + }, + { + "model": "checks.nsdomain", + "pk": 9047, + "fields": { + "domain": "ns-cloud-c3.googledomains.com.", + "v6_good": "['2001:4860:4802:36::6c']", + "v6_bad": "[]", + "v4_good": "['216.239.36.108']", + "v4_bad": "[]", + "score": 10, + "domaintestipv6": 9012, + "mailtestipv6": null + } + }, + { + "model": "checks.nsdomain", + "pk": 9048, + "fields": { + "domain": "ns-cloud-c4.googledomains.com.", + "v6_good": "['2001:4860:4802:38::6c']", + "v6_bad": "[]", + "v4_good": "['216.239.38.108']", + "v4_bad": "[]", + "score": 10, + "domaintestipv6": 9013, + "mailtestipv6": null + } + }, + { + "model": "checks.nsdomain", + "pk": 9049, + "fields": { + "domain": "ns-cloud-c3.googledomains.com.", + "v6_good": "['2001:4860:4802:36::6c']", + "v6_bad": "[]", + "v4_good": "['216.239.36.108']", + "v4_bad": "[]", + "score": 10, + "domaintestipv6": 9013, + "mailtestipv6": null + } + }, + { + "model": "checks.nsdomain", + "pk": 9050, + "fields": { + "domain": "ns-cloud-c1.googledomains.com.", + "v6_good": "['2001:4860:4802:32::6c']", + "v6_bad": "[]", + "v4_good": "['216.239.32.108']", + "v4_bad": "[]", + "score": 10, + "domaintestipv6": 9013, + "mailtestipv6": null + } + }, + { + "model": "checks.nsdomain", + "pk": 9051, + "fields": { + "domain": "ns-cloud-c2.googledomains.com.", + "v6_good": "['2001:4860:4802:34::6c']", + "v6_bad": "[]", + "v4_good": "['216.239.34.108']", + "v4_bad": "[]", + "score": 10, + "domaintestipv6": 9013, + "mailtestipv6": null + } + }, + { + "model": "checks.nsdomain", + "pk": 9052, + "fields": { + "domain": "jerry.ns.cloudflare.com.", + "v6_good": "['2606:4700:58::adf5:3bb6', '2803:f800:50::6ca2:c1b6', '2a06:98c1:50::ac40:21b6']", + "v6_bad": "[]", + "v4_good": "['172.64.33.182', '108.162.193.182', '173.245.59.182']", + "v4_bad": "[]", + "score": 10, + "domaintestipv6": 9014, + "mailtestipv6": null + } + }, + { + "model": "checks.nsdomain", + "pk": 9053, + "fields": { + "domain": "meera.ns.cloudflare.com.", + "v6_good": "['2606:4700:50::adf5:3ac3', '2803:f800:50::6ca2:c0c3', '2a06:98c1:50::ac40:20c3']", + "v6_bad": "[]", + "v4_good": "['173.245.58.195', '108.162.192.195', '172.64.32.195']", + "v4_bad": "[]", + "score": 10, + "domaintestipv6": 9014, + "mailtestipv6": null + } + } +] diff --git a/checks/models.py b/checks/models.py index 20f8a0304..020931bea 100644 --- a/checks/models.py +++ b/checks/models.py @@ -16,17 +16,6 @@ class ListField(models.TextField): def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) - def from_db_value(self, value, expression, connection, context="Null"): - if value is None: - return value - try: - return ast.literal_eval(value) - except SyntaxError: - raise SyntaxError( - f"Syntax error while attempting to parse value as python, in ListField," - f" possibly raw value has been stored instead of valid python code: {value}" - ) - def to_python(self, value): if not value: value = [] @@ -42,8 +31,11 @@ def get_prep_value(self, value): return str(value) def value_to_string(self, obj): - value = self._get_val_from_obj(obj) - return self.get_db_prep_value(value) + value = self.value_from_object(obj) + return self.get_prep_value(value) + + def from_db_value(self, value, expression, connection): + return self.to_python(value) class AutoConfOption(Enum): diff --git a/docker/Dockerfile b/docker/Dockerfile index 80fa29d85..873549565 100644 --- a/docker/Dockerfile +++ b/docker/Dockerfile @@ -134,6 +134,18 @@ USER unbound ENTRYPOINT ["/entrypoint.sh"] +# build frontend image target +FROM --platform=linux/amd64 debian:bullseye-20241111-slim AS frontend + +# install npm from official image +COPY --from=node:22-slim /usr/local/bin/ /usr/local/bin/ +COPY --from=node:22-slim /usr/local/lib/node_modules /usr/local/lib/node_modules + +ADD frontend/ /app/frontend +WORKDIR /app/frontend +RUN npm install +RUN npm run docker:build + # build main application image target FROM --platform=linux/amd64 debian:bullseye-20241111-slim AS build-app ARG PYTHON_VERSION @@ -205,8 +217,10 @@ RUN install -d -m 0755 -o nobody -g nogroup /app/batch_results # some js/css files use a separate script to generate minimized versions # storage these in a place for django to find RUN mkdir -p /app/static_frontend -RUN python3 bin/frontend.py js -RUN python3 bin/frontend.py css +# copy build/minimized CSS files from frontend stage +COPY --from=frontend --chown=nobody:nogroup /app/static_frontend/css/*.css /app/static_frontend/css/ +# copy build/minimized JS files from frontend stage +COPY --from=frontend --chown=nobody:nogroup /app/static_frontend/js/ /app/static_frontend/js/ # generate language files RUN python3 bin/pofiles.py to_django @@ -228,6 +242,19 @@ ENV SETUPTOOLS_SCM_PRETEND_VERSION=$RELEASE ENTRYPOINT [ "python3", "./manage.py"] CMD ["runserver", "0.0.0.0:8080"] +# app image with development tools for better live reloading +FROM app AS app-dev + +# required for compose `develop` mode file sync/copy +USER root + +# copy dependencies to rebuild CSS (postcss) +COPY --from=frontend /usr/local/bin/ /usr/local/bin/ +COPY --from=frontend /usr/local/lib/node_modules /usr/local/lib/node_modules + +# copy browser reload module +COPY --from=linttest-deps /usr/local/lib/python${PYTHON_VERSION}/dist-packages/django_browser_reload /usr/local/lib/python${PYTHON_VERSION}/dist-packages/django_browser_reload + # supplement application with unittest, lint dependencies FROM build-app AS linttest ARG PYTHON_VERSION diff --git a/docker/compose.development.yaml b/docker/compose.development.yaml index 34d43da26..c4a0693e7 100644 --- a/docker/compose.development.yaml +++ b/docker/compose.development.yaml @@ -17,25 +17,9 @@ services: environment: - INTERNETNL_DOMAINNAME - webserver: - build: - context: .. - dockerfile: docker/webserver.Dockerfile - develop: - watch: - # auto rebuild/reload when config files change - - path: ./webserver/ - action: rebuild - app: - develop: - watch: - # auto rebuild/reload when CSS/JS changes - - path: ../frontend/ - action: sync+exec - target: /app/frontend - exec: - command: /bin/sh -c "python3 bin/frontend.py js;python3 bin/frontend.py css;" + build: + target: app-dev # use Django runserver for better debug abilities during development entrypoint: ["/bin/bash"] # run CSS auto rebuild in the background and start devserver @@ -43,6 +27,13 @@ services: - "-c" - > if [ "$INTERNETNL_AUTORELOAD" = "True" ]; then + # install npm dependencies and watch CSS and JS files for rebuild + cd /app/frontend; + # It's needed to install the rollup linux dependency + npm install; + npm run docker:watch & + cd /app; + # start development server with auto reloading ./manage.py runserver 0.0.0.0:8080 else ./manage.py runserver 0.0.0.0:8080 --noreload @@ -55,6 +46,8 @@ services: - ../checks:/app/checks - ../interface:/app/interface - ../internetnl:/app/internetnl + # mount frontend files so build tools can detect changes and rebuild + - ../frontend/src:/app/frontend/src worker: volumes: diff --git a/docker/webserver.Dockerfile b/docker/webserver.Dockerfile index cc4728625..ede9b581c 100644 --- a/docker/webserver.Dockerfile +++ b/docker/webserver.Dockerfile @@ -34,6 +34,8 @@ RUN mkdir -p /var/www/internet.nl/.well-known/ # copy all security*.txt files COPY .well-known/security*.txt /var/www/internet.nl/.well-known/ COPY interface/static/favicon.ico /var/www/internet.nl/ +COPY interface/static/favicon.svg /var/www/internet.nl/ +COPY interface/static/favicon.png /var/www/internet.nl/ COPY docker/webserver/nginx_templates/* /etc/nginx/templates/ COPY docker/webserver/mime.types /etc/nginx/ diff --git a/docker/webserver/nginx_templates/app.conf.template b/docker/webserver/nginx_templates/app.conf.template index e091882b9..cb0955f7c 100644 --- a/docker/webserver/nginx_templates/app.conf.template +++ b/docker/webserver/nginx_templates/app.conf.template @@ -249,6 +249,12 @@ server { location = /favicon.ico { alias /var/www/internet.nl/favicon.ico; } + location = /favicon.svg { + alias /var/www/internet.nl/favicon.svg; + } + location = /favicon.png { + alias /var/www/internet.nl/favicon.png; + } # static files served from app location /static { diff --git a/documentation/Docker-development-environment.md b/documentation/Docker-development-environment.md index 07742257e..53872df7c 100644 --- a/documentation/Docker-development-environment.md +++ b/documentation/Docker-development-environment.md @@ -408,3 +408,31 @@ There are various cron jobs configured during normal deployments that perform ta ## Routinator For the development environment the Routinator service/container is not started but instead an external routinator service is used. This reduces resource usage and wait time. + +## Testdata/fixtures + +For frontend development purposes a set of testresults can be loaded into the database to so these don't have to be generated manually. + +To load this testdata run: + + docker exec -ti internetnl-develop-app-1 ./manage.py loaddata example_reports + +The following urls can be used to view the testresults: + +http://localhost:8080/site/internet.nl/9000/ +http://localhost:8080/site/example.nl/9001/ +http://localhost:8080/site/ipv6.internet.nl/9002/ +http://localhost:8080/site/forfun.net/9003/ +http://localhost:8080/site/ipv6.google.com/9004/ +http://localhost:8080/site/brokendnssec.net/9005/ +http://localhost:8080/site/ok.bogussig.ok.bad-dnssec.wb.sidnlabs.nl/9006/ +http://localhost:8080/site/badhash.dane.huque.com/9007/ +http://localhost:8080/site/expired.badssl.com/9008/ +http://localhost:8080/site/wrong.host.badssl.com/9009/ +http://localhost:8080/site/self-signed.badssl.com/9010/ +http://localhost:8080/site/untrusted-root.badssl.com/9011/ +http://localhost:8080/site/revoked.badssl.com/9012/ +http://localhost:8080/site/pinning-test.badssl.com/9013/ +http://localhost:8080/site/invalid.rpki.isbgpsafeyet.com/9014/ + +There are several scenarios with different failures in the testresults. diff --git a/documentation/generate_example_reports.md b/documentation/generate_example_reports.md new file mode 100644 index 000000000..2a3681856 --- /dev/null +++ b/documentation/generate_example_reports.md @@ -0,0 +1,96 @@ +# To export reports as Django fixtures and generate documentation urls + +# on server +*DO NOT RUN ON PRODUCTION DB, WILL CAUSE DATA LOSS!* + +`ssh ` +`docker compose --project-name=internetnl-prod exec postgres psql --username internetnl internetnl_db1` + + # clear existing reports and related data + delete from checks_asrecord; + delete from checks_autoconf; + delete from checks_batchdomain; + delete from checks_batchmailtest; + delete from checks_batchrequest; + delete from checks_batchuser; + delete from checks_batchwebtest; + delete from checks_connectiontest; + delete from checks_domaintestappsecpriv; + delete from checks_domaintestdnssec; + delete from checks_domaintestipv6; + delete from checks_domaintestreport; + delete from checks_domaintesttls; + delete from checks_mailtestauth; + delete from checks_mailtestdnssec; + delete from checks_mailtestipv6; + delete from checks_mailtestreport; + delete from checks_mailtestrpki; + delete from checks_mailtesttls; + delete from checks_mxdomain; + delete from checks_nsdomain; + delete from checks_resolver; + delete from checks_rpkimxhost; + delete from checks_rpkimxnshost; + delete from checks_rpkinshost; + delete from checks_rpkiwebhost; + delete from checks_webdomain; + delete from checks_webtestappsecpriv; + delete from checks_webtestrpki; + delete from checks_webtesttls; + + # set starting index as a high number to avoid conflicts with existing reports on import + alter sequence checks_asrecord_id_seq RESTART with 9000; + alter sequence checks_autoconf_id_seq RESTART with 9000; + alter sequence checks_batchdomain_id_seq RESTART with 9000; + alter sequence checks_batchmailtest_id_seq RESTART with 9000; + alter sequence checks_batchrequest_id_seq RESTART with 9000; + alter sequence checks_batchuser_id_seq RESTART with 9000; + alter sequence checks_batchwebtest_id_seq RESTART with 9000; + alter sequence checks_connectiontest_id_seq RESTART with 9000; + alter sequence checks_domaintestappsecpriv_id_seq RESTART with 9000; + alter sequence checks_domaintestdnssec_id_seq RESTART with 9000; + alter sequence checks_domaintestipv6_id_seq RESTART with 9000; + alter sequence checks_domaintestreport_id_seq RESTART with 9000; + alter sequence checks_domaintesttls_id_seq RESTART with 9000; + alter sequence checks_mailtestauth_id_seq RESTART with 9000; + alter sequence checks_mailtestdnssec_id_seq RESTART with 9000; + alter sequence checks_mailtestipv6_id_seq RESTART with 9000; + alter sequence checks_mailtestreport_id_seq RESTART with 9000; + alter sequence checks_mailtestrpki_id_seq RESTART with 9000; + alter sequence checks_mailtesttls_id_seq RESTART with 9000; + alter sequence checks_mxdomain_id_seq RESTART with 9000; + alter sequence checks_nsdomain_id_seq RESTART with 9000; + alter sequence checks_resolver_id_seq RESTART with 9000; + alter sequence checks_rpkimxhost_id_seq RESTART with 9000; + alter sequence checks_rpkimxnshost_id_seq RESTART with 9000; + alter sequence checks_rpkinshost_id_seq RESTART with 9000; + alter sequence checks_rpkiwebhost_id_seq RESTART with 9000; + alter sequence checks_webdomain_id_seq RESTART with 9000; + alter sequence checks_webtestappsecpriv_id_seq RESTART with 9000; + alter sequence checks_webtestrpki_id_seq RESTART with 9000; + alter sequence checks_webtesttls_id_seq RESTART with 9000; + +## run live tests to generate reports +`APP_URLS=https:// RELEASE=latest make live-tests` + +## export fixtures +`docker compose --project-name=internetnl-prod exec app ./manage.py dumpdata checks --indent=2 > ~/example_reports.json` + +# in local dev +`scp :example_reports.json checks/fixtures/` + +## import fixtures +`docker exec -ti internetnl-develop-app-1 ./manage.py loaddata example_reports.json` + +## generate documentation urls +`docker exec -ti internetnl-develop-app-1 ./manage.py shell` + + from checks.models import DomainTestReport, MailTestReport, ConnectionTest + for d in DomainTestReport.objects.all(): + print(f"http://localhost:8080/site/{d.domain}/{d.id}/") + + for d in MailTestReport.objects.all(): + print(f"http://localhost:8080/mail/{d.domain}/{d.id}/") + + for d in ConnectionTest.objects.all(): + print(f"http://localhost:8080/connection/{d.test_id}/") diff --git a/documentation/images/dockerfiles.py b/documentation/images/dockerfiles.py index 4d4e664f7..bbc853c00 100644 --- a/documentation/images/dockerfiles.py +++ b/documentation/images/dockerfiles.py @@ -56,7 +56,7 @@ Packages("certbot"), File("webserver/authentication.sh,webserver/tls_init.sh"), File("webserver/nginx_templates"), - File("robots.txt,.well-known/security.txt,favicon.ico"), + File("robots.txt,.well-known/security.txt,favicon.svg"), File("certbot/entrypoint.sh"), ] >> Image("ghcr.io/internetstandards/webserver") diff --git a/frontend/.stylelintrc.json b/frontend/.stylelintrc.json new file mode 100644 index 000000000..ae10978a9 --- /dev/null +++ b/frontend/.stylelintrc.json @@ -0,0 +1,12 @@ +{ + "extends": [ + "stylelint-config-standard" + ], + "rules": { + "selector-type-no-unknown": null, + "selector-pseudo-element-no-unknown": null, + "selector-pseudo-class-no-unknown": null, + "declaration-property-value-no-unknown": null, + "no-descending-specificity": null + } +} \ No newline at end of file diff --git a/frontend/css/alt.css b/frontend/css/alt.css deleted file mode 100644 index f20ebcc79..000000000 --- a/frontend/css/alt.css +++ /dev/null @@ -1,301 +0,0 @@ -/* internet.nl - alt.css -*/ - -/* - - this stylesheet is loaded only by browsers that have both images and javascript enabled - it is used to replace very, very important text such as warnings with a visually more - attractive background image. This may be the case on the test result page or the - logo in the header. Also, this sheet loads background images for headers etc. - -*/ - -/* ===================================================================================== */ - -/* auxilliary classes */ -.visuallyhidden, .hidden { - border: 0; - clip: rect(0, 0, 0, 0); - height: 1px; - margin: -1px; - overflow: hidden; - padding: 0; - position: absolute; - width: 1px; -} - -/* ===================================================================================== */ - -@media (max-width:499px) { - #site-title a { - height: 33px; - /* logo with site description below */ - background: url('/static/logo_en.png'); - background: url('/static/logo_en.svg'); - } -} - -@media (min-width:500px) AND (max-width:739px) { - #site-title a { - background: url('/static/logo-tablet_en.png'); - background: url('/static/logo-tablet_en.svg'); - } -} - -@media (min-width:740px) { - #site-title a { - height: 25px; - /* logo with site description below */ - background: url('/static/logo_en.png'); - background: url('/static/logo_en.svg'); - } -} - -/* Site title and site description */ -#site-title a { - background-repeat: no-repeat; - background-size: contain; -} - - -#menu-button i { - font-size: 1em; - display: block; - text-indent: 999em; - background: white url('/static/icon-menu.png') center center no-repeat; - background-image: url('/static/icon-menu.svg'), none; /* browsers that do not understand this will show the png-based image */ - background-repeat: no-repeat; - background-size: contain; -} - - - - -/* ================================= */ -/* styling for test result indicator */ - -#testresults-overview .reruntest, -#testresults-overview .icon-testinfo, -#testresults-overview .permalink { - background-size: 1.25em 1.25em; - padding-left: 1.75em; - background-position: left center; - background-repeat: no-repeat; - display: inline-block; - max-width: 60%; - margin: 0 0 .25em 0; -} -#testresults-overview .permalink { - background-image: url('/static/icon-permalink.png'); - background-image: url('/static/icon-permalink.svg'), none; /* browsers that do not understand this will show the png-based image */ -} -#testresults-overview .reruntest { - background-image: url('/static/icon-reruntest.png'); - background-image: url('/static/icon-reruntest.svg'), none; /* browsers that do not understand this will show the png-based image */ -} -#testresults-overview .icon-testinfo { - background-image: url('/static/icon-testinfo.png'); - background-image: url('/static/icon-testinfo.svg'), none; /* browsers that do not understand this will show the png-based image */ -} - -/* ===================================================================================== */ -/* images for test results */ -.testresult { - padding-left: 2.25em; /* 36px */ - background: #fff url('/static/icon-testresult-default.png') .6em .6em no-repeat; - background-image: url('/static/icon-testresult-default.svg'), none; /* browsers that do not understand this will show the png-based image */ - background-size: 1.125em 1.125em; /* 18px 18px */ -} -.faq-subtest { - padding-left: 1.5em; - background: #fff url('/static/icon-testresult-default.png') no-repeat; - background-image: url('/static/icon-testresult-default.svg'), none; /* browsers that do not understand this will show the png-based image */ - background-size: 1.125em 1.125em; /* 18px 18px */ -} -.testresult.passed, -.faq-subtest.passed { - background-image: url('/static/icon-check.png'); - background-image: url('/static/icon-check.svg'), none; /* browsers that do not understand this will show the png-based image */ -} -.testresult.failed, -.faq-subtest.failed { - background-image: url('/static/icon-error.png'); - background-image: url('/static/icon-error.svg'), none; /* browsers that do not understand this will show the png-based image */ -} -.testresult.warning, -.faq-subtest.warning { - background-image: url('/static/icon-warning.png'); - background-image: url('/static/icon-warning.svg'), none; /* browsers that do not understand this will show the png-based image */ -} -.testresult.info, -.faq-subtest.info { - background-image: url('/static/icon-info.png'); - background-image: url('/static/icon-info.svg'), none; /* browsers that do not understand this will show the png-based image */ -} -.testresult.good-not-tested, -.faq-subtest.good-not-tested { - background-image: url('/static/icon-not-tested-question-mark.png'); - background-image: url('/static/icon-not-tested-question-mark.svg'), none; /* browsers that do not understand this will show the png-based image */ -} -.testresult.not-tested, -.faq-subtest.not-tested { - background-image: url('/static/icon-not-tested.png'); - background-image: url('/static/icon-not-tested.svg'), none; /* browsers that do not understand this will show the png-based image */ -} -.testresult.error, -.faq-subtest.error { - background-image: url('/static/icon-not-tested-bolt.png'); - background-image: url('/static/icon-not-tested-bolt.svg'), none; /* browsers that do not understand this will show the png-based image */ -} -.testresult.not-tested h3 a { - color: #6D6D6D; -} -.meter { - background: white url('/static/progress-meter2x.png') bottom center no-repeat; - background-size: 100% 80px; - background-position: center center; - background-origin: border-box; -} -.testresults h2, -.faq-test, -.test-header .test-title h2, -#testresults-overview ul li { - padding-left: 1.5em; - background-size: 1em 1em; /* 16px 16px */ - background-repeat: no-repeat; - background-position: left center; -} -.testresults h2.error, -.faq-test.error, -.test-header .test-title h2.error, -#testresults-overview ul li.error { - background-image: url('/static/probe-error.png'); - background-image: url('/static/probe-error.svg'), none; /* browsers that do not understand this will show the png-based image */ -} -.testresults h2.warning, -.faq-test.warning, -.test-header .test-title h2.warning, -#testresults-overview ul li.warning { - background-image: url('/static/icon-circle-warning.png'); - background-image: url('/static/icon-circle-warning.svg'), none; /* browsers that do not understand this will show the png-based image */ -} -.testresults h2.failed, -.faq-test.failed, -.test-header .test-title h2.failed, -#testresults-overview ul li.failed { - background-image: url('/static/icon-circle-error.png'); - background-image: url('/static/icon-circle-error.svg'), none; /* browsers that do not understand this will show the png-based image */ -} -.testresults h2.info, -.faq-test.info, -.test-header .test-title h2.info, -#testresults-overview ul li.info { - background-image: url('/static/icon-info.png'); - background-image: url('/static/icon-info.svg'), none; /* browsers that do not understand this will show the png-based image */ -} -.testresults h2.passed, -.faq-test.passed, -.test-header .test-title h2.passed, -#testresults-overview ul li.passed { - background-image: url('/static/icon-circle-check.png'); - background-image: url('/static/icon-circle-check.svg'), none; /* browsers that do not understand this will show the png-based image */ -} -.perfectscore { - background: white; - color: black; - padding: 1em 1em 1em 6.45em; - margin: 1em 0; - min-height: 6.45em; - background-image: url('/static/badge-simple-flat.png'); - background-image: url('/static/badge-simple-flat.svg'), none; /* browsers that do not understand this will show the png-based image */ - background-repeat: no-repeat; - background-position: .5em 1em; -} - - -#testresults-overview .congratulations { - margin-bottom: 1em; -} - -#testresults-overview .perfectscore a { - color: black; -} - -/* ===================================================================================== */ -/* images for test result descriptions */ -.panel-title a .icon { - transition: all 200ms ease 0s; - width: 1em; - height: 1em; - background: url('/static/icon-arrow-down.png') center right no-repeat; - background-image: url('/static/icon-arrow-down.svg'), none; - background-size: contain; -} -.panel-title a .icon img { - visibility: hidden; - display: none; -} -.panel-title a.active .icon { - transform: rotate(180deg); -} - -/* ===================================================================================== */ -/* icons in the headers for various tests */ -.emailtest h1, -.websitetest h1, -.connectiontest h1, -.block .emailtest h2, -.block .websitetest h2, -.block .connectiontest h2, -.block.emailtest h2, -.block.websitetest h2, -.block.connectiontest h2 { - background-position: right top; - background-repeat: no-repeat; - background-size: 20px 20px; - padding-right: 28px; -} -.emailtest h1, -.websitetest h1, -.connectiontest h1 { - background-position: right 12px; -} - -.connectiontest h1, -.block .connectiontest h2, -.block.connectiontest h2 { - background-image: url('/static/icon-connectiontest.png'); - background-image: url('/static/icon-connectiontest.svg'), none; /* browsers that do not understand this will show the png-based image */ -} -.emailtest h1, -.block .emailtest h2, -.block.emailtest h2 { - background-image: url('/static/icon-emailtest.png'); - background-image: url('/static/icon-emailtest.svg'), none; /* browsers that do not understand this will show the png-based image */ -} -.websitetest h1, -.block .websitetest h2, -.block.websitetest h2 { - background-image: url('/static/icon-website-test.png'); - background-image: url('/static/icon-website-test.svg'), none; /* browsers that do not understand this will show the png-based image */ -} - -/* ===================================================================================== */ -/* error message */ -.error .message { - padding-left: 2em; - background: url('/static/icon-warning.png') center right no-repeat; - background-image: url('/static/icon-warning.svg'), none; /* browsers that do not understand this will show the png-based image */ - background-position: left top; - background-repeat: no-repeat; - background-size: 20px 20px; -} - -/* ===================================================================================== */ -/* news overview */ -.news li a { - padding-right: 1.5em; - background: url('/static/icon-arrow-right.png') center right no-repeat; - background-image: url('/static/icon-arrow-right.svg'), none; /* browser that do not understand this will show the png-based image */ -} diff --git a/frontend/css/high-contrast.css b/frontend/css/high-contrast.css deleted file mode 100644 index d669ad1a2..000000000 --- a/frontend/css/high-contrast.css +++ /dev/null @@ -1,18 +0,0 @@ -/* internet.nl - high-contrast.css -*/ - -/* images for test result descriptions */ -.meter { - height: 40px; - background-color: #fff; -} -.meter > span { - box-sizing: border-box !important; - top: 5px; - height: 0 !important; - min-height: 1px; - background-color: #000; - background-image: none; - border: 10px solid #000; -} diff --git a/frontend/css/old-ie.css b/frontend/css/old-ie.css deleted file mode 100644 index 55179daf4..000000000 --- a/frontend/css/old-ie.css +++ /dev/null @@ -1,104 +0,0 @@ -/* internet.nl - ... -*/ - -/* for browsers <= IE9 */ -main .wrap .block { - width: 30%; - min-width: intrinsic; - float: left; -} - -#site-title a { - background: none; - text-indent: 0; - font-size: 1em; - width: auto !important; - height: auto !important; - display: block; - float: none !important; - padding-left: 44px !important; -} -#site-title a { - font-size: 32px; - min-height: 36px; - background: url('/static/logo-300w.png') center left no-repeat; - color: black; - width: 300px; - height: 65px; - text-decoration: none; - text-transform: uppercase; -} -#site-description { - min-height: 36px; - background: url('/static/icon-circle-error-ie8.png') center left no-repeat; -} -#site-description:after { - content: '(please update your browser)'; - margin-left: 2em; - line-height: 2; - display: block; -} - -.testresult { - background-image: url('/static/icon-testresult-default-ie8.png') !important; -} -.testresult.passed { - background-image: url('/static/icon-check-ie8.png') !important; -} -.testresult.failed { - background-image: url('/static/icon-error-ie8.png') !important; -} -.testresult.warning { - background-image: url('/static/icon-warning-ie8.png') !important; -} -.testresult.good-not-tested { - background-image: url('/static/icon-not-tested-question-mark-ie8.png') !important; -} -.testresult.not-tested { - background-image: url('/static/icon-not-tested-ie8.png') !important; -} -.testresults h2.warning, -#testresults-overview ul li.warning { - background-image: url('/static/icon-circle-warning-ie8.png') !important; -} -.testresults h2.failed, -#testresults-overview ul li.error { - background-image: url('/static/icon-circle-error-ie8.png') !important; -} -.testresults h2.passed, -#testresults-overview ul li.check { - background-image: url('/static/icon-circle-check-ie8.png') !important; -} -.connectiontest h1, -.block .connectiontest h2, -.block.connectiontest h2 { - background-image: url('/static/icon-connectiontest-ie8.png') !important; -} -.emailtest h1, -.block .emailtest h2, -.block.emailtest h2 { - background-image: url('/static/icon-emailtest-ie8.png') !important; -} -.websitetest h1, -.block .websitetest h2, -.block.websitetest h2 { - background-image: url('/static/icon-website-test-ie8.png') !important; -} -.panel-title a .icon { - background-image: url('/static/icon-arrow-down-ie8.png') !important; -} - -.block.hall-of-fame, -.block.hall-of-fame li { - list-style: url('/static/li-check-green.png'); -} -.block.stats .passed { - list-style: url('/static/li-shield-ok.png') !important; -} -.block.stats .almost-there { - list-style: url('/static/li-shield-warning.png') !important; -} -.block.stats .notpassed { - list-style: url('/static/li-shield-error.png') !important; -} diff --git a/frontend/css/print.css b/frontend/css/print.css deleted file mode 100644 index 5cf67c5b7..000000000 --- a/frontend/css/print.css +++ /dev/null @@ -1,122 +0,0 @@ -/* internet.nl - print css -*/ - - -/* firefox bug fix */ -main .wrap, -aside, -main .wrap .block, -main .wrap .result { - display: block; - width:100%; -} - -/* printing not necessary for the following parts */ -nav, -.language-switch-list, -.language-switch-header-container, -#menu-button, -aside, -.footlink, -.panel-button-container, -.panel-title a .icon, -.timestamp > :not(a.permalink), -#site-description { - display:none !important; -} - -/* print permalink */ -a.permalink::after { - content: ": " attr(href); -} - -/* print design */ -header { - position: absolute !important; - top:0 !important; - left:0 !important; - border-bottom-style: none !important; - box-shadow: none !important -} - -.block, -.result { - box-shadow: 0 0 0 #ffffff; -} - -#site-title a, -#site-description { - background-image: none !important; -} -#site-title a { - padding-left:0; - font-size:32px; - text-decoration: none; - font-weight: bold; - color: #00BFD6; -} -header div span.hidden { - display:block; - position: relative; - overflow: visible; - height:auto; - width:auto; -} - -#site-title a img { - display: inherit !important; - height:1.3em !important; -} - -/* show all accordion-items */ -div[aria-hidden=true] { - display:inherit; -} - -/* save ink */ -main, -.mainwrap, -.testresults, -.body-with-semifixed-header { - background-color: #ffffff !important; -} - -footer { - background: #ffffff; - color: #626262; -} - - -.score-container { - border-style: none; -} -.score-container .score { - -webkit-print-color-adjust: exact; - height: auto; - font-size: 150%; -} -.score-container .meter { - background-size: 100% 160px; - border: 1px solid #b3b3b3; - font-size: 150%; -} - - -#site-title a, -.testresult, -.faq-subtest, -.testresults h2, -.faq-test, -.test-header .test-title h2, -#testresults-overview ul li, -.score-container .meter, -.perfectscore { - -webkit-print-color-adjust: exact; -} - -#site-title a { - content:url('/static/logo_en.png'); - width: 296px; - height: 65px; -} diff --git a/frontend/css/style.css b/frontend/css/style.css deleted file mode 100644 index 044d61031..000000000 --- a/frontend/css/style.css +++ /dev/null @@ -1,1808 +0,0 @@ -/* internet.nl - style.css -*/ - -@font-face { - font-family: 'robotobold'; - src: url('/static/fonts/robotobold.eot'); - src: url('/static/fonts/robotobold.eot?#iefix') format('embedded-opentype'), - url('/static/fonts/robotobold.woff') format('woff'), - url('/static/fonts/robotobold.ttf') format('truetype'), - url('/static/fonts/robotobold.svg#robotobold') format('svg'); - font-weight: bold; - font-style: normal; - -} - -@font-face { - font-family: 'robotoregular'; - src: url('/static/fonts/robotoregular.eot'); - src: url('/static/fonts/robotoregular.eot?#iefix') format('embedded-opentype'), - url('/static/fonts/robotoregular.woff') format('woff'), - url('/static/fonts/robotoregular.ttf') format('truetype'), - url('/static/fonts/robotoregular.svg#robotoregular') format('svg'); - font-weight: normal; - font-style: normal; -} - - -/* http://meyerweb.com/eric/tools/css/reset/ - v2.0 | 20110126 - License: none (public domain) -*/ -html, body, div, span, applet, object, iframe, -h1, h2, h3, h4, h5, h6, p, blockquote, pre, -a, abbr, acronym, address, big, cite, code, -del, dfn, em, img, ins, kbd, q, s, samp, -small, strike, strong, sub, sup, tt, var, -b, u, i, center, -dl, dt, dd, ol, ul, li, -fieldset, form, label, legend, -table, caption, tbody, tfoot, thead, tr, th, td, -article, aside, canvas, details, embed, -figure, figcaption, footer, header, hgroup, -menu, nav, output, ruby, section, summary, -time, mark, audio, video { - margin: 0; - padding: 0; - border: 0; - font-size: 100%; - font: inherit; - vertical-align: baseline; -} -/* HTML5 display-role reset for older browsers */ -article, aside, details, figcaption, figure, -footer, header, hgroup, menu, nav, section { - display: block; -} -body { - line-height: 1.5; - color: #000; -} -ol, ul { - list-style: none; -} -strong, b, .attentie { - font-family: 'robotobold', arial, sans-serif; - font-weight: bold; -} -em { - font-style: italic; -} -h1, h2, h3, h4 { - font-family: 'robotobold', arial, sans-serif; - font-weight: bold; -} - -blockquote { - padding-top: .5em; - border-top: 1px solid #E2E2E2; - border-bottom: 1px solid #E2E2E2; - margin: 2em 3em 2em 2em; - font-size: 95%; -} -hr { - border: 0; - height: 1px; - background: #575757; -} - -code { - font-size: 1.1em; - background: #E2E2E2; - padding-left: .2em; - padding-right: .2em; -} -code, pre { - font-family: monospace; -} -pre { - max-width: 100%; - - /* https://css-tricks.com/snippets/css/make-pre-text-wrap/ */ - /* Browser specific (not valid) styles to make preformatted text wrap */ - white-space: pre-wrap; /* css-3 */ - white-space: -moz-pre-wrap; /* Mozilla, since 1999 */ - white-space: -pre-wrap; /* Opera 4-6 */ - white-space: -o-pre-wrap; /* Opera 7 */ - word-wrap: break-word; /* Internet Explorer 5.5+ */ - -} - -blockquote, q { - quotes: none; -} -blockquote:before, blockquote:after, -q:before, q:after { - content: ''; - content: none; -} -table { - border-collapse: collapse; - border-spacing: 0; -} -/* ************** - internet.nl starts here - ************** */ - -/* see: css-tricks.com/box-sizing/ */ -html { - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - box-sizing: border-box; -} -*, *:before, *:after { - -webkit-box-sizing: inherit; - -moz-box-sizing: inherit; - box-sizing: inherit; -} - -/* some a11y flavour */ -.skiplink a { - position:absolute; - top:0px; - left:-9999px; - z-index:1000; -} -.skiplink a:focus { - left:0; - top:0; - padding:.25em; - color:black; - text-decoration: none; - background:#00BFD6; -} -.skiplink-hide { - display: none; -} - -a:focus { - outline:2px solid #14C9DF; -} - -/* ************ */ -body { - font-family: 'robotoregular', arial, sans-serif; -} - -header { - width: 100%; - background-color: #ffffff; - box-shadow: 0px 1px 4px #888888; - border-bottom: 8px solid #05BFD6; -} - -main { - background-color: #e3e3e3; - padding-bottom: .5em; -} - -.mainwrap { - padding-top:.25em; - background-color: #e3e3e3; -} - -.home .mainwrap { - background-color: #05BFD6; - background: linear-gradient(#05BFD6, #45E7FB); - padding-top: 0; -} - -footer { - background-color: #575757; - color: #ffffff; - padding-top: .5em; -} - -.wrap { - margin:0 .5em 0 .5em; - padding-top:.5em; - padding-bottom:.5em; -} - -header .wrap, -footer .wrap { - margin-left: 1em; -} -footer .wrap { - margin-right: 1em; -} - -main .wrap { - margin-left: 0em; - margin-right: 0em; -} - -nav ul li { - display: inline-block; - padding: .2em; -} - - -/* begin styling for the header */ - -header .wrap { - overflow: hidden; -} - -#masthead { - display: inline-block; - float: left; - width: 80%; - width: calc(100% - 60px); -} - #site-title a { - display: block; - height: 33px; - font-size: 100%; - width: 100%; -/* basic: show logo */ - background: url('/static/logo_en.png'); - background: url('/static/logo_en.svg'); - background-repeat: no-repeat; - background-size: contain; - background-position: left center; - padding-left: 30px; - } - #site-title a, - #site-description { - float: left; - white-space: nowrap; - overflow: hidden; - } - -#language-switch-header-container { - float: right; - margin-right: .25em; -} -#language-switch-header-container.active { - /* for when the language options are displayed on a smaller screen */ - width: 100%; - margin-top: .5em; - margin-bottom: .5em; - border-top: 1px solid #E2E2E2; - border-bottom: 1px solid #E2E2E2; -} - -.menu-with-js-actions.active #sitenav a { - font-size: 125%; -} - - -.language-switch-list li { - display: inline; - float: left; - margin-bottom: .5em; - text-align: right; - font-size: 80%; - margin: 0 0 0 1em; -} -#language-switch-header-container.active li { - padding: .2em; - margin: .5em 3px .5em 3px; -} - -header .language-switch-list li a { - color: #575757; - text-decoration: none; -} -header .language-switch-list li a:hover, -header .language-switch-list li a:active, -header .language-switch-list li a:focus { - text-decoration: underline; -} -header .language-switch-list li button { - color: #000; - background-color: white; - text-decoration: none; - border: none; - border-radius: 0px; - margin: 0px; - padding: 0px; - font: inherit; -} -header .language-switch-list li button { - text-transform: capitalize; -} -header .language-switch-list li button:hover, -header .language-switch-list li button:active, -header .language-switch-list li button:focus { - text-decoration: underline; -} -header .language-switch-list li button:hover{ - cursor: pointer; -} -header .language-switch-list li button:focus { - outline: 2px solid #14C9DF; -} -header .language-switch-list li button.active-language { - color: #000; - text-decoration: underline; -} -header .language-switch-list li button.active-language:hover, -header .language-switch-list li button.active-language:active, -header .language-switch-list li button.active-language:focus { - cursor: default; -} - -#menu-button { - position: absolute; - right: .5em; - top: .5em; - border: 1px solid black; - border-radius: 2px; - background: white; - text-transform: uppercase; - padding: .5em; - font-size: 80%; - min-width: 40px; -} -/* ====================================================== */ -@media (max-width:500px) { - #menu-button { - height: 36px; - width: 36px; - padding: 0; - } - #menu-button i { - font-size: 3em; - line-height: .5; - height: 24px; - width: 36px; - } - #menu-button b { - border: 0; - clip: rect(0, 0, 0, 0); - height: 1px; - margin: -1px; - overflow: hidden; - padding: 0; - position: absolute; - width: 1px; - } - - hall-of-fame #content li, - footer li { - margin-top: .5em; - margin-bottom: .5em; - } - -} - -/* ====================================================== */ -@media (min-width:500px) { - - #masthead { - width: calc(100% - 80px); - } - - #menu-button { - height: 36px; - width: auto; - padding: .5em; - } - #menu-button i { - float: left; - height: 16px; - width: 16px; - } -} - -/* ====================================================== */ -@media (min-width: 740px) { - - #masthead { - min-height: 65px; - width: 300px; - padding-bottom: .5em; - } - - #site-title a { - min-height: 65px; - padding-left: 75px; - } - -} -/*=======*/ - - -header nav { - overflow: hidden; - display: block; - float: none; - clear: both; - } - header nav li { - font-size: .8em; - border-bottom: 3px solid white; - } - header nav a { - color: #000; - text-decoration: none; - margin: 3px; - display: block; - } - header nav a:hover, - header nav a:active, - header nav a:focus { - text-decoration: underline; - } - header nav li.current { - font-weight: bold; - border-color: #ffab4c; - } - header nav li.current a { - margin: 0; - } - -nav[aria-hidden=true] { - display: none; -} - -nav[aria-hidden=false] { - display: block; -} - -/* end styling for the header */ - -/* Intro wrap only on the front page */ -.introwrap { - overflow: hidden; -} -.introwrap p { - text-align: center; - margin: 0 auto; -} -.introwrap .wrap p { -} - -@media screen { - - .introwrap p span { - background: #008297; - color: #ffffff; - display: inline-block; - padding: .5em 1em .7em 1em; - font-family: 'robotobold', arial, sans-serif; - font-weight: bold; - font-size: 120%; - position: relative; - } - - .introwrap .wrap p { - margin-top: .5em; - } - -} -.block { - background-color: #ffffff; - padding:.5em; - margin-top:.25em; - margin-bottom:.5em; - box-shadow: 0px 1px 4px #888888; - position: relative; -} - -main .wrap .block.fullwidth .wrap { - padding: 1em; -} - -aside { - padding:0; - margin-top:.25em; - margin-bottom:.5em; - } - aside .block { - margin-left:0; - margin-right:0; - } - -.block.dark { - background-color: #575757; - color: #ffffff; - } - .block.dark a { - color: #ffffff; - } -main ul li, -main ol li { - margin-bottom: .3em; -} -main ul, -main ol { - margin-top: .3em; -} - - -h1 { - font-size: 1.625em; - line-height: 1.5em; - word-wrap: break-word; - hyphens: auto; /* prevents the title from breaking out of the container, see issue #401 */ -} -h2 { - margin-top: .8em; - font-size: 1.375em; - line-height: 1.5em; -} -h2:first-child { - margin-top: .5em; - margin-bottom: .5em; -} -.hall-of-fame h2:first-child { - margin-bottom: 1em; -} -.faqs h2 { - margin-top: .8em; - margin-bottom: .5em; -} -h3 { - font-size: 1.125em; - line-height: 1.125em; -} -h4 { - font-size: 1em; - line-height: 1em; -} -.block h2 { - width:100%; - vertical-align: middle; - line-height: 1; -} -textarea#html-block { - width: 630px; - height: 180px; -} -textarea#css-block { - width: 630px; - height: 180px; -} -/* content styling */ -article ol, -.hall-of-fame .intro .hof-content ol { - padding-left: 1.5em; - list-style-type: decimal; - line-height: 1.5; -} -article ul, -.hall-of-fame .intro .hof-content ul { - padding-left: 1.5em; - list-style-type: disc; -} -article ul ul, -.hall-of-fame .intro .hof-content ul ul { - list-style-type: circle; - margin-bottom: 0; -} -article ul ul ul, -.hall-of-fame .intro .hof-content ul ul ul { - list-style-type: square; -} -article ul ul ul ul, -.hall-of-fame .intro .hof-content ul ul ul ul { - list-style-type: circle; -} -article img { - max-width: 100%; - height: auto; -} - - -/*.blocks */ -.block a { - color: #037584; -} -.block button { - display: block; - margin: 0 auto .5em; - background: #fff; - border: solid .3em #ffab4c; - font-family: 'robotobold', arial, sans-serif; - font-weight: bold; - font-size: 100%; - border-radius: 18px; - padding: .2em .5em; - } - .block button:hover, - .block button:focus, - .block button:active { - background: #ffab4c; - } - .block button:hover { - cursor: pointer; - } - .block button:focus { - outline:none; - } - -/* make room for the button */ -.block form { - margin-top: .5em; - width: 100%; - overflow: hidden; -} - -.block form label { - width: 100%; - display: block; -} -.block input[type="url"], -.block input[type="text"] { - width: 100%; -} - -.block input[type="email"], -.block input[type="url"], -.block input[type="text"] { - border: 2px solid #dadada; - border-radius: 4px; - font-size: 1em; - padding-left: .5em; - margin-top: .5em; - height: 1.875em; /* 30px */ -} -.block .emailfield { - display: block; - background: white; - width: auto; - padding: 0 0 0 0; - border: 2px solid #dadada; - border-radius: 4px; - margin-top: .5em; - margin-bottom: 1em; - overflow: hidden; - height: 1.875em; /* 30px */ -} -.block .emailfield:before { - content: '@'; - background: #dadada; - width: 8%; - display: block; - float: left; - text-align: center; - height: 100%; - overflow: hidden; - padding: 2px 0; -} -.block .emailfield input { - margin: 0 3px; - border-width: 0; - border-radius: 0 4px 4px 0; - width: 89%; - width: calc(92% - 6px); - float: right; - height: 1.875em; /* 30px */ - height: 1.5em; /* 24px */ -} -.block form label span { - line-height: 1; -} - -.block p, .block a, .block input, .block ul, .block ol { - margin-bottom:1em; -} -.block ol ol, -.block ol ul, -.block ul ol, -.block ul ul { - margin-bottom: 0; -} - -.block.dark.stats h3 { - margin-top:.5em; -} -.block.dark.stats li { - padding-left: 1em; - text-indent: -.7em; -} - -.block.dark.stats table { - width:100%; - } - .block.dark.stats th { - padding-top:0; - font-weight:normal; - } - .block.dark.stats th, - .block.dark.stats td { - text-align:right; - background-color:#575757; - } - - .block.stats h3 { - } - .block.stats span { - display: inline-block; - width: 52%; - float: right; - padding: 0; - margin-left: 5%; - } - - .block.stats .almost-there { - list-style: url('/static/li-shield-warning.png'); - list-style: url('/static/li-shield-warning.svg'); - } - - .block.stats .notpassed { - list-style: url('/static/li-shield-error.png'); - list-style: url('/static/li-shield-error.svg'); - } - - .block.stats .passed { - list-style: url('/static/li-shield-ok.png'); - list-style: url('/static/li-shield-ok.svg'); - } - -.block.stats ol, -.block.hall-of-fame ol { - overflow: hidden; - padding-left: 14px; -} -.block.stats li { - margin-left: 14px; - clear: both; -} -.block.hall-of-fame li { - margin-left: 7px; -} -aside .emailtest li a, -aside .websitetest li a, -aside .connectiontest li a, -aside .further-testing li a, -aside .further-testing li p, -.block.hall-of-fame li { - list-style: none; - clear: both; - -ms-word-break: break-all; - word-break: break-all; - /* Non standard for webkit */ - word-break: break-word; - --webkit-hyphens: auto; - -moz-hyphens: auto; - hyphens: auto; -} -.block.hall-of-fame li { - list-style: url('/static/li-check-green.png'); - list-style: url('/static/li-check-green.svg'); -} - -.block h3 a { - color: #000000; -} - -/* ============================= */ -/* styling for forms on homepage */ -.home .block .wrapper { - display: table; - height: 100%; - width: 100%; -} -.home .block .wrapper form { - display: table-cell; - vertical-align: bottom; - padding-top: 1em; -} -.home .block .wrapper .title-and-explanation { - overflow: hidden; - width: 100%; - display: table-row; -} -.title-and-explanation p { - margin-bottom: 0; -} - -.read-more { - overflow: hidden; - display: block; - text-transform: lowercase; - text-align: right; - padding: 2px; /* this is needed for the focus outline */ -} -.read-more a { - color: black; - /*text-decoration: none;*/ - text-decoration: underline; - padding-right: 1.5em; - background: url('/static/icon-arrow-right.png') center right no-repeat; - background-image: url('/static/icon-arrow-right.svg'), none; -} -.dark .read-more a { - color: #ffffff; - background: url('/static/icon-arrow-right-white.png') center right no-repeat; - background-image: url('/static/icon-arrow-right-white.svg'), none; -} -.read-more a:hover, -.read-more a:focus, -.read-more a:active { - text-decoration: underline; -} - -.invalid-domain { - color: #d00; -} - - -.error .message { - padding: .5em; - display: block; - border: 3px solid #d00; - border-color: #d00; - font-size: 90%; - min-height: 28px; -} - -/* news overview */ -.news li a { - display:inline-block; - color: #000000; - text-decoration: none; - vertical-align: top; - padding-top:.5em; - padding-bottom:.5em; - margin-bottom:0; - display: block; - overflow: hidden; - } - .news li a:hover, - .news li a:active, - .news li a:focus { - background-color: #f6f6f6; - } - .news li a:hover .dateshield, - .news li a:active .dateshield, - .news li a:focus .dateshield { - border-color: #111111; - background: white; - } - -/* designer date in a nice way */ -.dateshield { - display:inline-block; - float: left; - width: 2.4em; - border: 1px solid #dfdfdf; - text-align: center; - margin-right:.5em; - } - .dateshield span { - font-family: Helvetica, sans-serif; - font-size: 1.6em; - color: #111111; - display: block; - line-height: 1.2; - } - .dateshield abbr { - font-size: .5em; - color: #111; - text-transform: uppercase; - display: block; - padding: .1em 0 0 0; - text-decoration:none; - line-height: 1; - } - .dateshield abbr+span { - font-family: Helvetica, sans-serif; - font-size: .45em; - padding-top: .1em; - padding-bottom: .2em; - } - -/* news overview */ -.overview a { - text-decoration: none; - color: #000000; - display: block; - padding-right: 1.5em; - background: url('/static/icon-arrow-right.png') top right no-repeat; - background-image: url('/static/icon-arrow-right.svg'), none; - } - .overview a:hover, - .overview a:active, - .overview a:focus { - text-decoration: underline; - background: url('/static/icon-arrow-right.png') top right no-repeat; - background-image: url('/static/icon-arrow-right.svg'), none; - } - .overview a:focus { - outline:2px solid #14C9DF; - } - .overview div div a, - .overview div div a:hover, - .overview div div a:active, - .overview div div a:focus { - /* fallback for errors */ - display: inline; - background: none; - padding-right: inherit; - text-decoration: underline; - } - -.newsitem article img { - width:100%; -} -.newsitem article img.blogphoto { - width:auto; - float: left; - width: 8.125em; - max-width: 40%; - margin-right:.5em; -} -.newsitem article .intro { - font-size: 110%; - line-height: 1.4em; - margin-bottom: 1em; -} -.newsitem article .nicedate { - margin-bottom: .5em; -} - -/* Hall Of Fame, show some room on the left side of the image */ -.block.hall-of-fame { - background: white url('/static/badge-simple-flat.png') center right no-repeat; - background-image: url('/static/badge-simple-flat.svg'), none; - background-size: 62px 80px; - background-position: 95% .5em; -} -.block.hall-of-fame h2, -.block.hall-of-fame p { - margin-right: 70px; -} -.block.hall-of-fame p.read-more { - margin-right: 0; -} -.hall-of-fame main ol, -.hall-of-fame main ul { - margin-bottom: 1em; - list-style: none; -} - -.hidethis { - display:none !important; /* bad but we need to make sure that something will be hidden */ -} - -.testresults { - margin-bottom: 1em; - background: #eaeaea; - color: #000; - padding: 0 1em 1em 1em; -} -.testresults + .testresults { - border-top-width: 0; -} -.testresults h2 { - margin-top: 1em; - font-size: 18px; -} -.testresults h3 { - font-size: 16px; - font-family: 'robotoregular', arial, sans-serif; -} -.testresults .test-subsection { - font-family: 'robotobold', arial, sans-serif; - margin-bottom: .5em; - font-weight: bold; -} -/* ========= */ -/* accordion */ -div[aria-hidden=true] { - display:none; -} - -/* ========================== */ -/* styling for test busy page */ -.test-in-progress #content ul { - display: block; - width: 100%; -} -.test-in-progress #content li { - display: block; - overflow: hidden; - clear: both; - margin-bottom: 1em; -} - -.probing { - display: block; - overflow: hidden; - line-height: 1.5em; -} -.probing img { - /*height: 1.5em; - width: 1.5em;*/ - float: left; - margin-right: .5em; - border-radius: 50%; -} -li.probing { - margin-bottom: 1.5em; -} - -/* styling for test results page */ -.testresult { - padding-left: 1em; - margin-bottom: 1em; - border-top: 1px solid #b3b3b3; - border-bottom: 1px solid #b3b3b3; - background-color: #fff; -} -.testresult:last-of-type { - margin-bottom: 0; -} - -.faq-subtest, -.faq-test { - padding-left: 1em; - margin-top: .7em; - margin-bottom: .7em; - background-color: #fff; -} - -table { - max-width: 100%; -} -table th { - font-family: 'robotobold', arial, sans-serif; - font-weight: bold; - padding-top: 0.5em; - border-bottom: 1px solid #dadada; -} -table td, -table th { - padding-right: 1em; - text-align: left; - word-break: break-word; - font-size: 90%; -} -table td { - padding-top: .4em; -} - -/* ===================================================================================== */ -/* styling for test results */ -.test-header hr { - width:100%; - margin-bottom:2em; - margin-top:0; - background: #ffffff; - border-top: #e3e3e3 dashed 1px; -} -.test-header .description { - font-family: 'robotoregular', arial, sans-serif; - font-weight: normal; - font-size: medium; - margin-bottom: 0.5em; -} - -.panel-title-old { - border-bottom: none; - display: block; - padding: .5em 2em .5em 0; - position: relative; - text-decoration: none; - width: 100%; - margin-bottom: 0; -} -.panel-title a { - border-bottom: none; - display: block; - padding: .5em 2em .5em 0; - position: relative; - text-decoration: none; - transition: color 200ms ease 0s; - width: 100%; - margin-bottom: 0; -} -.panel-title a .pre-icon, -.panel-title a .icon { - position: absolute; - top: .5em; - right: .5em; -} -.panel-title a:hover, -.panel-title a:focus { - color: #000; -} -.panel-title a:hover .icon, -.panel-title a:focus .icon { - color: #000; -} -.panel-title a.active { - color: #000; -} -.testresult .pre-icon { - display: block; - width: auto; -} -.panel-content { - padding-right: 1em; -} -.js .accordion { - border-bottom: 1px solid #ececec; - margin: 2em 0; -} -.accordion .panel-title a { - border-top: 1px solid #ececec; -} -[id^="panel-"] { - margin-top: .5em; - margin-bottom: .5em; -} -.result.wide .block { - width: auto; -} - -.tech-details-table { - font-family: monospace; - padding-left: 0.5rem; - margin-bottom: 1rem; - overflow-x: auto; -} -.tech-details-table table tbody td:first-child { - word-break: break-all; -} - -.test-direct { - margin-top: 1em; - padding-top: 1em; - border-top: 1px solid #e3e3e3; -} -.test-direct a, .further-testing a { - margin-top: 0.5em; - color: #000000; - font-family: 'robotoregular', arial, sans-serif; - font-weight: normal; -} -.further-testing p { - margin-bottom: 0; -} -.further-testing ul ul { - list-style: disc; - padding-left: 1.5em; - margin-top: 0; - margin-bottom: 1em; -} - -/* ================================= */ -/* button for toggle of test results */ -.panel-button-container { - text-align: right; - /*padding-bottom: .5em;*/ - overflow: hidden; -} -.panel-button-container button { - border: 1px solid white; - border-radius: 1px; - margin: 2px; - padding: 0; - font-family: 'robotoregular', arial, sans-serif; - font-weight: normal; - text-decoration: underline; - float: right; -} -.panel-button-container button:hover { - background: none; -} -.panel-button-container button:focus { - outline: 2px solid #14C9DF; - background: none; -} - -/* ================================= */ -/* styling for test result indicator */ -#testresults-overview a { - color: #000; -} -#testresults-overview .timestamp { - font-size: 80%; - margin-top: 1em; - line-height: 1.5em; -} -#testresults-overview .timestamp table td { - padding-top: 0; - padding-right: 2px; - font-size: 100%; - vertical-align: top; -} -#testresults-overview .timestamp table td img { - height: 18px; -} - -.testresults-percentage { - margin-top: 1em; - margin-bottom: 1em; -} - -.testresults-percentage .perfect-score { - margin-bottom: .2em; -} - -.score-container { - overflow: hidden; - border: 1px solid #b3b3b3; - height: 2.5em; /* 40px */ -} -.score-container .score { - background: #ffab4c; - color: black; - width: 2.5em; /* 40px */ - text-align: center; - line-height: 2.4; - border-right: 1px solid #666; - font-family: 'robotobold', arial, sans-serif; - font-weight: bold; - border-left: 1px solid #b3b3b3; -} -.score-container .score, -.score-container .meter { - display: block; - float: left; - clear: none; - overflow: hidden; - height: 100%; - padding: 0; - margin: 0; -} - -.meter { - width: 90%; - width: calc(100% - 2.5em); - position: relative; - background-color: #fff; - padding: 0; - box-shadow: inset 0 -1px 1px rgba(255,255,255,0.3); - position: relative; -} -.meter > span { - display: block; - height: 62%; - overflow: hidden; - position: absolute; - left: 0; - top: 19%; - margin: 0 1px 0 0; - padding: 0 0 10px 0; - border-radius: 0 5px 5px 0; - background-color: #05BFD6; - background-color: rgba(5, 191, 214, .95); - background-image: linear-gradient( - center bottom, - rgb(43,194,83) 37%, - rgb(84,240,84) 69% - ); -} -#testresults-overview ul, -#testresults-overview ul li { - list-style: none; - margin-left: 0; - padding-left: 0; -} -#dated-results-warning { - text-align: right; - padding: 0; - margin: 0; -} - -.retest-text { - color: #6D6D6D; -} - -/* ================ */ -/* styling 404 page */ -.error404 h1 { - text-align: center; -} - -.block-404 { - position: relative; -} -.block-404 .inner { - background: black; - position: relative; - padding: 3em 3em 7em 3em; - margin-bottom: 2em; -} -.block-404 a[rel="license"] { - position: absolute; - bottom: 0em; - right: 1em; - font-size: x-small; - text-decoration: none; -} -.block-404 img { - max-width: 100%; - height: auto; -} - -/* ============================= */ -/* styling for semi-fixed header */ -.body-with-semifixed-header { - background-color: #e3e3e3; -} -.body-with-semifixed-header main { - /* minimum height for header on small screens */ - display: block; - padding-top: 66px; -} -.header-js-animated { - /* header received extra class name via JS: .header-js-animated */ - position: fixed; - z-index: 10; - right: 0; - left: 0; - top: 0; - will-change: transform; - transition: transform 200ms linear; -} -.header-js-animated.header-pinned { - /* active until scrolling reaches offset */ - transform: translateY(0%); -} -.header-js-animated.header-unpinned { - /* scrolling reaches offset: 205 */ - transform: translateY(-100%); -} - -/* ====== */ -/* footer */ -footer hr { - background: white; - clear: both; -} -footer ul li { - line-height: 1.5; -} -footer ul li a { - color: #ffffff; - text-decoration: none; -} -footer ul li a:hover, -footer ul li a:active, -footer ul li a:focus { - text-decoration: underline; -} -footer ul li:first-child { - padding-left: 0; -} -footer ul li:last-child { - padding-right: 0; -} - -/* ============ */ -/* social media */ -.mastodonfollow { - background: url('/static/uxwing/icon-mastodonfollow-small.png'); - background-color: transparent; - background-repeat: no-repeat; - background-position: 5px center; - background-size: 1.25em 1.25em; - padding-left: 2em; -} - -.twitterfollow { - background: url('/static/icon-twitterfollow.svg'); - background: url('/static/icon-twitterfollow.png'); - background-color: transparent; - background-repeat: no-repeat; - background-position: 5px center; - background-size: 1.25em 1.25em; - padding-left: 2em; -} - -.linkedinfollow { - background: url('/static/icon-linkedinfollow.svg'); - background: url('/static/icon-linkedinfollow.png'); - background-color: transparent; - background-repeat: no-repeat; - background-position: 5px center; - background-size: 1.25em 1.25em; - padding-left: 2em; -} - -footer ul li.follow-us { - padding-right: 0.5em; -} - - - -/* ====================================================== */ -@media (max-width:540px) { - .websitetest h1 { - word-wrap: break-word; - font-size: 1.25em; - } - .websitetest .testresults-percentage { - word-wrap: break-word; - } - .mainwrap { - padding-top: 0; - } - .mainwrap .wrap { - padding-top: 0; - } - .body-with-semifixed-header main { - padding-top: 55px; - } - - .score-container .score { - font-size: 70%; - line-height: 40px; - min-width: 15%; - } - .score-container .meter { - max-width: 85%; - } -} - -/* ====================================================== */ -@media (min-width:400px) { - - main .wrap { - /** - * Commented out on purpose. Only usable on introwrap and it broke result - * page when unfolding details. Moved to introwrap instead. - */ - /*overflow: hidden;*/ - clear: both; - display: -ms-flexbox; - display: flex; - flex-flow: row wrap; - justify-content: space-between; - } - .home main .wrap { - align-items: stretch; - flex-flow: column wrap; - } - - aside { - width:100%; - margin-top: .25em; - margin-bottom: .25em; - } -} - -/* ====================================================== */ - -@media (min-width:540px) { - -/* - issue 170: styling hall of fame, only add columns to the test result list. - that is, only columns if the viewport > 540px -*/ - .list-column { - -webkit-column-count: 2; - -moz-column-count: 2; - column-count: 2; - list-style-position: inside; - } - .list-column li { - text-overflow: ellipsis; /* makes for better abbreviations in the list items */ - } - - /* reset colums for lists in lists */ - .list-column ol, - .list-column ul { - -webkit-column-count: 1; - -moz-column-count: 1; - column-count: 1; - } -} - -@media (min-width:800px) { - - .list-column.column-3 { - -webkit-column-count: 3; - -moz-column-count: 3; - column-count: 3; - } -} - -/* ====================================================== */ - -@media (min-width: 740px) { - - .body-with-semifixed-header main { - /* 89px is the minimum height for headers on screens > 740px */ - overflow: hidden; - padding-top: 5.563em; /* 89px */ - } - - .home main .wrap { - flex-flow: row wrap; - } - - main .wrap .block, - main .wrap .result { - /* width: calc(50% - 1em); */ /* it breaks the result page */ - width: auto; - margin: .5em; - } - .home main .wrap .block { - flex: 1 0 calc(50% - 1em); - } - main .wrap .block.wide, - main .wrap .result.wide { - flex: 1 0 65%; /* added flex-shrink and flex-basis to this shorthand, issue #401 */ - } - - main .wrap .block.wide + aside, - main .wrap .result.wide + aside { - /* specifically target the asides AFTER the results and main content, issue #401 */ - flex: 1 0 32%; - margin-right: 0; - } - - main .wrap .block.wide + aside .block, - main .wrap .result.wide + aside .block { - /* do not limit width to 300px, but make these blocks align right */ - width: auto; - } - - main .wrap .block.fullwidth { - min-width: 99%; - } - main .wrap .block.fullwidth.center { - background: none; - box-shadow: none; - } - - main .wrap .block.fullwidth .wrap { - margin: 0 auto; - max-width: 45em; - background: white; - box-shadow: 0px 1px 4px #888888; - padding: 1em 2em 4em 2em; - } - - .block li, - .block p { - line-height: 1.5; - } - - header nav { - float: right; - clear: right; - } - - footer ul li { - display: inline-block; - padding: .5em .5em 1em .5em; - } - - .follow-us { - float: right; - } - - .introwrap p span:after, - .introwrap p span:before { - content: ''; - position: absolute; - height: 0; - width: 0; - border-style: solid; - border-width: 0; - border-width: 81px 20px 0 0; - } - - .introwrap p span:before { - left: -20px; - bottom: 0; - border-color: transparent #008297; - } - - .introwrap p span:after { - right: -20px; - top: 0; - border-color: #008297 transparent; - } - - .home .block.news, - .home .block.hall-of-fame { /* v5 issue #248 */ - position: relative; - padding-bottom: 32px; - } - .home .block.news .read-more, - .home .block.hall-of-fame .read-more{ /* v5 issue #248 */ - position: absolute; - bottom: 0; - right: 0; - margin-right: .75em; - margin-bottom: .75em; - } -} - -/* ====================================================== */ -@media (min-width:800px) { - - aside, - main .wrap .block, - main .wrap .result { - width: 300px; - margin-top: 0; - margin-bottom: 0; - } - main .wrap .block { - margin-bottom: .75em; - padding: .75em; - } - main .wrap .result { - margin-bottom: .75em; - } - main .wrap .block.wide, - main .wrap .result.wide { - width: auto; - } - - aside { - margin-right: 1em; - } - .home main .wrap .block { - width: calc(33% - 1em); - flex: 1 0 calc(33% - 1em); - margin-top: .75em; - } - - header .wrap { - padding-bottom:0; - } - header nav { - margin-top:10px; - } - - table th, - table td { - font-size: 100%; - } - - .site-titel a { - padding-bottom: .25em; - } - - footer .wrap .version { - float: right; - } -} - - -/* ====================================================== */ -@media (min-width:1050px) { - header .wrap, - footer .wrap { - margin-left:auto; - margin-right:auto; - } - header .wrap { - padding-left: .5em; - } - header .wrap, - footer .wrap { - width:1036px; - } - - #language-switch-header-container { - padding: 0 .5em 0 0; - } - - nav ul li { - padding: .5em .2em .2em .2em; - margin-left: .3em; - font-size: 1em; - } - - main .wrap { - width: 64.750em; /* 1036px */ - max-width: 100%; - margin-left:auto; - margin-right:auto; - } - - aside { - width: 32%; - } - main .wrap .block, - main .wrap .result { - margin: 0 .5% .5% .5%; - } - - main .wrap .block { - margin-bottom: .75em; - padding: .75em; - } - main .wrap .result { - margin-bottom: .75em; - } - .home main .wrap .block { - margin-top: .75em; - } - main .wrap .block.wide, - main .wrap .result.wide { - width: auto; - max-width: 66%; - } - .introwrap .wrap { - width: 62.500em; /* 1000px */ - - margin-left:auto; - margin-right:auto; - padding-top: .5em; - padding-bottom: .5em; - } -} - -/* ====================================================== */ - -@media (min-width:800px) { - - .hall-of-fame .intro { - margin-bottom: 1rem; - } - .flexblocks { - display: flex; - } - .flexblocks img { - margin: .5rem .5rem .1rem .5rem; - clear: both; - max-width: intrinsic; - float: right; - } - .flexblocks .flexblock { - flex: 1; - padding-right: 1rem; - } - .flexblocks .flexblock + .flexblock { - padding-right: 0; - padding-left: 1rem; - } -} - -.hall-of-fame .intro h2 { - margin-bottom: 0; -} -.hall-of-fame .intro nav li { - margin: 0 1rem 0 0; - padding: 0; -} -ul.menu { - overflow: hidden; - margin-left: -.35rem; -} -ul.menu li { - display:inline-block; - float: left; -} -ul.menu li + li:before { - content: ' '; - display: block; - float: left; - background: #000; - height: .75rem; - width: 1px; - margin: .75rem .5rem 0 .5rem; -} -ul.menu li a { - display: block; - float: left; - padding: .25rem .1rem; - margin: .1rem .25rem; - border-bottom: 3px solid white; -} -ul.menu a { - text-decoration: none; - color: #000000; -} -ul.menu a:hover, -ul.menu a:focus, -ul.menu a:active { - text-decoration: underline; -} -ul.menu a, -ul.menu a:visited { - color: #000; -} -ul.menu li a[aria-current="page"] { - font-weight: bold; - border-color: #ffab4c; -} - -/* ====================================================== */ diff --git a/frontend/js/accordion.js b/frontend/js/accordion.js deleted file mode 100644 index 5cba33259..000000000 --- a/frontend/js/accordion.js +++ /dev/null @@ -1,81 +0,0 @@ -/* internet.nl - accordion.js -*/ - -/* global console, $ */ - - // src: http://codepen.io/Webactually/pen/bgLFC/ - // Hiding the panel content. If JS is inactive, content will be displayed - // $( '.panel-content' ).hide(); - - // Preparing the DOM - - // -- Update the markup of accordion container - $( '.accordion' ).attr({ - role: 'tablist', - multiselectable: 'true' - }); - - // -- Adding ID, aria-labelled-by, role and aria-labelledby attributes to panel content - $( '.panel-content' ).attr( 'id', function( IDcount ) { - return 'panel-' + IDcount; - }); - $( '.panel-content' ).attr( 'aria-labelledby', function( IDcount ) { - return 'control-panel-' + IDcount; - }); - $( '.panel-content' ).attr( 'aria-hidden' , 'true' ); - // ---- Only for accordion, add role tabpanel - $( '.accordion .panel-content' ).attr( 'role' , 'tabpanel' ); - - // -- Wrapping panel title content with a - $( '.panel-title' ).each(function(i){ - - // ---- Need to identify the target, easy it's the immediate brother - $target = $(this).next( '.panel-content' )[0].id; - - $('a', this).attr('href', '#' + 'control-' + $target) - .attr('aria-controls', $target) - .attr('id', 'control-' + $target); - - var opentext = $('#panel-item-open').html(); - $('.pre-icon', this).text(opentext); - }); - - var cphashmatch = /^#control-panel-[0-9]+/.exec(window.location.hash); - if (cphashmatch && $(cphashmatch[0]).length) { - $(cphashmatch[0]).attr( 'aria-expanded' , true ).addClass( 'active' ).parent().next( '.panel-content' ).slideDown(200).attr( 'aria-hidden' , 'false'); - setPanelItemFoldText($('.pre-icon', cphashmatch[0]), 'close'); - refreshPanelButtonText($(cphashmatch[0]), 'open'); - } - - // Now we can play with it - $( '.panel-title a' ).click(function() { - - if ($(this).attr( 'aria-expanded' ) == 'false'){ //If aria expanded is false then it's not opened and we want it opened ! - - // -- Only for accordion effect (2 options) : comment or uncomment the one you want - - // ---- Option 1 : close only opened panel in the same accordion - // search through the current Accordion container for opened panel and close it, remove class and change aria expanded value - //$(this).parents( '.accordion' ).find( '[aria-expanded=true]' ).attr( 'aria-expanded' , false ).removeClass( 'active' ).parent().next( '.panel-content' ).slideUp(200).attr( 'aria-hidden' , 'true'); - - // Option 2 : close all opened panels in all accordion container - //var testResults = $(this).parent().parent().parent(); - //$('.panel-title > a', testResults).attr('aria-expanded', false).removeClass('active').parent().next('.panel-content').slideUp(200); - - // Finally we open the panel, set class active for styling purpos on a and aria-expanded to "true" - $(this).attr( 'aria-expanded' , true ).addClass( 'active' ).parent().next( '.panel-content' ).slideDown(200).attr( 'aria-hidden' , 'false'); - setPanelItemFoldText($('.pre-icon', this), 'close'); - refreshPanelButtonText($(this), 'open'); - var stateObj = { foo: "bar" }; - window.history.pushState(stateObj,null,"#"+$(this).attr('id')); - } else { // The current panel is opened and we want to close it - $(this).attr( 'aria-expanded' , false ).removeClass( 'active' ).parent().next( '.panel-content' ).slideUp(200).attr( 'aria-hidden' , 'true'); - var stateObj = { foo: "bar" }; - history.pushState(stateObj, null, '#') - setPanelItemFoldText($('.pre-icon', this), 'open'); - refreshPanelButtonText($(this), 'close'); - } - // No Boing Boing - return false; - }); diff --git a/frontend/js/functions.js b/frontend/js/functions.js deleted file mode 100644 index 7a530bf85..000000000 --- a/frontend/js/functions.js +++ /dev/null @@ -1,51 +0,0 @@ -/* internet.nl - functions.js -*/ - -/* - * Hide text elements that are only shown when JavaScript is not working - */ -function HideJSLess() { - var jsless = $(".jsless"); - if (jsless.length) { - jsless.each(function() { - $(this).addClass("hidethis").attr("aria-hidden", true); - }); - } -} - - -$(document).ready(function(){ - - /** - * headroom.js used under The MIT License (MIT) - * https://wicky.nillia.ms/headroom.js/ - */ - if(Headroom.cutsTheMustard && document.addEventListener){ - /* for IE 9 or greater */ - /* select the header element */ - var theHeader = document.querySelector("header"); - - /* extra styling for body if we want to make the header fixed */ - var fixedHeaderbody = document.querySelector("body"); - fixedHeaderbody.classList.add("body-with-semifixed-header"); - - /* construct an instance of Headroom, passing the element */ - var fixedHeader = new Headroom(theHeader, { - "offset": 205, - "tolerance": 5, - "classes": { - "initial": "header-js-animated", - "pinned": "header-pinned", - "unpinned": "header-unpinned" - } - }); - /* initialise */ - fixedHeader.init(); - } - - $("#form-connection-test").submit(function(e){ - e.preventDefault(); - window.location = "/connection/"; - }); -}); diff --git a/frontend/js/headroom.js b/frontend/js/headroom.js deleted file mode 100644 index b62648b61..000000000 --- a/frontend/js/headroom.js +++ /dev/null @@ -1,437 +0,0 @@ -/*! - * headroom.js v0.12.0 - Give your page some headroom. Hide your header until you need it - * Copyright (c) 2020 Nick Williams - http://wicky.nillia.ms/headroom.js - * License: MIT - */ - -(function (global, factory) { - typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() : - typeof define === 'function' && define.amd ? define(factory) : - (global = global || self, global.Headroom = factory()); -}(this, function () { 'use strict'; - - function isBrowser() { - return typeof window !== "undefined"; - } - - /** - * Used to detect browser support for adding an event listener with options - * Credit: https://developer.mozilla.org/en-US/docs/Web/API/EventTarget/addEventListener - */ - function passiveEventsSupported() { - var supported = false; - - try { - var options = { - // eslint-disable-next-line getter-return - get passive() { - supported = true; - } - }; - window.addEventListener("test", options, options); - window.removeEventListener("test", options, options); - } catch (err) { - supported = false; - } - - return supported; - } - - function isSupported() { - return !!( - isBrowser() && - function() {}.bind && - "classList" in document.documentElement && - Object.assign && - Object.keys && - requestAnimationFrame - ); - } - - function isDocument(obj) { - return obj.nodeType === 9; // Node.DOCUMENT_NODE === 9 - } - - function isWindow(obj) { - // `obj === window` or `obj instanceof Window` is not sufficient, - // as the obj may be the window of an iframe. - return obj && obj.document && isDocument(obj.document); - } - - function windowScroller(win) { - var doc = win.document; - var body = doc.body; - var html = doc.documentElement; - - return { - /** - * @see http://james.padolsey.com/javascript/get-document-height-cross-browser/ - * @return {Number} the scroll height of the document in pixels - */ - scrollHeight: function() { - return Math.max( - body.scrollHeight, - html.scrollHeight, - body.offsetHeight, - html.offsetHeight, - body.clientHeight, - html.clientHeight - ); - }, - - /** - * @see http://andylangton.co.uk/blog/development/get-viewport-size-width-and-height-javascript - * @return {Number} the height of the viewport in pixels - */ - height: function() { - return win.innerHeight || html.clientHeight || body.clientHeight; - }, - - /** - * Gets the Y scroll position - * @return {Number} pixels the page has scrolled along the Y-axis - */ - scrollY: function() { - if (win.pageYOffset !== undefined) { - return win.pageYOffset; - } - - return (html || body.parentNode || body).scrollTop; - } - }; - } - - function elementScroller(element) { - return { - /** - * @return {Number} the scroll height of the element in pixels - */ - scrollHeight: function() { - return Math.max( - element.scrollHeight, - element.offsetHeight, - element.clientHeight - ); - }, - - /** - * @return {Number} the height of the element in pixels - */ - height: function() { - return Math.max(element.offsetHeight, element.clientHeight); - }, - - /** - * Gets the Y scroll position - * @return {Number} pixels the element has scrolled along the Y-axis - */ - scrollY: function() { - return element.scrollTop; - } - }; - } - - function createScroller(element) { - return isWindow(element) ? windowScroller(element) : elementScroller(element); - } - - /** - * @param element EventTarget - */ - function trackScroll(element, options, callback) { - var isPassiveSupported = passiveEventsSupported(); - var rafId; - var scrolled = false; - var scroller = createScroller(element); - var lastScrollY = scroller.scrollY(); - var details = {}; - - function update() { - var scrollY = Math.round(scroller.scrollY()); - var height = scroller.height(); - var scrollHeight = scroller.scrollHeight(); - - // reuse object for less memory churn - details.scrollY = scrollY; - details.lastScrollY = lastScrollY; - details.direction = scrollY > lastScrollY ? "down" : "up"; - details.distance = Math.abs(scrollY - lastScrollY); - details.isOutOfBounds = scrollY < 0 || scrollY + height > scrollHeight; - details.top = scrollY <= options.offset[details.direction]; - details.bottom = scrollY + height >= scrollHeight; - details.toleranceExceeded = - details.distance > options.tolerance[details.direction]; - - callback(details); - - lastScrollY = scrollY; - scrolled = false; - } - - function handleScroll() { - if (!scrolled) { - scrolled = true; - rafId = requestAnimationFrame(update); - } - } - - var eventOptions = isPassiveSupported - ? { passive: true, capture: false } - : false; - - element.addEventListener("scroll", handleScroll, eventOptions); - update(); - - return { - destroy: function() { - cancelAnimationFrame(rafId); - element.removeEventListener("scroll", handleScroll, eventOptions); - } - }; - } - - function normalizeUpDown(t) { - return t === Object(t) ? t : { down: t, up: t }; - } - - /** - * UI enhancement for fixed headers. - * Hides header when scrolling down - * Shows header when scrolling up - * @constructor - * @param {DOMElement} elem the header element - * @param {Object} options options for the widget - */ - function Headroom(elem, options) { - options = options || {}; - Object.assign(this, Headroom.options, options); - this.classes = Object.assign({}, Headroom.options.classes, options.classes); - - this.elem = elem; - this.tolerance = normalizeUpDown(this.tolerance); - this.offset = normalizeUpDown(this.offset); - this.initialised = false; - this.frozen = false; - } - Headroom.prototype = { - constructor: Headroom, - - /** - * Start listening to scrolling - * @public - */ - init: function() { - if (Headroom.cutsTheMustard && !this.initialised) { - this.addClass("initial"); - this.initialised = true; - - // defer event registration to handle browser - // potentially restoring previous scroll position - setTimeout( - function(self) { - self.scrollTracker = trackScroll( - self.scroller, - { offset: self.offset, tolerance: self.tolerance }, - self.update.bind(self) - ); - }, - 100, - this - ); - } - - return this; - }, - - /** - * Destroy the widget, clearing up after itself - * @public - */ - destroy: function() { - this.initialised = false; - Object.keys(this.classes).forEach(this.removeClass, this); - this.scrollTracker.destroy(); - }, - - /** - * Unpin the element - * @public - */ - unpin: function() { - if (this.hasClass("pinned") || !this.hasClass("unpinned")) { - this.addClass("unpinned"); - this.removeClass("pinned"); - - if (this.onUnpin) { - this.onUnpin.call(this); - } - } - }, - - /** - * Pin the element - * @public - */ - pin: function() { - if (this.hasClass("unpinned")) { - this.addClass("pinned"); - this.removeClass("unpinned"); - - if (this.onPin) { - this.onPin.call(this); - } - } - }, - - /** - * Freezes the current state of the widget - * @public - */ - freeze: function() { - this.frozen = true; - this.addClass("frozen"); - }, - - /** - * Re-enables the default behaviour of the widget - * @public - */ - unfreeze: function() { - this.frozen = false; - this.removeClass("frozen"); - }, - - top: function() { - if (!this.hasClass("top")) { - this.addClass("top"); - this.removeClass("notTop"); - - if (this.onTop) { - this.onTop.call(this); - } - } - }, - - notTop: function() { - if (!this.hasClass("notTop")) { - this.addClass("notTop"); - this.removeClass("top"); - - if (this.onNotTop) { - this.onNotTop.call(this); - } - } - }, - - bottom: function() { - if (!this.hasClass("bottom")) { - this.addClass("bottom"); - this.removeClass("notBottom"); - - if (this.onBottom) { - this.onBottom.call(this); - } - } - }, - - notBottom: function() { - if (!this.hasClass("notBottom")) { - this.addClass("notBottom"); - this.removeClass("bottom"); - - if (this.onNotBottom) { - this.onNotBottom.call(this); - } - } - }, - - shouldUnpin: function(details) { - var scrollingDown = details.direction === "down"; - - return scrollingDown && !details.top && details.toleranceExceeded; - }, - - shouldPin: function(details) { - var scrollingUp = details.direction === "up"; - - return (scrollingUp && details.toleranceExceeded) || details.top; - }, - - addClass: function(className) { - this.elem.classList.add.apply( - this.elem.classList, - this.classes[className].split(" ") - ); - }, - - removeClass: function(className) { - this.elem.classList.remove.apply( - this.elem.classList, - this.classes[className].split(" ") - ); - }, - - hasClass: function(className) { - return this.classes[className].split(" ").every(function(cls) { - return this.classList.contains(cls); - }, this.elem); - }, - - update: function(details) { - if (details.isOutOfBounds) { - // Ignore bouncy scrolling in OSX - return; - } - - if (this.frozen === true) { - return; - } - - if (details.top) { - this.top(); - } else { - this.notTop(); - } - - if (details.bottom) { - this.bottom(); - } else { - this.notBottom(); - } - - if (this.shouldUnpin(details)) { - this.unpin(); - } else if (this.shouldPin(details)) { - this.pin(); - } - } - }; - - /** - * Default options - * @type {Object} - */ - Headroom.options = { - tolerance: { - up: 0, - down: 0 - }, - offset: 0, - scroller: isBrowser() ? window : null, - classes: { - frozen: "headroom--frozen", - pinned: "headroom--pinned", - unpinned: "headroom--unpinned", - top: "headroom--top", - notTop: "headroom--not-top", - bottom: "headroom--bottom", - notBottom: "headroom--not-bottom", - initial: "headroom" - } - }; - - Headroom.cutsTheMustard = isSupported(); - - return Headroom; - -})); diff --git a/frontend/js/imagecheck.js b/frontend/js/imagecheck.js deleted file mode 100644 index f1a2d7595..000000000 --- a/frontend/js/imagecheck.js +++ /dev/null @@ -1,75 +0,0 @@ -// scripts inspired by -// http://www.html5accessibility.com/tests/imagecheck.html - -function ImageCheck() { - /* `unique` is replaced when building the frontend */ - var unique = "@@unique@@"; - if (check_if_images_enabled()) { - // Is the image 1px big, If so, than the images are enabled and we can use the CSS with backgroundimage - var objHead = document.getElementsByTagName('head'); - var objCSS_noimages = objHead[0].appendChild(document.createElement('link')); - objCSS_noimages.id = 'noimages'; - objCSS_noimages.rel = 'stylesheet'; - /* Web browsers (at least firefox, chromium) *always* get the cached - * version for these javascript-loaded css files. - * #unique is added to always get the file from the server if a newer - * version exists. - */ - objCSS_noimages.href = '/static/css/alt-min.css'+'#'+unique; - objCSS_noimages.type = 'text/css'; - } - if (check_if_browser_in_high_contrast()) { - var objHead = document.getElementsByTagName('head'); - var objCSS_highcontrast = objHead[0].appendChild(document.createElement('link')); - objCSS_highcontrast.id = 'highcontrast'; - objCSS_highcontrast.rel = 'stylesheet'; - /* Web browsers (at least firefox, chromium) *always* get the cached - * version for these javascript-loaded css files. - * #unique is added to always get the file from the server if a newer - * version exists. - */ - objCSS_highcontrast.href = '/static/css/high-contrast-min.css'+'#'+unique; - objCSS_highcontrast.type = 'text/css'; - } -} - -function check_if_images_enabled() { - if (document.getElementById('flag').offsetWidth == 1) { - return true; - } else { - return false; - } -} - -function check_if_browser_in_high_contrast() { - var testelement, colorcheck; - //Create a test div - testelement = document.createElement("div"); - //Set its color style to something unusual - testelement.style.color = "rgb(31,41,59)"; - testelement.id = 'highcontrast_check'; - //Attach to body so we can inspect it - document.body.appendChild(testelement); - //Use standard means if available, otherwise use the IE methods - colorcheck = document.defaultView ? document.defaultView.getComputedStyle(testelement, null).color : testelement.currentStyle.color; - //Delete the test DIV - document.body.removeChild(testelement); - //get rid of extra spaces in result - colorcheck = colorcheck.replace(/ /g, ""); - - //Check if we got back what we set - //If not we are in high contrast mode - if (colorcheck !== "rgb(31,41,59)") { - return true; - } else { - return false; - } -} - -if (window.attachEvent) { - window.attachEvent('onload', ImageCheck); -} else if (window.addEventListener) { - window.addEventListener("load", ImageCheck, false); -} else { - window.onload = ImageCheck; -} diff --git a/frontend/js/internetnl.connection.js b/frontend/js/internetnl.connection.js deleted file mode 100644 index 0953a631b..000000000 --- a/frontend/js/internetnl.connection.js +++ /dev/null @@ -1,91 +0,0 @@ -function enableResults() { - window.location = $("#continue").attr('href'); -} - - -function showResults(category, results) { - if(results != undefined) { - var probeFinished = $("#probe-finished").text(); - $("#"+category+"-summary").attr('aria-busy', false).text(probeFinished); - if(results.icon != undefined) - $("#"+category+"-icon").attr("src", "/static/probe-animation-ready.gif"); - } -} - - -function test_cb(test_id){ - completed_conn_tests++ - if (completed_conn_tests >= 5){ - $.ajax({ - url: "/connection/finished/"+test_id, - dataType: "json", - success: function (json) { - showResults("ipv6", json.connipv6); - showResults("resolver", json.connresolver); - enableResults(); - }, - }); - } -} - - -function fetchTest(url, test_id){ - $.ajax({ - dataType: 'jsonp', - url: "http://"+url, - timeout: 6000, - success: function (resp) { - test_cb(test_id); - }, - error: function(js, stat, err) { - test_cb(test_id); - } - }); -} - - -function startConnectionTest(test_id){ - var connTestDomain = $("#conn-test-domain").text(); - var ipv6TestAddr = $("#ipv6-test-addr").text(); - fetchTest(test_id+".bogus.conn.test-ns-signed."+connTestDomain, test_id); - fetchTest(test_id+".aaaa.conn.test-ns-signed."+connTestDomain, test_id); - fetchTest(test_id+".a.conn.test-ns-signed."+connTestDomain, test_id); - fetchTest(test_id+".a-aaaa.conn.test-ns6-signed."+connTestDomain, test_id); - fetchTest("["+ipv6TestAddr+"]/connection/addr-test/"+test_id+"/", test_id); -} - - -function kickStartConnectionTest(){ - $.ajaxSetup({cache: false}); - /* Init global variable */ - completed_conn_tests = 0; - - /* Show text about auto redirection when we have the results */ - $(".probing-text").removeClass('hidethis').attr('aria-hidden', false); - - $(document).ready(function(){ - $.ajax({ - url: "/connection/gettestid/", - dataType: 'json', - success: function(resp){ - var test_id = resp.test_id; - startConnectionTest(test_id); - $(".connforward").attr("href", "/connection/"+test_id+"/results"); - }, - error: function(err) { - /* show error when we can't get a test_id */ - } - }); - }); -} - - -if (window.attachEvent) { - window.attachEvent('onload', HideJSLess); - window.attachEvent('onload', kickStartConnectionTest); -} else if (window.addEventListener) { - window.addEventListener("load", HideJSLess, false); - window.addEventListener("load", kickStartConnectionTest, false); -} else { - window.onload = "ImageCheck();HideJSLess();kickStartConnectionTest();"; -} diff --git a/frontend/js/internetnl.probe.js b/frontend/js/internetnl.probe.js deleted file mode 100644 index 38c5fb7e4..000000000 --- a/frontend/js/internetnl.probe.js +++ /dev/null @@ -1,147 +0,0 @@ -/** - * Redirect to the results page. - */ -function enableResults() { - var toResults = $("#continue"); - /* check if we should redirect */ - if (toResults.length) { - window.location = "results"; - } -} - - -/** - * Update the probe with the finished status. - * If the probe is already done continue. - * If this is the last running probe redirect to the results page. - */ -function showResults(category, results) { - if ($("#"+category+"-summary").attr('aria-busy') == "false") { - return; - } - if(--probesRunning <= 0) { - enableResults(); - } - if(results != undefined) { - var probeFinished = $("#probe-finished").text(); - $("#"+category+"-summary").attr('aria-busy', false).text(probeFinished); - $("#"+category+"-icon").attr("src", "/static/probe-animation-ready.gif"); - } -} - - -/** - * Parse the statuses of the probes. - * If at least on probe is not finished signal a retry. - */ -function parseStatuses(json) { - var retry = false; - for (var i=0; i div").each(function() { - var name = $(".probe-name", this).text(); - var is_busy = $("#"+name+"-summary").attr('aria-busy'); - if (is_busy == "true") { - showError(name); - } - }); -} - - -/** - * Poll to get the status of the probes. - * If the probes are not done and there is still time wait, and poll again. - * On error show the error status of the still running probes. - */ -function pollProbes(testurl, retryCount) { - if (typeof(retryCount) === 'undefined') { - retryCount=parseInt(javascriptRetries); - } - if (retryCount < 0) { - showErrors(); - } else { - $.ajax({ - url: testurl, - dataType: "json", - success: function(json) { - var retry = parseStatuses(json); - if (retry == true) { - setTimeout(function() { - pollProbes(testurl, retryCount-1); }, - parseInt(javascriptTimeout) - ); - } - }, - error: function() { - showErrors(); - } - }); - } -}; - -/** - * Start the probes. - */ -function startProbes() { - $.ajaxSetup({cache: false}); - /* Init some global variables */ - javascriptRetries = $("#javascript-retries").text(); - javascriptTimeout = $("#javascript-timeout").text(); - probesRunning = 0; - - /* Show text about auto redirection when we have the results */ - $(".probing-text").removeClass('hidethis').attr('aria-hidden', false); - - /* Start the probes */ - $("#probes > div").each(function() { - ++probesRunning; - }); - probesUrl = $("#probes-url").text(); - pollProbes(probesUrl); -} - - -if (window.attachEvent) { - window.attachEvent('onload', HideJSLess); - window.attachEvent('onload', startProbes); -} else if (window.addEventListener) { - window.addEventListener("load", HideJSLess, false); - window.addEventListener("load", startProbes, false); -} else { - window.onload = "ImageCheck();HideJSLess();startProbes();"; -} diff --git a/frontend/js/internetnl.results.js b/frontend/js/internetnl.results.js deleted file mode 100644 index 3050f188a..000000000 --- a/frontend/js/internetnl.results.js +++ /dev/null @@ -1,184 +0,0 @@ -function make_progressbar() { - /* check if there is any element with a class testresults-percentage */ - var percentage = $(".testresults-percentage"); - if (percentage.length) { - percentage.each(function() { - - /* retrieve the percentage */ - var theLength = $(this).data("resultscore"); - - /* to do: slimme methode om te ondervangen dat wel / niet geanimeerd mag worden */ - var canAnimate = true; - - /* set the animation speed */ - var theSpeed = 1000; - - var theSpan = $(this).find('.meter span'); - var theScore = $(this).find('.score-container .score'); - - /* animate the indicator */ - if (canAnimate) { - theSpan.width(0) - .animate({ - width: theLength + "%" - }, - { - duration: theSpeed, - step: function (now, fx) { - $("#testresults-overview p.score").text(parseInt(now) + "%"); - } - }); - } else { - /* no animation */ - theSpan.width(theLength + "%"); - theScore.text(theLength + "%"); - } - }); - } -} - - -/* Align the overview with the first aside block on the results page. */ -function alignResultsOverviewWithAsideBox() { - /* Try to make the doTheAlignment() run after the javascript-loaded css - files have taken effect. */ - setTimeout(doTheAlignment, 300); -} - - -function doTheAlignment() { - var maxdiff = 40; /* pixels */ - var overview = $("#testresults-overview") - var firstBlock = $("#first-aside-block") - var overviewHeight = overview.innerHeight(); - var firstBlockHeight = firstBlock.innerHeight(); - - var maxHeight = Math.max(overviewHeight, firstBlockHeight); - var diff = 0; - - if (overviewHeight < maxHeight) { - diff = maxHeight - overviewHeight; - if (diff < maxdiff) { - overview.css("min-height", overviewHeight + diff); - } - } else { - diff = maxHeight - firstBlockHeight; - if (diff < maxdiff) { - firstBlock.css("min-height", firstBlockHeight + diff); - } - } -} - - -function startCountDownRetestTime() { - var retestTime = $("#retest-time"); - if (retestTime) { - var seconds = retestTime.text(); - countDownRetestTime(seconds); - } -} - - -function countDownRetestTime(seconds) { - if (seconds < 1) { - $(".retest-text").addClass("hidethis").attr("aria-hidden", true); - $(".retest-link").removeClass("hidethis").attr("aria-hidden", false); - } else { - $(".retest-text").removeClass("hidethis").attr("aria-hidden", false); - $(".retest-link").addClass("hidethis").attr("aria-hidden", true); - $(".retest-text .retest-time").text(seconds); - setTimeout(function(){countDownRetestTime(seconds-1);}, 1000); - } -} - - -function enablePanelButtons() { - var buttons = $('.panel-button-container button'); - - /* Show buttons */ - buttons.each(function() { - var panelButtonShowText = $('#panel-button-show').text(); - $(this).text(panelButtonShowText); - $(this).removeClass('hidethis').attr('aria-hidden', false); - }); - - /* Add logic */ - buttons.click(function() { - var testHeader = $(this).parent().parent(); - if ($(this).hasClass('panel-button-show')) { - $('+.testresults .panel-title > a', testHeader).each(function() { - if ($(this).attr('aria-expanded') == 'false') { - $(this).parents('.accordion').find('[aria-expanded=true]').attr('aria-expanded', false).removeClass('active').parent().next('.panel-content').slideUp(200).attr('aria-hidden', 'true'); - $(this).attr('aria-expanded', true).addClass('active').parent().next('.panel-content').slideDown(200).attr('aria-hidden', 'false'); - } - setPanelItemFoldText($('.pre-icon', this), 'close'); - }); - $(this).addClass('panel-button-hide').removeClass('panel-button-show'); - var panelButtonHideText = $('#panel-button-hide').text(); - $(this).text(panelButtonHideText); - } else { - /* Hide all results */ - $('+.testresults .panel-title > a', testHeader).each(function() { - if ($(this).attr('aria-expanded') == 'true') { - $(this).attr('aria-expanded', false).removeClass('active').parent().next('.panel-content').slideUp(200).attr('aria-hidden', 'true'); - } - setPanelItemFoldText($('.pre-icon', this), 'open'); - }); - $(this).addClass('panel-button-show').removeClass('panel-button-hide'); - var panelButtonShowText = $('#panel-button-show').text(); - $(this).text(panelButtonShowText); - } - }); -} - - -/** - * Check if every panel content is open/close and change the button text. - */ -function refreshPanelButtonText(panel_a, action) { - var testResults = panel_a.parents('.testresults'); - var testHeader = testResults.prev(); - var button = $('.panel-button-container button', testHeader); - if (action === 'close' && - $('.panel-title a', testResults).length === - $('.panel-title', testResults).find('a[aria-expanded=false]').length) { - button.addClass('panel-button-show').removeClass('panel-button-hide'); - var panelButtonShowText = $('#panel-button-show').text(); - button.text(panelButtonShowText); - - } else if (action === 'open' && - $('.panel-title a', testResults).length === - $('.panel-title', testResults).find('a[aria-expanded=true]').length) { - button.addClass('panel-button-hide').removeClass('panel-button-show'); - var panelButtonHideText = $('#panel-button-hide').text(); - button.text(panelButtonHideText); - } -} - -/** - * Change the text used for opening/closing a fodable test item. - */ -function setPanelItemFoldText(panel_preicon, text) { - if (text === 'open') { - var openText = $('#panel-item-open').text(); - panel_preicon.text(openText); - } else if (text === 'close') { - var closeText = $('#panel-item-close').text(); - panel_preicon.text(closeText); - } -} - - -if (window.attachEvent) { - window.attachEvent('onload', make_progressbar); - window.attachEvent('onload', startCountDownRetestTime); - window.attachEvent('onload', enablePanelButtons); - window.attachEvent('onload', alignResultsOverviewWithAsideBox); -} else if (window.addEventListener) { - window.addEventListener("load", make_progressbar, false); - window.addEventListener("load", startCountDownRetestTime, false); - window.addEventListener("load", enablePanelButtons, false); - window.addEventListener("load", alignResultsOverviewWithAsideBox, false); -} else { - window.onload = "ImageCheck();make_progressbar(),startCountDownRetestTime();enablePanelButtons();alignResultsOverviewWithAsideBox();"; -} diff --git a/frontend/js/matomo.js b/frontend/js/matomo.js deleted file mode 100644 index a40e5e306..000000000 --- a/frontend/js/matomo.js +++ /dev/null @@ -1,41 +0,0 @@ -var _paq = _paq || []; - -function matomoGeneratedCode(disableCookies) { - /* tracker methods like "setCustomDimension" should be called before "trackPageView" */ - var d=$("#matomo-subdomain-tracking").text(); - if ("" != d) { - _paq.push(["setCookieDomain", d]); - } - if (disableCookies) { - _paq.push(['disableCookies']); - } - _paq.push(['trackPageView']); - _paq.push(['enableLinkTracking']); - (function() { - var u=$("#matomo-url").text(); - var siteid=$("#matomo-siteid").text(); - if ("" != u) { - _paq.push(['setTrackerUrl', u+'piwik.php']); - _paq.push(['setSiteId', siteid]); - var d=document, g=d.createElement('script'), s=d.getElementsByTagName('script')[0]; - g.type='text/javascript'; g.async=true; g.defer=true; g.src=u+'piwik.js'; s.parentNode.insertBefore(g,s); - } - })(); -} - -if ("" != $("#matomo-siteid").text()) { - /* Do Not Track detection based on https://dev.to/corbindavenport/how-to-correctly-check-for-do-not-track-with-javascript-135d */ - if (window.doNotTrack || navigator.doNotTrack || navigator.msDoNotTrack || 'msTrackingProtectionEnabled' in window.external) { - /* The browser supports Do Not Track!*/ - if (window.doNotTrack == "1" || navigator.doNotTrack == "yes" || navigator.doNotTrack == "1" || navigator.msDoNotTrack == "1" || ('msTrackingProtectionEnabled' in window.external && window.external.msTrackingProtectionEnabled())) { - /* Do Not Track is enabled! */ - matomoGeneratedCode(true); - } else { - /* Do Not Track is disabled! */ - matomoGeneratedCode(false); - } - } else { - /* Do Not Track is not supported */ - matomoGeneratedCode(false); - } -} diff --git a/frontend/js/menu.js b/frontend/js/menu.js deleted file mode 100644 index 62d1fd9ec..000000000 --- a/frontend/js/menu.js +++ /dev/null @@ -1,121 +0,0 @@ -// internet.nl - menu.js - -// Vars -var header = document.querySelector('header .wrap'), - menu = document.querySelector('#sitenav'), - langswitch = document.querySelector('#language-switch-header-container'), - menuButton = document.querySelector('.menu-button'); - -function hideMenuButton(document, window, undefined) { - - header.classList.remove('menu-with-js-actions'); - - header.classList.add('no-menu-button'); - - menu.setAttribute('aria-hidden', 'false'); - langswitch.setAttribute('aria-hidden', 'false'); - - // restore the skiplink to the menu - document.querySelector('#skiplink-sitenav').setAttribute('class', 'skiplink'); - - var ele = document.getElementById("menu-button"); - - if (ele) { - // Remove button from page - header.removeChild(menuButton); - } - -} - -function showMenuButton(document, window, undefined) { - - 'use strict'; - - header.classList.add('menu-with-js-actions'); - header.classList.remove('no-menu-button'); - - menuButton = document.createElement('button'); - - - // Button properties - menuButton.classList.add('menu-button'); - menuButton.setAttribute('id', 'menu-button'); - menuButton.setAttribute('aria-label', 'Menu'); - menuButton.setAttribute('aria-expanded', 'false'); - menuButton.setAttribute('aria-controls', 'sitenav'); - menuButton.innerHTML = ' menu'; - - // Menu properties - menu.setAttribute('aria-hidden', 'true'); - menu.setAttribute('aria-labelledby', 'menu-button'); - - langswitch.setAttribute('aria-hidden', 'true'); - - // remove the skiplink to the menu from the A11Y dom - document.querySelector('#skiplink-sitenav').setAttribute('class', 'skiplink-hide'); - - // Add button to page - header.insertBefore(menuButton, langswitch); - - // Handle button click event - menuButton.addEventListener('click', function () { - - // If active... - if (menu.classList.contains('active')) { - // Hide - - header.classList.remove('active'); - - menu.classList.remove('active'); - menu.setAttribute('aria-hidden', 'true'); - - langswitch.classList.remove('active'); - langswitch.setAttribute('aria-hidden', 'true'); - - menuButton.setAttribute('aria-expanded', 'false'); - } else { - // Show - - header.classList.add('active'); - - menu.classList.add('active'); - menu.setAttribute('aria-hidden', 'false'); - - langswitch.classList.add('active'); - langswitch.setAttribute('aria-hidden', 'false'); - - menuButton.setAttribute('aria-expanded', 'true'); - } - }, false); -} - -// ========================================================================================================= - -// media query change -function WidthChange(mq) { - - if (mq.matches) { - // window width is at least 1000px - // don't show menu button - hideMenuButton(document, window); - } - else { - // window width is less than 500px - // DO show menu button - showMenuButton(document, window); - - } - -} - -// ========================================================================================================= - -// media query event handler -if (matchMedia) { - var mq = window.matchMedia('(min-width: 740px)'); - mq.addListener(WidthChange); - WidthChange(mq); -} - - -// ========================================================================================================= diff --git a/frontend/package-lock.json b/frontend/package-lock.json new file mode 100644 index 000000000..f46a0d022 --- /dev/null +++ b/frontend/package-lock.json @@ -0,0 +1,6895 @@ +{ + "name": "frontend", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "devDependencies": { + "@csstools/postcss-cascade-layers": "^5.0.1", + "@rollup/plugin-terser": "^0.4.4", + "autoprefixer": "^10.4.20", + "concurrently": "^8.2.2", + "cssnano": "^7.0.7", + "glob": "^11.0.2", + "postcss": "^8.5.5", + "postcss-import": "^16.1.0", + "postcss-preset-env": "^10.1.4", + "postcss-variable-compress": "^3.0.0", + "rollup": "^4.40.2", + "rollup-plugin-postcss": "^4.0.2", + "stylelint": "^16.14.1", + "stylelint-config-standard": "^37.0.0" + }, + "optionalDependencies": { + "@rollup/rollup-linux-x64-gnu": "4.40.2" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.27.1.tgz", + "integrity": "sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-validator-identifier": "^7.27.1", + "js-tokens": "^4.0.0", + "picocolors": "^1.1.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.27.1.tgz", + "integrity": "sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/runtime": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.27.1.tgz", + "integrity": "sha512-1x3D2xEk2fRo3PAhwQwu5UubzgiVWSXTBfWpVd2Mx2AzRqJuDJCsgaDVZ7HB5iGzDW1Hl1sWN2mFyKjmR9uAog==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@csstools/cascade-layer-name-parser": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@csstools/cascade-layer-name-parser/-/cascade-layer-name-parser-2.0.4.tgz", + "integrity": "sha512-7DFHlPuIxviKYZrOiwVU/PiHLm3lLUR23OMuEEtfEOQTOp9hzQ2JjdY6X5H18RVuUPJqSCI+qNnD5iOLMVE0bA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@csstools/css-parser-algorithms": "^3.0.4", + "@csstools/css-tokenizer": "^3.0.3" + } + }, + "node_modules/@csstools/color-helpers": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/@csstools/color-helpers/-/color-helpers-5.0.2.tgz", + "integrity": "sha512-JqWH1vsgdGcw2RR6VliXXdA0/59LttzlU8UlRT/iUUsEeWfYq8I+K0yhihEUTTHLRm1EXvpsCx3083EU15ecsA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "engines": { + "node": ">=18" + } + }, + "node_modules/@csstools/css-calc": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/@csstools/css-calc/-/css-calc-2.1.3.tgz", + "integrity": "sha512-XBG3talrhid44BY1x3MHzUx/aTG8+x/Zi57M4aTKK9RFB4aLlF3TTSzfzn8nWVHWL3FgAXAxmupmDd6VWww+pw==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@csstools/css-parser-algorithms": "^3.0.4", + "@csstools/css-tokenizer": "^3.0.3" + } + }, + "node_modules/@csstools/css-color-parser": { + "version": "3.0.9", + "resolved": "https://registry.npmjs.org/@csstools/css-color-parser/-/css-color-parser-3.0.9.tgz", + "integrity": "sha512-wILs5Zk7BU86UArYBJTPy/FMPPKVKHMj1ycCEyf3VUptol0JNRLFU/BZsJ4aiIHJEbSLiizzRrw8Pc1uAEDrXw==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "dependencies": { + "@csstools/color-helpers": "^5.0.2", + "@csstools/css-calc": "^2.1.3" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@csstools/css-parser-algorithms": "^3.0.4", + "@csstools/css-tokenizer": "^3.0.3" + } + }, + "node_modules/@csstools/css-parser-algorithms": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@csstools/css-parser-algorithms/-/css-parser-algorithms-3.0.4.tgz", + "integrity": "sha512-Up7rBoV77rv29d3uKHUIVubz1BTcgyUK72IvCQAbfbMv584xHcGKCKbWh7i8hPrRJ7qU4Y8IO3IY9m+iTB7P3A==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@csstools/css-tokenizer": "^3.0.3" + } + }, + "node_modules/@csstools/css-tokenizer": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@csstools/css-tokenizer/-/css-tokenizer-3.0.3.tgz", + "integrity": "sha512-UJnjoFsmxfKUdNYdWgOB0mWUypuLvAfQPH1+pyvRJs6euowbFkFC6P13w1l8mJyi3vxYMxc9kld5jZEGRQs6bw==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/@csstools/media-query-list-parser": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@csstools/media-query-list-parser/-/media-query-list-parser-4.0.2.tgz", + "integrity": "sha512-EUos465uvVvMJehckATTlNqGj4UJWkTmdWuDMjqvSUkjGpmOyFZBVwb4knxCm/k2GMTXY+c/5RkdndzFYWeX5A==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@csstools/css-parser-algorithms": "^3.0.4", + "@csstools/css-tokenizer": "^3.0.3" + } + }, + "node_modules/@csstools/postcss-cascade-layers": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/@csstools/postcss-cascade-layers/-/postcss-cascade-layers-5.0.1.tgz", + "integrity": "sha512-XOfhI7GShVcKiKwmPAnWSqd2tBR0uxt+runAxttbSp/LY2U16yAVPmAf7e9q4JJ0d+xMNmpwNDLBXnmRCl3HMQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/selector-specificity": "^5.0.0", + "postcss-selector-parser": "^7.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-color-function": { + "version": "4.0.9", + "resolved": "https://registry.npmjs.org/@csstools/postcss-color-function/-/postcss-color-function-4.0.9.tgz", + "integrity": "sha512-2UeQCGMO5+EeQsPQK2DqXp0dad+P6nIz6G2dI06APpBuYBKxZEq7CTH+UiztFQ8cB1f89dnO9+D/Kfr+JfI2hw==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/css-color-parser": "^3.0.9", + "@csstools/css-parser-algorithms": "^3.0.4", + "@csstools/css-tokenizer": "^3.0.3", + "@csstools/postcss-progressive-custom-properties": "^4.0.1", + "@csstools/utilities": "^2.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-color-mix-function": { + "version": "3.0.9", + "resolved": "https://registry.npmjs.org/@csstools/postcss-color-mix-function/-/postcss-color-mix-function-3.0.9.tgz", + "integrity": "sha512-Enj7ZIIkLD7zkGCN31SZFx4H1gKiCs2Y4taBo/v/cqaHN7p1qGrf5UTMNSjQFZ7MgClGufHx4pddwFTGL+ipug==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/css-color-parser": "^3.0.9", + "@csstools/css-parser-algorithms": "^3.0.4", + "@csstools/css-tokenizer": "^3.0.3", + "@csstools/postcss-progressive-custom-properties": "^4.0.1", + "@csstools/utilities": "^2.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-content-alt-text": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@csstools/postcss-content-alt-text/-/postcss-content-alt-text-2.0.5.tgz", + "integrity": "sha512-9BOS535v6YmyOYk32jAHXeddRV+iyd4vRcbrEekpwxmueAXX5J8WgbceFnE4E4Pmw/ysnB9v+n/vSWoFmcLMcA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/css-parser-algorithms": "^3.0.4", + "@csstools/css-tokenizer": "^3.0.3", + "@csstools/postcss-progressive-custom-properties": "^4.0.1", + "@csstools/utilities": "^2.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-exponential-functions": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/@csstools/postcss-exponential-functions/-/postcss-exponential-functions-2.0.8.tgz", + "integrity": "sha512-vHgDXtGIBPpFQnFNDftMQg4MOuXcWnK91L/7REjBNYzQ/p2Fa/6RcnehTqCRrNtQ46PNIolbRsiDdDuxiHolwQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/css-calc": "^2.1.3", + "@csstools/css-parser-algorithms": "^3.0.4", + "@csstools/css-tokenizer": "^3.0.3" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-font-format-keywords": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@csstools/postcss-font-format-keywords/-/postcss-font-format-keywords-4.0.0.tgz", + "integrity": "sha512-usBzw9aCRDvchpok6C+4TXC57btc4bJtmKQWOHQxOVKen1ZfVqBUuCZ/wuqdX5GHsD0NRSr9XTP+5ID1ZZQBXw==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/utilities": "^2.0.0", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-gamut-mapping": { + "version": "2.0.9", + "resolved": "https://registry.npmjs.org/@csstools/postcss-gamut-mapping/-/postcss-gamut-mapping-2.0.9.tgz", + "integrity": "sha512-quksIsFm3DGsf8Qbr9KiSGBF2w3RwxSfOfma5wbORDB1AFF15r4EVW7sUuWw3s5IAEGMqzel/dE2rQsI7Yb8mA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/css-color-parser": "^3.0.9", + "@csstools/css-parser-algorithms": "^3.0.4", + "@csstools/css-tokenizer": "^3.0.3" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-gradients-interpolation-method": { + "version": "5.0.9", + "resolved": "https://registry.npmjs.org/@csstools/postcss-gradients-interpolation-method/-/postcss-gradients-interpolation-method-5.0.9.tgz", + "integrity": "sha512-duqTeUHF4ambUybAmhX9KonkicLM/WNp2JjMUbegRD4O8A/tb6fdZ7jUNdp/UUiO1FIdDkMwmNw6856bT0XF8Q==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/css-color-parser": "^3.0.9", + "@csstools/css-parser-algorithms": "^3.0.4", + "@csstools/css-tokenizer": "^3.0.3", + "@csstools/postcss-progressive-custom-properties": "^4.0.1", + "@csstools/utilities": "^2.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-hwb-function": { + "version": "4.0.9", + "resolved": "https://registry.npmjs.org/@csstools/postcss-hwb-function/-/postcss-hwb-function-4.0.9.tgz", + "integrity": "sha512-sDpdPsoGAhYl/PMSYfu5Ez82wXb2bVkg1Cb8vsRLhpXhAk4OSlsJN+GodAql6tqc1B2G/WToxsFU6G74vkhPvA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/css-color-parser": "^3.0.9", + "@csstools/css-parser-algorithms": "^3.0.4", + "@csstools/css-tokenizer": "^3.0.3", + "@csstools/postcss-progressive-custom-properties": "^4.0.1", + "@csstools/utilities": "^2.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-ic-unit": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@csstools/postcss-ic-unit/-/postcss-ic-unit-4.0.1.tgz", + "integrity": "sha512-lECc38i1w3qU9nhrUhP6F8y4BfcQJkR1cb8N6tZNf2llM6zPkxnqt04jRCwsUgNcB3UGKDy+zLenhOYGHqCV+Q==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/postcss-progressive-custom-properties": "^4.0.1", + "@csstools/utilities": "^2.0.0", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-initial": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@csstools/postcss-initial/-/postcss-initial-2.0.1.tgz", + "integrity": "sha512-L1wLVMSAZ4wovznquK0xmC7QSctzO4D0Is590bxpGqhqjboLXYA16dWZpfwImkdOgACdQ9PqXsuRroW6qPlEsg==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-is-pseudo-class": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/@csstools/postcss-is-pseudo-class/-/postcss-is-pseudo-class-5.0.1.tgz", + "integrity": "sha512-JLp3POui4S1auhDR0n8wHd/zTOWmMsmK3nQd3hhL6FhWPaox5W7j1se6zXOG/aP07wV2ww0lxbKYGwbBszOtfQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/selector-specificity": "^5.0.0", + "postcss-selector-parser": "^7.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-light-dark-function": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/@csstools/postcss-light-dark-function/-/postcss-light-dark-function-2.0.8.tgz", + "integrity": "sha512-v8VU5WtrZIyEtk88WB4fkG22TGd8HyAfSFfZZQ1uNN0+arMJdZc++H3KYTfbYDpJRGy8GwADYH8ySXiILn+OyA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/css-parser-algorithms": "^3.0.4", + "@csstools/css-tokenizer": "^3.0.3", + "@csstools/postcss-progressive-custom-properties": "^4.0.1", + "@csstools/utilities": "^2.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-logical-float-and-clear": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@csstools/postcss-logical-float-and-clear/-/postcss-logical-float-and-clear-3.0.0.tgz", + "integrity": "sha512-SEmaHMszwakI2rqKRJgE+8rpotFfne1ZS6bZqBoQIicFyV+xT1UF42eORPxJkVJVrH9C0ctUgwMSn3BLOIZldQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-logical-overflow": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@csstools/postcss-logical-overflow/-/postcss-logical-overflow-2.0.0.tgz", + "integrity": "sha512-spzR1MInxPuXKEX2csMamshR4LRaSZ3UXVaRGjeQxl70ySxOhMpP2252RAFsg8QyyBXBzuVOOdx1+bVO5bPIzA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-logical-overscroll-behavior": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@csstools/postcss-logical-overscroll-behavior/-/postcss-logical-overscroll-behavior-2.0.0.tgz", + "integrity": "sha512-e/webMjoGOSYfqLunyzByZj5KKe5oyVg/YSbie99VEaSDE2kimFm0q1f6t/6Jo+VVCQ/jbe2Xy+uX+C4xzWs4w==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-logical-resize": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@csstools/postcss-logical-resize/-/postcss-logical-resize-3.0.0.tgz", + "integrity": "sha512-DFbHQOFW/+I+MY4Ycd/QN6Dg4Hcbb50elIJCfnwkRTCX05G11SwViI5BbBlg9iHRl4ytB7pmY5ieAFk3ws7yyg==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-logical-viewport-units": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@csstools/postcss-logical-viewport-units/-/postcss-logical-viewport-units-3.0.3.tgz", + "integrity": "sha512-OC1IlG/yoGJdi0Y+7duz/kU/beCwO+Gua01sD6GtOtLi7ByQUpcIqs7UE/xuRPay4cHgOMatWdnDdsIDjnWpPw==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/css-tokenizer": "^3.0.3", + "@csstools/utilities": "^2.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-media-minmax": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/@csstools/postcss-media-minmax/-/postcss-media-minmax-2.0.8.tgz", + "integrity": "sha512-Skum5wIXw2+NyCQWUyfstN3c1mfSh39DRAo+Uh2zzXOglBG8xB9hnArhYFScuMZkzeM+THVa//mrByKAfumc7w==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "dependencies": { + "@csstools/css-calc": "^2.1.3", + "@csstools/css-parser-algorithms": "^3.0.4", + "@csstools/css-tokenizer": "^3.0.3", + "@csstools/media-query-list-parser": "^4.0.2" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-media-queries-aspect-ratio-number-values": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@csstools/postcss-media-queries-aspect-ratio-number-values/-/postcss-media-queries-aspect-ratio-number-values-3.0.4.tgz", + "integrity": "sha512-AnGjVslHMm5xw9keusQYvjVWvuS7KWK+OJagaG0+m9QnIjZsrysD2kJP/tr/UJIyYtMCtu8OkUd+Rajb4DqtIQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/css-parser-algorithms": "^3.0.4", + "@csstools/css-tokenizer": "^3.0.3", + "@csstools/media-query-list-parser": "^4.0.2" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-nested-calc": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@csstools/postcss-nested-calc/-/postcss-nested-calc-4.0.0.tgz", + "integrity": "sha512-jMYDdqrQQxE7k9+KjstC3NbsmC063n1FTPLCgCRS2/qHUbHM0mNy9pIn4QIiQGs9I/Bg98vMqw7mJXBxa0N88A==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/utilities": "^2.0.0", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-normalize-display-values": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@csstools/postcss-normalize-display-values/-/postcss-normalize-display-values-4.0.0.tgz", + "integrity": "sha512-HlEoG0IDRoHXzXnkV4in47dzsxdsjdz6+j7MLjaACABX2NfvjFS6XVAnpaDyGesz9gK2SC7MbNwdCHusObKJ9Q==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-oklab-function": { + "version": "4.0.9", + "resolved": "https://registry.npmjs.org/@csstools/postcss-oklab-function/-/postcss-oklab-function-4.0.9.tgz", + "integrity": "sha512-UHrnujimwtdDw8BYDcWJtBXuJ13uc/BjAddPdfMc/RsWxhg8gG8UbvTF0tnMtHrZ4i7lwy85fPEzK1AiykMyRA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/css-color-parser": "^3.0.9", + "@csstools/css-parser-algorithms": "^3.0.4", + "@csstools/css-tokenizer": "^3.0.3", + "@csstools/postcss-progressive-custom-properties": "^4.0.1", + "@csstools/utilities": "^2.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-progressive-custom-properties": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@csstools/postcss-progressive-custom-properties/-/postcss-progressive-custom-properties-4.0.1.tgz", + "integrity": "sha512-Ofz81HaY8mmbP8/Qr3PZlUzjsyV5WuxWmvtYn+jhYGvvjFazTmN9R2io5W5znY1tyk2CA9uM0IPWyY4ygDytCw==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-random-function": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@csstools/postcss-random-function/-/postcss-random-function-2.0.0.tgz", + "integrity": "sha512-MYZKxSr4AKfjECL8vg49BbfNNzK+t3p2OWX+Xf7rXgMaTP44oy/e8VGWu4MLnJ3NUd9tFVkisLO/sg+5wMTNsg==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/css-calc": "^2.1.3", + "@csstools/css-parser-algorithms": "^3.0.4", + "@csstools/css-tokenizer": "^3.0.3" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-relative-color-syntax": { + "version": "3.0.9", + "resolved": "https://registry.npmjs.org/@csstools/postcss-relative-color-syntax/-/postcss-relative-color-syntax-3.0.9.tgz", + "integrity": "sha512-+AGOcLF5PmMnTRPnOdCvY7AwvD5veIOhTWbJV6vC3hB1tt0ii/k6QOwhWfsGGg1ZPQ0JY15u+wqLR4ZTtB0luA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/css-color-parser": "^3.0.9", + "@csstools/css-parser-algorithms": "^3.0.4", + "@csstools/css-tokenizer": "^3.0.3", + "@csstools/postcss-progressive-custom-properties": "^4.0.1", + "@csstools/utilities": "^2.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-scope-pseudo-class": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@csstools/postcss-scope-pseudo-class/-/postcss-scope-pseudo-class-4.0.1.tgz", + "integrity": "sha512-IMi9FwtH6LMNuLea1bjVMQAsUhFxJnyLSgOp/cpv5hrzWmrUYU5fm0EguNDIIOHUqzXode8F/1qkC/tEo/qN8Q==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "postcss-selector-parser": "^7.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-sign-functions": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@csstools/postcss-sign-functions/-/postcss-sign-functions-1.1.3.tgz", + "integrity": "sha512-4F4GRhj8xNkBtLZ+3ycIhReaDfKJByXI+cQGIps3AzCO8/CJOeoDPxpMnL5vqZrWKOceSATHEQJUO/Q/r2y7OQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/css-calc": "^2.1.3", + "@csstools/css-parser-algorithms": "^3.0.4", + "@csstools/css-tokenizer": "^3.0.3" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-stepped-value-functions": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/@csstools/postcss-stepped-value-functions/-/postcss-stepped-value-functions-4.0.8.tgz", + "integrity": "sha512-6Y4yhL4fNhgzbZ/wUMQ4EjFUfoNNMpEXZnDw1JrlcEBHUT15gplchtFsZGk7FNi8PhLHJfCUwVKrEHzhfhKK+g==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/css-calc": "^2.1.3", + "@csstools/css-parser-algorithms": "^3.0.4", + "@csstools/css-tokenizer": "^3.0.3" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-text-decoration-shorthand": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@csstools/postcss-text-decoration-shorthand/-/postcss-text-decoration-shorthand-4.0.2.tgz", + "integrity": "sha512-8XvCRrFNseBSAGxeaVTaNijAu+FzUvjwFXtcrynmazGb/9WUdsPCpBX+mHEHShVRq47Gy4peYAoxYs8ltUnmzA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/color-helpers": "^5.0.2", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-trigonometric-functions": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/@csstools/postcss-trigonometric-functions/-/postcss-trigonometric-functions-4.0.8.tgz", + "integrity": "sha512-YcDvYTRu7f78/91B6bX+mE1WoAO91Su7/8KSRpuWbIGUB8hmaNSRu9wziaWSLJ1lOB1aQe+bvo9BIaLKqPOo/g==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/css-calc": "^2.1.3", + "@csstools/css-parser-algorithms": "^3.0.4", + "@csstools/css-tokenizer": "^3.0.3" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-unset-value": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@csstools/postcss-unset-value/-/postcss-unset-value-4.0.0.tgz", + "integrity": "sha512-cBz3tOCI5Fw6NIFEwU3RiwK6mn3nKegjpJuzCndoGq3BZPkUjnsq7uQmIeMNeMbMk7YD2MfKcgCpZwX5jyXqCA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/selector-resolve-nested": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@csstools/selector-resolve-nested/-/selector-resolve-nested-3.0.0.tgz", + "integrity": "sha512-ZoK24Yku6VJU1gS79a5PFmC8yn3wIapiKmPgun0hZgEI5AOqgH2kiPRsPz1qkGv4HL+wuDLH83yQyk6inMYrJQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss-selector-parser": "^7.0.0" + } + }, + "node_modules/@csstools/selector-specificity": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@csstools/selector-specificity/-/selector-specificity-5.0.0.tgz", + "integrity": "sha512-PCqQV3c4CoVm3kdPhyeZ07VmBRdH2EpMFA/pd9OASpOEC3aXNGoqPDAZ80D0cLpMBxnmk0+yNhGsEx31hq7Gtw==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss-selector-parser": "^7.0.0" + } + }, + "node_modules/@csstools/utilities": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@csstools/utilities/-/utilities-2.0.0.tgz", + "integrity": "sha512-5VdOr0Z71u+Yp3ozOx8T11N703wIFGVRgOWbOZMKgglPJsWA54MRIoMNVMa7shUToIhx5J8vX4sOZgD2XiihiQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@dual-bundle/import-meta-resolve": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/@dual-bundle/import-meta-resolve/-/import-meta-resolve-4.1.0.tgz", + "integrity": "sha512-+nxncfwHM5SgAtrVzgpzJOI1ol0PkumhVo469KCf9lUi21IGcY90G98VuHm9VRrUypmAzawAHO9bs6hqeADaVg==", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/@isaacs/cliui": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", + "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", + "dev": true, + "license": "ISC", + "dependencies": { + "string-width": "^5.1.2", + "string-width-cjs": "npm:string-width@^4.2.0", + "strip-ansi": "^7.0.1", + "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", + "wrap-ansi": "^8.1.0", + "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.8", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.8.tgz", + "integrity": "sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/set-array": "^1.2.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.24" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/set-array": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", + "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/source-map": { + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.6.tgz", + "integrity": "sha512-1ZJTZebgqllO79ue2bm3rIGud/bOe0pP5BjSRCRxxYkEZS8STV7zN84UBbiYu7jy+eCKSnVIUgoWWE/tt+shMQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.25" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz", + "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.25", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", + "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@keyv/serialize": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@keyv/serialize/-/serialize-1.0.3.tgz", + "integrity": "sha512-qnEovoOp5Np2JDGonIDL6Ayihw0RhnRh6vxPuHo4RDn1UOzwEo4AeIfpL6UGIrsceWrCMiVPgwRjbHu4vYFc3g==", + "dev": true, + "license": "MIT", + "dependencies": { + "buffer": "^6.0.3" + } + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@rollup/plugin-terser": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/@rollup/plugin-terser/-/plugin-terser-0.4.4.tgz", + "integrity": "sha512-XHeJC5Bgvs8LfukDwWZp7yeqin6ns8RTl2B9avbejt6tZqsqvVoWI7ZTQrcNsfKEDWBTnTxM8nMDkO2IFFbd0A==", + "dev": true, + "license": "MIT", + "dependencies": { + "serialize-javascript": "^6.0.1", + "smob": "^1.0.0", + "terser": "^5.17.4" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "rollup": "^2.0.0||^3.0.0||^4.0.0" + }, + "peerDependenciesMeta": { + "rollup": { + "optional": true + } + } + }, + "node_modules/@rollup/rollup-android-arm-eabi": { + "version": "4.40.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.40.2.tgz", + "integrity": "sha512-JkdNEq+DFxZfUwxvB58tHMHBHVgX23ew41g1OQinthJ+ryhdRk67O31S7sYw8u2lTjHUPFxwar07BBt1KHp/hg==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-android-arm64": { + "version": "4.40.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.40.2.tgz", + "integrity": "sha512-13unNoZ8NzUmnndhPTkWPWbX3vtHodYmy+I9kuLxN+F+l+x3LdVF7UCu8TWVMt1POHLh6oDHhnOA04n8oJZhBw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-darwin-arm64": { + "version": "4.40.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.40.2.tgz", + "integrity": "sha512-Gzf1Hn2Aoe8VZzevHostPX23U7N5+4D36WJNHK88NZHCJr7aVMG4fadqkIf72eqVPGjGc0HJHNuUaUcxiR+N/w==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-darwin-x64": { + "version": "4.40.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.40.2.tgz", + "integrity": "sha512-47N4hxa01a4x6XnJoskMKTS8XZ0CZMd8YTbINbi+w03A2w4j1RTlnGHOz/P0+Bg1LaVL6ufZyNprSg+fW5nYQQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-freebsd-arm64": { + "version": "4.40.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.40.2.tgz", + "integrity": "sha512-8t6aL4MD+rXSHHZUR1z19+9OFJ2rl1wGKvckN47XFRVO+QL/dUSpKA2SLRo4vMg7ELA8pzGpC+W9OEd1Z/ZqoQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-freebsd-x64": { + "version": "4.40.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.40.2.tgz", + "integrity": "sha512-C+AyHBzfpsOEYRFjztcYUFsH4S7UsE9cDtHCtma5BK8+ydOZYgMmWg1d/4KBytQspJCld8ZIujFMAdKG1xyr4Q==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-linux-arm-gnueabihf": { + "version": "4.40.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.40.2.tgz", + "integrity": "sha512-de6TFZYIvJwRNjmW3+gaXiZ2DaWL5D5yGmSYzkdzjBDS3W+B9JQ48oZEsmMvemqjtAFzE16DIBLqd6IQQRuG9Q==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm-musleabihf": { + "version": "4.40.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.40.2.tgz", + "integrity": "sha512-urjaEZubdIkacKc930hUDOfQPysezKla/O9qV+O89enqsqUmQm8Xj8O/vh0gHg4LYfv7Y7UsE3QjzLQzDYN1qg==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-gnu": { + "version": "4.40.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.40.2.tgz", + "integrity": "sha512-KlE8IC0HFOC33taNt1zR8qNlBYHj31qGT1UqWqtvR/+NuCVhfufAq9fxO8BMFC22Wu0rxOwGVWxtCMvZVLmhQg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-musl": { + "version": "4.40.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.40.2.tgz", + "integrity": "sha512-j8CgxvfM0kbnhu4XgjnCWJQyyBOeBI1Zq91Z850aUddUmPeQvuAy6OiMdPS46gNFgy8gN1xkYyLgwLYZG3rBOg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-loongarch64-gnu": { + "version": "4.40.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.40.2.tgz", + "integrity": "sha512-Ybc/1qUampKuRF4tQXc7G7QY9YRyeVSykfK36Y5Qc5dmrIxwFhrOzqaVTNoZygqZ1ZieSWTibfFhQ5qK8jpWxw==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-powerpc64le-gnu": { + "version": "4.40.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.40.2.tgz", + "integrity": "sha512-3FCIrnrt03CCsZqSYAOW/k9n625pjpuMzVfeI+ZBUSDT3MVIFDSPfSUgIl9FqUftxcUXInvFah79hE1c9abD+Q==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-gnu": { + "version": "4.40.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.40.2.tgz", + "integrity": "sha512-QNU7BFHEvHMp2ESSY3SozIkBPaPBDTsfVNGx3Xhv+TdvWXFGOSH2NJvhD1zKAT6AyuuErJgbdvaJhYVhVqrWTg==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-musl": { + "version": "4.40.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.40.2.tgz", + "integrity": "sha512-5W6vNYkhgfh7URiXTO1E9a0cy4fSgfE4+Hl5agb/U1sa0kjOLMLC1wObxwKxecE17j0URxuTrYZZME4/VH57Hg==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-s390x-gnu": { + "version": "4.40.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.40.2.tgz", + "integrity": "sha512-B7LKIz+0+p348JoAL4X/YxGx9zOx3sR+o6Hj15Y3aaApNfAshK8+mWZEf759DXfRLeL2vg5LYJBB7DdcleYCoQ==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-gnu": { + "version": "4.40.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.40.2.tgz", + "integrity": "sha512-lG7Xa+BmBNwpjmVUbmyKxdQJ3Q6whHjMjzQplOs5Z+Gj7mxPtWakGHqzMqNER68G67kmCX9qX57aRsW5V0VOng==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-musl": { + "version": "4.40.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.40.2.tgz", + "integrity": "sha512-tD46wKHd+KJvsmije4bUskNuvWKFcTOIM9tZ/RrmIvcXnbi0YK/cKS9FzFtAm7Oxi2EhV5N2OpfFB348vSQRXA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-win32-arm64-msvc": { + "version": "4.40.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.40.2.tgz", + "integrity": "sha512-Bjv/HG8RRWLNkXwQQemdsWw4Mg+IJ29LK+bJPW2SCzPKOUaMmPEppQlu/Fqk1d7+DX3V7JbFdbkh/NMmurT6Pg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-ia32-msvc": { + "version": "4.40.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.40.2.tgz", + "integrity": "sha512-dt1llVSGEsGKvzeIO76HToiYPNPYPkmjhMHhP00T9S4rDern8P2ZWvWAQUEJ+R1UdMWJ/42i/QqJ2WV765GZcA==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-msvc": { + "version": "4.40.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.40.2.tgz", + "integrity": "sha512-bwspbWB04XJpeElvsp+DCylKfF4trJDa2Y9Go8O6A7YLX2LIKGcNK/CYImJN6ZP4DcuOHB4Utl3iCbnR62DudA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@trysound/sax": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/@trysound/sax/-/sax-0.2.0.tgz", + "integrity": "sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/@types/estree": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.7.tgz", + "integrity": "sha512-w28IoSUCJpidD/TGviZwwMJckNESJZXFu7NBZ5YJ4mEUnNraUn9Pm8HSZm/jDF1pDWYKspWE7oVphigUPRakIQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/acorn": { + "version": "8.14.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.1.tgz", + "integrity": "sha512-OvQ/2pUDKmgfCg++xsTX1wGxfTaszcHVcTctW4UJB4hibJx2HXxxO5UmVgyjMa+ZDsiaf5wWLXYpRWMmBI0QHg==", + "dev": true, + "license": "MIT", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/ajv": { + "version": "8.17.1", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", + "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.3", + "fast-uri": "^3.0.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ansi-regex": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", + "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true, + "license": "Python-2.0" + }, + "node_modules/array-union": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/astral-regex": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", + "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/autoprefixer": { + "version": "10.4.21", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.21.tgz", + "integrity": "sha512-O+A6LWV5LDHSJD3LjHYoNi4VLsj/Whi7k6zG12xTYaU4cQ8oxQGckXNX8cRHK5yOZ/ppVHe0ZBXGzSV9jXdVbQ==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/autoprefixer" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "browserslist": "^4.24.4", + "caniuse-lite": "^1.0.30001702", + "fraction.js": "^4.3.7", + "normalize-range": "^0.1.2", + "picocolors": "^1.1.1", + "postcss-value-parser": "^4.2.0" + }, + "bin": { + "autoprefixer": "bin/autoprefixer" + }, + "engines": { + "node": "^10 || ^12 || >=14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true, + "license": "MIT" + }, + "node_modules/base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/boolbase": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", + "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==", + "dev": true, + "license": "ISC" + }, + "node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/braces": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "dev": true, + "license": "MIT", + "dependencies": { + "fill-range": "^7.1.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/browserslist": { + "version": "4.24.5", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.24.5.tgz", + "integrity": "sha512-FDToo4Wo82hIdgc1CQ+NQD0hEhmpPjrZ3hiUgwgOG6IuTdlpr8jdjyG24P6cNP1yJpTLzS5OcGgSw0xmDU1/Tw==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "caniuse-lite": "^1.0.30001716", + "electron-to-chromium": "^1.5.149", + "node-releases": "^2.0.19", + "update-browserslist-db": "^1.1.3" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/buffer": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", + "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.2.1" + } + }, + "node_modules/buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/cacheable": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/cacheable/-/cacheable-1.9.0.tgz", + "integrity": "sha512-8D5htMCxPDUULux9gFzv30f04Xo3wCnik0oOxKoRTPIBoqA7HtOcJ87uBhQTs3jCfZZTrUBGsYIZOgE0ZRgMAg==", + "dev": true, + "license": "MIT", + "dependencies": { + "hookified": "^1.8.2", + "keyv": "^5.3.3" + } + }, + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/caniuse-api": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/caniuse-api/-/caniuse-api-3.0.0.tgz", + "integrity": "sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw==", + "dev": true, + "license": "MIT", + "dependencies": { + "browserslist": "^4.0.0", + "caniuse-lite": "^1.0.0", + "lodash.memoize": "^4.1.2", + "lodash.uniq": "^4.5.0" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001718", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001718.tgz", + "integrity": "sha512-AflseV1ahcSunK53NfEs9gFWgOEmzr0f+kaMFA4xiLZlr9Hzt7HxcSpIFcnNCUkz6R6dWKa54rUz3HUmI3nVcw==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "CC-BY-4.0" + }, + "node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/chalk/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/cliui/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/cliui/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true, + "license": "MIT" + }, + "node_modules/cliui/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cliui/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cliui/node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true, + "license": "MIT" + }, + "node_modules/colord": { + "version": "2.9.3", + "resolved": "https://registry.npmjs.org/colord/-/colord-2.9.3.tgz", + "integrity": "sha512-jeC1axXpnb0/2nn/Y1LPuLdgXBLH7aDcHu4KEKfqw3CUhX7ZpfBSlPKyqXE6btIgEzfWtrX3/tyBCaCvXvMkOw==", + "dev": true, + "license": "MIT" + }, + "node_modules/commander": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", + "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 10" + } + }, + "node_modules/concat-with-sourcemaps": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/concat-with-sourcemaps/-/concat-with-sourcemaps-1.1.0.tgz", + "integrity": "sha512-4gEjHJFT9e+2W/77h/DS5SGUgwDaOwprX8L/gl5+3ixnzkVJJsZWDSelmN3Oilw3LNDZjZV0yqH1hLG3k6nghg==", + "dev": true, + "license": "ISC", + "dependencies": { + "source-map": "^0.6.1" + } + }, + "node_modules/concurrently": { + "version": "8.2.2", + "resolved": "https://registry.npmjs.org/concurrently/-/concurrently-8.2.2.tgz", + "integrity": "sha512-1dP4gpXFhei8IOtlXRE/T/4H88ElHgTiUzh71YUmtjTEHMSRS2Z/fgOxHSxxusGHogsRfxNq1vyAwxSC+EVyDg==", + "dev": true, + "license": "MIT", + "dependencies": { + "chalk": "^4.1.2", + "date-fns": "^2.30.0", + "lodash": "^4.17.21", + "rxjs": "^7.8.1", + "shell-quote": "^1.8.1", + "spawn-command": "0.0.2", + "supports-color": "^8.1.1", + "tree-kill": "^1.2.2", + "yargs": "^17.7.2" + }, + "bin": { + "conc": "dist/bin/concurrently.js", + "concurrently": "dist/bin/concurrently.js" + }, + "engines": { + "node": "^14.13.0 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/open-cli-tools/concurrently?sponsor=1" + } + }, + "node_modules/cosmiconfig": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-9.0.0.tgz", + "integrity": "sha512-itvL5h8RETACmOTFc4UfIyB2RfEHi71Ax6E/PivVxq9NseKbOWpeyHEOIbmAw1rs8Ak0VursQNww7lf7YtUwzg==", + "dev": true, + "license": "MIT", + "dependencies": { + "env-paths": "^2.2.1", + "import-fresh": "^3.3.0", + "js-yaml": "^4.1.0", + "parse-json": "^5.2.0" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/d-fischer" + }, + "peerDependencies": { + "typescript": ">=4.9.5" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/cross-spawn": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", + "dev": true, + "license": "MIT", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/css-blank-pseudo": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/css-blank-pseudo/-/css-blank-pseudo-7.0.1.tgz", + "integrity": "sha512-jf+twWGDf6LDoXDUode+nc7ZlrqfaNphrBIBrcmeP3D8yw1uPaix1gCC8LUQUGQ6CycuK2opkbFFWFuq/a94ag==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "postcss-selector-parser": "^7.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/css-declaration-sorter": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/css-declaration-sorter/-/css-declaration-sorter-7.2.0.tgz", + "integrity": "sha512-h70rUM+3PNFuaBDTLe8wF/cdWu+dOZmb7pJt8Z2sedYbAcQVQV/tEchueg3GWxwqS0cxtbxmaHEdkNACqcvsow==", + "dev": true, + "license": "ISC", + "engines": { + "node": "^14 || ^16 || >=18" + }, + "peerDependencies": { + "postcss": "^8.0.9" + } + }, + "node_modules/css-functions-list": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/css-functions-list/-/css-functions-list-3.2.3.tgz", + "integrity": "sha512-IQOkD3hbR5KrN93MtcYuad6YPuTSUhntLHDuLEbFWE+ff2/XSZNdZG+LcbbIW5AXKg/WFIfYItIzVoHngHXZzA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12 || >=16" + } + }, + "node_modules/css-has-pseudo": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/css-has-pseudo/-/css-has-pseudo-7.0.2.tgz", + "integrity": "sha512-nzol/h+E0bId46Kn2dQH5VElaknX2Sr0hFuB/1EomdC7j+OISt2ZzK7EHX9DZDY53WbIVAR7FYKSO2XnSf07MQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/selector-specificity": "^5.0.0", + "postcss-selector-parser": "^7.0.0", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/css-prefers-color-scheme": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/css-prefers-color-scheme/-/css-prefers-color-scheme-10.0.0.tgz", + "integrity": "sha512-VCtXZAWivRglTZditUfB4StnsWr6YVZ2PRtuxQLKTNRdtAf8tpzaVPE9zXIF3VaSc7O70iK/j1+NXxyQCqdPjQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/css-select": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-5.1.0.tgz", + "integrity": "sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "boolbase": "^1.0.0", + "css-what": "^6.1.0", + "domhandler": "^5.0.2", + "domutils": "^3.0.1", + "nth-check": "^2.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/css-tree": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-3.1.0.tgz", + "integrity": "sha512-0eW44TGN5SQXU1mWSkKwFstI/22X2bG1nYzZTYMAWjylYURhse752YgbE4Cx46AC+bAvI+/dYTPRk1LqSUnu6w==", + "dev": true, + "license": "MIT", + "dependencies": { + "mdn-data": "2.12.2", + "source-map-js": "^1.0.1" + }, + "engines": { + "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0" + } + }, + "node_modules/css-what": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.1.0.tgz", + "integrity": "sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">= 6" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/cssdb": { + "version": "8.2.5", + "resolved": "https://registry.npmjs.org/cssdb/-/cssdb-8.2.5.tgz", + "integrity": "sha512-leAt8/hdTCtzql9ZZi86uYAmCLzVKpJMMdjbvOGVnXFXz/BWFpBmM1MHEHU/RqtPyRYmabVmEW1DtX3YGLuuLA==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + } + ], + "license": "MIT-0" + }, + "node_modules/cssesc": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", + "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", + "dev": true, + "license": "MIT", + "bin": { + "cssesc": "bin/cssesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/cssnano": { + "version": "7.0.7", + "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-7.0.7.tgz", + "integrity": "sha512-evKu7yiDIF7oS+EIpwFlMF730ijRyLFaM2o5cTxRGJR9OKHKkc+qP443ZEVR9kZG0syaAJJCPJyfv5pbrxlSng==", + "dev": true, + "license": "MIT", + "dependencies": { + "cssnano-preset-default": "^7.0.7", + "lilconfig": "^3.1.3" + }, + "engines": { + "node": "^18.12.0 || ^20.9.0 || >=22.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/cssnano" + }, + "peerDependencies": { + "postcss": "^8.4.32" + } + }, + "node_modules/cssnano-preset-default": { + "version": "7.0.7", + "resolved": "https://registry.npmjs.org/cssnano-preset-default/-/cssnano-preset-default-7.0.7.tgz", + "integrity": "sha512-jW6CG/7PNB6MufOrlovs1TvBTEVmhY45yz+bd0h6nw3h6d+1e+/TX+0fflZ+LzvZombbT5f+KC063w9VoHeHow==", + "dev": true, + "license": "MIT", + "dependencies": { + "browserslist": "^4.24.5", + "css-declaration-sorter": "^7.2.0", + "cssnano-utils": "^5.0.1", + "postcss-calc": "^10.1.1", + "postcss-colormin": "^7.0.3", + "postcss-convert-values": "^7.0.5", + "postcss-discard-comments": "^7.0.4", + "postcss-discard-duplicates": "^7.0.2", + "postcss-discard-empty": "^7.0.1", + "postcss-discard-overridden": "^7.0.1", + "postcss-merge-longhand": "^7.0.5", + "postcss-merge-rules": "^7.0.5", + "postcss-minify-font-values": "^7.0.1", + "postcss-minify-gradients": "^7.0.1", + "postcss-minify-params": "^7.0.3", + "postcss-minify-selectors": "^7.0.5", + "postcss-normalize-charset": "^7.0.1", + "postcss-normalize-display-values": "^7.0.1", + "postcss-normalize-positions": "^7.0.1", + "postcss-normalize-repeat-style": "^7.0.1", + "postcss-normalize-string": "^7.0.1", + "postcss-normalize-timing-functions": "^7.0.1", + "postcss-normalize-unicode": "^7.0.3", + "postcss-normalize-url": "^7.0.1", + "postcss-normalize-whitespace": "^7.0.1", + "postcss-ordered-values": "^7.0.2", + "postcss-reduce-initial": "^7.0.3", + "postcss-reduce-transforms": "^7.0.1", + "postcss-svgo": "^7.0.2", + "postcss-unique-selectors": "^7.0.4" + }, + "engines": { + "node": "^18.12.0 || ^20.9.0 || >=22.0" + }, + "peerDependencies": { + "postcss": "^8.4.32" + } + }, + "node_modules/cssnano-utils": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/cssnano-utils/-/cssnano-utils-5.0.1.tgz", + "integrity": "sha512-ZIP71eQgG9JwjVZsTPSqhc6GHgEr53uJ7tK5///VfyWj6Xp2DBmixWHqJgPno+PqATzn48pL42ww9x5SSGmhZg==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.12.0 || ^20.9.0 || >=22.0" + }, + "peerDependencies": { + "postcss": "^8.4.32" + } + }, + "node_modules/csso": { + "version": "5.0.5", + "resolved": "https://registry.npmjs.org/csso/-/csso-5.0.5.tgz", + "integrity": "sha512-0LrrStPOdJj+SPCCrGhzryycLjwcgUSHBtxNA8aIDxf0GLsRh1cKYhB00Gd1lDOS4yGH69+SNn13+TWbVHETFQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "css-tree": "~2.2.0" + }, + "engines": { + "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0", + "npm": ">=7.0.0" + } + }, + "node_modules/csso/node_modules/css-tree": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-2.2.1.tgz", + "integrity": "sha512-OA0mILzGc1kCOCSJerOeqDxDQ4HOh+G8NbOJFOTgOCzpw7fCBubk0fEyxp8AgOL/jvLgYA/uV0cMbe43ElF1JA==", + "dev": true, + "license": "MIT", + "dependencies": { + "mdn-data": "2.0.28", + "source-map-js": "^1.0.1" + }, + "engines": { + "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0", + "npm": ">=7.0.0" + } + }, + "node_modules/csso/node_modules/mdn-data": { + "version": "2.0.28", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.28.tgz", + "integrity": "sha512-aylIc7Z9y4yzHYAJNuESG3hfhC+0Ibp/MAMiaOZgNv4pmEdFyfZhhhny4MNiAfWdBQ1RQ2mfDWmM1x8SvGyp8g==", + "dev": true, + "license": "CC0-1.0" + }, + "node_modules/date-fns": { + "version": "2.30.0", + "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-2.30.0.tgz", + "integrity": "sha512-fnULvOpxnC5/Vg3NCiWelDsLiUc9bRwAPs/+LfTLNvetFCtCTN+yQz15C/fs4AwX1R9K5GLtLfn8QW+dWisaAw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.21.0" + }, + "engines": { + "node": ">=0.11" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/date-fns" + } + }, + "node_modules/debug": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.1.tgz", + "integrity": "sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/dir-glob": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "dev": true, + "license": "MIT", + "dependencies": { + "path-type": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/dom-serializer": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz", + "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==", + "dev": true, + "license": "MIT", + "dependencies": { + "domelementtype": "^2.3.0", + "domhandler": "^5.0.2", + "entities": "^4.2.0" + }, + "funding": { + "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" + } + }, + "node_modules/domelementtype": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", + "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ], + "license": "BSD-2-Clause" + }, + "node_modules/domhandler": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz", + "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "domelementtype": "^2.3.0" + }, + "engines": { + "node": ">= 4" + }, + "funding": { + "url": "https://github.com/fb55/domhandler?sponsor=1" + } + }, + "node_modules/domutils": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.2.2.tgz", + "integrity": "sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "dom-serializer": "^2.0.0", + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3" + }, + "funding": { + "url": "https://github.com/fb55/domutils?sponsor=1" + } + }, + "node_modules/eastasianwidth": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", + "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", + "dev": true, + "license": "MIT" + }, + "node_modules/electron-to-chromium": { + "version": "1.5.155", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.155.tgz", + "integrity": "sha512-ps5KcGGmwL8VaeJlvlDlu4fORQpv3+GIcF5I3f9tUKUlJ/wsysh6HU8P5L1XWRYeXfA0oJd4PyM8ds8zTFf6Ng==", + "dev": true, + "license": "ISC" + }, + "node_modules/emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", + "dev": true, + "license": "MIT" + }, + "node_modules/entities": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", + "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/env-paths": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", + "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-arrayish": "^0.2.1" + } + }, + "node_modules/escalade": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/estree-walker": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-0.6.1.tgz", + "integrity": "sha512-SqmZANLWS0mnatqbSfRP5g8OXZC12Fgg1IwNtLsyHDzJizORW4khDfjPqJZsemPWBB2uqykUah5YpQ6epsqC/w==", + "dev": true, + "license": "MIT" + }, + "node_modules/eventemitter3": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", + "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-glob": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz", + "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.8" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/fast-uri": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.0.6.tgz", + "integrity": "sha512-Atfo14OibSv5wAp4VWNsFYE1AchQRTv9cBGWET4pZWHzYshFSS9NQI6I57rdKn9croWVMbYFbLhJ+yJvmZIIHw==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fastify" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fastify" + } + ], + "license": "BSD-3-Clause" + }, + "node_modules/fastest-levenshtein": { + "version": "1.0.16", + "resolved": "https://registry.npmjs.org/fastest-levenshtein/-/fastest-levenshtein-1.0.16.tgz", + "integrity": "sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4.9.1" + } + }, + "node_modules/fastq": { + "version": "1.19.1", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.19.1.tgz", + "integrity": "sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/file-entry-cache": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-10.1.0.tgz", + "integrity": "sha512-Et/ex6smi3wOOB+n5mek+Grf7P2AxZR5ueqRUvAAn4qkyatXi3cUC1cuQXVkX0VlzBVsN4BkWJFmY/fYiRTdww==", + "dev": true, + "license": "MIT", + "dependencies": { + "flat-cache": "^6.1.9" + } + }, + "node_modules/fill-range": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", + "dev": true, + "license": "MIT", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/flat-cache": { + "version": "6.1.9", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-6.1.9.tgz", + "integrity": "sha512-DUqiKkTlAfhtl7g78IuwqYM+YqvT+as0mY+EVk6mfimy19U79pJCzDZQsnqk3Ou/T6hFXWLGbwbADzD/c8Tydg==", + "dev": true, + "license": "MIT", + "dependencies": { + "cacheable": "^1.9.0", + "flatted": "^3.3.3", + "hookified": "^1.8.2" + } + }, + "node_modules/flatted": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.3.tgz", + "integrity": "sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==", + "dev": true, + "license": "ISC" + }, + "node_modules/foreground-child": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.1.tgz", + "integrity": "sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==", + "dev": true, + "license": "ISC", + "dependencies": { + "cross-spawn": "^7.0.6", + "signal-exit": "^4.0.1" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/fraction.js": { + "version": "4.3.7", + "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.3.7.tgz", + "integrity": "sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==", + "dev": true, + "license": "MIT", + "engines": { + "node": "*" + }, + "funding": { + "type": "patreon", + "url": "https://github.com/sponsors/rawify" + } + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/generic-names": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/generic-names/-/generic-names-4.0.0.tgz", + "integrity": "sha512-ySFolZQfw9FoDb3ed9d80Cm9f0+r7qj+HJkWjeD9RBfpxEVTlVhol+gvaQB/78WbwYfbnNh8nWHHBSlg072y6A==", + "dev": true, + "license": "MIT", + "dependencies": { + "loader-utils": "^3.2.0" + } + }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "dev": true, + "license": "ISC", + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/glob": { + "version": "11.0.2", + "resolved": "https://registry.npmjs.org/glob/-/glob-11.0.2.tgz", + "integrity": "sha512-YT7U7Vye+t5fZ/QMkBFrTJ7ZQxInIUjwyAjVj84CYXqgBdv30MFUPGnBR6sQaVq6Is15wYJUsnzTuWaGRBhBAQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "foreground-child": "^3.1.0", + "jackspeak": "^4.0.1", + "minimatch": "^10.0.0", + "minipass": "^7.1.2", + "package-json-from-dist": "^1.0.0", + "path-scurry": "^2.0.0" + }, + "bin": { + "glob": "dist/esm/bin.mjs" + }, + "engines": { + "node": "20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/global-modules": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-2.0.0.tgz", + "integrity": "sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A==", + "dev": true, + "license": "MIT", + "dependencies": { + "global-prefix": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/global-prefix": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-3.0.0.tgz", + "integrity": "sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg==", + "dev": true, + "license": "MIT", + "dependencies": { + "ini": "^1.3.5", + "kind-of": "^6.0.2", + "which": "^1.3.1" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/global-prefix/node_modules/which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "which": "bin/which" + } + }, + "node_modules/globby": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", + "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", + "dev": true, + "license": "MIT", + "dependencies": { + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.2.9", + "ignore": "^5.2.0", + "merge2": "^1.4.1", + "slash": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/globby/node_modules/ignore": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", + "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/globby/node_modules/slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/globjoin": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/globjoin/-/globjoin-0.1.4.tgz", + "integrity": "sha512-xYfnw62CKG8nLkZBfWbhWwDw02CHty86jfPcc2cr3ZfeuK9ysoVPPEUxf21bAD/rWAgk52SuBrLJlefNy8mvFg==", + "dev": true, + "license": "MIT" + }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/hookified": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/hookified/-/hookified-1.9.0.tgz", + "integrity": "sha512-2yEEGqphImtKIe1NXWEhu6yD3hlFR4Mxk4Mtp3XEyScpSt4pQ4ymmXA1zzxZpj99QkFK+nN0nzjeb2+RUi/6CQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/html-tags": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/html-tags/-/html-tags-3.3.1.tgz", + "integrity": "sha512-ztqyC3kLto0e9WbNp0aeP+M3kTt+nbaIveGmUxAtZa+8iFgKLUOD4YKM5j+f3QD89bra7UeumolZHKuOXnTmeQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/icss-replace-symbols": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/icss-replace-symbols/-/icss-replace-symbols-1.1.0.tgz", + "integrity": "sha512-chIaY3Vh2mh2Q3RGXttaDIzeiPvaVXJ+C4DAh/w3c37SKZ/U6PGMmuicR2EQQp9bKG8zLMCl7I+PtIoOOPp8Gg==", + "dev": true, + "license": "ISC" + }, + "node_modules/icss-utils": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-5.1.0.tgz", + "integrity": "sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==", + "dev": true, + "license": "ISC", + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "BSD-3-Clause" + }, + "node_modules/ignore": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.4.tgz", + "integrity": "sha512-gJzzk+PQNznz8ysRrC0aOkBNVRBDtE1n53IqyqEf3PXrYwomFs5q4pGMizBMJF+ykh03insJ27hB8gSrD2Hn8A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/import-cwd": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/import-cwd/-/import-cwd-3.0.0.tgz", + "integrity": "sha512-4pnzH16plW+hgvRECbDWpQl3cqtvSofHWh44met7ESfZ8UZOWWddm8hEyDTqREJ9RbYHY8gi8DqmaelApoOGMg==", + "dev": true, + "license": "MIT", + "dependencies": { + "import-from": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/import-fresh": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz", + "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/import-fresh/node_modules/resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/import-from": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/import-from/-/import-from-3.0.0.tgz", + "integrity": "sha512-CiuXOFFSzkU5x/CR0+z7T91Iht4CXgfCxVOFRhh2Zyhg5wOpWvvDLQUsWl+gcN+QscYBjez8hDCt85O7RLDttQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "resolve-from": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/ini": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", + "dev": true, + "license": "ISC" + }, + "node_modules/is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", + "dev": true, + "license": "MIT" + }, + "node_modules/is-core-module": { + "version": "2.16.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz", + "integrity": "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==", + "dev": true, + "license": "MIT", + "dependencies": { + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-plain-object": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz", + "integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true, + "license": "ISC" + }, + "node_modules/jackspeak": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-4.1.0.tgz", + "integrity": "sha512-9DDdhb5j6cpeitCbvLO7n7J4IxnbM6hoF6O1g4HQ5TfhvvKN8ywDM7668ZhMHRqVmxqhps/F6syWK2KcPxYlkw==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "@isaacs/cliui": "^8.0.2" + }, + "engines": { + "node": "20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dev": true, + "license": "MIT", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", + "dev": true, + "license": "MIT" + }, + "node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true, + "license": "MIT" + }, + "node_modules/keyv": { + "version": "5.3.3", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-5.3.3.tgz", + "integrity": "sha512-Rwu4+nXI9fqcxiEHtbkvoes2X+QfkTRo1TMkPfwzipGsJlJO/z69vqB4FNl9xJ3xCpAcbkvmEabZfPzrwN3+gQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@keyv/serialize": "^1.0.3" + } + }, + "node_modules/kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/known-css-properties": { + "version": "0.36.0", + "resolved": "https://registry.npmjs.org/known-css-properties/-/known-css-properties-0.36.0.tgz", + "integrity": "sha512-A+9jP+IUmuQsNdsLdcg6Yt7voiMF/D4K83ew0OpJtpu+l34ef7LaohWV0Rc6KNvzw6ZDizkqfyB5JznZnzuKQA==", + "dev": true, + "license": "MIT" + }, + "node_modules/lilconfig": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.3.tgz", + "integrity": "sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/antonk52" + } + }, + "node_modules/lines-and-columns": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", + "dev": true, + "license": "MIT" + }, + "node_modules/loader-utils": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-3.3.1.tgz", + "integrity": "sha512-FMJTLMXfCLMLfJxcX9PFqX5qD88Z5MRGaZCVzfuqeZSPsyiBzs+pahDQjbIWz2QIzPZz0NX9Zy4FX3lmK6YHIg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 12.13.0" + } + }, + "node_modules/lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", + "dev": true, + "license": "MIT" + }, + "node_modules/lodash.camelcase": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz", + "integrity": "sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==", + "dev": true, + "license": "MIT" + }, + "node_modules/lodash.memoize": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", + "integrity": "sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==", + "dev": true, + "license": "MIT" + }, + "node_modules/lodash.truncate": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/lodash.truncate/-/lodash.truncate-4.4.2.tgz", + "integrity": "sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw==", + "dev": true, + "license": "MIT" + }, + "node_modules/lodash.uniq": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz", + "integrity": "sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/lru-cache": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.1.0.tgz", + "integrity": "sha512-QIXZUBJUx+2zHUdQujWejBkcD9+cs94tLn0+YL8UrCh+D5sCXZ4c7LaEH48pNwRY3MLDgqUFyhlCyjJPf1WP0A==", + "dev": true, + "license": "ISC", + "engines": { + "node": "20 || >=22" + } + }, + "node_modules/mathml-tag-names": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/mathml-tag-names/-/mathml-tag-names-2.1.3.tgz", + "integrity": "sha512-APMBEanjybaPzUrfqU0IMU5I0AswKMH7k8OTLs0vvV4KZpExkTkY87nR/zpbuTPj+gARop7aGUbl11pnDfW6xg==", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/mdn-data": { + "version": "2.12.2", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.12.2.tgz", + "integrity": "sha512-IEn+pegP1aManZuckezWCO+XZQDplx1366JoVhTpMpBB1sPey/SbveZQUosKiKiGYjg1wH4pMlNgXbCiYgihQA==", + "dev": true, + "license": "CC0-1.0" + }, + "node_modules/meow": { + "version": "13.2.0", + "resolved": "https://registry.npmjs.org/meow/-/meow-13.2.0.tgz", + "integrity": "sha512-pxQJQzB6djGPXh08dacEloMFopsOqGVRKFPYvPOt9XDZ1HasbgDZA74CJGreSU4G3Ak7EFJGoiH2auq+yXISgA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/micromatch": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", + "dev": true, + "license": "MIT", + "dependencies": { + "braces": "^3.0.3", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/minimatch": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.0.1.tgz", + "integrity": "sha512-ethXTt3SGGR+95gudmqJ1eNhRO7eGEGIgYA9vnPatK4/etz2MEVDno5GMCibdMTuBMyElzIlgxMna3K94XDIDQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": "20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/minipass": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", + "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true, + "license": "MIT" + }, + "node_modules/nanoid": { + "version": "3.3.11", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", + "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/node-releases": { + "version": "2.0.19", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.19.tgz", + "integrity": "sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==", + "dev": true, + "license": "MIT" + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/normalize-range": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", + "integrity": "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/normalize-url": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-6.1.0.tgz", + "integrity": "sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/nth-check": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", + "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "boolbase": "^1.0.0" + }, + "funding": { + "url": "https://github.com/fb55/nth-check?sponsor=1" + } + }, + "node_modules/p-finally": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", + "integrity": "sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/p-queue": { + "version": "6.6.2", + "resolved": "https://registry.npmjs.org/p-queue/-/p-queue-6.6.2.tgz", + "integrity": "sha512-RwFpb72c/BhQLEXIZ5K2e+AhgNVmIejGlTgiB9MzZ0e93GRvqZ7uSi0dvRF7/XIXDeNkra2fNHBxTyPDGySpjQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "eventemitter3": "^4.0.4", + "p-timeout": "^3.2.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-timeout": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-3.2.0.tgz", + "integrity": "sha512-rhIwUycgwwKcP9yTOOFK/AKsAopjjCakVqLHePO3CC6Mir1Z99xT+R63jZxAT5lFZLa2inS5h+ZS2GvR99/FBg==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-finally": "^1.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/package-json-from-dist": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz", + "integrity": "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==", + "dev": true, + "license": "BlueOak-1.0.0" + }, + "node_modules/parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, + "license": "MIT", + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/parse-json": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", + "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "dev": true, + "license": "MIT" + }, + "node_modules/path-scurry": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-2.0.0.tgz", + "integrity": "sha512-ypGJsmGtdXUOeM5u93TyeIEfEhM6s+ljAhrk5vAvSx8uyY/02OvrZnA0YNGUrPXfpJMgI1ODd3nwz8Npx4O4cg==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "lru-cache": "^11.0.0", + "minipass": "^7.1.2" + }, + "engines": { + "node": "20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "dev": true, + "license": "ISC" + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/postcss": { + "version": "8.5.5", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.5.tgz", + "integrity": "sha512-d/jtm+rdNT8tpXuHY5MMtcbJFBkhXE6593XVR9UoGCH8jSFGci7jGvMGH5RYd5PBJW+00NZQt6gf7CbagJCrhg==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "nanoid": "^3.3.11", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/postcss-attribute-case-insensitive": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/postcss-attribute-case-insensitive/-/postcss-attribute-case-insensitive-7.0.1.tgz", + "integrity": "sha512-Uai+SupNSqzlschRyNx3kbCTWgY/2hcwtHEI/ej2LJWc9JJ77qKgGptd8DHwY1mXtZ7Aoh4z4yxfwMBue9eNgw==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "dependencies": { + "postcss-selector-parser": "^7.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-calc": { + "version": "10.1.1", + "resolved": "https://registry.npmjs.org/postcss-calc/-/postcss-calc-10.1.1.tgz", + "integrity": "sha512-NYEsLHh8DgG/PRH2+G9BTuUdtf9ViS+vdoQ0YA5OQdGsfN4ztiwtDWNtBl9EKeqNMFnIu8IKZ0cLxEQ5r5KVMw==", + "dev": true, + "license": "MIT", + "dependencies": { + "postcss-selector-parser": "^7.0.0", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^18.12 || ^20.9 || >=22.0" + }, + "peerDependencies": { + "postcss": "^8.4.38" + } + }, + "node_modules/postcss-clamp": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/postcss-clamp/-/postcss-clamp-4.1.0.tgz", + "integrity": "sha512-ry4b1Llo/9zz+PKC+030KUnPITTJAHeOwjfAyyB60eT0AorGLdzp52s31OsPRHRf8NchkgFoG2y6fCfn1IV1Ow==", + "dev": true, + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": ">=7.6.0" + }, + "peerDependencies": { + "postcss": "^8.4.6" + } + }, + "node_modules/postcss-color-functional-notation": { + "version": "7.0.9", + "resolved": "https://registry.npmjs.org/postcss-color-functional-notation/-/postcss-color-functional-notation-7.0.9.tgz", + "integrity": "sha512-WScwD3pSsIz+QP97sPkGCeJm7xUH0J18k6zV5o8O2a4cQJyv15vLUx/WFQajuJVgZhmJL5awDu8zHnqzAzm4lw==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/css-color-parser": "^3.0.9", + "@csstools/css-parser-algorithms": "^3.0.4", + "@csstools/css-tokenizer": "^3.0.3", + "@csstools/postcss-progressive-custom-properties": "^4.0.1", + "@csstools/utilities": "^2.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-color-hex-alpha": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/postcss-color-hex-alpha/-/postcss-color-hex-alpha-10.0.0.tgz", + "integrity": "sha512-1kervM2cnlgPs2a8Vt/Qbe5cQ++N7rkYo/2rz2BkqJZIHQwaVuJgQH38REHrAi4uM0b1fqxMkWYmese94iMp3w==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "dependencies": { + "@csstools/utilities": "^2.0.0", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-color-rebeccapurple": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/postcss-color-rebeccapurple/-/postcss-color-rebeccapurple-10.0.0.tgz", + "integrity": "sha512-JFta737jSP+hdAIEhk1Vs0q0YF5P8fFcj+09pweS8ktuGuZ8pPlykHsk6mPxZ8awDl4TrcxUqJo9l1IhVr/OjQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/utilities": "^2.0.0", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-colormin": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/postcss-colormin/-/postcss-colormin-7.0.3.tgz", + "integrity": "sha512-xZxQcSyIVZbSsl1vjoqZAcMYYdnJsIyG8OvqShuuqf12S88qQboxxEy0ohNCOLwVPXTU+hFHvJPACRL2B5ohTA==", + "dev": true, + "license": "MIT", + "dependencies": { + "browserslist": "^4.24.5", + "caniuse-api": "^3.0.0", + "colord": "^2.9.3", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^18.12.0 || ^20.9.0 || >=22.0" + }, + "peerDependencies": { + "postcss": "^8.4.32" + } + }, + "node_modules/postcss-convert-values": { + "version": "7.0.5", + "resolved": "https://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-7.0.5.tgz", + "integrity": "sha512-0VFhH8nElpIs3uXKnVtotDJJNX0OGYSZmdt4XfSfvOMrFw1jKfpwpZxfC4iN73CTM/MWakDEmsHQXkISYj4BXw==", + "dev": true, + "license": "MIT", + "dependencies": { + "browserslist": "^4.24.5", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^18.12.0 || ^20.9.0 || >=22.0" + }, + "peerDependencies": { + "postcss": "^8.4.32" + } + }, + "node_modules/postcss-custom-media": { + "version": "11.0.5", + "resolved": "https://registry.npmjs.org/postcss-custom-media/-/postcss-custom-media-11.0.5.tgz", + "integrity": "sha512-SQHhayVNgDvSAdX9NQ/ygcDQGEY+aSF4b/96z7QUX6mqL5yl/JgG/DywcF6fW9XbnCRE+aVYk+9/nqGuzOPWeQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "dependencies": { + "@csstools/cascade-layer-name-parser": "^2.0.4", + "@csstools/css-parser-algorithms": "^3.0.4", + "@csstools/css-tokenizer": "^3.0.3", + "@csstools/media-query-list-parser": "^4.0.2" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-custom-properties": { + "version": "14.0.4", + "resolved": "https://registry.npmjs.org/postcss-custom-properties/-/postcss-custom-properties-14.0.4.tgz", + "integrity": "sha512-QnW8FCCK6q+4ierwjnmXF9Y9KF8q0JkbgVfvQEMa93x1GT8FvOiUevWCN2YLaOWyByeDX8S6VFbZEeWoAoXs2A==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "dependencies": { + "@csstools/cascade-layer-name-parser": "^2.0.4", + "@csstools/css-parser-algorithms": "^3.0.4", + "@csstools/css-tokenizer": "^3.0.3", + "@csstools/utilities": "^2.0.0", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-custom-selectors": { + "version": "8.0.4", + "resolved": "https://registry.npmjs.org/postcss-custom-selectors/-/postcss-custom-selectors-8.0.4.tgz", + "integrity": "sha512-ASOXqNvDCE0dAJ/5qixxPeL1aOVGHGW2JwSy7HyjWNbnWTQCl+fDc968HY1jCmZI0+BaYT5CxsOiUhavpG/7eg==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "dependencies": { + "@csstools/cascade-layer-name-parser": "^2.0.4", + "@csstools/css-parser-algorithms": "^3.0.4", + "@csstools/css-tokenizer": "^3.0.3", + "postcss-selector-parser": "^7.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-dir-pseudo-class": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/postcss-dir-pseudo-class/-/postcss-dir-pseudo-class-9.0.1.tgz", + "integrity": "sha512-tRBEK0MHYvcMUrAuYMEOa0zg9APqirBcgzi6P21OhxtJyJADo/SWBwY1CAwEohQ/6HDaa9jCjLRG7K3PVQYHEA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "postcss-selector-parser": "^7.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-discard-comments": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/postcss-discard-comments/-/postcss-discard-comments-7.0.4.tgz", + "integrity": "sha512-6tCUoql/ipWwKtVP/xYiFf1U9QgJ0PUvxN7pTcsQ8Ns3Fnwq1pU5D5s1MhT/XySeLq6GXNvn37U46Ded0TckWg==", + "dev": true, + "license": "MIT", + "dependencies": { + "postcss-selector-parser": "^7.1.0" + }, + "engines": { + "node": "^18.12.0 || ^20.9.0 || >=22.0" + }, + "peerDependencies": { + "postcss": "^8.4.32" + } + }, + "node_modules/postcss-discard-duplicates": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/postcss-discard-duplicates/-/postcss-discard-duplicates-7.0.2.tgz", + "integrity": "sha512-eTonaQvPZ/3i1ASDHOKkYwAybiM45zFIc7KXils4mQmHLqIswXD9XNOKEVxtTFnsmwYzF66u4LMgSr0abDlh5w==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.12.0 || ^20.9.0 || >=22.0" + }, + "peerDependencies": { + "postcss": "^8.4.32" + } + }, + "node_modules/postcss-discard-empty": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/postcss-discard-empty/-/postcss-discard-empty-7.0.1.tgz", + "integrity": "sha512-cFrJKZvcg/uxB6Ijr4l6qmn3pXQBna9zyrPC+sK0zjbkDUZew+6xDltSF7OeB7rAtzaaMVYSdbod+sZOCWnMOg==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.12.0 || ^20.9.0 || >=22.0" + }, + "peerDependencies": { + "postcss": "^8.4.32" + } + }, + "node_modules/postcss-discard-overridden": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/postcss-discard-overridden/-/postcss-discard-overridden-7.0.1.tgz", + "integrity": "sha512-7c3MMjjSZ/qYrx3uc1940GSOzN1Iqjtlqe8uoSg+qdVPYyRb0TILSqqmtlSFuE4mTDECwsm397Ya7iXGzfF7lg==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.12.0 || ^20.9.0 || >=22.0" + }, + "peerDependencies": { + "postcss": "^8.4.32" + } + }, + "node_modules/postcss-double-position-gradients": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/postcss-double-position-gradients/-/postcss-double-position-gradients-6.0.1.tgz", + "integrity": "sha512-ZitCwmvOR4JzXmKw6sZblTgwV1dcfLvClcyjADuqZ5hU0Uk4SVNpvSN9w8NcJ7XuxhRYxVA8m8AB3gy+HNBQOA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/postcss-progressive-custom-properties": "^4.0.1", + "@csstools/utilities": "^2.0.0", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-focus-visible": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/postcss-focus-visible/-/postcss-focus-visible-10.0.1.tgz", + "integrity": "sha512-U58wyjS/I1GZgjRok33aE8juW9qQgQUNwTSdxQGuShHzwuYdcklnvK/+qOWX1Q9kr7ysbraQ6ht6r+udansalA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "postcss-selector-parser": "^7.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-focus-within": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/postcss-focus-within/-/postcss-focus-within-9.0.1.tgz", + "integrity": "sha512-fzNUyS1yOYa7mOjpci/bR+u+ESvdar6hk8XNK/TRR0fiGTp2QT5N+ducP0n3rfH/m9I7H/EQU6lsa2BrgxkEjw==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "postcss-selector-parser": "^7.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-font-variant": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/postcss-font-variant/-/postcss-font-variant-5.0.0.tgz", + "integrity": "sha512-1fmkBaCALD72CK2a9i468mA/+tr9/1cBxRRMXOUaZqO43oWPR5imcyPjXwuv7PXbCid4ndlP5zWhidQVVa3hmA==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/postcss-gap-properties": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/postcss-gap-properties/-/postcss-gap-properties-6.0.0.tgz", + "integrity": "sha512-Om0WPjEwiM9Ru+VhfEDPZJAKWUd0mV1HmNXqp2C29z80aQ2uP9UVhLc7e3aYMIor/S5cVhoPgYQ7RtfeZpYTRw==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-image-set-function": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/postcss-image-set-function/-/postcss-image-set-function-7.0.0.tgz", + "integrity": "sha512-QL7W7QNlZuzOwBTeXEmbVckNt1FSmhQtbMRvGGqqU4Nf4xk6KUEQhAoWuMzwbSv5jxiRiSZ5Tv7eiDB9U87znA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/utilities": "^2.0.0", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-import": { + "version": "16.1.0", + "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-16.1.0.tgz", + "integrity": "sha512-7hsAZ4xGXl4MW+OKEWCnF6T5jqBw80/EE9aXg1r2yyn1RsVEU8EtKXbijEODa+rg7iih4bKf7vlvTGYR4CnPNg==", + "dev": true, + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.0.0", + "read-cache": "^1.0.0", + "resolve": "^1.1.7" + }, + "engines": { + "node": ">=18.0.0" + }, + "peerDependencies": { + "postcss": "^8.0.0" + } + }, + "node_modules/postcss-lab-function": { + "version": "7.0.9", + "resolved": "https://registry.npmjs.org/postcss-lab-function/-/postcss-lab-function-7.0.9.tgz", + "integrity": "sha512-IGbsIXbqMDusymJAKYX+f9oakPo89wL9Pzd/qRBQOVf3EIQWT9hgvqC4Me6Dkzxp3KPuIBf6LPkjrLHe/6ZMIQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/css-color-parser": "^3.0.9", + "@csstools/css-parser-algorithms": "^3.0.4", + "@csstools/css-tokenizer": "^3.0.3", + "@csstools/postcss-progressive-custom-properties": "^4.0.1", + "@csstools/utilities": "^2.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-load-config": { + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-3.1.4.tgz", + "integrity": "sha512-6DiM4E7v4coTE4uzA8U//WhtPwyhiim3eyjEMFCnUpzbrkK9wJHgKDT2mR+HbtSrd/NubVaYTOpSpjUl8NQeRg==", + "dev": true, + "license": "MIT", + "dependencies": { + "lilconfig": "^2.0.5", + "yaml": "^1.10.2" + }, + "engines": { + "node": ">= 10" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + "peerDependencies": { + "postcss": ">=8.0.9", + "ts-node": ">=9.0.0" + }, + "peerDependenciesMeta": { + "postcss": { + "optional": true + }, + "ts-node": { + "optional": true + } + } + }, + "node_modules/postcss-load-config/node_modules/lilconfig": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.1.0.tgz", + "integrity": "sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "node_modules/postcss-logical": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/postcss-logical/-/postcss-logical-8.1.0.tgz", + "integrity": "sha512-pL1hXFQ2fEXNKiNiAgtfA005T9FBxky5zkX6s4GZM2D8RkVgRqz3f4g1JUoq925zXv495qk8UNldDwh8uGEDoA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-merge-longhand": { + "version": "7.0.5", + "resolved": "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-7.0.5.tgz", + "integrity": "sha512-Kpu5v4Ys6QI59FxmxtNB/iHUVDn9Y9sYw66D6+SZoIk4QTz1prC4aYkhIESu+ieG1iylod1f8MILMs1Em3mmIw==", + "dev": true, + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.2.0", + "stylehacks": "^7.0.5" + }, + "engines": { + "node": "^18.12.0 || ^20.9.0 || >=22.0" + }, + "peerDependencies": { + "postcss": "^8.4.32" + } + }, + "node_modules/postcss-merge-rules": { + "version": "7.0.5", + "resolved": "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-7.0.5.tgz", + "integrity": "sha512-ZonhuSwEaWA3+xYbOdJoEReKIBs5eDiBVLAGpYZpNFPzXZcEE5VKR7/qBEQvTZpiwjqhhqEQ+ax5O3VShBj9Wg==", + "dev": true, + "license": "MIT", + "dependencies": { + "browserslist": "^4.24.5", + "caniuse-api": "^3.0.0", + "cssnano-utils": "^5.0.1", + "postcss-selector-parser": "^7.1.0" + }, + "engines": { + "node": "^18.12.0 || ^20.9.0 || >=22.0" + }, + "peerDependencies": { + "postcss": "^8.4.32" + } + }, + "node_modules/postcss-minify-font-values": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/postcss-minify-font-values/-/postcss-minify-font-values-7.0.1.tgz", + "integrity": "sha512-2m1uiuJeTplll+tq4ENOQSzB8LRnSUChBv7oSyFLsJRtUgAAJGP6LLz0/8lkinTgxrmJSPOEhgY1bMXOQ4ZXhQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^18.12.0 || ^20.9.0 || >=22.0" + }, + "peerDependencies": { + "postcss": "^8.4.32" + } + }, + "node_modules/postcss-minify-gradients": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/postcss-minify-gradients/-/postcss-minify-gradients-7.0.1.tgz", + "integrity": "sha512-X9JjaysZJwlqNkJbUDgOclyG3jZEpAMOfof6PUZjPnPrePnPG62pS17CjdM32uT1Uq1jFvNSff9l7kNbmMSL2A==", + "dev": true, + "license": "MIT", + "dependencies": { + "colord": "^2.9.3", + "cssnano-utils": "^5.0.1", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^18.12.0 || ^20.9.0 || >=22.0" + }, + "peerDependencies": { + "postcss": "^8.4.32" + } + }, + "node_modules/postcss-minify-params": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/postcss-minify-params/-/postcss-minify-params-7.0.3.tgz", + "integrity": "sha512-vUKV2+f5mtjewYieanLX0xemxIp1t0W0H/D11u+kQV/MWdygOO7xPMkbK+r9P6Lhms8MgzKARF/g5OPXhb8tgg==", + "dev": true, + "license": "MIT", + "dependencies": { + "browserslist": "^4.24.5", + "cssnano-utils": "^5.0.1", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^18.12.0 || ^20.9.0 || >=22.0" + }, + "peerDependencies": { + "postcss": "^8.4.32" + } + }, + "node_modules/postcss-minify-selectors": { + "version": "7.0.5", + "resolved": "https://registry.npmjs.org/postcss-minify-selectors/-/postcss-minify-selectors-7.0.5.tgz", + "integrity": "sha512-x2/IvofHcdIrAm9Q+p06ZD1h6FPcQ32WtCRVodJLDR+WMn8EVHI1kvLxZuGKz/9EY5nAmI6lIQIrpo4tBy5+ug==", + "dev": true, + "license": "MIT", + "dependencies": { + "cssesc": "^3.0.0", + "postcss-selector-parser": "^7.1.0" + }, + "engines": { + "node": "^18.12.0 || ^20.9.0 || >=22.0" + }, + "peerDependencies": { + "postcss": "^8.4.32" + } + }, + "node_modules/postcss-modules": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/postcss-modules/-/postcss-modules-4.3.1.tgz", + "integrity": "sha512-ItUhSUxBBdNamkT3KzIZwYNNRFKmkJrofvC2nWab3CPKhYBQ1f27XXh1PAPE27Psx58jeelPsxWB/+og+KEH0Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "generic-names": "^4.0.0", + "icss-replace-symbols": "^1.1.0", + "lodash.camelcase": "^4.3.0", + "postcss-modules-extract-imports": "^3.0.0", + "postcss-modules-local-by-default": "^4.0.0", + "postcss-modules-scope": "^3.0.0", + "postcss-modules-values": "^4.0.0", + "string-hash": "^1.1.1" + }, + "peerDependencies": { + "postcss": "^8.0.0" + } + }, + "node_modules/postcss-modules-extract-imports": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.1.0.tgz", + "integrity": "sha512-k3kNe0aNFQDAZGbin48pL2VNidTF0w4/eASDsxlyspobzU3wZQLOGj7L9gfRe0Jo9/4uud09DsjFNH7winGv8Q==", + "dev": true, + "license": "ISC", + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/postcss-modules-local-by-default": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.2.0.tgz", + "integrity": "sha512-5kcJm/zk+GJDSfw+V/42fJ5fhjL5YbFDl8nVdXkJPLLW+Vf9mTD5Xe0wqIaDnLuL2U6cDNpTr+UQ+v2HWIBhzw==", + "dev": true, + "license": "MIT", + "dependencies": { + "icss-utils": "^5.0.0", + "postcss-selector-parser": "^7.0.0", + "postcss-value-parser": "^4.1.0" + }, + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/postcss-modules-scope": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-3.2.1.tgz", + "integrity": "sha512-m9jZstCVaqGjTAuny8MdgE88scJnCiQSlSrOWcTQgM2t32UBe+MUmFSO5t7VMSfAf/FJKImAxBav8ooCHJXCJA==", + "dev": true, + "license": "ISC", + "dependencies": { + "postcss-selector-parser": "^7.0.0" + }, + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/postcss-modules-values": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-4.0.0.tgz", + "integrity": "sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "icss-utils": "^5.0.0" + }, + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/postcss-nesting": { + "version": "13.0.1", + "resolved": "https://registry.npmjs.org/postcss-nesting/-/postcss-nesting-13.0.1.tgz", + "integrity": "sha512-VbqqHkOBOt4Uu3G8Dm8n6lU5+9cJFxiuty9+4rcoyRPO9zZS1JIs6td49VIoix3qYqELHlJIn46Oih9SAKo+yQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/selector-resolve-nested": "^3.0.0", + "@csstools/selector-specificity": "^5.0.0", + "postcss-selector-parser": "^7.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-normalize-charset": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-charset/-/postcss-normalize-charset-7.0.1.tgz", + "integrity": "sha512-sn413ofhSQHlZFae//m9FTOfkmiZ+YQXsbosqOWRiVQncU2BA3daX3n0VF3cG6rGLSFVc5Di/yns0dFfh8NFgQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.12.0 || ^20.9.0 || >=22.0" + }, + "peerDependencies": { + "postcss": "^8.4.32" + } + }, + "node_modules/postcss-normalize-display-values": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-display-values/-/postcss-normalize-display-values-7.0.1.tgz", + "integrity": "sha512-E5nnB26XjSYz/mGITm6JgiDpAbVuAkzXwLzRZtts19jHDUBFxZ0BkXAehy0uimrOjYJbocby4FVswA/5noOxrQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^18.12.0 || ^20.9.0 || >=22.0" + }, + "peerDependencies": { + "postcss": "^8.4.32" + } + }, + "node_modules/postcss-normalize-positions": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-positions/-/postcss-normalize-positions-7.0.1.tgz", + "integrity": "sha512-pB/SzrIP2l50ZIYu+yQZyMNmnAcwyYb9R1fVWPRxm4zcUFCY2ign7rcntGFuMXDdd9L2pPNUgoODDk91PzRZuQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^18.12.0 || ^20.9.0 || >=22.0" + }, + "peerDependencies": { + "postcss": "^8.4.32" + } + }, + "node_modules/postcss-normalize-repeat-style": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-7.0.1.tgz", + "integrity": "sha512-NsSQJ8zj8TIDiF0ig44Byo3Jk9e4gNt9x2VIlJudnQQ5DhWAHJPF4Tr1ITwyHio2BUi/I6Iv0HRO7beHYOloYQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^18.12.0 || ^20.9.0 || >=22.0" + }, + "peerDependencies": { + "postcss": "^8.4.32" + } + }, + "node_modules/postcss-normalize-string": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-string/-/postcss-normalize-string-7.0.1.tgz", + "integrity": "sha512-QByrI7hAhsoze992kpbMlJSbZ8FuCEc1OT9EFbZ6HldXNpsdpZr+YXC5di3UEv0+jeZlHbZcoCADgb7a+lPmmQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^18.12.0 || ^20.9.0 || >=22.0" + }, + "peerDependencies": { + "postcss": "^8.4.32" + } + }, + "node_modules/postcss-normalize-timing-functions": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-7.0.1.tgz", + "integrity": "sha512-bHifyuuSNdKKsnNJ0s8fmfLMlvsQwYVxIoUBnowIVl2ZAdrkYQNGVB4RxjfpvkMjipqvbz0u7feBZybkl/6NJg==", + "dev": true, + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^18.12.0 || ^20.9.0 || >=22.0" + }, + "peerDependencies": { + "postcss": "^8.4.32" + } + }, + "node_modules/postcss-normalize-unicode": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/postcss-normalize-unicode/-/postcss-normalize-unicode-7.0.3.tgz", + "integrity": "sha512-EcoA29LvG3F+EpOh03iqu+tJY3uYYKzArqKJHxDhUYLa2u58aqGq16K6/AOsXD9yqLN8O6y9mmePKN5cx6krOw==", + "dev": true, + "license": "MIT", + "dependencies": { + "browserslist": "^4.24.5", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^18.12.0 || ^20.9.0 || >=22.0" + }, + "peerDependencies": { + "postcss": "^8.4.32" + } + }, + "node_modules/postcss-normalize-url": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-url/-/postcss-normalize-url-7.0.1.tgz", + "integrity": "sha512-sUcD2cWtyK1AOL/82Fwy1aIVm/wwj5SdZkgZ3QiUzSzQQofrbq15jWJ3BA7Z+yVRwamCjJgZJN0I9IS7c6tgeQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^18.12.0 || ^20.9.0 || >=22.0" + }, + "peerDependencies": { + "postcss": "^8.4.32" + } + }, + "node_modules/postcss-normalize-whitespace": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-whitespace/-/postcss-normalize-whitespace-7.0.1.tgz", + "integrity": "sha512-vsbgFHMFQrJBJKrUFJNZ2pgBeBkC2IvvoHjz1to0/0Xk7sII24T0qFOiJzG6Fu3zJoq/0yI4rKWi7WhApW+EFA==", + "dev": true, + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^18.12.0 || ^20.9.0 || >=22.0" + }, + "peerDependencies": { + "postcss": "^8.4.32" + } + }, + "node_modules/postcss-opacity-percentage": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/postcss-opacity-percentage/-/postcss-opacity-percentage-3.0.0.tgz", + "integrity": "sha512-K6HGVzyxUxd/VgZdX04DCtdwWJ4NGLG212US4/LA1TLAbHgmAsTWVR86o+gGIbFtnTkfOpb9sCRBx8K7HO66qQ==", + "dev": true, + "funding": [ + { + "type": "kofi", + "url": "https://ko-fi.com/mrcgrtz" + }, + { + "type": "liberapay", + "url": "https://liberapay.com/mrcgrtz" + } + ], + "license": "MIT", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-ordered-values": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/postcss-ordered-values/-/postcss-ordered-values-7.0.2.tgz", + "integrity": "sha512-AMJjt1ECBffF7CEON/Y0rekRLS6KsePU6PRP08UqYW4UGFRnTXNrByUzYK1h8AC7UWTZdQ9O3Oq9kFIhm0SFEw==", + "dev": true, + "license": "MIT", + "dependencies": { + "cssnano-utils": "^5.0.1", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^18.12.0 || ^20.9.0 || >=22.0" + }, + "peerDependencies": { + "postcss": "^8.4.32" + } + }, + "node_modules/postcss-overflow-shorthand": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/postcss-overflow-shorthand/-/postcss-overflow-shorthand-6.0.0.tgz", + "integrity": "sha512-BdDl/AbVkDjoTofzDQnwDdm/Ym6oS9KgmO7Gr+LHYjNWJ6ExORe4+3pcLQsLA9gIROMkiGVjjwZNoL/mpXHd5Q==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-page-break": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/postcss-page-break/-/postcss-page-break-3.0.4.tgz", + "integrity": "sha512-1JGu8oCjVXLa9q9rFTo4MbeeA5FMe00/9C7lN4va606Rdb+HkxXtXsmEDrIraQ11fGz/WvKWa8gMuCKkrXpTsQ==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "postcss": "^8" + } + }, + "node_modules/postcss-place": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/postcss-place/-/postcss-place-10.0.0.tgz", + "integrity": "sha512-5EBrMzat2pPAxQNWYavwAfoKfYcTADJ8AXGVPcUZ2UkNloUTWzJQExgrzrDkh3EKzmAx1evfTAzF9I8NGcc+qw==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-preset-env": { + "version": "10.1.6", + "resolved": "https://registry.npmjs.org/postcss-preset-env/-/postcss-preset-env-10.1.6.tgz", + "integrity": "sha512-1jRD7vttKLJ7o0mcmmYWKRLm7W14rI8K1I7Y41OeXUPEVc/CAzfTssNUeJ0zKbR+zMk4boqct/gwS/poIFF5Lg==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/postcss-cascade-layers": "^5.0.1", + "@csstools/postcss-color-function": "^4.0.9", + "@csstools/postcss-color-mix-function": "^3.0.9", + "@csstools/postcss-content-alt-text": "^2.0.5", + "@csstools/postcss-exponential-functions": "^2.0.8", + "@csstools/postcss-font-format-keywords": "^4.0.0", + "@csstools/postcss-gamut-mapping": "^2.0.9", + "@csstools/postcss-gradients-interpolation-method": "^5.0.9", + "@csstools/postcss-hwb-function": "^4.0.9", + "@csstools/postcss-ic-unit": "^4.0.1", + "@csstools/postcss-initial": "^2.0.1", + "@csstools/postcss-is-pseudo-class": "^5.0.1", + "@csstools/postcss-light-dark-function": "^2.0.8", + "@csstools/postcss-logical-float-and-clear": "^3.0.0", + "@csstools/postcss-logical-overflow": "^2.0.0", + "@csstools/postcss-logical-overscroll-behavior": "^2.0.0", + "@csstools/postcss-logical-resize": "^3.0.0", + "@csstools/postcss-logical-viewport-units": "^3.0.3", + "@csstools/postcss-media-minmax": "^2.0.8", + "@csstools/postcss-media-queries-aspect-ratio-number-values": "^3.0.4", + "@csstools/postcss-nested-calc": "^4.0.0", + "@csstools/postcss-normalize-display-values": "^4.0.0", + "@csstools/postcss-oklab-function": "^4.0.9", + "@csstools/postcss-progressive-custom-properties": "^4.0.1", + "@csstools/postcss-random-function": "^2.0.0", + "@csstools/postcss-relative-color-syntax": "^3.0.9", + "@csstools/postcss-scope-pseudo-class": "^4.0.1", + "@csstools/postcss-sign-functions": "^1.1.3", + "@csstools/postcss-stepped-value-functions": "^4.0.8", + "@csstools/postcss-text-decoration-shorthand": "^4.0.2", + "@csstools/postcss-trigonometric-functions": "^4.0.8", + "@csstools/postcss-unset-value": "^4.0.0", + "autoprefixer": "^10.4.21", + "browserslist": "^4.24.4", + "css-blank-pseudo": "^7.0.1", + "css-has-pseudo": "^7.0.2", + "css-prefers-color-scheme": "^10.0.0", + "cssdb": "^8.2.5", + "postcss-attribute-case-insensitive": "^7.0.1", + "postcss-clamp": "^4.1.0", + "postcss-color-functional-notation": "^7.0.9", + "postcss-color-hex-alpha": "^10.0.0", + "postcss-color-rebeccapurple": "^10.0.0", + "postcss-custom-media": "^11.0.5", + "postcss-custom-properties": "^14.0.4", + "postcss-custom-selectors": "^8.0.4", + "postcss-dir-pseudo-class": "^9.0.1", + "postcss-double-position-gradients": "^6.0.1", + "postcss-focus-visible": "^10.0.1", + "postcss-focus-within": "^9.0.1", + "postcss-font-variant": "^5.0.0", + "postcss-gap-properties": "^6.0.0", + "postcss-image-set-function": "^7.0.0", + "postcss-lab-function": "^7.0.9", + "postcss-logical": "^8.1.0", + "postcss-nesting": "^13.0.1", + "postcss-opacity-percentage": "^3.0.0", + "postcss-overflow-shorthand": "^6.0.0", + "postcss-page-break": "^3.0.4", + "postcss-place": "^10.0.0", + "postcss-pseudo-class-any-link": "^10.0.1", + "postcss-replace-overflow-wrap": "^4.0.0", + "postcss-selector-not": "^8.0.1" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-pseudo-class-any-link": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/postcss-pseudo-class-any-link/-/postcss-pseudo-class-any-link-10.0.1.tgz", + "integrity": "sha512-3el9rXlBOqTFaMFkWDOkHUTQekFIYnaQY55Rsp8As8QQkpiSgIYEcF/6Ond93oHiDsGb4kad8zjt+NPlOC1H0Q==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "postcss-selector-parser": "^7.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-reduce-initial": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/postcss-reduce-initial/-/postcss-reduce-initial-7.0.3.tgz", + "integrity": "sha512-RFvkZaqiWtGMlVjlUHpaxGqEL27lgt+Q2Ixjf83CRAzqdo+TsDyGPtJUbPx2MuYIJ+sCQc2TrOvRnhcXQfgIVA==", + "dev": true, + "license": "MIT", + "dependencies": { + "browserslist": "^4.24.5", + "caniuse-api": "^3.0.0" + }, + "engines": { + "node": "^18.12.0 || ^20.9.0 || >=22.0" + }, + "peerDependencies": { + "postcss": "^8.4.32" + } + }, + "node_modules/postcss-reduce-transforms": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/postcss-reduce-transforms/-/postcss-reduce-transforms-7.0.1.tgz", + "integrity": "sha512-MhyEbfrm+Mlp/36hvZ9mT9DaO7dbncU0CvWI8V93LRkY6IYlu38OPg3FObnuKTUxJ4qA8HpurdQOo5CyqqO76g==", + "dev": true, + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^18.12.0 || ^20.9.0 || >=22.0" + }, + "peerDependencies": { + "postcss": "^8.4.32" + } + }, + "node_modules/postcss-replace-overflow-wrap": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/postcss-replace-overflow-wrap/-/postcss-replace-overflow-wrap-4.0.0.tgz", + "integrity": "sha512-KmF7SBPphT4gPPcKZc7aDkweHiKEEO8cla/GjcBK+ckKxiZslIu3C4GCRW3DNfL0o7yW7kMQu9xlZ1kXRXLXtw==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "postcss": "^8.0.3" + } + }, + "node_modules/postcss-resolve-nested-selector": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/postcss-resolve-nested-selector/-/postcss-resolve-nested-selector-0.1.6.tgz", + "integrity": "sha512-0sglIs9Wmkzbr8lQwEyIzlDOOC9bGmfVKcJTaxv3vMmd3uo4o4DerC3En0bnmgceeql9BfC8hRkp7cg0fjdVqw==", + "dev": true, + "license": "MIT" + }, + "node_modules/postcss-safe-parser": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/postcss-safe-parser/-/postcss-safe-parser-7.0.1.tgz", + "integrity": "sha512-0AioNCJZ2DPYz5ABT6bddIqlhgwhpHZ/l65YAYo0BCIn0xiDpsnTHz0gnoTGk0OXZW0JRs+cDwL8u/teRdz+8A==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss-safe-parser" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "engines": { + "node": ">=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-selector-not": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/postcss-selector-not/-/postcss-selector-not-8.0.1.tgz", + "integrity": "sha512-kmVy/5PYVb2UOhy0+LqUYAhKj7DUGDpSWa5LZqlkWJaaAV+dxxsOG3+St0yNLu6vsKD7Dmqx+nWQt0iil89+WA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "dependencies": { + "postcss-selector-parser": "^7.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-selector-parser": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.0.tgz", + "integrity": "sha512-8sLjZwK0R+JlxlYcTuVnyT2v+htpdrjDOKuMcOVdYjt52Lh8hWRYpxBPoKx/Zg+bcjc3wx6fmQevMmUztS/ccA==", + "dev": true, + "license": "MIT", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-svgo": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/postcss-svgo/-/postcss-svgo-7.0.2.tgz", + "integrity": "sha512-5Dzy66JlnRM6pkdOTF8+cGsB1fnERTE8Nc+Eed++fOWo1hdsBptCsbG8UuJkgtZt75bRtMJIrPeZmtfANixdFA==", + "dev": true, + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.2.0", + "svgo": "^3.3.2" + }, + "engines": { + "node": "^18.12.0 || ^20.9.0 || >= 18" + }, + "peerDependencies": { + "postcss": "^8.4.32" + } + }, + "node_modules/postcss-unique-selectors": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/postcss-unique-selectors/-/postcss-unique-selectors-7.0.4.tgz", + "integrity": "sha512-pmlZjsmEAG7cHd7uK3ZiNSW6otSZ13RHuZ/4cDN/bVglS5EpF2r2oxY99SuOHa8m7AWoBCelTS3JPpzsIs8skQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "postcss-selector-parser": "^7.1.0" + }, + "engines": { + "node": "^18.12.0 || ^20.9.0 || >=22.0" + }, + "peerDependencies": { + "postcss": "^8.4.32" + } + }, + "node_modules/postcss-value-parser": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", + "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/postcss-variable-compress": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/postcss-variable-compress/-/postcss-variable-compress-3.0.0.tgz", + "integrity": "sha512-BTQHgBF3dmM1UmqR/Zn8X4U1jYnE9iQywKJFYaf4h0+KRKYvXd6jjU8ODlPq681I/Wdy97sja603b9kD3xq9Ow==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "postcss": "^8.2.8" + } + }, + "node_modules/promise.series": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/promise.series/-/promise.series-0.2.0.tgz", + "integrity": "sha512-VWQJyU2bcDTgZw8kpfBpB/ejZASlCrzwz5f2hjb/zlujOEB4oeiAhHygAWq8ubsX2GVkD4kCU5V2dwOTaCY5EQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.12" + } + }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/randombytes": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "safe-buffer": "^5.1.0" + } + }, + "node_modules/read-cache": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", + "integrity": "sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==", + "dev": true, + "license": "MIT", + "dependencies": { + "pify": "^2.3.0" + } + }, + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/resolve": { + "version": "1.22.10", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.10.tgz", + "integrity": "sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-core-module": "^2.16.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/reusify": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz", + "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==", + "dev": true, + "license": "MIT", + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/rollup": { + "version": "4.40.2", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.40.2.tgz", + "integrity": "sha512-tfUOg6DTP4rhQ3VjOO6B4wyrJnGOX85requAXvqYTHsOgb2TFJdZ3aWpT8W2kPoypSGP7dZUyzxJ9ee4buM5Fg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "1.0.7" + }, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=18.0.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "@rollup/rollup-android-arm-eabi": "4.40.2", + "@rollup/rollup-android-arm64": "4.40.2", + "@rollup/rollup-darwin-arm64": "4.40.2", + "@rollup/rollup-darwin-x64": "4.40.2", + "@rollup/rollup-freebsd-arm64": "4.40.2", + "@rollup/rollup-freebsd-x64": "4.40.2", + "@rollup/rollup-linux-arm-gnueabihf": "4.40.2", + "@rollup/rollup-linux-arm-musleabihf": "4.40.2", + "@rollup/rollup-linux-arm64-gnu": "4.40.2", + "@rollup/rollup-linux-arm64-musl": "4.40.2", + "@rollup/rollup-linux-loongarch64-gnu": "4.40.2", + "@rollup/rollup-linux-powerpc64le-gnu": "4.40.2", + "@rollup/rollup-linux-riscv64-gnu": "4.40.2", + "@rollup/rollup-linux-riscv64-musl": "4.40.2", + "@rollup/rollup-linux-s390x-gnu": "4.40.2", + "@rollup/rollup-linux-x64-gnu": "4.40.2", + "@rollup/rollup-linux-x64-musl": "4.40.2", + "@rollup/rollup-win32-arm64-msvc": "4.40.2", + "@rollup/rollup-win32-ia32-msvc": "4.40.2", + "@rollup/rollup-win32-x64-msvc": "4.40.2", + "fsevents": "~2.3.2" + } + }, + "node_modules/rollup-plugin-postcss": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/rollup-plugin-postcss/-/rollup-plugin-postcss-4.0.2.tgz", + "integrity": "sha512-05EaY6zvZdmvPUDi3uCcAQoESDcYnv8ogJJQRp6V5kZ6J6P7uAVJlrTZcaaA20wTH527YTnKfkAoPxWI/jPp4w==", + "dev": true, + "license": "MIT", + "dependencies": { + "chalk": "^4.1.0", + "concat-with-sourcemaps": "^1.1.0", + "cssnano": "^5.0.1", + "import-cwd": "^3.0.0", + "p-queue": "^6.6.2", + "pify": "^5.0.0", + "postcss-load-config": "^3.0.0", + "postcss-modules": "^4.0.0", + "promise.series": "^0.2.0", + "resolve": "^1.19.0", + "rollup-pluginutils": "^2.8.2", + "safe-identifier": "^0.4.2", + "style-inject": "^0.3.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "postcss": "8.x" + } + }, + "node_modules/rollup-plugin-postcss/node_modules/css-declaration-sorter": { + "version": "6.4.1", + "resolved": "https://registry.npmjs.org/css-declaration-sorter/-/css-declaration-sorter-6.4.1.tgz", + "integrity": "sha512-rtdthzxKuyq6IzqX6jEcIzQF/YqccluefyCYheovBOLhFT/drQA9zj/UbRAa9J7C0o6EG6u3E6g+vKkay7/k3g==", + "dev": true, + "license": "ISC", + "engines": { + "node": "^10 || ^12 || >=14" + }, + "peerDependencies": { + "postcss": "^8.0.9" + } + }, + "node_modules/rollup-plugin-postcss/node_modules/css-select": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-4.3.0.tgz", + "integrity": "sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "boolbase": "^1.0.0", + "css-what": "^6.0.1", + "domhandler": "^4.3.1", + "domutils": "^2.8.0", + "nth-check": "^2.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/rollup-plugin-postcss/node_modules/css-tree": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.1.3.tgz", + "integrity": "sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "mdn-data": "2.0.14", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/rollup-plugin-postcss/node_modules/cssnano": { + "version": "5.1.15", + "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-5.1.15.tgz", + "integrity": "sha512-j+BKgDcLDQA+eDifLx0EO4XSA56b7uut3BQFH+wbSaSTuGLuiyTa/wbRYthUXX8LC9mLg+WWKe8h+qJuwTAbHw==", + "dev": true, + "license": "MIT", + "dependencies": { + "cssnano-preset-default": "^5.2.14", + "lilconfig": "^2.0.3", + "yaml": "^1.10.2" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/cssnano" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/rollup-plugin-postcss/node_modules/cssnano-preset-default": { + "version": "5.2.14", + "resolved": "https://registry.npmjs.org/cssnano-preset-default/-/cssnano-preset-default-5.2.14.tgz", + "integrity": "sha512-t0SFesj/ZV2OTylqQVOrFgEh5uanxbO6ZAdeCrNsUQ6fVuXwYTxJPNAGvGTxHbD68ldIJNec7PyYZDBrfDQ+6A==", + "dev": true, + "license": "MIT", + "dependencies": { + "css-declaration-sorter": "^6.3.1", + "cssnano-utils": "^3.1.0", + "postcss-calc": "^8.2.3", + "postcss-colormin": "^5.3.1", + "postcss-convert-values": "^5.1.3", + "postcss-discard-comments": "^5.1.2", + "postcss-discard-duplicates": "^5.1.0", + "postcss-discard-empty": "^5.1.1", + "postcss-discard-overridden": "^5.1.0", + "postcss-merge-longhand": "^5.1.7", + "postcss-merge-rules": "^5.1.4", + "postcss-minify-font-values": "^5.1.0", + "postcss-minify-gradients": "^5.1.1", + "postcss-minify-params": "^5.1.4", + "postcss-minify-selectors": "^5.2.1", + "postcss-normalize-charset": "^5.1.0", + "postcss-normalize-display-values": "^5.1.0", + "postcss-normalize-positions": "^5.1.1", + "postcss-normalize-repeat-style": "^5.1.1", + "postcss-normalize-string": "^5.1.0", + "postcss-normalize-timing-functions": "^5.1.0", + "postcss-normalize-unicode": "^5.1.1", + "postcss-normalize-url": "^5.1.0", + "postcss-normalize-whitespace": "^5.1.1", + "postcss-ordered-values": "^5.1.3", + "postcss-reduce-initial": "^5.1.2", + "postcss-reduce-transforms": "^5.1.0", + "postcss-svgo": "^5.1.0", + "postcss-unique-selectors": "^5.1.1" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/rollup-plugin-postcss/node_modules/cssnano-utils": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/cssnano-utils/-/cssnano-utils-3.1.0.tgz", + "integrity": "sha512-JQNR19/YZhz4psLX/rQ9M83e3z2Wf/HdJbryzte4a3NSuafyp9w/I4U+hx5C2S9g41qlstH7DEWnZaaj83OuEA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/rollup-plugin-postcss/node_modules/csso": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/csso/-/csso-4.2.0.tgz", + "integrity": "sha512-wvlcdIbf6pwKEk7vHj8/Bkc0B4ylXZruLvOgs9doS5eOsOpuodOV2zJChSpkp+pRpYQLQMeF04nr3Z68Sta9jA==", + "dev": true, + "license": "MIT", + "dependencies": { + "css-tree": "^1.1.2" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/rollup-plugin-postcss/node_modules/dom-serializer": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.4.1.tgz", + "integrity": "sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==", + "dev": true, + "license": "MIT", + "dependencies": { + "domelementtype": "^2.0.1", + "domhandler": "^4.2.0", + "entities": "^2.0.0" + }, + "funding": { + "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" + } + }, + "node_modules/rollup-plugin-postcss/node_modules/domhandler": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.1.tgz", + "integrity": "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "domelementtype": "^2.2.0" + }, + "engines": { + "node": ">= 4" + }, + "funding": { + "url": "https://github.com/fb55/domhandler?sponsor=1" + } + }, + "node_modules/rollup-plugin-postcss/node_modules/domutils": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz", + "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "dom-serializer": "^1.0.1", + "domelementtype": "^2.2.0", + "domhandler": "^4.2.0" + }, + "funding": { + "url": "https://github.com/fb55/domutils?sponsor=1" + } + }, + "node_modules/rollup-plugin-postcss/node_modules/entities": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", + "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", + "dev": true, + "license": "BSD-2-Clause", + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/rollup-plugin-postcss/node_modules/lilconfig": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.1.0.tgz", + "integrity": "sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "node_modules/rollup-plugin-postcss/node_modules/mdn-data": { + "version": "2.0.14", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.14.tgz", + "integrity": "sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==", + "dev": true, + "license": "CC0-1.0" + }, + "node_modules/rollup-plugin-postcss/node_modules/pify": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-5.0.0.tgz", + "integrity": "sha512-eW/gHNMlxdSP6dmG6uJip6FXN0EQBwm2clYYd8Wul42Cwu/DK8HEftzsapcNdYe2MfLiIwZqsDk2RDEsTE79hA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/rollup-plugin-postcss/node_modules/postcss-calc": { + "version": "8.2.4", + "resolved": "https://registry.npmjs.org/postcss-calc/-/postcss-calc-8.2.4.tgz", + "integrity": "sha512-SmWMSJmB8MRnnULldx0lQIyhSNvuDl9HfrZkaqqE/WHAhToYsAvDq+yAsA/kIyINDszOp3Rh0GFoNuH5Ypsm3Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "postcss-selector-parser": "^6.0.9", + "postcss-value-parser": "^4.2.0" + }, + "peerDependencies": { + "postcss": "^8.2.2" + } + }, + "node_modules/rollup-plugin-postcss/node_modules/postcss-colormin": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/postcss-colormin/-/postcss-colormin-5.3.1.tgz", + "integrity": "sha512-UsWQG0AqTFQmpBegeLLc1+c3jIqBNB0zlDGRWR+dQ3pRKJL1oeMzyqmH3o2PIfn9MBdNrVPWhDbT769LxCTLJQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "browserslist": "^4.21.4", + "caniuse-api": "^3.0.0", + "colord": "^2.9.1", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/rollup-plugin-postcss/node_modules/postcss-convert-values": { + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-5.1.3.tgz", + "integrity": "sha512-82pC1xkJZtcJEfiLw6UXnXVXScgtBrjlO5CBmuDQc+dlb88ZYheFsjTn40+zBVi3DkfF7iezO0nJUPLcJK3pvA==", + "dev": true, + "license": "MIT", + "dependencies": { + "browserslist": "^4.21.4", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/rollup-plugin-postcss/node_modules/postcss-discard-comments": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/postcss-discard-comments/-/postcss-discard-comments-5.1.2.tgz", + "integrity": "sha512-+L8208OVbHVF2UQf1iDmRcbdjJkuBF6IS29yBDSiWUIzpYaAhtNl6JYnYm12FnkeCwQqF5LeklOu6rAqgfBZqQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/rollup-plugin-postcss/node_modules/postcss-discard-duplicates": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-discard-duplicates/-/postcss-discard-duplicates-5.1.0.tgz", + "integrity": "sha512-zmX3IoSI2aoenxHV6C7plngHWWhUOV3sP1T8y2ifzxzbtnuhk1EdPwm0S1bIUNaJ2eNbWeGLEwzw8huPD67aQw==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/rollup-plugin-postcss/node_modules/postcss-discard-empty": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/postcss-discard-empty/-/postcss-discard-empty-5.1.1.tgz", + "integrity": "sha512-zPz4WljiSuLWsI0ir4Mcnr4qQQ5e1Ukc3i7UfE2XcrwKK2LIPIqE5jxMRxO6GbI3cv//ztXDsXwEWT3BHOGh3A==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/rollup-plugin-postcss/node_modules/postcss-discard-overridden": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-discard-overridden/-/postcss-discard-overridden-5.1.0.tgz", + "integrity": "sha512-21nOL7RqWR1kasIVdKs8HNqQJhFxLsyRfAnUDm4Fe4t4mCWL9OJiHvlHPjcd8zc5Myu89b/7wZDnOSjFgeWRtw==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/rollup-plugin-postcss/node_modules/postcss-merge-longhand": { + "version": "5.1.7", + "resolved": "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-5.1.7.tgz", + "integrity": "sha512-YCI9gZB+PLNskrK0BB3/2OzPnGhPkBEwmwhfYk1ilBHYVAZB7/tkTHFBAnCrvBBOmeYyMYw3DMjT55SyxMBzjQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.2.0", + "stylehacks": "^5.1.1" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/rollup-plugin-postcss/node_modules/postcss-merge-rules": { + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-5.1.4.tgz", + "integrity": "sha512-0R2IuYpgU93y9lhVbO/OylTtKMVcHb67zjWIfCiKR9rWL3GUk1677LAqD/BcHizukdZEjT8Ru3oHRoAYoJy44g==", + "dev": true, + "license": "MIT", + "dependencies": { + "browserslist": "^4.21.4", + "caniuse-api": "^3.0.0", + "cssnano-utils": "^3.1.0", + "postcss-selector-parser": "^6.0.5" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/rollup-plugin-postcss/node_modules/postcss-minify-font-values": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-minify-font-values/-/postcss-minify-font-values-5.1.0.tgz", + "integrity": "sha512-el3mYTgx13ZAPPirSVsHqFzl+BBBDrXvbySvPGFnQcTI4iNslrPaFq4muTkLZmKlGk4gyFAYUBMH30+HurREyA==", + "dev": true, + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/rollup-plugin-postcss/node_modules/postcss-minify-gradients": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/postcss-minify-gradients/-/postcss-minify-gradients-5.1.1.tgz", + "integrity": "sha512-VGvXMTpCEo4qHTNSa9A0a3D+dxGFZCYwR6Jokk+/3oB6flu2/PnPXAh2x7x52EkY5xlIHLm+Le8tJxe/7TNhzw==", + "dev": true, + "license": "MIT", + "dependencies": { + "colord": "^2.9.1", + "cssnano-utils": "^3.1.0", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/rollup-plugin-postcss/node_modules/postcss-minify-params": { + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/postcss-minify-params/-/postcss-minify-params-5.1.4.tgz", + "integrity": "sha512-+mePA3MgdmVmv6g+30rn57USjOGSAyuxUmkfiWpzalZ8aiBkdPYjXWtHuwJGm1v5Ojy0Z0LaSYhHaLJQB0P8Jw==", + "dev": true, + "license": "MIT", + "dependencies": { + "browserslist": "^4.21.4", + "cssnano-utils": "^3.1.0", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/rollup-plugin-postcss/node_modules/postcss-minify-selectors": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/postcss-minify-selectors/-/postcss-minify-selectors-5.2.1.tgz", + "integrity": "sha512-nPJu7OjZJTsVUmPdm2TcaiohIwxP+v8ha9NehQ2ye9szv4orirRU3SDdtUmKH+10nzn0bAyOXZ0UEr7OpvLehg==", + "dev": true, + "license": "MIT", + "dependencies": { + "postcss-selector-parser": "^6.0.5" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/rollup-plugin-postcss/node_modules/postcss-normalize-charset": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-normalize-charset/-/postcss-normalize-charset-5.1.0.tgz", + "integrity": "sha512-mSgUJ+pd/ldRGVx26p2wz9dNZ7ji6Pn8VWBajMXFf8jk7vUoSrZ2lt/wZR7DtlZYKesmZI680qjr2CeFF2fbUg==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/rollup-plugin-postcss/node_modules/postcss-normalize-display-values": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-normalize-display-values/-/postcss-normalize-display-values-5.1.0.tgz", + "integrity": "sha512-WP4KIM4o2dazQXWmFaqMmcvsKmhdINFblgSeRgn8BJ6vxaMyaJkwAzpPpuvSIoG/rmX3M+IrRZEz2H0glrQNEA==", + "dev": true, + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/rollup-plugin-postcss/node_modules/postcss-normalize-positions": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-positions/-/postcss-normalize-positions-5.1.1.tgz", + "integrity": "sha512-6UpCb0G4eofTCQLFVuI3EVNZzBNPiIKcA1AKVka+31fTVySphr3VUgAIULBhxZkKgwLImhzMR2Bw1ORK+37INg==", + "dev": true, + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/rollup-plugin-postcss/node_modules/postcss-normalize-repeat-style": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-5.1.1.tgz", + "integrity": "sha512-mFpLspGWkQtBcWIRFLmewo8aC3ImN2i/J3v8YCFUwDnPu3Xz4rLohDO26lGjwNsQxB3YF0KKRwspGzE2JEuS0g==", + "dev": true, + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/rollup-plugin-postcss/node_modules/postcss-normalize-string": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-normalize-string/-/postcss-normalize-string-5.1.0.tgz", + "integrity": "sha512-oYiIJOf4T9T1N4i+abeIc7Vgm/xPCGih4bZz5Nm0/ARVJ7K6xrDlLwvwqOydvyL3RHNf8qZk6vo3aatiw/go3w==", + "dev": true, + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/rollup-plugin-postcss/node_modules/postcss-normalize-timing-functions": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-5.1.0.tgz", + "integrity": "sha512-DOEkzJ4SAXv5xkHl0Wa9cZLF3WCBhF3o1SKVxKQAa+0pYKlueTpCgvkFAHfk+Y64ezX9+nITGrDZeVGgITJXjg==", + "dev": true, + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/rollup-plugin-postcss/node_modules/postcss-normalize-unicode": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-unicode/-/postcss-normalize-unicode-5.1.1.tgz", + "integrity": "sha512-qnCL5jzkNUmKVhZoENp1mJiGNPcsJCs1aaRmURmeJGES23Z/ajaln+EPTD+rBeNkSryI+2WTdW+lwcVdOikrpA==", + "dev": true, + "license": "MIT", + "dependencies": { + "browserslist": "^4.21.4", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/rollup-plugin-postcss/node_modules/postcss-normalize-url": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-normalize-url/-/postcss-normalize-url-5.1.0.tgz", + "integrity": "sha512-5upGeDO+PVthOxSmds43ZeMeZfKH+/DKgGRD7TElkkyS46JXAUhMzIKiCa7BabPeIy3AQcTkXwVVN7DbqsiCew==", + "dev": true, + "license": "MIT", + "dependencies": { + "normalize-url": "^6.0.1", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/rollup-plugin-postcss/node_modules/postcss-normalize-whitespace": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-whitespace/-/postcss-normalize-whitespace-5.1.1.tgz", + "integrity": "sha512-83ZJ4t3NUDETIHTa3uEg6asWjSBYL5EdkVB0sDncx9ERzOKBVJIUeDO9RyA9Zwtig8El1d79HBp0JEi8wvGQnA==", + "dev": true, + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/rollup-plugin-postcss/node_modules/postcss-ordered-values": { + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/postcss-ordered-values/-/postcss-ordered-values-5.1.3.tgz", + "integrity": "sha512-9UO79VUhPwEkzbb3RNpqqghc6lcYej1aveQteWY+4POIwlqkYE21HKWaLDF6lWNuqCobEAyTovVhtI32Rbv2RQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "cssnano-utils": "^3.1.0", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/rollup-plugin-postcss/node_modules/postcss-reduce-initial": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/postcss-reduce-initial/-/postcss-reduce-initial-5.1.2.tgz", + "integrity": "sha512-dE/y2XRaqAi6OvjzD22pjTUQ8eOfc6m/natGHgKFBK9DxFmIm69YmaRVQrGgFlEfc1HePIurY0TmDeROK05rIg==", + "dev": true, + "license": "MIT", + "dependencies": { + "browserslist": "^4.21.4", + "caniuse-api": "^3.0.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/rollup-plugin-postcss/node_modules/postcss-reduce-transforms": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-reduce-transforms/-/postcss-reduce-transforms-5.1.0.tgz", + "integrity": "sha512-2fbdbmgir5AvpW9RLtdONx1QoYG2/EtqpNQbFASDlixBbAYuTcJ0dECwlqNqH7VbaUnEnh8SrxOe2sRIn24XyQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/rollup-plugin-postcss/node_modules/postcss-selector-parser": { + "version": "6.1.2", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.2.tgz", + "integrity": "sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==", + "dev": true, + "license": "MIT", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/rollup-plugin-postcss/node_modules/postcss-svgo": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-svgo/-/postcss-svgo-5.1.0.tgz", + "integrity": "sha512-D75KsH1zm5ZrHyxPakAxJWtkyXew5qwS70v56exwvw542d9CRtTo78K0WeFxZB4G7JXKKMbEZtZayTGdIky/eA==", + "dev": true, + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.2.0", + "svgo": "^2.7.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/rollup-plugin-postcss/node_modules/postcss-unique-selectors": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/postcss-unique-selectors/-/postcss-unique-selectors-5.1.1.tgz", + "integrity": "sha512-5JiODlELrz8L2HwxfPnhOWZYWDxVHWL83ufOv84NrcgipI7TaeRsatAhK4Tr2/ZiYldpK/wBvw5BD3qfaK96GA==", + "dev": true, + "license": "MIT", + "dependencies": { + "postcss-selector-parser": "^6.0.5" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/rollup-plugin-postcss/node_modules/stylehacks": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/stylehacks/-/stylehacks-5.1.1.tgz", + "integrity": "sha512-sBpcd5Hx7G6seo7b1LkpttvTz7ikD0LlH5RmdcBNb6fFR0Fl7LQwHDFr300q4cwUqi+IYrFGmsIHieMBfnN/Bw==", + "dev": true, + "license": "MIT", + "dependencies": { + "browserslist": "^4.21.4", + "postcss-selector-parser": "^6.0.4" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/rollup-plugin-postcss/node_modules/svgo": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/svgo/-/svgo-2.8.0.tgz", + "integrity": "sha512-+N/Q9kV1+F+UeWYoSiULYo4xYSDQlTgb+ayMobAXPwMnLvop7oxKMo9OzIrX5x3eS4L4f2UHhc9axXwY8DpChg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@trysound/sax": "0.2.0", + "commander": "^7.2.0", + "css-select": "^4.1.3", + "css-tree": "^1.1.3", + "csso": "^4.2.0", + "picocolors": "^1.0.0", + "stable": "^0.1.8" + }, + "bin": { + "svgo": "bin/svgo" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/rollup-pluginutils": { + "version": "2.8.2", + "resolved": "https://registry.npmjs.org/rollup-pluginutils/-/rollup-pluginutils-2.8.2.tgz", + "integrity": "sha512-EEp9NhnUkwY8aif6bxgovPHMoMoNr2FulJziTndpt5H9RdwC47GSGuII9XxpSdzVGM0GWrNPHV6ie1LTNJPaLQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "estree-walker": "^0.6.1" + } + }, + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/rxjs": { + "version": "7.8.2", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.2.tgz", + "integrity": "sha512-dhKf903U/PQZY6boNNtAGdWbG85WAbjT/1xYoZIC7FAY0yWapOBQVsVrDl58W86//e1VpMNBtRV4MaXfdMySFA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.1.0" + } + }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/safe-identifier": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/safe-identifier/-/safe-identifier-0.4.2.tgz", + "integrity": "sha512-6pNbSMW6OhAi9j+N8V+U715yBQsaWJ7eyEUaOrawX+isg5ZxhUlV1NipNtgaKHmFGiABwt+ZF04Ii+3Xjkg+8w==", + "dev": true, + "license": "ISC" + }, + "node_modules/serialize-javascript": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.2.tgz", + "integrity": "sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "randombytes": "^2.1.0" + } + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "license": "MIT", + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/shell-quote": { + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.2.tgz", + "integrity": "sha512-AzqKpGKjrj7EM6rKVQEPpB288oCfnrEIuyoT9cyF4nmGa7V8Zk6f7RRqYisX8X9m+Q7bd632aZW4ky7EhbQztA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/slice-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", + "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "astral-regex": "^2.0.0", + "is-fullwidth-code-point": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/slice-ansi?sponsor=1" + } + }, + "node_modules/smob": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/smob/-/smob-1.5.0.tgz", + "integrity": "sha512-g6T+p7QO8npa+/hNx9ohv1E5pVCmWrVCUzUXJyLdMmftX6ER0oiWY/w9knEonLpnOp6b6FenKnMfR8gqwWdwig==", + "dev": true, + "license": "MIT" + }, + "node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-js": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-support": { + "version": "0.5.21", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", + "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", + "dev": true, + "license": "MIT", + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/spawn-command": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/spawn-command/-/spawn-command-0.0.2.tgz", + "integrity": "sha512-zC8zGoGkmc8J9ndvml8Xksr1Amk9qBujgbF0JAIWO7kXr43w0h/0GJNM/Vustixu+YE8N/MTrQ7N31FvHUACxQ==", + "dev": true + }, + "node_modules/stable": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/stable/-/stable-0.1.8.tgz", + "integrity": "sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w==", + "deprecated": "Modern JS already guarantees Array#sort() is a stable sort, so this library is deprecated. See the compatibility table on MDN: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/sort#browser_compatibility", + "dev": true, + "license": "MIT" + }, + "node_modules/string-hash": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/string-hash/-/string-hash-1.1.3.tgz", + "integrity": "sha512-kJUvRUFK49aub+a7T1nNE66EJbZBMnBgoC1UbCZ5n6bsZKBRga4KgBRTMn/pFkeCZSYtNeSyMxPDM0AXWELk2A==", + "dev": true, + "license": "CC0-1.0" + }, + "node_modules/string-width": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "dev": true, + "license": "MIT", + "dependencies": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/string-width-cjs": { + "name": "string-width", + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width-cjs/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width-cjs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true, + "license": "MIT" + }, + "node_modules/string-width-cjs/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/strip-ansi-cjs": { + "name": "strip-ansi", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi-cjs/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/style-inject": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/style-inject/-/style-inject-0.3.0.tgz", + "integrity": "sha512-IezA2qp+vcdlhJaVm5SOdPPTUu0FCEqfNSli2vRuSIBbu5Nq5UvygTk/VzeCqfLz2Atj3dVII5QBKGZRZ0edzw==", + "dev": true, + "license": "MIT" + }, + "node_modules/stylehacks": { + "version": "7.0.5", + "resolved": "https://registry.npmjs.org/stylehacks/-/stylehacks-7.0.5.tgz", + "integrity": "sha512-5kNb7V37BNf0Q3w+1pxfa+oiNPS++/b4Jil9e/kPDgrk1zjEd6uR7SZeJiYaLYH6RRSC1XX2/37OTeU/4FvuIA==", + "dev": true, + "license": "MIT", + "dependencies": { + "browserslist": "^4.24.5", + "postcss-selector-parser": "^7.1.0" + }, + "engines": { + "node": "^18.12.0 || ^20.9.0 || >=22.0" + }, + "peerDependencies": { + "postcss": "^8.4.32" + } + }, + "node_modules/stylelint": { + "version": "16.19.1", + "resolved": "https://registry.npmjs.org/stylelint/-/stylelint-16.19.1.tgz", + "integrity": "sha512-C1SlPZNMKl+d/C867ZdCRthrS+6KuZ3AoGW113RZCOL0M8xOGpgx7G70wq7lFvqvm4dcfdGFVLB/mNaLFChRKw==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/stylelint" + }, + { + "type": "github", + "url": "https://github.com/sponsors/stylelint" + } + ], + "license": "MIT", + "dependencies": { + "@csstools/css-parser-algorithms": "^3.0.4", + "@csstools/css-tokenizer": "^3.0.3", + "@csstools/media-query-list-parser": "^4.0.2", + "@csstools/selector-specificity": "^5.0.0", + "@dual-bundle/import-meta-resolve": "^4.1.0", + "balanced-match": "^2.0.0", + "colord": "^2.9.3", + "cosmiconfig": "^9.0.0", + "css-functions-list": "^3.2.3", + "css-tree": "^3.1.0", + "debug": "^4.3.7", + "fast-glob": "^3.3.3", + "fastest-levenshtein": "^1.0.16", + "file-entry-cache": "^10.0.8", + "global-modules": "^2.0.0", + "globby": "^11.1.0", + "globjoin": "^0.1.4", + "html-tags": "^3.3.1", + "ignore": "^7.0.3", + "imurmurhash": "^0.1.4", + "is-plain-object": "^5.0.0", + "known-css-properties": "^0.36.0", + "mathml-tag-names": "^2.1.3", + "meow": "^13.2.0", + "micromatch": "^4.0.8", + "normalize-path": "^3.0.0", + "picocolors": "^1.1.1", + "postcss": "^8.5.3", + "postcss-resolve-nested-selector": "^0.1.6", + "postcss-safe-parser": "^7.0.1", + "postcss-selector-parser": "^7.1.0", + "postcss-value-parser": "^4.2.0", + "resolve-from": "^5.0.0", + "string-width": "^4.2.3", + "supports-hyperlinks": "^3.2.0", + "svg-tags": "^1.0.0", + "table": "^6.9.0", + "write-file-atomic": "^5.0.1" + }, + "bin": { + "stylelint": "bin/stylelint.mjs" + }, + "engines": { + "node": ">=18.12.0" + } + }, + "node_modules/stylelint-config-recommended": { + "version": "15.0.0", + "resolved": "https://registry.npmjs.org/stylelint-config-recommended/-/stylelint-config-recommended-15.0.0.tgz", + "integrity": "sha512-9LejMFsat7L+NXttdHdTq94byn25TD+82bzGRiV1Pgasl99pWnwipXS5DguTpp3nP1XjvLXVnEJIuYBfsRjRkA==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/stylelint" + }, + { + "type": "github", + "url": "https://github.com/sponsors/stylelint" + } + ], + "license": "MIT", + "engines": { + "node": ">=18.12.0" + }, + "peerDependencies": { + "stylelint": "^16.13.0" + } + }, + "node_modules/stylelint-config-standard": { + "version": "37.0.0", + "resolved": "https://registry.npmjs.org/stylelint-config-standard/-/stylelint-config-standard-37.0.0.tgz", + "integrity": "sha512-+6eBlbSTrOn/il2RlV0zYGQwRTkr+WtzuVSs1reaWGObxnxLpbcspCUYajVQHonVfxVw2U+h42azGhrBvcg8OA==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/stylelint" + }, + { + "type": "github", + "url": "https://github.com/sponsors/stylelint" + } + ], + "license": "MIT", + "dependencies": { + "stylelint-config-recommended": "^15.0.0" + }, + "engines": { + "node": ">=18.12.0" + }, + "peerDependencies": { + "stylelint": "^16.13.0" + } + }, + "node_modules/stylelint/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/stylelint/node_modules/balanced-match": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-2.0.0.tgz", + "integrity": "sha512-1ugUSr8BHXRnK23KfuYS+gVMC3LB8QGH9W1iGtDPsNWoQbgtXSExkBu2aDR4epiGWZOjZsj6lDl/N/AqqTC3UA==", + "dev": true, + "license": "MIT" + }, + "node_modules/stylelint/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true, + "license": "MIT" + }, + "node_modules/stylelint/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/stylelint/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/supports-hyperlinks": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-3.2.0.tgz", + "integrity": "sha512-zFObLMyZeEwzAoKCyu1B91U79K2t7ApXuQfo8OuxwXLDgcKxuwM+YvcbIhm6QWqz7mHUH1TVytR1PwVVjEuMig==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0", + "supports-color": "^7.0.0" + }, + "engines": { + "node": ">=14.18" + }, + "funding": { + "url": "https://github.com/chalk/supports-hyperlinks?sponsor=1" + } + }, + "node_modules/supports-hyperlinks/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/svg-tags": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/svg-tags/-/svg-tags-1.0.0.tgz", + "integrity": "sha512-ovssysQTa+luh7A5Weu3Rta6FJlFBBbInjOh722LIt6klpU2/HtdUbszju/G4devcvk8PGt7FCLv5wftu3THUA==", + "dev": true + }, + "node_modules/svgo": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/svgo/-/svgo-3.3.2.tgz", + "integrity": "sha512-OoohrmuUlBs8B8o6MB2Aevn+pRIH9zDALSR+6hhqVfa6fRwG/Qw9VUMSMW9VNg2CFc/MTIfabtdOVl9ODIJjpw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@trysound/sax": "0.2.0", + "commander": "^7.2.0", + "css-select": "^5.1.0", + "css-tree": "^2.3.1", + "css-what": "^6.1.0", + "csso": "^5.0.5", + "picocolors": "^1.0.0" + }, + "bin": { + "svgo": "bin/svgo" + }, + "engines": { + "node": ">=14.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/svgo" + } + }, + "node_modules/svgo/node_modules/css-tree": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-2.3.1.tgz", + "integrity": "sha512-6Fv1DV/TYw//QF5IzQdqsNDjx/wc8TrMBZsqjL9eW01tWb7R7k/mq+/VXfJCl7SoD5emsJop9cOByJZfs8hYIw==", + "dev": true, + "license": "MIT", + "dependencies": { + "mdn-data": "2.0.30", + "source-map-js": "^1.0.1" + }, + "engines": { + "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0" + } + }, + "node_modules/svgo/node_modules/mdn-data": { + "version": "2.0.30", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.30.tgz", + "integrity": "sha512-GaqWWShW4kv/G9IEucWScBx9G1/vsFZZJUO+tD26M8J8z3Kw5RDQjaoZe03YAClgeS/SWPOcb4nkFBTEi5DUEA==", + "dev": true, + "license": "CC0-1.0" + }, + "node_modules/table": { + "version": "6.9.0", + "resolved": "https://registry.npmjs.org/table/-/table-6.9.0.tgz", + "integrity": "sha512-9kY+CygyYM6j02t5YFHbNz2FN5QmYGv9zAjVp4lCDjlCw7amdckXlEt/bjMhUIfj4ThGRE4gCUH5+yGnNuPo5A==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "ajv": "^8.0.1", + "lodash.truncate": "^4.4.2", + "slice-ansi": "^4.0.0", + "string-width": "^4.2.3", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/table/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/table/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true, + "license": "MIT" + }, + "node_modules/table/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/table/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/terser": { + "version": "5.39.2", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.39.2.tgz", + "integrity": "sha512-yEPUmWve+VA78bI71BW70Dh0TuV4HHd+I5SHOAfS1+QBOmvmCiiffgjR8ryyEd3KIfvPGFqoADt8LdQ6XpXIvg==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "@jridgewell/source-map": "^0.3.3", + "acorn": "^8.14.0", + "commander": "^2.20.0", + "source-map-support": "~0.5.20" + }, + "bin": { + "terser": "bin/terser" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/terser/node_modules/commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/tree-kill": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz", + "integrity": "sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==", + "dev": true, + "license": "MIT", + "bin": { + "tree-kill": "cli.js" + } + }, + "node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "dev": true, + "license": "0BSD" + }, + "node_modules/update-browserslist-db": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.3.tgz", + "integrity": "sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "escalade": "^3.2.0", + "picocolors": "^1.1.1" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "dev": true, + "license": "MIT" + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/wrap-ansi": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", + "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs": { + "name": "wrap-ansi", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true, + "license": "MIT" + }, + "node_modules/wrap-ansi-cjs/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi/node_modules/ansi-styles": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", + "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/write-file-atomic": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-5.0.1.tgz", + "integrity": "sha512-+QU2zd6OTD8XWIJCbffaiQeH9U73qIqafo1x6V1snCWYGJf6cVE0cDR4D8xRzcEnfI21IFrUPzPGtcPf8AC+Rw==", + "dev": true, + "license": "ISC", + "dependencies": { + "imurmurhash": "^0.1.4", + "signal-exit": "^4.0.1" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=10" + } + }, + "node_modules/yaml": { + "version": "1.10.2", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", + "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">= 6" + } + }, + "node_modules/yargs": { + "version": "17.7.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", + "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", + "dev": true, + "license": "MIT", + "dependencies": { + "cliui": "^8.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.1.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/yargs/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/yargs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true, + "license": "MIT" + }, + "node_modules/yargs/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/yargs/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + } + } +} diff --git a/frontend/package.json b/frontend/package.json new file mode 100644 index 000000000..ed9d86a16 --- /dev/null +++ b/frontend/package.json @@ -0,0 +1,32 @@ +{ + "type": "module", + "scripts": { + "css:lint": "stylelint css/*.css", + "docker:build": "NODE_ENV=production OUTPUT_DIR=/app/static_frontend rollup -c", + "docker:watch": "NODE_ENV=development OUTPUT_DIR=/app/static_frontend rollup -c -w", + "build": "NODE_ENV=production rollup -c", + "watch": "NODE_ENV=development rollup -c -w" + }, + "devDependencies": { + "@csstools/postcss-cascade-layers": "^5.0.1", + "@rollup/plugin-terser": "^0.4.4", + "autoprefixer": "^10.4.20", + "concurrently": "^8.2.2", + "cssnano": "^7.0.7", + "glob": "^11.0.2", + "postcss": "^8.5.5", + "postcss-import": "^16.1.0", + "postcss-preset-env": "^10.1.4", + "postcss-variable-compress": "^3.0.0", + "rollup": "^4.40.2", + "rollup-plugin-postcss": "^4.0.2", + "stylelint": "^16.14.1", + "stylelint-config-standard": "^37.0.0" + }, + "optionalDependencies": { + "@rollup/rollup-linux-x64-gnu": "4.40.2" + }, + "browserslist": [ + "defaults" + ] +} \ No newline at end of file diff --git a/frontend/postcss.config.js b/frontend/postcss.config.js new file mode 100644 index 000000000..7b7714030 --- /dev/null +++ b/frontend/postcss.config.js @@ -0,0 +1,16 @@ +export default { + plugins: { + "postcss-import": {}, + "@csstools/postcss-cascade-layers": { + onImportLayerRule: "warn", + }, + autoprefixer: {}, + "postcss-preset-env": { + features: {}, + }, + cssnano: { + preset: "default", + }, + "postcss-variable-compress": {}, + }, +}; diff --git a/frontend/rollup.config.js b/frontend/rollup.config.js new file mode 100644 index 000000000..ec88fa265 --- /dev/null +++ b/frontend/rollup.config.js @@ -0,0 +1,94 @@ +import terser from "@rollup/plugin-terser"; +import postcss from "rollup-plugin-postcss"; +import { defineConfig } from "rollup"; +import fs from "fs"; + +const isProduction = process.env.NODE_ENV === "production"; +const outputDir = process.env.OUTPUT_DIR ?? "dist"; + +const cleanupOutputDir = () => ({ + name: "cleanup-output-dir", + buildStart() { + // Only clean up if not in watch mode + if (!this.meta.watchMode && fs.existsSync(outputDir)) { + fs.rmSync(outputDir, { recursive: true, force: true }); + } + }, +}); + +const defaultPlugins = [ + isProduction && + terser({ + compress: { + drop_console: true, + drop_debugger: true, + }, + format: { + comments: false, + }, + }), +]; + +// Define chunks configuration +const chunks = { + base: [ + "src/js/base/header.js", + "src/js/base/theme.js", + "src/js/base/print.js", + "src/js/lib/matomo.js", + ], + results: [ + "src/js/pages/results/copy-link.js", + "src/js/pages/results/repeat-test-countdown.js", + ], + connection: ["src/js/pages/connection/connection.js"], + probe: ["src/js/pages/probe/probe.js"], + "components/card-list": ["src/js/components/card-list/load-more.js"], + "components/carousel": ["src/js/components/carousel/carrousel.js"], + "components/meter": ["src/js/components/meter/result-meter.js"], + "components/action-card": [ + "src/js/components/action-card/action-card-fallback.js", + ], +}; + +// Create config for each file +const config = [ + // Modern JavaScript bundle (ES modules) + { + input: "src/index.js", + output: { + format: "es", + sourcemap: !isProduction, + dir: `${outputDir}/js`, + manualChunks: chunks, + chunkFileNames: "[name]-min.js", + }, + plugins: [cleanupOutputDir(), ...defaultPlugins], + }, + // Legacy JavaScript bundle (IIFE) + { + input: "src/index.js", + output: { + format: "iife", + sourcemap: !isProduction, + file: `${outputDir}/js/legacy-min.js`, + }, + plugins: defaultPlugins, + }, + // CSS bundle + { + input: "src/index.css", + output: { + file: `${outputDir}/css/style-min.css`, + }, + plugins: [ + postcss({ + extract: true, + minimize: isProduction, + sourceMap: !isProduction, + }), + ], + }, +]; + +export default defineConfig(config); diff --git a/frontend/src/css/about-section.css b/frontend/src/css/about-section.css new file mode 100644 index 000000000..593227da3 --- /dev/null +++ b/frontend/src/css/about-section.css @@ -0,0 +1,126 @@ +.about-section { + h2 { + padding-bottom: 0.5rem; + + @media (width >= 56.25rem) { + padding-bottom: 1.5rem; + } + } + + p { + @media (width >= 56.25rem) { + grid-column: 1 / 7; + } + + &:nth-of-type(2) { + padding-top: 1rem; + + @media (width >= 56.25rem) { + grid-column: 8 / 13; + padding-top: 0; + } + } + } + + .about-link { + justify-self: center; + margin-block: 3rem; + + &::after { + mask-image: url("/static/icons/arrow-right.svg"); + display: block; + } + } +} + +.logo-list { + display: grid; + grid-template-columns: repeat(2, 1fr); + grid-template-rows: auto; + padding-top: 2.5rem; + justify-content: space-between; + align-items: center; + + @media (width >= 56.25rem) { + grid-template-columns: repeat(5, 1fr); + gap: 6.25rem; + overflow-x: auto; + padding-top: 5rem; + scroll-snap-type: x mandatory; + scroll-behavior: smooth; + scrollbar-color: var(--green-500) var(--transparent-100); + scrollbar-width: thin; + padding-bottom: 1.25rem; + + &::-webkit-scrollbar { + height: 6px; + } + + &::-webkit-scrollbar-thumb { + background-color: var(--green-500); + border-radius: 0.625rem; + } + + &::-webkit-scrollbar-track { + background-color: var(--transparent-100); + } + } + + li { + grid-column: span 1; + display: flex; + justify-content: center; + scroll-snap-align: start; + + &:last-child { + display: none; + + @media (width >= 56.25rem) { + display: block; + } + } + } + + img { + transition: 0.3s; + + &:hover { + opacity: 0.6; + } + } +} + +.quote-section { + .container { + padding-block: 2.75rem; + row-gap: 2.5rem; + + @media (width >= 56.25rem) { + align-items: center; + gap: 0; + } + } + + .quote-image { + border-radius: 100%; + + @media (width >= 56.25rem) { + grid-column: 2 / 3; + } + } + + blockquote { + display: flex; + flex-direction: column; + gap: 1rem; + + @media (width >= 56.25rem) { + grid-column: 4 / 12; + gap: 2.5rem; + } + + cite { + font-style: normal; + } + } +} \ No newline at end of file diff --git a/frontend/src/css/components.css b/frontend/src/css/components.css new file mode 100644 index 000000000..3b00eea1a --- /dev/null +++ b/frontend/src/css/components.css @@ -0,0 +1,518 @@ +/* MARK: BUTTONS +*/ +.primary-button, +.secondary-button { + display: flex; + align-items: center; + gap: 0.5rem; + padding: 0.5rem 1rem; + border-radius: 0.5rem; + justify-content: center; + font: var(--section-button-m); + transition: border 0.3s, background-color 0.3s; + width: 100%; + + @media (width >= 56.25rem) { + width: auto; + } + + &:not(#load-more)::after { + mask-image: url("/static/icons/arrow-right.svg"); + display: block; + } + + &.rounded { + border-radius: 100%; + padding: 0.375rem; + border: none; + width: fit-content; + + &.secondary-button { + background: var(--white-100); + color: var(--green-500); + } + } +} + +.primary-button { + background: var(--button-bg-color-primary); + color: var(--button-text-color-primary); + + &:not(.rounded):hover { + background: var(--button-bg-color-hover-primary); + } +} + +.secondary-button:not(.rounded) { + color: var(--button-text-color-secondary); + border: 2px solid currentcolor; + + &:hover { + border: 2px solid var(--button-bg-color-hover-secondary); + } +} + +#load-more::after { + display: block; + mask-image: url("/static/icons/plus.svg"); +} + +#load-more.hidden { + display: none; +} + +#load-more { + @media (scripting: none) { + display: none; + } +} + +.button-container { + display: grid; + align-items: center; + gap: 0.5rem; + width: 100%; + + @media (width >= 56.25rem) { + grid-template-columns: repeat(2, 1fr); + gap: 1.5rem; + width: fit-content; + } + + .primary-button, + .secondary-button { + height: 100%; + } +} + +/* MARK: GENERAL SECTIONS +*/ + +.intro-section { + .container { + padding-block: 4rem; + + @media (width >= 56.25rem) { + padding-block: 4.875rem; + } + } + + hgroup { + gap: 1.5rem; + + @media (width >= 56.25rem) { + gap: 2.25rem; + grid-column: 2 / 12; + } + + .article-category { + padding: 0.5rem 1rem; + background-color: var(--white-100); + border-radius: 0.5rem; + } + } +} + +.article-index-section { + margin-bottom: 4rem; + + .container { + padding-top: 3rem; + + @media (width >= 56.25rem) { + padding-top: 3rem; + } + } + + hgroup { + gap: 1rem; + + @media (width >= 56.25rem) { + gap: 1.5rem; + } + } +} + +.article-content-section { + .container { + row-gap: 1.5rem; + border-bottom: 0.0313rem solid var(--green-400); + padding-bottom: 1.25rem; + + @media (width >= 56.25rem) { + padding-bottom: 2.5rem; + } + + > * { + @media (width >= 56.25rem) { + grid-column: 2 / 12; + } + } + } + + h2:not(:first-of-type) { + font: var(--section-header-s); + } + + p { + font: var(--section-body-xl); + } + + a { + display: inline; + color: var(--body-link-color); + text-decoration: underline; + } + + code { + background: var(--bg-color-primary); + padding: 0.25rem; + border-radius: 0.25rem; + } + + ul, ol { + list-style: initial; + list-style-position: inside; + } + + li { + font: var(--section-body-xl); + color: var(--body-color-primary); + padding-block: 0.375rem; + font-weight: 500; + } + + &.footer-page .container { + padding-block: 1.25rem; + + @media (width >= 56.25rem) { + padding-block: 2.5rem; + } + + > * { + grid-column: span 12; + display: flex; + flex-direction: column; + row-gap: 1.5rem; + } + } +} + +/* MARK: CARDS +*/ + +.card-section { + .container { + row-gap: 1.5rem; + + @media (width >= 56.25rem) { + row-gap: 3rem; + } + + .h3 { + text-align: center; + } + + .h3, + .secondary-button { + justify-self: center; + } + } +} + +.card-list { + display: grid; + grid-template-columns: repeat(auto-fit, minmax(min(18.75rem, 100%), 1fr)); + gap: 1.5rem; + + @media (width >= 56.25rem) { + gap: 2rem; + } +} + +.card { + border-radius: 0.5rem; + + a { + display: flex; + padding: 1.5rem; + gap: 1.5rem; + position: relative; + z-index: 1; + height: 100%; + border-radius: 0.5rem; + justify-content: space-between; + align-items: center; + flex-direction: row; + } + + .secondary-button.rounded { + flex-shrink: 0; + align-self: center; + } + + hgroup { + gap: 1rem; + flex: 1; + + h2, h3 { + font: var(--card-header-l); + } + } + + &.news-card { + background-color: var(--card-bg-color-news); + + a { + color: var(--card-body-color-news); + } + } + + &.knowledge-card { + background-color: var(--card-bg-color-knowledge); + + a { + color: var(--card-heading-color-knowledge); + } + } + + + &.large { + &.knowledge-card { + @media (prefers-color-scheme: dark) { + border: var(--card-border); + } + + @media (prefers-color-scheme: light) { + border: none; + } + } + + &.news-card { + border: var(--card-border); + } + + translate: 0 3rem; + + @media (width >= 56.25rem) { + translate: 0 4rem; + + a { + padding: 2.5rem; + } + } + + hgroup { + h2, h3 { + font: var(--card-header-xl); + } + + p:not(.card-category, .card-date) { + font: var(--card-body-xs); + display: -webkit-box; + line-clamp: 2; + -webkit-line-clamp: 2; + -webkit-box-orient: vertical; + overflow: clip; + } + } + } + + .card-category { + background-color: var(--white-100); + color: var(--green-500); + font: var(--card-header-xs); + border-radius: 0.25rem; + padding: 0.5rem 1.25rem; + width: fit-content; + } + + .card-date { + font: var(--card-body-l); + } + + &:nth-child(n+6) { + @media (scripting: enabled) { + display: none; + } + + @media (prefers-reduced-motion: no-preference) and (scripting: enabled) { + @supports (transition-behavior: allow-discrete) { + transition: display 0.5s, opacity 0.5s, left 0.5s, translate 0.5s; + transition-behavior: allow-discrete; + translate: 0 1.5625rem; + opacity: 0; + } + } + + &.visible { + display: block; + + @media (prefers-reduced-motion: no-preference) { + @supports (transition-behavior: allow-discrete) { + translate: 0 0; + opacity: 1; + + @starting-style { + translate: 0 1.5625rem; + opacity: 0; + } + } + } + } + } +} + +/* MARK: ELLIPSE +*/ + +.ellipse { + position: relative; + + .container { + position: relative; + z-index: 1; + } + + &::after { + content: ""; + mask-repeat: no-repeat; + position: absolute; + width: 100%; + height: 100%; + top: 0; + left: 0; + background: var(--ellipse-color-light); + } + + &.hidden-mobile::after { + display: none; + + @media (width >= 56.25rem) { + display: block; + } + } + + &:not(.card) { + &::after { + mask-image: url("/static/icons/ellipse-multiple.svg"); + mask-position: bottom left; + transform: scaleY(-1); + mask-size: 62.5rem; + border-radius: 1rem; + + @media (width >= 56.25rem) { + mask-size: cover; + transform: scaleY(1); + } + } + + &.reverse::after { + transform: scale(-1); + + @media (width >= 56.25rem) { + transform: scaleX(-1); + } + } + + &.bg-secondary::after { + background: var(--ellipse-color-dark); + } + } + + &.card { + &::after { + mask-position: bottom left; + mask-size: cover; + background: var(--ellipse-color-light); + border-radius: 0.5rem; + } + + &:nth-child(3n + 1)::after { + mask-image: url("/static/icons/ellipse-single-1.svg"); + } + + &:nth-child(3n + 2)::after { + mask-image: url("/static/icons/ellipse-single-2.svg"); + } + + &:nth-child(3n)::after { + mask-image: url("/static/icons/ellipse-single-3.svg"); + mask-position: bottom right; + } + } +} + +/* MARK: ACCORDION +*/ + +.accordion { + appearance: none; + overflow: clip; + border: 1px solid var(--accordion-border-color); + + &::details-content { + @media (prefers-reduced-motion: no-preference) { + @supports (transition-behavior: allow-discrete) { + transition: height 0.3s, opacity 0.3s, content-visibility 0.3s; + transition-behavior: allow-discrete; + opacity: 0; + height: 0; + } + } + } + + &[open] { + &::details-content { + @media (prefers-reduced-motion: no-preference) { + @supports (transition-behavior: allow-discrete) { + opacity: 1; + height: auto; + } + } + } + + summary::after { + transform: rotate(-180deg); + } + } + + summary { + cursor: pointer; + list-style: none; + display: flex; + justify-content: space-between; + gap: 1.5rem; + hyphens: auto; + overflow-wrap: break-word; + + &::-webkit-details-marker { + display: none; + } + + &::after { + mask-image: url("/static/icons/angle-down.svg"); + display: block; + transition: transform 0.3s; + background-color: var(--accordion-heading-color); + } + } +} + +/* Overwrites for light theme */ +[data-theme="light"] { + color-scheme: light; + + .card.large.knowledge-card { + border: none; + } +} + +/* Overwrites for dark theme */ +[data-theme="dark"] { + color-scheme: dark; + + .card.large.knowledge-card { + border: var(--card-border); + } +} \ No newline at end of file diff --git a/frontend/src/css/contact-section.css b/frontend/src/css/contact-section.css new file mode 100644 index 000000000..d635ec17e --- /dev/null +++ b/frontend/src/css/contact-section.css @@ -0,0 +1,221 @@ +.contact-section { + background: linear-gradient(to bottom, var(--bg-color-primary) 65%, transparent 65%); + + @media (width >= 56.25rem) { + background: linear-gradient(to right, var(--bg-color-primary) 100%, transparent 100%); + background-size: calc((100vw - 77.5rem) / 2 + 77.5rem - 12.5rem) 100%; + background-repeat: no-repeat; + } + + .container { + padding-block: 2rem; + + @media (width >= 56.25rem) { + padding-block: 2rem; + } + + h2 { + padding-bottom: 1.5rem; + + @media (width >= 56.25rem) { + grid-column: span 7; + padding-bottom: 2.5rem; + } + } + + .secondary-button:not(.rounded) { + margin-block: 1rem 2rem; + justify-self: center; + + @media (width >= 56.25rem) { + grid-column: span 7; + justify-self: start; + margin-block: 1.5rem 0; + } + } + } + + &.alt { + background: none; + + .container { + background-color: var(--bg-color-primary); + border-radius: 0.5rem; + + > *, .secondary-button:not(.rounded) { + @media (width >= 56.25rem) { + grid-column: 3 / 11; + } + } + } + } +} + +[data-theme="light"] { + color-scheme: light; + + .faq-item { + border: 1px solid var(--green-400); + } +} + +.faq-item { + margin-bottom: 0.5rem; + background: var(--accordion-bg-color); + border-radius: 0.5rem; + + @media (width >= 56.25rem) { + grid-column: span 7; + margin-bottom: 1rem; + } + + p { + padding: 0 1rem 1rem; + font: var(--accordion-body); + color: var(--accordion-body-color); + } + + summary { + padding: 1rem; + font: var(--accordion-header); + color: var(--accordion-heading-color); + } +} + +.contact-card { + padding: 2rem 1rem; + background: var(--card-bg-color-contact); + border-radius: 0.5rem; + align-self: start; + display: flex; + flex-direction: column; + gap: 1rem; + + @media (width >= 56.25rem) { + grid-column: 9 / 13; + grid-row: 1 / 8; + padding: 2rem; + gap: 2rem; + } + + > hgroup { + gap: 0.5rem; + + @media (width >= 56.25rem) { + gap: 1rem; + } + + h3 { + font: var(--card-header-xl); + color: var(--card-heading-color-contact); + } + + p { + font: var(--card-body-l); + color: var(--card-body-color-contact); + } + } + + ul { + display: flex; + gap: 1rem; + flex-direction: column; + } +} + +.faq-sub-section { + .container { + padding-block: 2rem; + gap: 1rem; + + @media (width >= 56.25rem) { + padding-block: 2rem; + gap: 3rem; + } + } + + .h2 { + text-align: center; + } +} + +.contact-card-list { + display: flex; + gap: 0.5rem; + flex-direction: column; + + @media (width >= 56.25rem) { + gap: 2rem; + flex-direction: row; + } +} + +.contact-card-small { + background: var(--card-bg-color-contact); + border-radius: 0.5rem; + color: inherit; + display: flex; + justify-content: space-between; + align-items: center; + width: 100%; + + &.alt { + padding: 1rem; + + @media (width >= 56.25rem) { + padding: 2rem; + } + } + + &:not(.alt) { + background: var(--button-bg-color-contact); + + > a { + width: 100%; + height: 100%; + justify-content: space-between; + align-items: center; + border-radius: 0.5rem; + padding: 1rem; + } + } + + hgroup { + gap: 0.5rem; + + a { + display: inline; + text-decoration: underline; + color: inherit; + } + } + + h4 { + display: flex; + gap: 0.5rem; + align-items: center; + font: var(--card-header-m); + color: var(--card-heading-color-contact); + + &::before { + display: block; + } + + &.mail::before { + mask-image: url("/static/icons/envelope.svg"); + } + + &.help::before { + mask-image: url("/static/icons/gear.svg"); + } + + &.visit::before { + mask-image: url("/static/icons/pin.svg"); + } + } + + p { + font: var(--card-body-m); + color: var(--card-body-color-contact); + } +} \ No newline at end of file diff --git a/frontend/src/css/footer.css b/frontend/src/css/footer.css new file mode 100644 index 000000000..bae60529d --- /dev/null +++ b/frontend/src/css/footer.css @@ -0,0 +1,161 @@ +.footer-nav { + background: var(--footer-bg-color); + width: 100%; + + .container { + display: flex; + justify-content: space-between; + padding-block: 2.5rem; + flex-direction: column; + gap: 2.5rem; + width: 100%; + + @media (width >= 56.25rem) { + flex-direction: row; + padding-block: 2.5rem; + } + } +} + +.footer-logo { + transition: opacity 0.3s; + height: fit-content; + width: fit-content; + + &:hover { + opacity: 0.8; + } +} + +footer { + .nav-list { + display: grid; + grid-template-columns: repeat(1, 1fr); + grid-template-rows: auto; + gap: 1.5rem; + + @media (width >= 56.25rem) { + grid-template-columns: repeat(3, 1fr); + } + } + + .nav-item a { + display: flex; + align-items: center; + gap: 1rem; + font: var(--footer-link); + color: var(--footer-text-color); + text-decoration: underline; + text-decoration-color: var(--transparent-100); + text-decoration-thickness: 2px; + text-underline-offset: 0.625rem; + transition: text-decoration-color 0.3s; + width: fit-content; + + &:hover { + text-decoration-color: currentcolor; + } + + &::before { + mask-image: url("/static/icons/arrow-right.svg"); + display: block; + + @media (width >= 56.25rem) { + width: 2rem; + height: 2rem; + } + } + } +} + +.footer-bar { + background: var(--footer-bar-bg-color); + + .container { + display: flex; + gap: 2rem; + flex-direction: column; + padding-block: 2rem; + width: 100%; + + @media (width >= 56.25rem) { + flex-direction: row; + justify-content: space-between; + align-items: center; + padding-block: 1rem; + } + } +} + +.footer-links { + display: flex; + gap: 1.25rem; + flex-direction: column; + + @media (width >= 56.25rem) { + flex-direction: row; + } + + .footer-link a { + color: var(--footer-bar-text-color); + font: var(--footer-bar-link); + text-decoration: underline; + text-decoration-color: var(--transparent-100); + text-decoration-thickness: 2px; + text-underline-offset: 0.625rem; + transition: text-decoration-color 0.3s; + width: fit-content; + + &:hover { + text-decoration-color: currentcolor; + } + } +} + +.footer-socials { + display: flex; + gap: 1.5rem; + + .footer-social { + display: flex; + align-items: center; + + .icon { + background-color: var(--green-600); + padding: 0.5rem; + border-radius: 100%; + color: var(--white-100); + + &::after { + display: block; + background-color: var(--white-100); + width: 1.125rem; + height: 1.125rem; + } + + &.x::after { + mask-image: url("/static/icons/x.svg"); + } + + &.linkedin::after { + mask-image: url("/static/icons/linkedin.svg"); + } + + &.mastodon::after { + mask-image: url("/static/icons/mastodon.svg"); + } + } + } +} + +.version { + text-align: left; + border-top: 1px solid var(--grey-300); + padding: 1.25rem 1rem; + max-width: 77.5rem; + margin-inline: auto; + + @media (width >= 56.25rem) { + text-align: right; + } +} diff --git a/frontend/src/css/global.css b/frontend/src/css/global.css new file mode 100644 index 000000000..e824be2c7 --- /dev/null +++ b/frontend/src/css/global.css @@ -0,0 +1,341 @@ +/* MARK: FONT FAMILIES +*/ + +/* Montserrat-400 */ +@font-face { + font-display: swap; + font-family: Montserrat; + font-style: normal; + font-weight: 400; + src: url('/static/fonts/montserrat-400.woff2') format('woff2'); +} + +/* Montserrat-500 */ +@font-face { + font-display: swap; + font-family: Montserrat; + font-style: normal; + font-weight: 500; + src: url('/static/fonts/montserrat-500.woff2') format('woff2'); +} + +/* Montserrat-600 */ +@font-face { + font-display: swap; + font-family: Montserrat; + font-style: normal; + font-weight: 600; + src: url('/static/fonts/montserrat-600.woff2') format('woff2'); +} + +/* Montserrat-700 */ +@font-face { + font-display: swap; + font-family: Montserrat; + font-style: normal; + font-weight: 700; + src: url('/static/fonts/montserrat-700.woff2') format('woff2'); +} + +/* Roboto-400 */ +@font-face { + font-display: swap; + font-family: Roboto; + font-style: normal; + font-weight: 400; + src: url('/static/fonts/roboto-400.woff2') format('woff2'); +} + +/* Roboto-500 */ +@font-face { + font-display: swap; + font-family: Roboto; + font-style: normal; + font-weight: 500; + src: url('/static/fonts/roboto-500.woff2') format('woff2'); +} + +/* Roboto-700 */ +@font-face { + font-display: swap; + font-family: Roboto; + font-style: normal; + font-weight: 700; + src: url('/static/fonts/roboto-700.woff2') format('woff2'); +} + +*, +*::before, +*::after { + margin: 0; + padding: 0; + box-sizing: border-box; +} + +html { + scroll-padding-top: 3.125rem; +} + +body { + font-family: Montserrat, sans-serif; + background-color: var(--bg-color-body); + color: var(--body-color-primary); + interpolate-size: allow-keywords; + overflow-wrap: break-word; + text-wrap: pretty; +} + +main { + display: flex; + flex-direction: column; + gap: 2.5rem; + margin-bottom: 2.5rem; + + @media (width >= 56.25rem) { + gap: 2.5rem; + margin-bottom: 2.5rem; + } +} + +ul { + list-style: none; +} + +a { + text-decoration: none; + display: flex; +} + +p a { + text-decoration: underline; +} + +button { + cursor: pointer; + border: none; + background-color: transparent; +} + +img { + max-width: 100%; + height: auto; +} + +video { + max-width: 100%; + height: auto; + width: auto; +} + +.container { + max-inline-size: 77.5rem; + margin-inline: auto; + padding-inline: 1rem; +} + +.center { + display: flex; + justify-content: center; +} + +.light-visible { + display: var(--light-visible); +} + +.dark-visible { + display: var(--dark-visible); +} + +.skip-link { + position: absolute; + left: -9999px; + z-index: 999; + padding: 1rem; + background-color: var(--black-100); + color: var(--white-100); + opacity: 0; + + &:focus-visible { + left: 50%; + translate: -50% 0; + opacity: 1; + } +} + +.visually-hidden { + border: 0; + clip: rect(1px, 1px, 1px, 1px); + clip-path: inset(50%); + height: 1px; + margin: -1px; + overflow: clip; + padding: 0; + position: absolute; + white-space: nowrap; + width: 1px; +} + +body:has(.nav-controls.active) .skip-link { + display: none; +} + +body:has(.nav-controls.active) { + @media (width <= 56.25rem) { + overflow: hidden; + } +} + +.h1, .h2, .h3, .h4, .h5, .h6, .h7 { + color: var(--heading-color-primary); + + &.color-secondary { + color: var(--heading-color-secondary); + } + + &.color-alt { + color: var(--heading-color-alt); + } +} + +.h1 { + font: var(--section-header-xxl); +} + +.h2 { + font: var(--section-header-xl); +} + +.h3 { + font: var(--section-header-l); +} + +.h4 { + font: var(--section-header-m); +} + +.h5 { + font: var(--section-header-s); +} + +.h6 { + font: var(--section-header-xs); +} + +.h7 { + font: var(--section-header-xxs); +} + + + +.body-xl, .body-l, .body-m, .body-s { + color: var(--body-color-primary); + + + + &.color-secondary { + color: var(--body-color-secondary); + } +} + +.body-xl { + font: var(--section-body-xl); +} + +.body-l { + font: var(--section-body-l); +} + +.body-m { + font: var(--section-body-m); +} + +.body-s { + font: var(--section-body-s); +} + +.color-accent { + color: var(--heading-color-accent); +} + +hgroup { + display: flex; + flex-direction: column; + + &.flipped { + flex-direction: column-reverse; + } + + &.center { + text-align: center; + } +} + +.icon:not(.ellipse)::after, +.icon::before { + content: ""; + background-color: currentcolor; + mask-repeat: no-repeat; + mask-size: cover; + display: none; + width: 1.5rem; + height: 1.5rem; + min-width: 1.5rem; + min-height: 1.5rem; +} + +[class*="section"] { + &.bg-primary { + background-color: var(--bg-color-primary); + } + + &.bg-secondary { + background-color: var(--bg-color-secondary); + } + + &.bg-primary, &.bg-secondary { + margin-inline: 1rem; + border-radius: 1rem; + + &:first-child { + margin-inline: 0; + border-radius: 0; + + @media (width >= 56.25rem) { + margin-inline: 1rem; + border-radius: 1rem; + } + } + } + + > .container { + display: grid; + grid-template-columns: repeat(12, 1fr); + grid-template-rows: auto; + + > * { + grid-column: span 12; + } + } +} + +.test-card-small, +.contact-card .contact-card-small, +.hall-of-fame-list li, +.card:not(.home-variant), +.faq-item:not([open]), +.result-details-content details:not([open]), +.footer-social { + transition: transform 0.3s; + + &:hover { + transform: scale(1.03); + } +} + +.matomo { + display: none; +} + +.hidethis { + display: none; +} \ No newline at end of file diff --git a/frontend/src/css/hall-of-fame-section.css b/frontend/src/css/hall-of-fame-section.css new file mode 100644 index 000000000..a16bd40f3 --- /dev/null +++ b/frontend/src/css/hall-of-fame-section.css @@ -0,0 +1,124 @@ +.hall-of-fame-section { + .container { + row-gap: 1.5rem; + padding-block: 2rem; + + @media (width >= 56.25rem) { + row-gap: 3rem; + padding-block: 2rem; + } + } + + hgroup { + gap: 0.5rem; + + @media (width >= 56.25rem) { + grid-column: 3 / 11; + gap: 1rem; + } + } + + .button-container { + place-self: center; + } + + @media (width >= 56.25rem) { + .hall-of-fame-list { + grid-column: span 12; + } + } +} + +.filter-section { + translate: 0 -4.0625rem; + margin: 0 1rem -4.0625rem; + z-index: 1; + + @media (width >= 56.25rem) { + translate: 0 -4.6875rem; + margin: 0 0 -4.6875rem; + } + + .filter-container { + background: var(--bg-color-body); + border: var(--card-border); + box-shadow: var(--card-box-shadow); + display: flex; + justify-content: center; + padding: 1.5rem; + border-radius: 0.5rem; + flex-direction: column; + gap: 1rem; + + @media (width >= 56.25rem) { + grid-column: 3 / 11; + width: 100%; + gap: 3rem; + align-items: center; + flex-direction: row; + } + + .h2 { + font: var(--section-header-s); + color: var(--heading-color-primary); + } + } +} + +.hosters-section { + .container { + gap: 2rem 1rem; + + @media (width >= 56.25rem) { + gap: 4rem 2rem; + } + } + + hgroup { + gap: 1rem; + text-align: center; + + @media (width >= 56.25rem) { + grid-column: 2 / 10; + text-align: start; + } + } + + .image-container { + background-color: var(--green-100); + border-radius: 100%; + padding: 1.5rem 2.375rem; + place-self: center; + order: -1; + + @media (width >= 56.25rem) { + grid-column: 10 / 12; + order: unset; + } + } +} + +.hall-of-fame-list { + display: grid; + grid-template-columns: repeat(auto-fit, minmax(min(12.5rem, 50%), 1fr)); + grid-auto-flow: dense; + gap: 1.5rem; + + @media (width >= 56.25rem) { + grid-column: 2 / 12; + } + + li a { + text-wrap: nowrap; + text-overflow: ellipsis; + padding: 0.75rem 0.5rem; + background-color: var(--button-bg-color-hoster); + color: var(--button-text-color-hoster); + font: var(--section-button-m); + border-radius: 0.25rem; + text-align: center; + display: block; + overflow: clip; + border: 2px solid var(--grey-300); + } +} \ No newline at end of file diff --git a/frontend/src/css/header.css b/frontend/src/css/header.css new file mode 100644 index 000000000..86dda2ed2 --- /dev/null +++ b/frontend/src/css/header.css @@ -0,0 +1,551 @@ +/* ========================================================================== + HEADER COMPONENT STYLES + ========================================================================== */ + +/* Header Container */ + +header { + top: 0; + z-index: 2; + background: var(--nav-bg-color); + transition: border 0.3s, box-shadow 0.3s, translate 0.3s; + position: sticky; + + &.stuck { + border-bottom: var(--nav-sticky-border); + box-shadow: var(--nav-sticky-shadow); + } + + &.not-scrolling-up { + @media (prefers-reduced-motion: no-preference) { + translate: 0 -100%; + + #nav-sublist.nav-sublist.expanded { + translate: -50% -100%; + } + } + } + + @media (scripting: none) { + position: initial; + } + + .container { + display: flex; + align-items: center; + padding: 0; + justify-content: space-between; + gap: 1rem; + + @media (width >= 73.125rem) { + padding: 1.5rem 1rem; + } + + &:has(.active) { + padding: 0; + } + + @media (scripting: none) { + flex-wrap: wrap; + } + } +} + +/* Header Logo and Toggle Controls */ +.header-logo-toggle-controls { + display: flex; + justify-content: space-between; + background: var(--nav-bg-color); + z-index: 1; + width: 100%; + padding: 1.25rem 1rem; + gap: 1rem; + + @media (width >= 73.125rem) { + width: auto; + padding: 0; + } +} + +.header-logo { + transition: opacity 0.3s; + width: 227.5px; + + &:hover { + opacity: 0.8; + } +} + +/* Toggle Menu Button */ +.toggle-menu { + display: flex; + align-items: center; + gap: 0.5rem; + color: var(--nav-text-color); + font: var(--nav-button); + fill: currentcolor; + + .close { + display: none; + } + + @media (width >= 73.125rem) { + display: none; + } + + @media (scripting: none) { + display: none; + } + + &::after { + mask-image: url("/static/icons/hamburger.svg"); + display: block; + width: 2rem; + height: 2rem; + } +} + +/* Active Header State */ +header:has(.active) { + .close { + display: initial; + } + + .open { + display: none; + } + + .header-logo-toggle-controls { + padding: 1.25rem 1rem; + border-radius: 0 0 1rem 1rem; + } + + .toggle-menu::after { + mask-image: url("/static/icons/close.svg"); + } +} + + +/* Navigation Button Base Styles */ + + +/* Icon Styles */ +.icon { + &.globe::before { + @media (width >= 73.125rem) { + display: flex; + mask-image: url("/static/icons/globe.svg"); + } + } + + &.system::before { + @media (width >= 73.125rem) { + display: flex; + mask-image: url("/static/icons/system.svg"); + } + } + + &.sun::before { + @media (width >= 73.125rem) { + display: flex; + mask-image: url("/static/icons/sun.svg"); + } + } + + &.moon::before { + @media (width >= 73.125rem) { + display: flex; + mask-image: url("/static/icons/moon.svg"); + } + } +} + +/* Navigation Controls */ +.nav-controls { + align-items: center; + width: 100%; + flex-direction: column; + position: fixed; + height: 100vh; + height: 100dvh; + top: 0; + left: 0; + background: var(--nav-mobile-bg-color); + display: none; + overflow: auto; + padding: 6.875rem 1rem 1.875rem; + + @media (scripting: none) { + padding: 0; + } + + @media (prefers-reduced-motion: no-preference) and (scripting: enabled) { + @supports (transition-behavior: allow-discrete) { + transition: display 0.5s, opacity 0.5s, left 0.5s; + transition-behavior: allow-discrete; + left: 100%; + opacity: 0; + } + } + + @media (width >= 73.125rem) { + width: 100%; + flex-direction: row; + position: initial; + height: auto; + display: flex; + justify-content: space-between; + gap: 0.5rem; + overflow: initial; + padding: 0; + opacity: 1; + background-color: var(--nav-bg-color); + } + + @media (scripting: none) { + position: initial; + height: auto; + display: flex; + } + + &.active { + display: flex; + align-items: start; + gap: 1.875rem; + + @media (prefers-reduced-motion: no-preference) { + @supports (transition-behavior: allow-discrete) { + left: 0; + opacity: 1; + + @starting-style { + left: 100%; + opacity: 0; + } + } + } + } +} + +/* Main Navigation */ +header nav { + display: flex; + flex-direction: column; + width: 100%; + + @media (width >= 73.125rem) { + display: flex; + height: auto; + flex-direction: row; + } + + /* Navigation List */ + .nav-list { + display: flex; + padding: 0 0.25rem; + flex-flow: column wrap; + + @media (width >= 73.125rem) { + flex-flow: row nowrap; + flex-grow: 1; + place-content: space-evenly; + place-items: center; + + &.nav-settings { + place-content: flex-end; + flex-grow: 0; + gap: 1.25rem; + padding-left: 1rem; + } + } + + @media (scripting: none) { + flex-flow: row wrap; + } + } + + /* Navigation Items */ + .nav-item { + border-bottom: var(--nav-mobile-border); + + @media (width < 73.125rem) { + padding-bottom: 1rem; + padding-top: 1rem; + } + + @media (width >= 73.125rem) { + border-bottom: none; + } + + .settings-button { + display: flex; + gap: 0.5rem; + align-items: center; + color: var(--nav-text-color); + font: var(--nav-link); + border-radius: 0.5rem; + background: var(--nav-lang-bg-color); + cursor: pointer; + + @media (width >= 73.125rem) { + padding: 0.5rem 0.75rem; + } + + .current-language-desktop { + @media (width <= 73.125rem) { + display: none; + } + + text-transform: uppercase; + } + + .current-language-mobile { + @media (width >= 73.125rem) { + display: none; + } + } + + .current-theme-mobile { + @media (width >= 73.125rem) { + display: none; + } + } + + .current-theme-desktop { + @media (width < 73.125rem) { + display: none; + } + } + } + + /* Navigation Item Links and Buttons */ + a, .link-button { + display: flex; + gap: 1rem; + color: var(--nav-text-color); + font: var(--nav-link); + width: 100%; + border-bottom: 2px solid var(--transparent-100); + transition: border 0.3s; + align-items: center; + + &:hover { + @media (width >= 73.125rem) { + border-bottom: 2px solid currentcolor; + } + } + + @media (scripting: none) { + font-size: 1rem; + } + + @media (width >= 73.125rem) { + gap: 0.25rem; + width: auto; + } + } + + /* Current Navigation Item */ + &.current > a, &.current > button { + @media (width >= 73.125rem) { + border-bottom: 2px solid currentcolor; + } + } + + /* Navigation Items with Sublists */ + &:has(.nav-sublist) { + @media (width >= 73.125rem) { + position: relative; + + &::after { + content: ""; + position: absolute; + left: 0; + width: 100%; + height: 1.25rem; + } + } + + &:focus-within .nav-sublist { + @media (scripting: none) { + display: flex; + } + } + + &:hover .nav-sublist { + @media (width >= 73.125rem) { + display: flex; + + @media (prefers-reduced-motion: no-preference) { + @supports (transition-behavior: allow-discrete) { + opacity: 1; + + @supports not (interpolate-size: allow-keywords) { + max-height: 31.25rem; + } + + @supports (interpolate-size: allow-keywords) { + height: auto; + } + + @starting-style { + opacity: 0; + + @supports not (interpolate-size: allow-keywords) { + max-height: 0; + } + + @supports (interpolate-size: allow-keywords) { + height: 0; + } + } + } + } + } + } + } + + /* Navigation Subitems */ + .nav-subitem { + display: flex; + width: 100%; + + a, button { + display: flex; + font: var(--subnav-link); + color: var(--nav-text-color); + flex-grow: 1; + justify-content: space-between; + align-items: center; + border-bottom: 2px solid var(--transparent-100); + transition: border 0.3s; + + &:hover { + @media (width >= 73.125rem) { + border-bottom: 2px solid currentcolor; + } + } + + @media (scripting: none) { + font-size: 1rem; + } + + @media (width >= 73.125rem) { + gap: 0.5rem; + } + + &::after { + @media (width >= 73.125rem) { + flex-grow: 0; + display: flex; + mask-image: url("/static/icons/angle-down.svg"); + transform: rotate(270deg); + margin-left: auto; + } + } + } + } + } + + /* Toggle Subnav Buttons */ + [id^="toggle-subnav"]::after { + mask-image: url("/static/icons/angle-down.svg"); + display: block; + transform: scale(1.25); + transition: transform 0.3s; + + @media (width >= 73.125rem) { + transform: scale(1); + } + } + + .nav-item:has(.nav-sublist.expanded) [id^="toggle-subnav"]::after { + transform: rotate(180deg) scale(1.25); + + @media (width >= 73.125rem) { + transform: rotate(0deg) scale(1); + } + } + + /* Navigation Sublist */ + .nav-sublist { + display: none; + flex-direction: column; + gap: 1rem; + + @media (prefers-reduced-motion: no-preference) and (scripting: enabled) { + @supports (transition-behavior: allow-discrete) { + overflow: clip; + opacity: 0; + + @supports not (interpolate-size: allow-keywords) { + max-height: 0; + } + + @supports (interpolate-size: allow-keywords) { + height: 0; + } + + transition: max-height 0.3s, height 0.3s, opacity 0.3s, display 0.3s, + padding 0.3s, translate 0.3s; + transition-behavior: allow-discrete; + } + } + + @media (width >= 73.125rem) { + border: 1px solid var(--nav-sublist-border-color); + gap: 1rem; + position: absolute; + padding: 1.25rem 1.5rem; + background-color: var(--nav-dropdown-bg-color); + border-radius: 0.5rem; + width: max-content; + justify-content: space-between; + translate: -50% 0; + left: 50%; + margin-top: 1.25rem; + z-index: 10; + + @media (scripting: none) { + z-index: 2; + } + + /* Bring focused dropdown to front */ + &:focus-within, + &.focused { + z-index: 20; + } + } + + &.expanded { + display: flex; + padding-top: 1.25rem; + + @media (prefers-reduced-motion: no-preference) { + @supports (transition-behavior: allow-discrete) { + opacity: 1; + + @supports not (interpolate-size: allow-keywords) { + max-height: 31.25rem; + } + + @supports (interpolate-size: allow-keywords) { + height: auto; + } + + @starting-style { + opacity: 0; + + @supports not (interpolate-size: allow-keywords) { + max-height: 0; + } + + @supports (interpolate-size: allow-keywords) { + height: 0; + } + } + } + } + } + } + } diff --git a/frontend/src/css/knowledge-section.css b/frontend/src/css/knowledge-section.css new file mode 100644 index 000000000..75ab7e866 --- /dev/null +++ b/frontend/src/css/knowledge-section.css @@ -0,0 +1,217 @@ +.knowledge-section { + .container { + row-gap: 2rem; + align-items: center; + + @media (width >= 56.25rem) { + row-gap: 0; + } + } + + hgroup { + gap: 1rem; + + @media (width >= 56.25rem) { + grid-column: span 5; + gap: 2rem; + grid-row: 3 / 5; + } + } + + .button-container { + gap: 1rem; + + @media (width >= 56.25rem) { + grid-column: 1 / 6; + grid-row: 6 / 8; + } + } + + .button-container p { + text-align: center; + } +} + +.knowledge-list { + display: flex; + overflow-x: auto; + scroll-snap-type: x mandatory; + scroll-behavior: smooth; + gap: 1rem; + padding-bottom: 1.25rem; + + @supports selector(::scroll-marker) { + scroll-marker-group: after; + + &::scroll-marker-group { + display: flex; + justify-content: center; + align-items: center; + grid-column: span 12; + gap: 1.25rem; + min-height: 0.9375rem; + } + } + + scrollbar-width: none; + -ms-overflow-style: none; + + &::-webkit-scrollbar { + display: none; + } + + @media (scripting: none) { + scrollbar-width: initial; + -ms-overflow-style: initial; + + &::-webkit-scrollbar { + display: initial; + } + } + + @media (width >= 56.25rem) { + grid-column: 7 / -1; + gap: 2rem; + overflow-x: initial; + display: grid; + grid-template-columns: repeat(6, 1fr); + grid-template-rows: repeat(2, 1fr); + padding-bottom: 0; + grid-row: 1 / 11; + } +} + +.knowledge-card.home-variant { + flex: 0 0 75%; + scroll-snap-align: start; + scroll-snap-stop: always; + padding: 2rem 1.5rem; + display: flex; + flex-direction: column; + gap: 0.5rem; + height: auto; + + > *, + &::before { + z-index: 1; + position: relative; + } + + @supports selector(::scroll-marker) { + &::scroll-marker { + content: ""; + width: 0.5rem; + height: 0.5rem; + border-radius: 100%; + background-color: var(--green-400); + transition: background-color 0.3s; + display: flex; + align-items: center; + justify-content: center; + } + + &::scroll-marker:target-current { + background-color: var(--orange-300); + width: 0.9375rem; + height: 0.9375rem; + } + } + + @media (width >= 56.25rem) { + padding: 3rem 1.5rem 2rem; + } + + &::before { + display: block; + width: 2rem; + height: 2rem; + } + + &:nth-child(1) { + @media (width >= 56.25rem) { + grid-row: 1 / 1; + grid-column: 1 / 4; + } + + &::before { + mask-image: url("/static/icons/search.svg"); + } + } + + &:nth-child(2) { + @media (width >= 56.25rem) { + grid-row: 2 / 2; + grid-column: 1 / 4; + } + + &::before { + mask-image: url("/static/icons/graph.svg"); + } + } + + &:nth-child(3) { + @media (width >= 56.25rem) { + grid-row: 1 / 3; + grid-column: 4 / 7; + align-self: center; + } + + &::before { + mask-image: url("/static/icons/eye.svg"); + } + } + + h3 { + font: var(--card-header-s); + } + + p { + font: var(--card-body-s); + } + + &:hover h3 { + text-decoration: none; + } +} + +.dots { + display: flex; + justify-content: center; + align-items: center; + gap: 1.25rem; + min-height: 0.9375rem; + + @media (width >= 56.25rem) or (scripting: none) { + display: none; + } + + .dot { + width: 0.5rem; + height: 0.5rem; + background-color: var(--green-400); + border-radius: 50%; + transition: background-color 0.3s; + display: flex; + align-items: center; + justify-content: center; + + &.active { + background-color: var(--orange-300); + width: 0.9375rem; + height: 0.9375rem; + } + + & button { + height: 100%; + width: 100%; + + &:not(.active) { + padding: 0.75rem; + } + } + } + + @supports selector(::scroll-marker) { + display: none; + } +} \ No newline at end of file diff --git a/frontend/src/css/print.css b/frontend/src/css/print.css new file mode 100644 index 000000000..bd04804ea --- /dev/null +++ b/frontend/src/css/print.css @@ -0,0 +1,27 @@ +@media print { + header { + position: static; + } + + .not-scrolling-up { + translate: unset; + } + + .toggle-menu, .nav-controls, .footer-nav, .footer-bar, .action-card { + display: none; + } + + .meter-value { + opacity: 1; + animation: none; + } + + meter { + width: 100%; + animation: none; + } + + .result-section .container > * { + grid-column: span 12; + } +} \ No newline at end of file diff --git a/frontend/src/css/result-section.css b/frontend/src/css/result-section.css new file mode 100644 index 000000000..0adab9edd --- /dev/null +++ b/frontend/src/css/result-section.css @@ -0,0 +1,749 @@ +.result-section { + .container { + padding-block: 2rem; + row-gap: 1.5rem; + + @media (width >= 56.25rem) { + padding-block: 2.25rem; + row-gap: 3rem; + + & > * { + grid-column: 1 / 8; + } + } + } + + &.loading { + .container > * { + @media (width >= 56.25rem) { + grid-column: 3 / 11; + row-gap: 2.5rem; + } + } + } + + h1 { + display: flex; + flex-direction: column; + gap: 0.5rem; + } + + hgroup { + gap: 0.75rem; + + @media (width >= 56.25rem) { + gap: 1.5rem; + } + } + + ul:not(.meter-numbers) { + display: flex; + flex-direction: column; + gap: 1rem; + } + + .main-item { + &::before { + min-width: 1.75rem; + min-height: 1.75rem; + } + } + + li:not(.meter-number) { + display: flex; + gap: 1rem; + align-items: center; + + a { + display: inline; + text-decoration: underline; + } + + &.probing::before { + background-image: url("/static/icons/spinner.svg"); + display: block; + background-color: unset; + background-repeat: no-repeat; + background-size: cover; + + } + + &.probing:has(:not(.done))::before { + margin: 0.125rem; + + @media (prefers-reduced-motion: no-preference) { + animation: rotate linear infinite 2s; + } + } + + &.probing:has(.done)::before { + mask-image: url("/static/icons/circle-done.svg"); + background-color: var(--probing-color); + width: 1.75rem; + height: 1.75rem + + } + + &:not(.probing)::before { + background-color: unset; + background-repeat: no-repeat; + background-size: cover; + display: block; + } + + &.passed::before { + mask-image: url("/static/icons/checkmark-circle.svg"); + background-color: var(--success-color); + } + + &.warning::before { + mask-image: url("/static/icons/exclamation-circle.svg"); + background-color: var(--warning-color); + } + + &.failed::before { + mask-image: url("/static/icons/error.svg"); + background-color: var(--failed-color); + } + + &.not-tested::before { + mask-image: url("/static/icons/question.svg"); + background-color: var(--not-tested-color); + } + + &.error::before { + mask-image: url("/static/icons/broken.svg"); + background-color: var(--error-color); + } + + &.info::before { + mask-image: url("/static/icons/info.svg"); + background-color: var(--info-color); + } + + &.hidethis { + display: none; + } + } +} + +body.emailtest .action-card-item:has(.mail), +body.websitetest .action-card-item:has(.domain), +body.connectiontest .action-card-item:has(.connection) { + display: none; +} + +.action-card { + background-color: var(--card-bg-color-action); + border-radius: 1rem 1rem 0 0; + padding: 1rem 1.5rem; + display: flex; + flex-direction: column; + grid-column: span 12; + position: sticky; + bottom: 0; + order: 2; + z-index: 1; + max-height: 80vh; + overflow-y: auto; + + @media (width >= 56.25rem) { + grid-column: 9 / 13; + grid-row: 1 / 2; + bottom: unset; + order: unset; + top: 20vh; + margin-top: -28.125rem; + align-self: start; + padding: 2rem; + border-radius: 1rem; + } + + details { + display: flex; + flex-direction: column; + appearance: none; + overflow: clip; + padding-bottom: 1rem; + + @media (width >= 56.25rem) { + padding-bottom: 1.5rem; + } + + &::details-content { + @media (prefers-reduced-motion: no-preference) and (width < 56.25rem) { + @supports (transition-behavior: allow-discrete) { + transition: height 0.3s, opacity 0.3s, content-visibility 0.3s; + transition-behavior: allow-discrete; + opacity: 0; + height: 0; + } + } + + @media (width >= 56.25rem) { + content-visibility: visible; + } + } + + &[open] { + &::details-content { + @media (prefers-reduced-motion: no-preference) { + @supports (transition-behavior: allow-discrete) { + opacity: 1; + height: fit-content; + } + } + } + + summary::after { + transform: rotate(-180deg); + } + } + } + + summary, + h2 { + font: var(--card-header-xl); + color: var(--card-heading-color-action); + display: flex; + justify-content: space-between; + align-items: center; + } + + h2 { + display: none; + + @media (width >= 56.25rem) { + display: flex; + padding-bottom: 0.5rem; + } + } + + summary { + display: flex; + cursor: pointer; + + &::-webkit-details-marker { + display: none; + } + + &::after { + mask-image: url("/static/icons/angle-down.svg"); + display: block; + transition: transform 0.3s; + + @media (width >= 56.25rem) { + display: none; + } + } + + @media (width >= 56.25rem) { + display: none; + } + } + + .action-card-description { + font: var(--card-body-m); + color: var(--card-body-color-action); + padding-top: 1.5rem; + } + + .action-card-list { + display: flex; + flex-direction: column; + gap: 1.5rem; + padding-top: 1rem; + } + + .action-card-item a, + .action-card-item button, + .action-card-item .countdown { + color: var(--card-body-color-action); + font: var(--card-header-m); + justify-content: space-between; + align-items: center; + border-bottom: 0.0625rem solid var(--card-body-color-action); + padding-bottom: 0.5rem; + display: flex; + + &::after { + mask-image: url("/static/icons/angle-down.svg"); + display: block; + transform: rotate(-90deg); + } + + span { + display: flex; + gap: 1rem; + align-items: center; + } + + .domain::before { + mask-image: url("/static/icons/globe.svg"); + display: block; + } + + .mail::before { + mask-image: url("/static/icons/envelope.svg"); + display: block; + } + + .connection::before { + mask-image: url("/static/icons/link.svg"); + display: block; + } + + .reset::before { + mask-image: url("/static/icons/reset.svg"); + display: block; + } + + .clipboard::before { + mask-image: url("/static/icons/clipboard.svg"); + display: block; + } + + .countdown-time-text, + .countdown-time { + display: inline; + } + + &.repeat-test.hidden { + display: none; + } + } + + .action-card-item button { + background: none; + border: none; + border-bottom: 0.0625rem solid var(--card-body-color-action); + cursor: pointer; + text-align: left; + width: 100%; + + + &:focus { + outline: 2px solid var(--focus-color); + outline-offset: 2px; + } + } +} + +#copy-link { + &:not(.copied) { + .not-clicked { + display: flex; + } + + .clicked { + display: none; + } + } + + &.copied { + &::after { + display: none; + } + + .not-clicked { + display: none; + } + + .clicked { + display: flex; + } + } + + @media (scripting: none) { + cursor: default; + } +} + +@keyframes rotate { + from { + transform: rotate(0deg); + } + + to { + transform: rotate(360deg); + } +} + +.meter-container { + display: flex; + flex-direction: column; + gap: 1rem; + position: relative; + border-bottom: 1px solid var(--grey-300); + padding-block: 1.5rem 1rem; + margin-inline: 0.625rem; +} + +.meter { + background-color: var(--white-100); + border-radius: 1.25rem; + height: 1rem; +} + +.meter-value { + position: absolute; + translate: -50% -120%; + color: light-dark(var(--white-100), var(--black-100)); + background-color: var(--meter-bg-color); + mask-image: url("/static/icons/box.svg"); + mask-size: contain; + mask-repeat: no-repeat; + mask-position: center; + padding: 0.375rem 0.375rem 0.625rem; + display: flex; + font: var(--heading-font-xxs); + opacity: 0; + animation: fadein 1s ease forwards 2s; +} + +@keyframes fadein { + from { + opacity: 0; + } + + to { + opacity: 1; + } +} + +meter { + width: 100%; + border-radius: 1.25rem; + height: 100%; + background: var(--white-100); + vertical-align: top; + + @media (prefers-reduced-motion: no-preference) { + animation: fillmeter 2s ease forwards; + width: 0%; + } +} + +@keyframes fillmeter { + from { + width: 0%; + } + + to { + width: 100%; + } +} + +.meter-numbers { + display: flex; + justify-content: space-between; + font: var(--heading-font-xxs); +} + +meter::-webkit-meter-bar { + background: var(--white-100); + border-radius: 1.25rem; + height: 1rem; +} + +meter::-webkit-meter-optimum-value, +meter::-webkit-meter-suboptimum-value, +meter::-webkit-meter-even-less-good-value { + background: var(--meter-bg-color); + border-radius: 1.25rem; +} + +meter::-moz-meter-bar { + background: var(--meter-bg-color); + border-radius: 1.25rem; + height: 1rem; +} + +.result-details-section { + .container { + row-gap: 2rem; + + @media (width >= 56.25rem) { + gap: 2rem; + } + + & > *:not(.action-card) { + @media (width >= 56.25rem) { + grid-column: 1 / 9; + } + } + } +} + +.result-details-list { + display: flex; + flex-direction: column; + gap: 1.5rem; + z-index: 0; + + @media (width >= 56.25rem) { + gap: 2.125rem; + } +} + +.result-details-item { + display: flex; + flex-direction: column; + gap: 1.5rem; + padding-bottom: 1.5rem; + + @media (width >= 56.25rem) { + padding-bottom: 2.125rem; + } + + &:not(:last-child) { + border-bottom: 1px solid var(--grey-300); + } + + > hgroup { + display: flex; + flex-direction: column; + gap: 0.5rem; + + h3 { + display: flex; + gap: 1rem; + align-items: center; + + &::before { + width: 1.75rem; + height: 1.75rem; + min-width: 1.75rem; + min-height: 1.75rem; + } + + &.passed::before { + mask-image: url("/static/icons/checkmark-circle.svg"); + display: block; + background-color: var(--success-color); + } + + &.warning::before { + mask-image: url("/static/icons/exclamation-circle.svg"); + display: block; + background-color: var(--warning-color); + } + + &.failed::before { + mask-image: url("/static/icons/error.svg"); + display: block; + background-color: var(--failed-color); + } + + &.info::before { + mask-image: url("/static/icons/info.svg"); + display: block; + background-color: var(--info-color); + } + + &.not-tested::before { + mask-image: url("/static/icons/question.svg"); + background-color: var(--not-tested-color); + } + + &.error::before { + mask-image: url("/static/icons/broken.svg"); + display: block; + background-color: var(--error-color); + } + } + + p a { + display: inline-flex; + color: var(--body-link-color); + + &:hover { + text-decoration: underline; + } + } + } + + .result-details-content { + display: flex; + flex-direction: column; + background-color: var(--bg-color-primary); + border-radius: 0.5rem; + padding: 1.5rem; + + h4 { + padding-bottom: 1rem; + + &:not(:first-child) { + padding-top: 1rem; + } + } + + details { + margin-bottom: 0.5rem; + background: var(--accordion-bg-color); + border-radius: 0.5rem; + + @media (width >= 56.25rem) { + grid-column: span 7; + margin-bottom: 1rem; + } + + &:not(:last-child) { + margin-bottom: 0.5rem; + } + + > *:last-child { + padding-bottom: 1rem; + } + + a { + display: inline; + color: var(--body-link-color); + + &:hover { + text-decoration: underline; + } + } + + p { + margin-bottom: 1rem; + } + + ul { + list-style: initial; + } + + ul, + ol { + li { + margin-block: 1rem; + margin-left: 1.5rem; + } + } + + hr { + margin-bottom: 0.5rem; + } + + tbody { + font-family: monospace, sans-serif; + } + + td, + th { + padding: 0.375rem; + text-align: left; + + &:first-child { + padding-left: 0; + } + } + + code { + background: var(--bg-color-primary); + padding: 0.25rem; + border-radius: 0.25rem; + } + + div:has(.tech-details-table) { + display: flex; + gap: 0.5rem; + flex-direction: column; + } + + .tech-details-table { + overflow-x: auto; + } + + h5 { + font-size: inherit; + } + + &::details-content { + font: var(--accordion-body); + display: flex; + padding-inline: 1rem; + flex-direction: column; + gap: 1rem; + } + + &[open] > *:not(summary) { + @supports not (selector(::details-content)) { + font: var(--accordion-body); + padding: 0.5rem 1rem; + } + } + + summary { + padding: 1rem; + font: var(--accordion-header); + color: var(--accordion-heading-color); + font-weight: 600; + gap: 1rem; + + &.warning { + color: var(--warning-color); + } + + &.failed { + color: var(--failed-color); + } + + &.not-tested { + color: var(--not-tested-color); + } + + &::after { + margin-left: auto; + } + + &.passed::before { + mask-image: url("/static/icons/checkmark-circle.svg"); + display: block; + background-color: var(--success-color); + } + + &.warning::before { + mask-image: url("/static/icons/exclamation-circle.svg"); + display: block; + background-color: var(--warning-color); + } + + &.failed::before { + mask-image: url("/static/icons/error.svg"); + display: block; + background-color: var(--failed-color); + } + + &.info::before { + mask-image: url("/static/icons/info.svg"); + display: block; + background-color: var(--info-color); + } + + &.not-tested::before { + mask-image: url("/static/icons/question.svg"); + display: block; + } + + &.error::before { + mask-image: url("/static/icons/broken.svg"); + display: block; + background-color: var(--error-color); + } + } + } + } +} + +.action-card-item { + .repeat-test { + &.link.hidden { + display: none; + } + + &.countdown.hidden { + display: none; + } + } +} diff --git a/frontend/src/css/test-section.css b/frontend/src/css/test-section.css new file mode 100644 index 000000000..de654c82f --- /dev/null +++ b/frontend/src/css/test-section.css @@ -0,0 +1,341 @@ +.test-section { + .container { + row-gap: 0.5rem; + padding-block: 2.5rem; + + @media (width >= 56.25rem) { + gap: 2rem; + padding-block: 3.25rem; + } + } + + h1 { + padding-bottom: 0.5rem; + + @media (width >= 56.25rem) { + grid-column: 2 / 12; + padding-bottom: 1rem; + } + } + + &.home-variant { + h1 { + grid-column: span 12; + } + } +} + +.test-sub-section { + .container { + row-gap: 1.5rem; + padding-block: 2rem; + + @media (width >= 56.25rem) { + row-gap: 2rem; + padding-block: 2rem; + } + } + + h2 { + text-align: center; + + @media (width >= 56.25rem) { + grid-column: 2 / 12; + } + } +} + +.test-card-large { + background: var(--card-bg-color-test); + padding: 2rem 1rem; + border-radius: 0.5rem; + display: flex; + flex-direction: column; + justify-content: space-between; + + @media (width >= 56.25rem) { + padding: 3rem; + grid-column: 2 / 12; + } + + h2 { + display: flex; + gap: 1rem; + align-items: center; + color: var(--card-heading-color-test); + font: var(--card-header-xl); + padding-bottom: 1.5rem; + + &.icon::before { + display: block; + width: 2rem; + height: 2rem; + } + + &.domain::before { + mask-image: url("/static/icons/globe.svg"); + } + + &.mail::before { + mask-image: url("/static/icons/envelope.svg"); + } + + &.connection::before { + mask-image: url("/static/icons/link.svg"); + } + } + + form { + display: grid; + + @media (width >= 56.25rem) { + column-gap: 1.5rem; + row-gap: 0.5rem; + grid-template-columns: repeat(2, 1fr); + } + } + + label { + display: flex; + flex-direction: column; + gap: 0.25rem; + color: var(--card-body-color-test); + font: var(--card-header-xs); + padding-bottom: 1rem; + + @media (width >= 56.25rem) { + padding-bottom: 0; + grid-column: 1 / 2; + } + } + + input { + padding: 0.5rem 1rem; + border-radius: 0.25rem; + background: var(--card-input-bg-color-test); + font: var(--card-input); + color: var(--card-body-color-test); + border: 1px solid currentcolor; + min-height: 3.25rem; + + &::placeholder { + color: var(--placeholder-color); + opacity: 1; + } + } + + button { + padding: 0.625rem 1rem; + + @media (width >= 56.25rem) { + align-self: end; + grid-column: 2 / 3; + grid-row: 1 / 2; + } + } + + .invalid-domain { + color: var(--warning-color); + font: var(--card-body-m); + padding-bottom: 1rem; + + @media (width >= 56.25rem) { + padding-block: 0.5rem 0; + } + } + + &.home-variant { + @media (width >= 56.25rem) { + grid-column: span 8; + } + + a { + display: none; + margin-top: 1.5rem; + align-items: center; + gap: 1rem; + color: var(--card-body-color-test); + font: var(--card-body-m); + border-bottom: 1px solid var(--transparent-100); + width: fit-content; + transition: border-bottom 0.3s; + + &:hover { + border-bottom: 1px solid currentcolor; + } + + @media (width >= 56.25rem) { + display: flex; + } + + &::after { + mask-image: url("/static/icons/arrow-right.svg"); + display: block; + } + } + } + + &.domain-variant, + &.mail-variant { + ul { + display: none; + gap: 3rem; + padding-top: 1.5rem;; + + @media (width >= 56.25rem) { + display: flex; + } + } + + li { + display: flex; + align-items: center; + gap: 1rem; + color: var(--card-body-color-test); + font: var(--card-body-m); + + .icon { + padding: 0.25rem; + background-color: var(--bg-color-primary); + border-radius: 100%; + + &::before { + mask-image: url("/static/icons/checkmark.svg"); + display: block; + padding: 0.25rem; + border-radius: 100%; + } + } + } + } + + &.connection-variant { + form { + display: flex; + } + + .button-container { + width: auto; + } + + .primary-button { + width: 100%; + } + } + + &.mail-variant { + .mail-input-container { + position: relative; + display: flex; + align-items: center; + + input { + padding-left: 3.125rem; + width: 100%; + min-height: 3.25rem;; + } + + .mail-icon-container { + position: absolute; + pointer-events: none; + background-color: white; + padding: 0.375rem; + height: calc(100% - 0.125rem); + left: 0.125rem; + border-right: 1px solid currentcolor; + border-radius: 0.25rem 0 0 0.25rem; + display: flex; + align-items: center; + + &::after { + mask-image: url("/static/icons/atsymbol.svg"); + display: block; + background-color: #004654; + } + } + } + } +} + +.test-card-list { + display: flex; + gap: 0.5rem; + flex-direction: column; + + @media (width >= 56.25rem) { + gap: 1.5rem; + align-items: center; + grid-column: 2 / 12; + flex-direction: row; + } + + &.home-variant { + @media (width >= 56.25rem) { + flex-direction: column; + grid-column: span 4; + } + } + + &.hall-of-fame-variant { + @media (width >= 56.25rem) { + grid-column: span 12; + } + } +} + +.test-card-small { + width: 100%; + height: 100%; + + a { + display: flex; + align-items: center; + padding: 1.5rem 1rem; + background: var(--card-bg-color-test); + border-radius: 0.5rem; + gap: 1rem; + justify-content: space-between; + height: 100%; + + @media (width >= 56.25rem) { + padding: 2.25rem 1.5rem; + } + } + + .card-container { + display: flex; + gap: 1rem; + color: var(--card-heading-color-test); + + &::before { + display: block; + } + + &.domain::before { + mask-image: url("/static/icons/globe.svg"); + } + + &.mail::before { + mask-image: url("/static/icons/envelope.svg"); + } + + &.connection::before { + mask-image: url("/static/icons/link.svg"); + } + } + + hgroup { + @media (width >= 56.25rem) { + gap: 0.5rem; + } + + h2, h3 { + font: var(--card-header-s); + } + + p { + font: var(--card-body-m); + color: var(--card-body-color-test); + } + } +} \ No newline at end of file diff --git a/frontend/src/css/variables.css b/frontend/src/css/variables.css new file mode 100644 index 000000000..2b17adc8a --- /dev/null +++ b/frontend/src/css/variables.css @@ -0,0 +1,281 @@ +:root { + /* MARK: THEME PROPERTIES + */ + + /* COLORS */ + --black-100: #000; + --black-200: #191919; + --green-100: #E3F0F5; + --green-200: #EEF6F9; + --green-300: #8BF1FF; + --green-350: #219653; + --green-375: #21BD54; + --green-400: #037584; + --green-500: #34545F; + --green-600: #22363C; + --orange-100: #FFEBD2; + --orange-200: #FFC170; + --orange-300: #FFAC40; + --orange-350: #FFAD33; + --orange-375: #D45C00; + --orange-400: #E98400; + --orange-500: #BC6D07; + --orange-600: #CF7604; + --blue-100: #1565C0; + --red-100: #C00000; + --red-200: #FD2121; + --grey-100: #757575; + --grey-200: #828282; + --grey-300: #C5C5C5; + --grey-400: #707070; + --white-100: #FFF; + --transparent-100: transparent; + --transparent-200: #E3F0F500; + --transparent-300: #0000001A; + --transparent-400: #FFC17014; + --transparent-500: #FFFFFF80; + --transparent-600: #0000000A; + + /* HEADING FONTS */ + --heading-font-xxs: 700 0.875rem/1.5 'Montserrat', sans-serif; /* 14px */ + --heading-font-xxs-semibold: 500 0.875rem/1.5 'Montserrat', sans-serif; /* 14px */ + --heading-font-xs: 700 1rem/1.5 'Montserrat', sans-serif; /* 16px */ + --heading-font-s: 700 1.25rem/1.5 'Montserrat', sans-serif; /* 20px */ + --heading-font-m: 700 1.5rem/1.3 'Montserrat', sans-serif; /* 24px */ + --heading-font-l: 700 2rem/1.3 'Montserrat', sans-serif; /* 32px */ + --heading-font-xl: 700 2.5rem/1.3 'Montserrat', sans-serif; /* 40px */ + + /* BODY FONTS */ + --body-font-xxs: 400 0.875rem/1.5 'Roboto', sans-serif; /* 14px */ + --body-font-xxs-bold: 700 0.875rem/1.5 'Roboto', sans-serif; /* 14px */ + --body-font-xs: 400 1rem/1.5 'Roboto', sans-serif; /* 16px */ + --body-font-xs-bold: 700 1rem/1.5 'Roboto', sans-serif; /* 16px */ + --body-font-s: 400 1.125rem/1.75 'Roboto', sans-serif; /* 18px */ + --body-font-s-bold: 700 1.125rem/1.75 'Roboto', sans-serif; /* 18px */ + + /* BUTTON FONTS */ + --button-link-font-xxs: 700 0.875rem/2 'Montserrat', sans-serif; /* 14px */ + --button-link-font-xs: 700 1rem/2 'Montserrat', sans-serif; /* 16px */ + --button-link-font-s: 700 1.125rem/2 'Montserrat', sans-serif; /* 18px */ + --button-link-font-m: 700 1.25rem/2 'Montserrat', sans-serif; /* 20px */ + --button-link-font-l: 700 1.5rem/2 'Montserrat', sans-serif; /* 24px */ + + /* MARK: FONT VARIABLES +*/ + + /* NAV FONTS MOBILE */ + --nav-link: var(--button-link-font-m); + --nav-button: var(--button-link-font-xs); + --subnav-link: var(--button-link-font-xs); + --footer-link: var(--button-link-font-xs); + --footer-bar-link: var(--button-link-font-xxs); + + /* SECTION FONTS MOBILE */ + --section-header-xxl: var(--heading-font-m); + --section-header-xl: var(--heading-font-s); + --section-header-l: var(--heading-font-s); + --section-header-m: var(--heading-font-xs); + --section-header-s: var(--heading-font-xs); + --section-header-xs: var(--heading-font-xxs); + --section-header-xxs: var(--heading-font-xxs); + --section-body-xl: var(--body-font-xs); + --section-body-l: var(--body-font-xxs); + --section-body-m: var(--body-font-xs); + --section-body-s: var(--body-font-xxs); + --section-button-l: var(--button-link-font-s); + --section-button-m: var(--button-link-font-xs); + + /* CARD FONTS MOBILE */ + --card-header-xl: var(--heading-font-s); + --card-header-l: var(--heading-font-xs); + --card-header-m: var(--heading-font-xs); + --card-header-s: var(--heading-font-xxs); + --card-header-xs: var(--heading-font-xxs); + --card-body-l: var(--body-font-xs); + --card-body-m: var(--body-font-xxs); + --card-body-s: var(--body-font-xxs); + --card-body-xs: var(--body-font-xxs); + --card-input: var(--body-font-s); + + /* ACCORDION FONTS MOBILE */ + --accordion-header: var(--heading-font-xxs); + --accordion-header-semibold: var(--heading-font-xxs-semibold); + --accordion-body: var(--body-font-xxs); + --accordion-body-semibold: var(--body-font-xxs-semibold); + + @media (width >= 56.25rem) { + /* NAV FONTS DESKTOP */ + --nav-link: var(--button-link-font-xs); + --nav-button: var(--button-link-font-xs); + --subnav-link: var(--button-link-font-xs); + --footer-link: var(--button-link-font-m); + --footer-bar-link: var(--button-link-font-xs); + + /* SECTION FONTS DESKTOP */ + --section-header-xxl: var(--heading-font-xl); + --section-header-xl: var(--heading-font-l); + --section-header-l: var(--heading-font-m); + --section-header-m: var(--heading-font-m); + --section-header-s: var(--heading-font-s); + --section-header-xs: var(--heading-font-m); + --section-header-xxs: var(--heading-font-xs); + --section-body-xl: var(--body-font-s); + --section-body-l: var(--body-font-s); + --section-body-m: var(--body-font-xs); + --section-body-s: var(--body-font-xs); + --section-button-l: var(--button-link-font-s); + --section-button-m: var(--button-link-font-xs); + + /* CARD FONTS DESKTOP */ + --card-header-xl: var(--heading-font-m); + --card-header-l: var(--heading-font-s); + --card-header-m: var(--heading-font-xs); + --card-header-s: var(--heading-font-xs); + --card-header-xs: var(--heading-font-xs); + --card-body-l: var(--body-font-xs); + --card-body-m: var(--body-font-xs); + --card-body-s: var(--body-font-xs); + --card-body-xs: var(--body-font-s); + --card-input: var(--body-font-s); + + /* ACCORDION FONTS DESKTOP */ + --accordion-header: var(--heading-font-xs); + --accordion-header-semibold: var(--heading-font-xs-semibold); + --accordion-body: var(--body-font-xs); + --accordion-body-semibold: var(--body-font-xs-semibold); + } + + /* MARK: COLOR VARIABLES +*/ + + /* COLORS */ + color-scheme: light dark; + + /* HEADER COLORS LIGHTMODE */ + --nav-bg-color: light-dark(var(--white-100), var(--black-200)); + --nav-sublist-border-color: light-dark(var(--green-400), var(--white-100)); + --nav-text-color: light-dark(var(--green-500), var(--white-100)); + --nav-mobile-bg-color: light-dark(var(--green-200), var(--green-600)); + --nav-mobile-border: 0.5px solid light-dark(var(--green-400), var(--black-200)); + --nav-dropdown-bg-color: light-dark(var(--green-200), var(--green-600)); + --nav-sticky-border: 1.5px solid light-dark(var(--green-400), var(--green-400)); + --nav-sticky-shadow: 0px 4px 32px 0px light-dark(var(--transparent-300), var(--transparent-300)); + --nav-lang-bg-color: light-dark(var(--green-200), var(--green-600)); + --nav-mobile-lang-bg-color: light-dark(var(--white-100), var(--white-100)); + --nav-mobile-lang-text-color: light-dark(var(--green-500), var(--green-500)); + --nav-theme-button-bg-color: light-dark(var(--orange-500), var(--green-500)); + --nav-theme-button-color: light-dark(var(--white-100), var(--white-100)); + + /* FOOTER COLORS LIGHTMODE */ + --footer-bg-color: light-dark(var(--green-400), var(--green-600)); + --footer-text-color: light-dark(var(--white-100), var(--white-100)); + --footer-bar-bg-color: light-dark(var(--white-100), var(--green-500)); + --footer-bar-text-color: light-dark(var(--green-500), var(--white-100)); + + /* GENERAL COLORS LIGHTMODE */ + --bg-color-body: light-dark(var(--white-100), var(--black-200)); + --bg-color-primary: light-dark(var(--green-200), var(--green-600)); + --bg-color-secondary: light-dark(var(--orange-100), var(--green-600)); + --heading-color-primary: light-dark(var(--black-200), var(--white-100)); + --heading-color-secondary: light-dark(var(--green-500), var(--white-100)); + --heading-color-accent: light-dark(var(--green-400), var(--green-300)); + --heading-color-alt: light-dark(var(--orange-500), var(--white-100)); + --body-color-primary: light-dark(var(--black-200), var(--white-100)); + --body-color-secondary: light-dark(var(--green-500), var(--white-100)); + --body-link-color: light-dark(var(--green-400), var(--green-300)); + + /* BUTTON COLORS LIGHTMODE */ + --button-bg-color-primary: light-dark(var(--orange-300), var(--orange-300)); + --button-bg-color-hover-primary: light-dark(var(--orange-200), var(--orange-200)); + --button-text-color-primary: light-dark(var(--black-200), var(--black-200)); + --button-bg-color-secondary: light-dark(var(--transparent-100), var(--transparent-100)); + --button-bg-color-hover-secondary: light-dark(var(--orange-300), var(--green-400)); + --button-text-color-secondary: light-dark(var(--green-500), var(--white-100)); + --button-bg-color-contact: light-dark(var(--green-500), var(--black-200)); + --button-text-color-contact: light-dark(var(--white-100), var(--white-100)); + --button-bg-color-hoster: light-dark(var(--green-100), var(--black-200)); + --button-text-color-hoster: light-dark(var(--green-500), var(--white-100)); + + /* CARD COLORS LIGHTMODE */ + --card-bg-color-test: light-dark(var(--white-100), var(--black-200)); + --card-heading-color-test: light-dark(var(--green-400), var(--white-100)); + --card-body-color-test: light-dark(var(--green-500), var(--white-100)); + --card-input-bg-color-test: light-dark(var(--green-200), var(--green-500)); + --card-bg-color-knowledge: light-dark(var(--orange-200), var(--green-600)); + --card-heading-color-knowledge: light-dark(var(--black-200), var(--white-100)); + --card-body-color-knowledge: light-dark(var(--black-200), var(--white-100)); + --card-bg-color-news: light-dark(var(--green-100), var(--green-600)); + --card-heading-color-news: light-dark(var(--green-500), var(--white-100)); + --card-body-color-news: light-dark(var(--green-500), var(--white-100)); + --card-bg-color-contact: light-dark(var(--green-400), var(--green-500)); + --card-heading-color-contact: light-dark(var(--white-100), var(--white-100)); + --card-body-color-contact: light-dark(var(--white-100), var(--white-100)); + --card-border: 2px solid light-dark(var(--green-400), var(--white-100)); + --card-box-shadow: 0 4px 32px 0 light-dark(var(--transparent-600), var(--transparent-600)); + --card-bg-color-action: light-dark(var(--green-400), var(--green-500)); + --card-heading-color-action: var(--white-100); + --card-body-color-action: var(--white-100); + + /* ELLIPSES LIGHTMODE */ + --ellipse-color-light: linear-gradient(0deg,light-dark(var(--white-100), var(--green-500)),light-dark(var(--transparent-200), var(--green-600))); + + @media (width >= 56.25rem) { + --ellipse-color-light: linear-gradient(45deg,light-dark(var(--white-100), var(--green-500)),light-dark(var(--transparent-200), var(--green-600))); + } + + --ellipse-color-dark: linear-gradient(135deg,light-dark(var(--orange-200), var(--green-600)),light-dark(var(--transparent-400), var(--green-500))); + + /* ACCORDION COLORS LIGHTMODE */ + --accordion-bg-color: light-dark(var(--white-100), var(--black-200)); + --accordion-heading-color: light-dark(var(--black-200), var(--green-100)); + --accordion-body-color: light-dark(var(--black-200), var(--white-100)); + --accordion-border-color: light-dark(var(--green-400), var(--transparent-600)); + + /* RESULT STATE COLORS */ + --probing-color: light-dark(var(--green-400), var(--white-100)); + --success-color: light-dark(var(--green-350), var(--green-375)); + --warning-color: light-dark(var(--orange-375), var(--orange-350)); + --failed-color: light-dark(var(--red-100), var(--red-200)); + --not-tested-color: light-dark(var(--grey-100), var(--grey-300)); + --info-color: light-dark(var(--blue-100), var(--green-300)); + --error-color: light-dark(var(--grey-100), var(--grey-200)); + + /* OTHER COLORS */ + --placeholder-color: light-dark(var(--grey-400), var(--grey-300)); + --meter-bg-color: light-dark(var(--green-400), var(--orange-350)); +} + +/* MARK: OTHER VARIABLES +*/ + +@media (prefers-color-scheme: light) { + :root { + /* IMAGE VISIBILITY LIGHTMODE */ + --light-visible: block; + --dark-visible: none; + } +} + +@media (prefers-color-scheme: dark) { + :root { + /* IMAGE VISIBILITY DARKMODE */ + --light-visible: none; + --dark-visible: block; + } +} + +[data-theme="light"] { + color-scheme: light; + + /* IMAGE VISIBILITY LIGHTMODE */ + --light-visible: block; + --dark-visible: none; +} + +[data-theme="dark"] { + color-scheme: dark; + + /* IMAGE VISIBILITY DARKMODE */ + --light-visible: none; + --dark-visible: block; +} \ No newline at end of file diff --git a/frontend/src/index.css b/frontend/src/index.css new file mode 100644 index 000000000..1629fd887 --- /dev/null +++ b/frontend/src/index.css @@ -0,0 +1,19 @@ +@layer base, layout, components, print; + +/* Base layer: fundamental styles */ +@import url("css/variables.css") layer(base); +@import url("css/global.css") layer(base); + +/* Layout layer: structural elements like header and footer */ +@import url("css/header.css") layer(layout); +@import url("css/footer.css") layer(layout); + +/* Components layer: sections and other component styles */ +@import url("css/components.css") layer(components); +@import url("css/about-section.css") layer(components); +@import url("css/knowledge-section.css") layer(components); +@import url("css/contact-section.css") layer(components); +@import url("css/hall-of-fame-section.css") layer(components); +@import url("css/test-section.css") layer(components); +@import url("css/result-section.css") layer(components); +@import url("css/print.css") layer(print); \ No newline at end of file diff --git a/frontend/src/index.js b/frontend/src/index.js new file mode 100644 index 000000000..dd8159d8b --- /dev/null +++ b/frontend/src/index.js @@ -0,0 +1,17 @@ +// JS +import "./js/lib/utils.js"; +import "./js/lib/matomo.js"; + +import "./js/base/header.js"; +import "./js/base/theme.js"; +import "./js/base/print.js"; + +import "./js/components/card-list/load-more.js"; +import "./js/components/carousel/carrousel.js"; +import "./js/components/meter/result-meter.js"; +import "./js/components/action-card/action-card-fallback.js"; + +import "./js/pages/results/copy-link.js"; +import "./js/pages/results/repeat-test-countdown.js"; +import "./js/pages/connection/connection.js"; +import "./js/pages/probe/probe.js"; diff --git a/frontend/src/js/base/header.js b/frontend/src/js/base/header.js new file mode 100644 index 000000000..70b7797af --- /dev/null +++ b/frontend/src/js/base/header.js @@ -0,0 +1,129 @@ +import { validateElements } from "../lib/utils.js"; + +const elements = { + toggleMenu: document.querySelector(".toggle-menu"), + menu: document.getElementById("nav-controls"), + main: document.querySelector("main"), + footer: document.querySelector("footer"), + toggleSubMenu: document.getElementById("toggle-subnav"), + subMenu: document.querySelector(".nav-sublist"), + header: document.querySelector("header"), +}; + +function header() { + /* TOGGLE MOBILE MENU */ + const { toggleMenu, menu, main, footer } = elements; + + toggleMenu.addEventListener("click", () => { + menu.classList.toggle("active"); + + toggleMenu.setAttribute("aria-expanded", menu.classList.contains("active")); + main.toggleAttribute("inert", menu.classList.contains("active")); + footer.toggleAttribute("inert", menu.classList.contains("active")); + }); + + document.addEventListener("keydown", (event) => { + if (event.key === "Escape" && menu.classList.contains("active")) { + menu.classList.remove("active"); + toggleMenu.setAttribute("aria-expanded", "false"); + main.removeAttribute("inert"); + footer.removeAttribute("inert"); + } + }); + + /* TOGGLE DROPDOWN MENU */ + const toggleSubMenus = document.querySelectorAll('[id^="toggle-subnav"]'); + + toggleSubMenus.forEach((toggleSubMenu, index) => { + const navItem = toggleSubMenu.closest(".nav-item"); + const subMenu = navItem ? navItem.querySelector(".nav-sublist") : null; + + toggleSubMenu.addEventListener("click", () => { + subMenu.classList.toggle("expanded"); + + toggleSubMenu.setAttribute( + "aria-expanded", + subMenu.classList.contains("expanded") + ); + }); + + // Handle focus management for z-index elevation + if (subMenu) { + const focusIn = () => { + document + .querySelectorAll(".nav-sublist") + .forEach((menu) => menu.classList.remove("focused")); + subMenu.classList.add("focused"); + }; + + const focusOut = (event) => { + if ( + !subMenu.contains(event.relatedTarget) && + event.relatedTarget !== toggleSubMenu + ) { + subMenu.classList.remove("focused"); + } + }; + + toggleSubMenu.addEventListener("focusin", focusIn); + subMenu.addEventListener("focusin", focusIn); + toggleSubMenu.addEventListener("focusout", focusOut); + subMenu.addEventListener("focusout", focusOut); + } + }); + + /* STICKY HEADER */ + const header = document.querySelector("header"); + const headerHeight = header.offsetHeight; + const scrollWatcher = document.createElement("div"); + + scrollWatcher.setAttribute("data-scroll-watcher", ""); + header.before(scrollWatcher); + + const navObserver = new IntersectionObserver((entries) => { + header.classList.toggle("stuck", !entries[0].isIntersecting); + }); + + navObserver.observe(scrollWatcher); + + let lastScrollY = window.pageYOffset; + const buffer = 100; + let ticking = false; + + window.addEventListener( + "scroll", + () => { + const currentY = window.pageYOffset; + + if (!ticking) { + ticking = true; + requestAnimationFrame(() => { + const delta = currentY - lastScrollY; + + if (currentY <= headerHeight) { + header.classList.remove("not-scrolling-up"); + } else if (Math.abs(delta) > buffer) { + if (delta > 0) { + // Scrolled down + header.classList.add("not-scrolling-up"); + } else { + // Scrolled up + header.classList.remove("not-scrolling-up"); + } + + lastScrollY = currentY; + } + + ticking = false; + }); + } + }, + { passive: true } + ); +} + +if (validateElements(elements, "header")) { + header(); +} + +export default header; diff --git a/frontend/src/js/base/print.js b/frontend/src/js/base/print.js new file mode 100644 index 000000000..0c805091f --- /dev/null +++ b/frontend/src/js/base/print.js @@ -0,0 +1,26 @@ +import { validateElements } from "../lib/utils.js"; + +const elements = { + details: document.querySelectorAll("details"), +}; + +function print() { + if (window.matchMedia) { + const mediaQueryList = window.matchMedia("print"); + mediaQueryList.addEventListener("change", (mql) => { + if (mql.matches) { + if (elements.details.length > 0) { + elements.details.forEach((el) => { + el.open = true; + }); + } + } + }); + } +} + +if (validateElements(elements, "details")) { + print(); +} + +export default print; diff --git a/frontend/src/js/base/theme.js b/frontend/src/js/base/theme.js new file mode 100644 index 000000000..df9aaa23c --- /dev/null +++ b/frontend/src/js/base/theme.js @@ -0,0 +1,112 @@ +import { validateElements } from "../lib/utils.js"; + +const elements = { + currentTheme: document.querySelector(".current-theme-desktop"), + themeSelector: document.getElementById("toggle-subnav-theme"), + light: document.getElementById("theme-light"), + dark: document.getElementById("theme-dark"), + system: document.getElementById("theme-system"), +}; + +/** + * Get a cookie value by name + * @param {string} name - Cookie name + * @returns {string|null} Cookie value or null if not found + */ +function getCookie(name) { + // Split all cookies into an array + const allCookies = document.cookie.split(";"); + + // Look for the cookie with the matching name + const matchingCookie = allCookies.find((cookie) => + cookie.trim().startsWith(`${name}=`) + ); + + // Return the value if found, null if not found + if (!matchingCookie) { + return null; + } + + return matchingCookie.split("=")[1]; +} + +/** + * Set a cookie with specified parameters + * @param {string} name - Cookie name + * @param {string} value - Cookie value + * @param {number} days - Cookie duration in days + */ +function setCookie(name, value, days) { + const date = new Date(); + date.setDate(date.getDate() + days); + + const cookieValue = encodeURIComponent(value); + const expires = `expires=${date.toUTCString()}`; + const path = "path=/"; + + document.cookie = `${name}=${cookieValue};${expires};${path}`; +} + +/** + * Get the preferred theme based on cookie or system preference + * @returns {string} Theme name + */ +function getPreferredTheme() { + return window.matchMedia("(prefers-color-scheme: dark)").matches + ? "dark" + : "light"; +} + +/** + * Set the theme and save it to cookie + * @param {string} theme - Theme name + */ +function setTheme(theme) { + setCookie("theme", theme, 365); + + document.documentElement.setAttribute("data-theme", theme); + elements.themeSelector.classList.remove("moon", "system", "sun"); + + switch (theme) { + case "light": + elements.themeSelector.classList.add("sun"); + elements.currentTheme.textContent = elements.light.textContent; + break; + case "dark": + elements.themeSelector.classList.add("moon"); + elements.currentTheme.textContent = elements.dark.textContent; + break; + default: + elements.themeSelector.classList.add("system"); + elements.currentTheme.textContent = elements.system.textContent; + break; + } +} + +/** + * Initialize theme switching functionality + */ +function themeSwitch() { + // Set initial theme + setTheme(getCookie("theme")); + + // Add click handler for theme buttons + elements.light.addEventListener("click", () => { + setTheme("light"); + }); + + elements.dark.addEventListener("click", () => { + setTheme("dark"); + }); + + elements.system.addEventListener("click", () => { + setTheme("system"); + }); +} + +// Initialize theme switching if required elements are present +if (validateElements(elements, "theme")) { + themeSwitch(); +} + +export default themeSwitch; diff --git a/frontend/src/js/components/action-card/action-card-fallback.js b/frontend/src/js/components/action-card/action-card-fallback.js new file mode 100644 index 000000000..99a2da49e --- /dev/null +++ b/frontend/src/js/components/action-card/action-card-fallback.js @@ -0,0 +1,26 @@ +import { validateElements } from "../../lib/utils.js"; + +const elements = { + details: document.querySelector(".action-card details"), +}; + +function actionCardFallback() { + const toggleDetailsOpen = () => { + if (window.innerWidth > 900) { + elements.details.setAttribute("open", ""); + } else { + elements.details.removeAttribute("open"); + } + }; + + toggleDetailsOpen(); + window.addEventListener("resize", toggleDetailsOpen, { passive: true }); +} + +if (!CSS.supports("selector(::details-content)")) { + if (validateElements(elements, "action-card-fallback")) { + actionCardFallback(); + } +} + +export default actionCardFallback; diff --git a/frontend/src/js/components/card-list/load-more.js b/frontend/src/js/components/card-list/load-more.js new file mode 100644 index 000000000..25831556a --- /dev/null +++ b/frontend/src/js/components/card-list/load-more.js @@ -0,0 +1,32 @@ +import { validateElements, toggleElements } from "../../lib/utils.js"; + +const elements = { + cards: document.querySelectorAll(".card:nth-child(n+6)"), + loadMoreBtn: document.getElementById("load-more"), +}; + +function loadMore() { + let visibleCount = 0; + const batchSize = 3; + + const { cards, loadMoreBtn } = elements; + + loadMoreBtn.addEventListener("click", function () { + for (let i = visibleCount; i < visibleCount + batchSize; i++) { + if (cards[i]) { + cards[i].classList.add("visible"); + } + } + visibleCount += batchSize; + + if (visibleCount >= cards.length) { + loadMoreBtn.classList.add('hidden'); + } + }); +} + +if (validateElements(elements, "load-more")) { + loadMore(); +} + +export default loadMore; diff --git a/frontend/src/js/components/carousel/carrousel.js b/frontend/src/js/components/carousel/carrousel.js new file mode 100644 index 000000000..3fe5ef487 --- /dev/null +++ b/frontend/src/js/components/carousel/carrousel.js @@ -0,0 +1,49 @@ +import { validateElements } from "../../lib/utils.js"; + +// TODO: add languages in aria-label + +const elements = { + carousel: document.querySelector(".knowledge-list"), + dots: document.querySelectorAll(".dot"), + items: document.querySelectorAll(".knowledge-list li"), +}; + +function carousel() { + const { carousel, dots, items } = elements; + + carousel.addEventListener( + "scroll", + () => { + const index = [...items].findIndex((item) => { + const rect = item.getBoundingClientRect(); + return rect.left >= 0 && rect.left < window.innerWidth / 2; + }); + dots.forEach((dot) => dot.classList.remove("active")); + if (index !== -1) dots[index].classList.add("active"); + }, + { passive: true } + ); + + dots.forEach((dot, index) => { + const headerId = items[index].querySelector("h3").id; + const headerText = document.getElementById(headerId).textContent; + const button = dot.querySelector("button"); + + button.setAttribute("aria-label", `Scroll naar ${headerText}`); + button.addEventListener("click", () => { + items[index].scrollIntoView({ + behavior: "smooth", + inline: "center", + block: "nearest", + }); + }); + }); +} + +if (!CSS.supports("selector(::scroll-marker)")) { + if (validateElements(elements, "carrousel")) { + carousel(); + } +} + +export default carousel; diff --git a/frontend/src/js/components/meter/result-meter.js b/frontend/src/js/components/meter/result-meter.js new file mode 100644 index 000000000..b2a4b4072 --- /dev/null +++ b/frontend/src/js/components/meter/result-meter.js @@ -0,0 +1,17 @@ +import { validateElements } from "../../lib/utils.js"; + +const elements = { + meterElement: document.querySelector("meter"), + meterValue: document.querySelector(".meter-value"), +}; + +function resultMeter() { + const meterElementValue = Number(elements.meterElement.value); + elements.meterValue.style.left = `${meterElementValue}%`; +} + +if (validateElements(elements, "result-meter")) { + resultMeter(); +} + +export default resultMeter; diff --git a/frontend/src/js/lib/matomo.js b/frontend/src/js/lib/matomo.js new file mode 100644 index 000000000..ad0a3c66b --- /dev/null +++ b/frontend/src/js/lib/matomo.js @@ -0,0 +1,50 @@ +const _paq = window._paq || []; + +/** + * Initialize Matomo tracking with optional cookie disabling + * @param {boolean} disableCookies - Whether to disable cookies + */ +function matomoGeneratedCode(disableCookies) { + const subdomainTracking = document.getElementById( + "matomo-subdomain-tracking" + )?.textContent; + if (subdomainTracking) { + _paq.push(["setCookieDomain", subdomainTracking]); + } + + if (disableCookies) { + _paq.push(["disableCookies"]); + } + + _paq.push(["trackPageView"]); + _paq.push(["enableLinkTracking"]); + + const matomoUrl = document.getElementById("matomo-url")?.textContent; + const siteId = document.getElementById("matomo-siteid")?.textContent; + + if (matomoUrl) { + _paq.push(["setTrackerUrl", `${matomoUrl}piwik.php`]); + _paq.push(["setSiteId", siteId]); + + const script = document.createElement("script"); + script.type = "text/javascript"; + script.async = true; + script.defer = true; + script.src = `${matomoUrl}piwik.js`; + document.head.appendChild(script); + } +} + +// Check if Matomo is configured +const siteId = document.getElementById("matomo-siteid")?.textContent; +if (siteId) { + // This is deprecated starting from firefox 135 + const dntEnabled = + window?.doNotTrack === "1" || + navigator?.doNotTrack === "1" || + navigator?.doNotTrack === "yes" || + navigator?.msDoNotTrack === "1" || + window?.external?.msTrackingProtectionEnabled?.(); + + matomoGeneratedCode(dntEnabled); +} diff --git a/frontend/src/js/lib/utils.js b/frontend/src/js/lib/utils.js new file mode 100644 index 000000000..0517f4f30 --- /dev/null +++ b/frontend/src/js/lib/utils.js @@ -0,0 +1,98 @@ +/** + * Check if required DOM elements exist + * @param {Object} elements - Object containing element queries + * @param {string} context - Context for error message + * @returns {boolean} Whether all required elements exist + */ +function validateElements(elements, context = "") { + const missingElements = Object.entries(elements) + .filter(([_, element]) => !element) + .map(([name]) => name); + + if (missingElements.length > 0) { + console.error( + `Required elements not found${context ? ` for ${context}` : ""}:`, + missingElements.join(", ") + ); + return false; + } + return true; +} + +/** + * Validate and parse a numeric value + * @param {string} value - Value to parse + * @param {string} name - Name of the value for error message + * @returns {number|null} Parsed number or null if invalid + */ +function validateNumber(value, name) { + const num = parseInt(value); + if (isNaN(num)) { + console.error(`Invalid ${name} value:`, value); + return null; + } + + return num; +} + +/** + * Toggle visibility of elements + * @param {string} selector - CSS selector for elements + * @param {boolean} [hide] - Optional: Whether to hide or show elements. If not provided, toggles current state + * @param {string} context - Context for error message + */ +function toggleElements(selector, hide, context = "") { + const elements = document.querySelectorAll(selector); + + if (!validateElements(elements, context)) return; + + elements.forEach((element) => { + const hidden = typeof hide === "boolean" ? hide : !element.hidden; + element.hidden = hidden; + element.setAttribute("aria-hidden", hidden.toString()); + }); +} + +/** + * Handle HTTP response + * @param {Response} response - Fetch response object + * @returns {Object} Parsed JSON response + */ +async function fetchJson(response) { + try { + if (!response.ok) { + throw new Error(`HTTP error! status: ${response.status}`); + } + return await response.json(); + } catch (error) { + console.error("Error fetching JSON:", error); + throw error; + } +} + +/** + * Fetch data with timeout + * @param {string} url - URL to fetch + * @param {number} timeout - Timeout in milliseconds + * @param {Object} options - Additional fetch options + * @returns {Promise} Fetch response + */ +async function fetchWithTimeout(url, timeout, options = {}) { + try { + const response = await fetch(url, { + ...options, + signal: AbortSignal.timeout(timeout), + }); + return response; + } catch (error) { + throw error; + } +} + +export { + validateElements, + validateNumber, + toggleElements, + fetchJson, + fetchWithTimeout, +}; diff --git a/frontend/src/js/pages/connection/connection.js b/frontend/src/js/pages/connection/connection.js new file mode 100644 index 000000000..9c5c04532 --- /dev/null +++ b/frontend/src/js/pages/connection/connection.js @@ -0,0 +1,152 @@ +import { + validateElements, + toggleElements, + fetchJson, +} from "../../lib/utils.js"; + +// State management +const state = { + completedTests: 0, + requiredTests: 5, + timeout: 6000, // milliseconds +}; + +/** + * Enable results and redirect to the results page + */ +function enableResults() { + const elements = { + continue: document.querySelector("#continue"), + }; + + if (!validateElements(elements)) return; + window.location = elements.continue.getAttribute("href"); +} + +/** + * Show results for a specific category + * @param {string} category - The category to show results for + * @param {Object} results - The results object + */ +function showResults(category, results) { + if (!results) return; + + const elements = { + probeFinished: document.querySelector("#probe-finished")?.textContent, + summary: document.querySelector(`#${category}-summary`), + }; + + if (!validateElements(elements, category)) return; + + elements.summary.setAttribute("aria-busy", "false"); + elements.summary.textContent = elements.probeFinished; +} + +/** + * Handle test completion callback + * @param {string} test_id - The test ID + */ +async function handleTestCompletion(test_id) { + state.completedTests++; + + if (state.completedTests >= state.requiredTests) { + try { + const { connipv6, connresolver } = await fetchJson( + `/connection/finished/${test_id}` + ); + + showResults("ipv6", connipv6); + showResults("resolver", connresolver); + enableResults(); + } catch (error) { + console.error("Error fetching test results:", error); + } + } +} + +/** + * Fetch test data from a URL + * @param {string} url - The URL to fetch from + * @param {string} test_id - The test ID + */ +async function fetchTest(url, test_id) { + try { + const controller = new AbortController(); + const request = new Request(`http://${url}`, { + method: "get", + signal: controller.signal, + }); + + await fetch(request); + } catch (error) { + if (error.name === "TimeoutError") { + console.error( + `Timeout: It took more than ${ + state.timeout / 1000 + } seconds to get the result for ${test_id}!` + ); + } else if (error.name === "AbortError") { + console.error("Fetch aborted by the user"); + } else if (error.name === "TypeError") { + console.error("AbortSignal.timeout() method is not supported"); + } else { + // A network error, or some other problem. + console.error(`Error: type: ${error.name}, message: ${error.message}`); + } + } finally { + await handleTestCompletion(test_id); + } +} + +/** + * Start the connection test + * @param {string} test_id - The test ID + */ +function startConnectionTest(test_id) { + const elements = { + connTestDomain: document.querySelector("#conn-test-domain")?.textContent, + ipv6TestAddr: document.querySelector("#ipv6-test-addr")?.textContent, + }; + + if (!validateElements(elements)) return; + + const testUrls = [ + `${test_id}.bogus.conn.test-ns-signed.${elements.connTestDomain}`, + `${test_id}.aaaa.conn.test-ns-signed.${elements.connTestDomain}`, + `${test_id}.a.conn.test-ns-signed.${elements.connTestDomain}`, + `${test_id}.a-aaaa.conn.test-ns6-signed.${elements.connTestDomain}`, + `[${elements.ipv6TestAddr}]/connection/addr-test/${test_id}/`, + ]; + + testUrls.forEach((url) => fetchTest(url, test_id)); +} + +/** + * Initialize and start the connection test + */ +async function initializeConnectionTest() { + state.completedTests = 0; + + // Show probing text + toggleElements(".probing-text", false); + + try { + const { test_id } = await fetchJson("/connection/gettestid/"); + + startConnectionTest(test_id); + + const elements = { + connForward: document.querySelector(".connforward"), + }; + + if (!validateElements(elements)) return; + + elements.connForward.setAttribute("href", `/connection/${test_id}/results`); + } catch (error) { + console.error("Error initializing connection test:", error); + } +} + +document.addEventListener("DOMContentLoaded", () => { + initializeConnectionTest(); +}); diff --git a/frontend/src/js/pages/probe/probe.js b/frontend/src/js/pages/probe/probe.js new file mode 100644 index 000000000..5faf398f8 --- /dev/null +++ b/frontend/src/js/pages/probe/probe.js @@ -0,0 +1,201 @@ +import { + validateElements, + validateNumber, + toggleElements, + fetchJson, +} from "../../lib/utils.js"; + +// State management +const state = { + probesRunning: 0, + javascriptRetries: 0, + javascriptTimeout: 0, + probesUrl: "", +}; + +/** + * Show results for a specific category + * @param {string} category - The category to show results for + * @param {Object} results - The results object + */ +function showResults(category, results) { + const elements = { + summary: document.querySelector(`#${category}-summary`), + probeFinished: document.querySelector("#probe-finished")?.textContent, + }; + + if (!validateElements(elements, category)) return; + if (elements.summary.getAttribute("aria-busy") === "false") return; + + state.probesRunning--; + if (state.probesRunning <= 0) { + window.location = "results"; + } + + if (!results) return; + + elements.summary.setAttribute("aria-busy", "false"); + elements.summary.textContent = elements.probeFinished; + elements.summary.classList.add("done"); +} + +/** + * Show error for a specific category + * @param {string} category - The category to show error for + */ +function showError(category) { + state.probesRunning--; + + const elements = { + errorSummary: document.querySelector("#probe-error-summary")?.innerHTML, + summary: document.querySelector(`#${category}-summary`), + icon: document.querySelector(`#${category}-icon`), + }; + + if (!validateElements(elements, category)) return; + + // Update probe status + elements.summary.setAttribute("aria-busy", "false"); + elements.summary.innerHTML = elements.errorSummary; + elements.icon.setAttribute("src", "/static/probe-error.png"); +} + +/** + * Show errors for all running probes + */ +function showErrors() { + const elements = { + probes: document.querySelectorAll("#probes > div"), + }; + + if (!validateElements(elements)) return; + + elements.probes.forEach((probe) => { + const nameElement = probe.querySelector(".probe-name"); + if (!nameElement) { + console.error("Required element .probe-name not found in probe"); + return; + } + + const name = nameElement.textContent; + if (!name) { + console.error("Probe name is empty"); + return; + } + + const summaryElement = document.querySelector(`#${name}-summary`); + if (!summaryElement) { + console.error(`Required element #${name}-summary not found`); + return; + } + + if (summaryElement.getAttribute("aria-busy") === "true") { + showError(name); + } + }); +} + +/** + * Parse probe statuses and update UI accordingly + * @param {Array} json - Array of probe status objects + * @returns {boolean} Whether to retry polling + */ +function parseStatuses(json) { + if (!Array.isArray(json)) { + console.error("Invalid response format: expected array, got", typeof json); + return false; + } + + let retry = false; + + json.forEach((obj) => { + if (!obj.name) { + console.error("Probe status object missing required 'name' property"); + return; + } + + if (obj.done) { + if (obj.success) { + showResults(obj.name, obj); + } else { + showError(obj.name); + } + } else { + retry = true; + } + }); + + return retry; +} + +/** + * Poll for probe status updates + * @param {string} testurl - The URL to poll + * @param {number} retryCount - Number of retries remaining + */ +async function pollProbes(testurl, retryCount) { + if (typeof retryCount === "undefined") { + const retriesElement = document.querySelector("#javascript-retries"); + + if (!validateElements(retriesElement, "probe")) return; + + retryCount = validateNumber(retriesElement.textContent, "retries"); + if (retryCount === null) return; + } + + if (retryCount < 0) { + showErrors(); + return; + } + + try { + const json = await fetchJson(await fetch(testurl)); + + if (parseStatuses(json)) { + const timeoutElement = document.querySelector("#javascript-timeout"); + if (!validateElements(timeoutElement, "probe")) return; + + const timeout = validateNumber(timeoutElement.textContent, "timeout"); + if (timeout === null) return; + + setTimeout(() => { + pollProbes(testurl, retryCount - 1); + }, timeout); + } + } catch (error) { + console.error("Error polling probes:", error); + showErrors(); + } +} + +function initializeProbe() { + // Validate numeric values + const retries = validateNumber(elements.retries.textContent, "retries"); + const timeout = validateNumber(elements.timeout.textContent, "timeout"); + if (retries === null || timeout === null) return; + + // Initialize state + state.javascriptRetries = retries; + state.javascriptTimeout = timeout; + state.probesRunning = elements.probes.length; + state.probesUrl = elements.url.textContent; + + // Show probing text + toggleElements(".probing-text", false); + + // Start polling + pollProbes(state.probesUrl); +} + +const elements = { + retries: document.querySelector("#javascript-retries"), + timeout: document.querySelector("#javascript-timeout"), + url: document.querySelector("#probes-url"), + probes: document.querySelectorAll("#probes > div"), +}; + +document.addEventListener("DOMContentLoaded", () => { + if (validateElements(elements, "probe")) { + initializeProbe(); + } +}); diff --git a/frontend/src/js/pages/results/copy-link.js b/frontend/src/js/pages/results/copy-link.js new file mode 100644 index 000000000..9b7d49581 --- /dev/null +++ b/frontend/src/js/pages/results/copy-link.js @@ -0,0 +1,45 @@ +import { validateElements } from "../../lib/utils.js"; + +const elements = { + shareBtn: document.getElementById("copy-link"), +}; + +function copyLink() { + elements.shareBtn.addEventListener('click', function() { + const link = window.location.href; + + if (!window.isSecureContext) { + alert("Unable to share or copy link. Please copy manually: " + link); + return; + } + + if (navigator.share) { + navigator.share({ + url: link + }) + + } else { + fallbackCopy(link); + } + }); + + function fallbackCopy(link) { + navigator.clipboard.writeText(link) + .then(() => { + elements.shareBtn.classList.add('copied'); + setTimeout(() => { + elements.shareBtn.classList.remove('copied'); + }, 5000); + }) + .catch(() => { + alert('Unable to share or copy link. Please copy manually: ' + link); + }); + + } +} + +if (validateElements(elements, "copy-link")) { + copyLink(); +} + +export default copyLink; diff --git a/frontend/src/js/pages/results/repeat-test-countdown.js b/frontend/src/js/pages/results/repeat-test-countdown.js new file mode 100644 index 000000000..b16d2d2e6 --- /dev/null +++ b/frontend/src/js/pages/results/repeat-test-countdown.js @@ -0,0 +1,69 @@ +import { + validateElements, + validateNumber, + toggleElements, +} from "../../lib/utils.js"; + +const elements = { + retestTime: document.querySelector(".countdown-time"), +}; + +/** + * Start the countdown timer for retesting + */ +function startCountDownRetestTime() { + if (!validateElements(elements)) { + console.error("Could not find countdown time element"); + return; + } + + const seconds = validateNumber( + elements.retestTime.textContent, + "retest time" + ); + + if (seconds === null) { + console.error("Invalid retest time value"); + return; + } + + console.log("Starting countdown with", seconds, "seconds"); + countDownRetestTime(seconds); +} + +/** + * Count down the retest timer + * @param {number} seconds - Remaining seconds + */ +function countDownRetestTime(seconds) { + const elements = { + link: document.querySelector(".repeat-test.link"), + countdown: document.querySelector(".repeat-test.countdown"), + time: document.querySelector(".countdown-time"), + }; + + if (!validateElements(elements)) { + console.error("Could not find required elements for countdown"); + return; + } + + console.log("Countdown:", seconds, "seconds remaining"); + + if (seconds < 1) { + console.log("Countdown finished, showing link"); + elements.link.classList.remove("hidden"); + elements.countdown.classList.add("hidden"); + } else { + console.log("Countdown running, showing countdown"); + elements.link.classList.add("hidden"); + elements.countdown.classList.remove("hidden"); + elements.time.textContent = seconds; + setTimeout(() => countDownRetestTime(seconds - 1), 1000); + } +} + +if (validateElements(elements, "results")) { + startCountDownRetestTime(); +} + +export default startCountDownRetestTime; diff --git a/integration_tests/batch/test_batch.py b/integration_tests/batch/test_batch.py index c42684026..e02eb6c76 100644 --- a/integration_tests/batch/test_batch.py +++ b/integration_tests/batch/test_batch.py @@ -132,7 +132,7 @@ def test_batch_request(unique_id, register_test_user, test_domain): def test_batch_static_requires_no_auth(): """Static files should be available without authentication for viewing batch results.""" - response = requests.get(f"https://{APP_DOMAIN}/static/js/menu-min.js", json={}, verify=False) + response = requests.get(f"https://{APP_DOMAIN}/static/js/theme-min.js", json={}, verify=False) assert response.status_code == 200 diff --git a/integration_tests/common/test_basic.py b/integration_tests/common/test_basic.py index dfa3c7c95..05aae3bc9 100644 --- a/integration_tests/common/test_basic.py +++ b/integration_tests/common/test_basic.py @@ -6,8 +6,8 @@ import socket import os -FOOTER_TEXT_EN = "Internet.nl is an initiative of the Internet community and the Dutch" -FOOTER_TEXT_NL = "Internet.nl is een initiatief van de internetgemeenschap en de Nederlandse" +FOOTER_TEXT_EN = "Visit our Mastodon profile" +FOOTER_TEXT_NL = "Ga naar onze Mastodon profiel" LANGUAGE_CHANGE_TEXT_EN = "Test your website" LANGUAGE_CHANGE_TEXT_NL = "Test je website" @@ -61,7 +61,7 @@ def test_index_http_ok(page, app_url_subdomain): ) def test_index_footer_text_present(page, app_url, footer_text): page.goto(app_url) - footer = page.locator("#footer") + footer = page.locator(".footer-bar") assert footer_text in footer.text_content() @@ -90,16 +90,16 @@ def test_static_files(page, app_url_subdomain): def test_generated_css_static_files(page, app_url_subdomain): - response = page.request.get(app_url_subdomain + "/static/css/style-min.css") + response = page.request.get(app_url_subdomain + "/static/css/print.css") expect(response).to_be_ok() - assert "@font-face" in response.text() + assert "#site-description" in response.text() assert "expires" in response.headers def test_generated_js_static_files(page, app_url_subdomain): - response = page.request.get(app_url_subdomain + "/static/js/menu-min.js") + response = page.request.get(app_url_subdomain + "/static/js/theme-min.js") expect(response).to_be_ok() - assert "hideMenuButton" in response.text() + assert "setTheme" in response.text() assert "expires" in response.headers diff --git a/integration_tests/develop/test_basic.py b/integration_tests/develop/test_basic.py index a7eac20f0..1fa116b28 100644 --- a/integration_tests/develop/test_basic.py +++ b/integration_tests/develop/test_basic.py @@ -4,7 +4,7 @@ import requests from playwright.sync_api import expect -FOOTER_TEXT = "Internet.nl is an initiative of the Internet community and the Dutch" +FOOTER_TEXT = "Ga naar onze Mastodon profiel" SECURITY_TXT_TEXT = "Policy: https://internet.nl/disclosure/" @@ -19,7 +19,7 @@ def test_index_http_ok(page, app_url): def test_index_footer_text_present(page, app_url): """Branding is disabled on develop, so no footer text, only version""" page.goto(app_url) - footer = page.locator("#footer") + footer = page.locator(".footer-bar") expect(footer).not_to_have_text(re.compile(FOOTER_TEXT)) @@ -41,14 +41,14 @@ def test_static_files(page, app_url): def test_generated_css_static_files(page, app_url): - response = requests.get(app_url + "/static/css/style-min.css", verify=False) + response = requests.get(app_url + "/static/css/print.css", verify=False) response.raise_for_status() - assert "@font-face" in response.text + assert "#site-description" in response.text() assert "expires" in response.headers def test_generated_js_static_files(page, app_url): - response = requests.get(app_url + "/static/js/menu-min.js", verify=False) + response = requests.get(app_url + "/static/js/theme-min.js", verify=False) response.raise_for_status() - assert "hideMenuButton" in response.text + assert "setTheme" in response.text() assert "expires" in response.headers diff --git a/integration_tests/develop/test_website.py b/integration_tests/develop/test_website.py index 0fab9c736..c5af7b44c 100644 --- a/integration_tests/develop/test_website.py +++ b/integration_tests/develop/test_website.py @@ -17,8 +17,8 @@ def test_reject_invalid_domain(page, app_url): page.goto(app_url) - page.locator("#web-url").fill(domain) - page.locator("section.websitetest button").click() + page.locator('input[name="url"]').fill(domain) + page.get_by_label("Start de domein test").click() assert page.url == f"{app_url}/test-site/?invalid" diff --git a/integration_tests/live/test_basic.py b/integration_tests/live/test_basic.py index eb16cc272..c95455a04 100644 --- a/integration_tests/live/test_basic.py +++ b/integration_tests/live/test_basic.py @@ -4,7 +4,7 @@ import requests from playwright.sync_api import expect -FOOTER_TEXT = "Internet.nl is an initiative of the Internet community and the Dutch" +FOOTER_TEXT = "Ga naar onze Mastodon profiel" SECURITY_TXT_TEXT = "Policy: https://internet.nl/disclosure/" @@ -18,7 +18,7 @@ def test_index_http_ok(page, app_url): def test_index_footer_text_present(page, app_url): page.goto(app_url) - footer = page.locator("#footer") + footer = page.locator(".footer-bar") expect(footer).to_have_text(re.compile(FOOTER_TEXT)) @@ -46,16 +46,16 @@ def test_static_files(page, app_url): def test_generated_css_static_files(page, app_url): - response = requests.get(app_url + "/static/css/style-min.css") + response = requests.get(app_url + "/static/css/print.css") response.raise_for_status() - assert "@font-face" in response.text + assert "#site-description" in response.text() assert "expires" in response.headers def test_generated_js_static_files(page, app_url): - response = requests.get(app_url + "/static/js/menu-min.js") + response = requests.get(app_url + "/static/js/theme-min.js") response.raise_for_status() - assert "hideMenuButton" in response.text + assert "setTheme" in response.text() assert "expires" in response.headers diff --git a/integration_tests/live/test_connection.py b/integration_tests/live/test_connection.py index 61c89e57d..80d36cb72 100644 --- a/integration_tests/live/test_connection.py +++ b/integration_tests/live/test_connection.py @@ -3,7 +3,7 @@ import re from playwright.sync_api import expect from ..conftest import print_details_test_results -from ..conftest import ipv6_available +from .conftest import ipv6_available ALL_CONNECTION_PROBES_NO_IPV6 = {"resolver"} ALL_CONNECTION_PROBES = {"ipv6", "resolver"} diff --git a/interface/static/404-cat-not-found.png b/interface/static/404-cat-not-found.png deleted file mode 100644 index af28156dd..000000000 Binary files a/interface/static/404-cat-not-found.png and /dev/null differ diff --git a/interface/static/badge-simple-flat-2x.png b/interface/static/badge-simple-flat-2x.png deleted file mode 100644 index 64a28b6fa..000000000 Binary files a/interface/static/badge-simple-flat-2x.png and /dev/null differ diff --git a/interface/static/badge-simple-flat.png b/interface/static/badge-simple-flat.png deleted file mode 100644 index 8bab32ebe..000000000 Binary files a/interface/static/badge-simple-flat.png and /dev/null differ diff --git a/interface/static/badge-simple-flat.svg b/interface/static/badge-simple-flat.svg deleted file mode 100644 index 86194a037..000000000 --- a/interface/static/badge-simple-flat.svg +++ /dev/null @@ -1,50 +0,0 @@ - - - - badge-simple-flat - Created with Sketch. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/interface/static/clear.gif b/interface/static/clear.gif deleted file mode 100644 index 35d42e808..000000000 Binary files a/interface/static/clear.gif and /dev/null differ diff --git a/interface/static/embed-badge-champions.png b/interface/static/embed-badge-champions.png deleted file mode 100644 index 4850d04e3..000000000 Binary files a/interface/static/embed-badge-champions.png and /dev/null differ diff --git a/interface/static/embed-badge-champions.svg b/interface/static/embed-badge-champions.svg deleted file mode 100644 index d4b18c5b4..000000000 --- a/interface/static/embed-badge-champions.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/interface/static/embed-badge-emailtest.png b/interface/static/embed-badge-emailtest.png deleted file mode 100644 index 467993b4d..000000000 Binary files a/interface/static/embed-badge-emailtest.png and /dev/null differ diff --git a/interface/static/embed-badge-emailtest.svg b/interface/static/embed-badge-emailtest.svg deleted file mode 100644 index be2fddc1b..000000000 --- a/interface/static/embed-badge-emailtest.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/interface/static/embed-badge-hosters-v3.svg b/interface/static/embed-badge-hosters-v3.svg deleted file mode 100644 index 359df4eda..000000000 --- a/interface/static/embed-badge-hosters-v3.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/interface/static/embed-badge-websitetest.png b/interface/static/embed-badge-websitetest.png deleted file mode 100644 index 754011a01..000000000 Binary files a/interface/static/embed-badge-websitetest.png and /dev/null differ diff --git a/interface/static/embed-badge-websitetest.svg b/interface/static/embed-badge-websitetest.svg deleted file mode 100644 index 82db1a8c5..000000000 --- a/interface/static/embed-badge-websitetest.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/interface/static/favicon-16x16.png b/interface/static/favicon-16x16.png deleted file mode 100644 index a1e4cadc7..000000000 Binary files a/interface/static/favicon-16x16.png and /dev/null differ diff --git a/interface/static/favicon-32x32.png b/interface/static/favicon-32x32.png deleted file mode 100644 index bf8c64605..000000000 Binary files a/interface/static/favicon-32x32.png and /dev/null differ diff --git a/interface/static/favicon-96x96.png b/interface/static/favicon-96x96.png deleted file mode 100644 index d99110c0e..000000000 Binary files a/interface/static/favicon-96x96.png and /dev/null differ diff --git a/interface/static/favicon.ico b/interface/static/favicon.ico index c057fc321..52fc4bd9d 100644 Binary files a/interface/static/favicon.ico and b/interface/static/favicon.ico differ diff --git a/interface/static/favicon.png b/interface/static/favicon.png index f1070a8f2..da9c2be80 100644 Binary files a/interface/static/favicon.png and b/interface/static/favicon.png differ diff --git a/interface/static/favicon.svg b/interface/static/favicon.svg new file mode 100644 index 000000000..02f3111a6 --- /dev/null +++ b/interface/static/favicon.svg @@ -0,0 +1,38 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/interface/static/fonts/montserrat-400.woff2 b/interface/static/fonts/montserrat-400.woff2 new file mode 100644 index 000000000..62950ac2e Binary files /dev/null and b/interface/static/fonts/montserrat-400.woff2 differ diff --git a/interface/static/fonts/montserrat-500.woff2 b/interface/static/fonts/montserrat-500.woff2 new file mode 100644 index 000000000..a431dd5e6 Binary files /dev/null and b/interface/static/fonts/montserrat-500.woff2 differ diff --git a/interface/static/fonts/montserrat-600.woff2 b/interface/static/fonts/montserrat-600.woff2 new file mode 100644 index 000000000..de7a7b017 Binary files /dev/null and b/interface/static/fonts/montserrat-600.woff2 differ diff --git a/interface/static/fonts/montserrat-700.woff2 b/interface/static/fonts/montserrat-700.woff2 new file mode 100644 index 000000000..1ea709967 Binary files /dev/null and b/interface/static/fonts/montserrat-700.woff2 differ diff --git a/interface/static/fonts/roboto-400.woff2 b/interface/static/fonts/roboto-400.woff2 new file mode 100644 index 000000000..5a5fad1a5 Binary files /dev/null and b/interface/static/fonts/roboto-400.woff2 differ diff --git a/interface/static/fonts/roboto-500.woff2 b/interface/static/fonts/roboto-500.woff2 new file mode 100644 index 000000000..d8a648a0e Binary files /dev/null and b/interface/static/fonts/roboto-500.woff2 differ diff --git a/interface/static/fonts/roboto-700.woff2 b/interface/static/fonts/roboto-700.woff2 new file mode 100644 index 000000000..330b94317 Binary files /dev/null and b/interface/static/fonts/roboto-700.woff2 differ diff --git a/interface/static/fonts/robotobold.eot b/interface/static/fonts/robotobold.eot deleted file mode 100644 index b73776ee3..000000000 Binary files a/interface/static/fonts/robotobold.eot and /dev/null differ diff --git a/interface/static/fonts/robotobold.svg b/interface/static/fonts/robotobold.svg deleted file mode 100644 index 43b5ed222..000000000 --- a/interface/static/fonts/robotobold.svg +++ /dev/null @@ -1,593 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/interface/static/fonts/robotobold.ttf b/interface/static/fonts/robotobold.ttf deleted file mode 100644 index 1da72769a..000000000 Binary files a/interface/static/fonts/robotobold.ttf and /dev/null differ diff --git a/interface/static/fonts/robotobold.woff b/interface/static/fonts/robotobold.woff deleted file mode 100644 index 0c6994871..000000000 Binary files a/interface/static/fonts/robotobold.woff and /dev/null differ diff --git a/interface/static/fonts/robotoregular.eot b/interface/static/fonts/robotoregular.eot deleted file mode 100644 index 9b5e8e413..000000000 Binary files a/interface/static/fonts/robotoregular.eot and /dev/null differ diff --git a/interface/static/fonts/robotoregular.svg b/interface/static/fonts/robotoregular.svg deleted file mode 100644 index de7d77fea..000000000 --- a/interface/static/fonts/robotoregular.svg +++ /dev/null @@ -1,621 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/interface/static/fonts/robotoregular.ttf b/interface/static/fonts/robotoregular.ttf deleted file mode 100644 index 44dd78d5e..000000000 Binary files a/interface/static/fonts/robotoregular.ttf and /dev/null differ diff --git a/interface/static/fonts/robotoregular.woff b/interface/static/fonts/robotoregular.woff deleted file mode 100644 index bfa05d53f..000000000 Binary files a/interface/static/fonts/robotoregular.woff and /dev/null differ diff --git a/interface/static/icon-arrow-down-ie8.png b/interface/static/icon-arrow-down-ie8.png deleted file mode 100644 index a88176c82..000000000 Binary files a/interface/static/icon-arrow-down-ie8.png and /dev/null differ diff --git a/interface/static/icon-arrow-down.png b/interface/static/icon-arrow-down.png deleted file mode 100644 index 6a0765dd5..000000000 Binary files a/interface/static/icon-arrow-down.png and /dev/null differ diff --git a/interface/static/icon-arrow-down.svg b/interface/static/icon-arrow-down.svg deleted file mode 100644 index 4fe94a304..000000000 --- a/interface/static/icon-arrow-down.svg +++ /dev/null @@ -1 +0,0 @@ -icon-arrow-down \ No newline at end of file diff --git a/interface/static/icon-arrow-right.png b/interface/static/icon-arrow-right.png deleted file mode 100644 index 6fffbe71c..000000000 Binary files a/interface/static/icon-arrow-right.png and /dev/null differ diff --git a/interface/static/icon-arrow-right.svg b/interface/static/icon-arrow-right.svg deleted file mode 100644 index b313e3722..000000000 --- a/interface/static/icon-arrow-right.svg +++ /dev/null @@ -1 +0,0 @@ -icon-arrow-right \ No newline at end of file diff --git a/interface/static/icon-check-ie8.png b/interface/static/icon-check-ie8.png deleted file mode 100644 index 20f252306..000000000 Binary files a/interface/static/icon-check-ie8.png and /dev/null differ diff --git a/interface/static/icon-check.png b/interface/static/icon-check.png deleted file mode 100644 index e6d64bf0c..000000000 Binary files a/interface/static/icon-check.png and /dev/null differ diff --git a/interface/static/icon-check.svg b/interface/static/icon-check.svg deleted file mode 100644 index 67a233e72..000000000 --- a/interface/static/icon-check.svg +++ /dev/null @@ -1 +0,0 @@ -icon-check \ No newline at end of file diff --git a/interface/static/icon-circle-check-ie8.png b/interface/static/icon-circle-check-ie8.png deleted file mode 100644 index d44379d19..000000000 Binary files a/interface/static/icon-circle-check-ie8.png and /dev/null differ diff --git a/interface/static/icon-circle-check.png b/interface/static/icon-circle-check.png deleted file mode 100644 index 05c5e9bc8..000000000 Binary files a/interface/static/icon-circle-check.png and /dev/null differ diff --git a/interface/static/icon-circle-check.svg b/interface/static/icon-circle-check.svg deleted file mode 100644 index a9741503f..000000000 --- a/interface/static/icon-circle-check.svg +++ /dev/null @@ -1 +0,0 @@ -icon-circle-check \ No newline at end of file diff --git a/interface/static/icon-circle-error-ie8.png b/interface/static/icon-circle-error-ie8.png deleted file mode 100644 index 5567b2d59..000000000 Binary files a/interface/static/icon-circle-error-ie8.png and /dev/null differ diff --git a/interface/static/icon-circle-error.png b/interface/static/icon-circle-error.png deleted file mode 100644 index 1dff1de6d..000000000 Binary files a/interface/static/icon-circle-error.png and /dev/null differ diff --git a/interface/static/icon-circle-error.svg b/interface/static/icon-circle-error.svg deleted file mode 100644 index 1f00d6a08..000000000 --- a/interface/static/icon-circle-error.svg +++ /dev/null @@ -1 +0,0 @@ -icon-circle-error \ No newline at end of file diff --git a/interface/static/icon-circle-warning-ie8.png b/interface/static/icon-circle-warning-ie8.png deleted file mode 100644 index 83f7ede69..000000000 Binary files a/interface/static/icon-circle-warning-ie8.png and /dev/null differ diff --git a/interface/static/icon-circle-warning.png b/interface/static/icon-circle-warning.png deleted file mode 100644 index d82037e15..000000000 Binary files a/interface/static/icon-circle-warning.png and /dev/null differ diff --git a/interface/static/icon-circle-warning.svg b/interface/static/icon-circle-warning.svg deleted file mode 100644 index ae4637ee1..000000000 --- a/interface/static/icon-circle-warning.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/interface/static/icon-connectiontest-ie8.png b/interface/static/icon-connectiontest-ie8.png deleted file mode 100644 index b8f924da3..000000000 Binary files a/interface/static/icon-connectiontest-ie8.png and /dev/null differ diff --git a/interface/static/icon-connectiontest.png b/interface/static/icon-connectiontest.png deleted file mode 100644 index fab2ac135..000000000 Binary files a/interface/static/icon-connectiontest.png and /dev/null differ diff --git a/interface/static/icon-connectiontest.svg b/interface/static/icon-connectiontest.svg deleted file mode 100644 index 7e4532089..000000000 --- a/interface/static/icon-connectiontest.svg +++ /dev/null @@ -1 +0,0 @@ -icon-connectiontest \ No newline at end of file diff --git a/interface/static/icon-emailtest-ie8.png b/interface/static/icon-emailtest-ie8.png deleted file mode 100644 index 6a10c28c2..000000000 Binary files a/interface/static/icon-emailtest-ie8.png and /dev/null differ diff --git a/interface/static/icon-emailtest.png b/interface/static/icon-emailtest.png deleted file mode 100644 index bc1a7fe39..000000000 Binary files a/interface/static/icon-emailtest.png and /dev/null differ diff --git a/interface/static/icon-emailtest.svg b/interface/static/icon-emailtest.svg deleted file mode 100644 index 83e6bfb2d..000000000 --- a/interface/static/icon-emailtest.svg +++ /dev/null @@ -1 +0,0 @@ -icon-emailtest \ No newline at end of file diff --git a/interface/static/icon-error-ie8.png b/interface/static/icon-error-ie8.png deleted file mode 100644 index 2969e5e86..000000000 Binary files a/interface/static/icon-error-ie8.png and /dev/null differ diff --git a/interface/static/icon-error.png b/interface/static/icon-error.png deleted file mode 100644 index 99965b430..000000000 Binary files a/interface/static/icon-error.png and /dev/null differ diff --git a/interface/static/icon-error.svg b/interface/static/icon-error.svg deleted file mode 100644 index f07dd4167..000000000 --- a/interface/static/icon-error.svg +++ /dev/null @@ -1 +0,0 @@ -icon-error \ No newline at end of file diff --git a/interface/static/icon-info.png b/interface/static/icon-info.png deleted file mode 100644 index 56785a321..000000000 Binary files a/interface/static/icon-info.png and /dev/null differ diff --git a/interface/static/icon-info.svg b/interface/static/icon-info.svg deleted file mode 100644 index 688277abe..000000000 --- a/interface/static/icon-info.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/interface/static/icon-linkedinfollow.png b/interface/static/icon-linkedinfollow.png deleted file mode 100644 index 4da01728f..000000000 Binary files a/interface/static/icon-linkedinfollow.png and /dev/null differ diff --git a/interface/static/icon-linkedinfollow.svg b/interface/static/icon-linkedinfollow.svg deleted file mode 100644 index 7e43e6793..000000000 --- a/interface/static/icon-linkedinfollow.svg +++ /dev/null @@ -1,13 +0,0 @@ - - - - - - - diff --git a/interface/static/icon-menu.png b/interface/static/icon-menu.png deleted file mode 100644 index 7f6e40e22..000000000 Binary files a/interface/static/icon-menu.png and /dev/null differ diff --git a/interface/static/icon-menu.svg b/interface/static/icon-menu.svg deleted file mode 100644 index a1d30e331..000000000 --- a/interface/static/icon-menu.svg +++ /dev/null @@ -1 +0,0 @@ -icon-menu \ No newline at end of file diff --git a/interface/static/icon-not-tested-bolt-ie8.png b/interface/static/icon-not-tested-bolt-ie8.png deleted file mode 100644 index efe758e9f..000000000 Binary files a/interface/static/icon-not-tested-bolt-ie8.png and /dev/null differ diff --git a/interface/static/icon-not-tested-bolt.png b/interface/static/icon-not-tested-bolt.png deleted file mode 100644 index 773a2f666..000000000 Binary files a/interface/static/icon-not-tested-bolt.png and /dev/null differ diff --git a/interface/static/icon-not-tested-bolt.svg b/interface/static/icon-not-tested-bolt.svg deleted file mode 100644 index 451cdd1f7..000000000 --- a/interface/static/icon-not-tested-bolt.svg +++ /dev/null @@ -1 +0,0 @@ -icon-not-tested-bolt \ No newline at end of file diff --git a/interface/static/icon-not-tested-ie8.png b/interface/static/icon-not-tested-ie8.png deleted file mode 100644 index 586082d9f..000000000 Binary files a/interface/static/icon-not-tested-ie8.png and /dev/null differ diff --git a/interface/static/icon-not-tested-question-mark.png b/interface/static/icon-not-tested-question-mark.png deleted file mode 100644 index 1ab2c8011..000000000 Binary files a/interface/static/icon-not-tested-question-mark.png and /dev/null differ diff --git a/interface/static/icon-not-tested-question-mark.svg b/interface/static/icon-not-tested-question-mark.svg deleted file mode 100644 index 6ff4f0087..000000000 --- a/interface/static/icon-not-tested-question-mark.svg +++ /dev/null @@ -1 +0,0 @@ -icon-not-tested-question-mark \ No newline at end of file diff --git a/interface/static/icon-not-tested.png b/interface/static/icon-not-tested.png deleted file mode 100644 index 3c83cf136..000000000 Binary files a/interface/static/icon-not-tested.png and /dev/null differ diff --git a/interface/static/icon-not-tested.svg b/interface/static/icon-not-tested.svg deleted file mode 100644 index 921abf1b2..000000000 --- a/interface/static/icon-not-tested.svg +++ /dev/null @@ -1 +0,0 @@ -icon-not-relevant \ No newline at end of file diff --git a/interface/static/icon-permalink.png b/interface/static/icon-permalink.png deleted file mode 100644 index 9aa5b63ce..000000000 Binary files a/interface/static/icon-permalink.png and /dev/null differ diff --git a/interface/static/icon-permalink.svg b/interface/static/icon-permalink.svg deleted file mode 100644 index 9c056201e..000000000 --- a/interface/static/icon-permalink.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/interface/static/icon-reruntest.png b/interface/static/icon-reruntest.png deleted file mode 100644 index a236cad1b..000000000 Binary files a/interface/static/icon-reruntest.png and /dev/null differ diff --git a/interface/static/icon-reruntest.svg b/interface/static/icon-reruntest.svg deleted file mode 100644 index 00f2d0f54..000000000 --- a/interface/static/icon-reruntest.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/interface/static/icon-share.png b/interface/static/icon-share.png deleted file mode 100644 index ee68addbf..000000000 Binary files a/interface/static/icon-share.png and /dev/null differ diff --git a/interface/static/icon-share.svg b/interface/static/icon-share.svg deleted file mode 100644 index 263f45314..000000000 --- a/interface/static/icon-share.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/interface/static/icon-testinfo.png b/interface/static/icon-testinfo.png deleted file mode 100644 index 95d4c79a4..000000000 Binary files a/interface/static/icon-testinfo.png and /dev/null differ diff --git a/interface/static/icon-testinfo.svg b/interface/static/icon-testinfo.svg deleted file mode 100644 index 123826a9f..000000000 --- a/interface/static/icon-testinfo.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/interface/static/icon-testresult-default-ie8.png b/interface/static/icon-testresult-default-ie8.png deleted file mode 100644 index 586082d9f..000000000 Binary files a/interface/static/icon-testresult-default-ie8.png and /dev/null differ diff --git a/interface/static/icon-testresult-default.png b/interface/static/icon-testresult-default.png deleted file mode 100644 index 3c83cf136..000000000 Binary files a/interface/static/icon-testresult-default.png and /dev/null differ diff --git a/interface/static/icon-testresult-default.svg b/interface/static/icon-testresult-default.svg deleted file mode 100644 index 49c499516..000000000 --- a/interface/static/icon-testresult-default.svg +++ /dev/null @@ -1 +0,0 @@ -icon-testresult-default \ No newline at end of file diff --git a/interface/static/icon-twitterfollow.png b/interface/static/icon-twitterfollow.png deleted file mode 100644 index f3be78702..000000000 Binary files a/interface/static/icon-twitterfollow.png and /dev/null differ diff --git a/interface/static/icon-twitterfollow.svg b/interface/static/icon-twitterfollow.svg deleted file mode 100644 index 24eec0d44..000000000 --- a/interface/static/icon-twitterfollow.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/interface/static/icon-warning-ie8.png b/interface/static/icon-warning-ie8.png deleted file mode 100644 index 0121ee70b..000000000 Binary files a/interface/static/icon-warning-ie8.png and /dev/null differ diff --git a/interface/static/icon-warning.png b/interface/static/icon-warning.png deleted file mode 100644 index 53885e9de..000000000 Binary files a/interface/static/icon-warning.png and /dev/null differ diff --git a/interface/static/icon-warning.svg b/interface/static/icon-warning.svg deleted file mode 100644 index c1f5cec08..000000000 --- a/interface/static/icon-warning.svg +++ /dev/null @@ -1 +0,0 @@ -icon-warning \ No newline at end of file diff --git a/interface/static/icon-website-test-ie8.png b/interface/static/icon-website-test-ie8.png deleted file mode 100644 index 83fc94eee..000000000 Binary files a/interface/static/icon-website-test-ie8.png and /dev/null differ diff --git a/interface/static/icon-website-test.png b/interface/static/icon-website-test.png deleted file mode 100644 index 884fc6b97..000000000 Binary files a/interface/static/icon-website-test.png and /dev/null differ diff --git a/interface/static/icon-website-test.svg b/interface/static/icon-website-test.svg deleted file mode 100644 index 35b7c2902..000000000 --- a/interface/static/icon-website-test.svg +++ /dev/null @@ -1 +0,0 @@ -icon-website-test \ No newline at end of file diff --git a/interface/static/icons/angle-down.svg b/interface/static/icons/angle-down.svg new file mode 100644 index 000000000..02602e4a1 --- /dev/null +++ b/interface/static/icons/angle-down.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/interface/static/icons/angle-right.svg b/interface/static/icons/angle-right.svg new file mode 100644 index 000000000..72a3dec25 --- /dev/null +++ b/interface/static/icons/angle-right.svg @@ -0,0 +1,4 @@ + + + \ No newline at end of file diff --git a/interface/static/icons/arrow-right.svg b/interface/static/icons/arrow-right.svg new file mode 100644 index 000000000..fca80694f --- /dev/null +++ b/interface/static/icons/arrow-right.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/interface/static/icons/atsymbol.svg b/interface/static/icons/atsymbol.svg new file mode 100644 index 000000000..fcfbc0308 --- /dev/null +++ b/interface/static/icons/atsymbol.svg @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/interface/static/icons/box.svg b/interface/static/icons/box.svg new file mode 100644 index 000000000..59836fad5 --- /dev/null +++ b/interface/static/icons/box.svg @@ -0,0 +1,5 @@ + + + \ No newline at end of file diff --git a/interface/static/icons/broken.svg b/interface/static/icons/broken.svg new file mode 100644 index 000000000..ae5bf1927 --- /dev/null +++ b/interface/static/icons/broken.svg @@ -0,0 +1,4 @@ + + + + diff --git a/interface/static/icons/checkmark-circle.svg b/interface/static/icons/checkmark-circle.svg new file mode 100644 index 000000000..fca9f1422 --- /dev/null +++ b/interface/static/icons/checkmark-circle.svg @@ -0,0 +1,3 @@ + + + diff --git a/interface/static/icons/checkmark.svg b/interface/static/icons/checkmark.svg new file mode 100644 index 000000000..8e24fa11c --- /dev/null +++ b/interface/static/icons/checkmark.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/interface/static/icons/circle-done.svg b/interface/static/icons/circle-done.svg new file mode 100644 index 000000000..65a7d58a8 --- /dev/null +++ b/interface/static/icons/circle-done.svg @@ -0,0 +1,6 @@ + + + + \ No newline at end of file diff --git a/interface/static/icons/clipboard.svg b/interface/static/icons/clipboard.svg new file mode 100644 index 000000000..9e28c4883 --- /dev/null +++ b/interface/static/icons/clipboard.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/interface/static/icons/close.svg b/interface/static/icons/close.svg new file mode 100644 index 000000000..f5a138e5a --- /dev/null +++ b/interface/static/icons/close.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/interface/static/icons/ellipse-multiple.svg b/interface/static/icons/ellipse-multiple.svg new file mode 100644 index 000000000..8f2b7587c --- /dev/null +++ b/interface/static/icons/ellipse-multiple.svg @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/interface/static/icons/ellipse-single-1.svg b/interface/static/icons/ellipse-single-1.svg new file mode 100644 index 000000000..255e88cc3 --- /dev/null +++ b/interface/static/icons/ellipse-single-1.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/interface/static/icons/ellipse-single-2.svg b/interface/static/icons/ellipse-single-2.svg new file mode 100644 index 000000000..b78f04727 --- /dev/null +++ b/interface/static/icons/ellipse-single-2.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/interface/static/icons/ellipse-single-3.svg b/interface/static/icons/ellipse-single-3.svg new file mode 100644 index 000000000..6fb437d4b --- /dev/null +++ b/interface/static/icons/ellipse-single-3.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/interface/static/icons/en-flag.svg b/interface/static/icons/en-flag.svg new file mode 100644 index 000000000..bbe7a5682 --- /dev/null +++ b/interface/static/icons/en-flag.svg @@ -0,0 +1,9 @@ + + + + + + + + + \ No newline at end of file diff --git a/interface/static/icons/envelope.svg b/interface/static/icons/envelope.svg new file mode 100644 index 000000000..39552e7d2 --- /dev/null +++ b/interface/static/icons/envelope.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/interface/static/icons/error.svg b/interface/static/icons/error.svg new file mode 100644 index 000000000..701a6678c --- /dev/null +++ b/interface/static/icons/error.svg @@ -0,0 +1,4 @@ + + + + diff --git a/interface/static/icons/exclamation-circle.svg b/interface/static/icons/exclamation-circle.svg new file mode 100644 index 000000000..bee57a6e0 --- /dev/null +++ b/interface/static/icons/exclamation-circle.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/interface/static/icons/eye.svg b/interface/static/icons/eye.svg new file mode 100644 index 000000000..11e20d388 --- /dev/null +++ b/interface/static/icons/eye.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/interface/static/icons/gear.svg b/interface/static/icons/gear.svg new file mode 100644 index 000000000..85bccc19c --- /dev/null +++ b/interface/static/icons/gear.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/interface/static/icons/globe.svg b/interface/static/icons/globe.svg new file mode 100644 index 000000000..5218e2669 --- /dev/null +++ b/interface/static/icons/globe.svg @@ -0,0 +1,5 @@ + + + \ No newline at end of file diff --git a/interface/static/icons/graph.svg b/interface/static/icons/graph.svg new file mode 100644 index 000000000..05f47d700 --- /dev/null +++ b/interface/static/icons/graph.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/interface/static/icons/hamburger.svg b/interface/static/icons/hamburger.svg new file mode 100644 index 000000000..262497faf --- /dev/null +++ b/interface/static/icons/hamburger.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/interface/static/icons/info.svg b/interface/static/icons/info.svg new file mode 100644 index 000000000..6269c81fb --- /dev/null +++ b/interface/static/icons/info.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/interface/static/icons/link.svg b/interface/static/icons/link.svg new file mode 100644 index 000000000..da32f059f --- /dev/null +++ b/interface/static/icons/link.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/interface/static/icons/linkedin.svg b/interface/static/icons/linkedin.svg new file mode 100644 index 000000000..23b26072e --- /dev/null +++ b/interface/static/icons/linkedin.svg @@ -0,0 +1,13 @@ + + + + + \ No newline at end of file diff --git a/interface/static/icons/mastodon.svg b/interface/static/icons/mastodon.svg new file mode 100644 index 000000000..73ab42489 --- /dev/null +++ b/interface/static/icons/mastodon.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/interface/static/icons/moon.svg b/interface/static/icons/moon.svg new file mode 100644 index 000000000..c2ce68aca --- /dev/null +++ b/interface/static/icons/moon.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/interface/static/icons/nl-flag.svg b/interface/static/icons/nl-flag.svg new file mode 100644 index 000000000..bcad190b5 --- /dev/null +++ b/interface/static/icons/nl-flag.svg @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/interface/static/icons/pin.svg b/interface/static/icons/pin.svg new file mode 100644 index 000000000..f49d4d67f --- /dev/null +++ b/interface/static/icons/pin.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/interface/static/icons/plus.svg b/interface/static/icons/plus.svg new file mode 100644 index 000000000..fee2af340 --- /dev/null +++ b/interface/static/icons/plus.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/interface/static/icons/question.svg b/interface/static/icons/question.svg new file mode 100644 index 000000000..91d7b88d3 --- /dev/null +++ b/interface/static/icons/question.svg @@ -0,0 +1,4 @@ + + + + diff --git a/interface/static/icons/reset.svg b/interface/static/icons/reset.svg new file mode 100644 index 000000000..cd4c3bce8 --- /dev/null +++ b/interface/static/icons/reset.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/interface/static/icons/search.svg b/interface/static/icons/search.svg new file mode 100644 index 000000000..c6030ed79 --- /dev/null +++ b/interface/static/icons/search.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/interface/static/icons/spinner.svg b/interface/static/icons/spinner.svg new file mode 100644 index 000000000..049b79d82 --- /dev/null +++ b/interface/static/icons/spinner.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/interface/static/icons/sun.svg b/interface/static/icons/sun.svg new file mode 100644 index 000000000..a83218157 --- /dev/null +++ b/interface/static/icons/sun.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/interface/static/icons/system.svg b/interface/static/icons/system.svg new file mode 100644 index 000000000..b4aa20ad3 --- /dev/null +++ b/interface/static/icons/system.svg @@ -0,0 +1,11 @@ + + + + + + + \ No newline at end of file diff --git a/interface/static/icons/x.svg b/interface/static/icons/x.svg new file mode 100644 index 000000000..23077c6e4 --- /dev/null +++ b/interface/static/icons/x.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/interface/static/images/hosters-badge.png b/interface/static/images/hosters-badge.png new file mode 100644 index 000000000..54c596af2 Binary files /dev/null and b/interface/static/images/hosters-badge.png differ diff --git a/interface/static/images/ncc-wit.png b/interface/static/images/ncc-wit.png new file mode 100644 index 000000000..edf1c17d5 Binary files /dev/null and b/interface/static/images/ncc-wit.png differ diff --git a/interface/static/images/ncc.png b/interface/static/images/ncc.png new file mode 100644 index 000000000..e95f9da3e Binary files /dev/null and b/interface/static/images/ncc.png differ diff --git a/interface/static/images/ncsc-wit.png b/interface/static/images/ncsc-wit.png new file mode 100644 index 000000000..bbc6a5a80 Binary files /dev/null and b/interface/static/images/ncsc-wit.png differ diff --git a/interface/static/images/ncsc.png b/interface/static/images/ncsc.png new file mode 100644 index 000000000..819ae6be2 Binary files /dev/null and b/interface/static/images/ncsc.png differ diff --git a/interface/static/images/nlnet-wit.png b/interface/static/images/nlnet-wit.png new file mode 100644 index 000000000..7bc00f8c9 Binary files /dev/null and b/interface/static/images/nlnet-wit.png differ diff --git a/interface/static/images/nlnet.png b/interface/static/images/nlnet.png new file mode 100644 index 000000000..acfc98ee3 Binary files /dev/null and b/interface/static/images/nlnet.png differ diff --git a/interface/static/images/portret-oprichter-internetnl.png b/interface/static/images/portret-oprichter-internetnl.png new file mode 100644 index 000000000..c21c2994d Binary files /dev/null and b/interface/static/images/portret-oprichter-internetnl.png differ diff --git a/interface/static/images/surf-wit.png b/interface/static/images/surf-wit.png new file mode 100644 index 000000000..39ef3008b Binary files /dev/null and b/interface/static/images/surf-wit.png differ diff --git a/interface/static/images/surf.png b/interface/static/images/surf.png new file mode 100644 index 000000000..eae8244ca Binary files /dev/null and b/interface/static/images/surf.png differ diff --git a/interface/static/images/vvr-wit.png b/interface/static/images/vvr-wit.png new file mode 100644 index 000000000..d7709109c Binary files /dev/null and b/interface/static/images/vvr-wit.png differ diff --git a/interface/static/images/vvr.png b/interface/static/images/vvr.png new file mode 100644 index 000000000..1c8f87069 Binary files /dev/null and b/interface/static/images/vvr.png differ diff --git a/interface/static/js/jquery-3.5.1.min.js b/interface/static/js/jquery-3.5.1.min.js deleted file mode 100644 index b0614034a..000000000 --- a/interface/static/js/jquery-3.5.1.min.js +++ /dev/null @@ -1,2 +0,0 @@ -/*! jQuery v3.5.1 | (c) JS Foundation and other contributors | jquery.org/license */ -!function(e,t){"use strict";"object"==typeof module&&"object"==typeof module.exports?module.exports=e.document?t(e,!0):function(e){if(!e.document)throw new Error("jQuery requires a window with a document");return t(e)}:t(e)}("undefined"!=typeof window?window:this,function(C,e){"use strict";var t=[],r=Object.getPrototypeOf,s=t.slice,g=t.flat?function(e){return t.flat.call(e)}:function(e){return t.concat.apply([],e)},u=t.push,i=t.indexOf,n={},o=n.toString,v=n.hasOwnProperty,a=v.toString,l=a.call(Object),y={},m=function(e){return"function"==typeof e&&"number"!=typeof e.nodeType},x=function(e){return null!=e&&e===e.window},E=C.document,c={type:!0,src:!0,nonce:!0,noModule:!0};function b(e,t,n){var r,i,o=(n=n||E).createElement("script");if(o.text=e,t)for(r in c)(i=t[r]||t.getAttribute&&t.getAttribute(r))&&o.setAttribute(r,i);n.head.appendChild(o).parentNode.removeChild(o)}function w(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?n[o.call(e)]||"object":typeof e}var f="3.5.1",S=function(e,t){return new S.fn.init(e,t)};function p(e){var t=!!e&&"length"in e&&e.length,n=w(e);return!m(e)&&!x(e)&&("array"===n||0===t||"number"==typeof t&&0+~]|"+M+")"+M+"*"),U=new RegExp(M+"|>"),X=new RegExp(F),V=new RegExp("^"+I+"$"),G={ID:new RegExp("^#("+I+")"),CLASS:new RegExp("^\\.("+I+")"),TAG:new RegExp("^("+I+"|[*])"),ATTR:new RegExp("^"+W),PSEUDO:new RegExp("^"+F),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+M+"*(even|odd|(([+-]|)(\\d*)n|)"+M+"*(?:([+-]|)"+M+"*(\\d+)|))"+M+"*\\)|)","i"),bool:new RegExp("^(?:"+R+")$","i"),needsContext:new RegExp("^"+M+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+M+"*((?:-\\d)?\\d*)"+M+"*\\)|)(?=[^-]|$)","i")},Y=/HTML$/i,Q=/^(?:input|select|textarea|button)$/i,J=/^h\d$/i,K=/^[^{]+\{\s*\[native \w/,Z=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,ee=/[+~]/,te=new RegExp("\\\\[\\da-fA-F]{1,6}"+M+"?|\\\\([^\\r\\n\\f])","g"),ne=function(e,t){var n="0x"+e.slice(1)-65536;return t||(n<0?String.fromCharCode(n+65536):String.fromCharCode(n>>10|55296,1023&n|56320))},re=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,ie=function(e,t){return t?"\0"===e?"\ufffd":e.slice(0,-1)+"\\"+e.charCodeAt(e.length-1).toString(16)+" ":"\\"+e},oe=function(){T()},ae=be(function(e){return!0===e.disabled&&"fieldset"===e.nodeName.toLowerCase()},{dir:"parentNode",next:"legend"});try{H.apply(t=O.call(p.childNodes),p.childNodes),t[p.childNodes.length].nodeType}catch(e){H={apply:t.length?function(e,t){L.apply(e,O.call(t))}:function(e,t){var n=e.length,r=0;while(e[n++]=t[r++]);e.length=n-1}}}function se(t,e,n,r){var i,o,a,s,u,l,c,f=e&&e.ownerDocument,p=e?e.nodeType:9;if(n=n||[],"string"!=typeof t||!t||1!==p&&9!==p&&11!==p)return n;if(!r&&(T(e),e=e||C,E)){if(11!==p&&(u=Z.exec(t)))if(i=u[1]){if(9===p){if(!(a=e.getElementById(i)))return n;if(a.id===i)return n.push(a),n}else if(f&&(a=f.getElementById(i))&&y(e,a)&&a.id===i)return n.push(a),n}else{if(u[2])return H.apply(n,e.getElementsByTagName(t)),n;if((i=u[3])&&d.getElementsByClassName&&e.getElementsByClassName)return H.apply(n,e.getElementsByClassName(i)),n}if(d.qsa&&!N[t+" "]&&(!v||!v.test(t))&&(1!==p||"object"!==e.nodeName.toLowerCase())){if(c=t,f=e,1===p&&(U.test(t)||z.test(t))){(f=ee.test(t)&&ye(e.parentNode)||e)===e&&d.scope||((s=e.getAttribute("id"))?s=s.replace(re,ie):e.setAttribute("id",s=S)),o=(l=h(t)).length;while(o--)l[o]=(s?"#"+s:":scope")+" "+xe(l[o]);c=l.join(",")}try{return H.apply(n,f.querySelectorAll(c)),n}catch(e){N(t,!0)}finally{s===S&&e.removeAttribute("id")}}}return g(t.replace($,"$1"),e,n,r)}function ue(){var r=[];return function e(t,n){return r.push(t+" ")>b.cacheLength&&delete e[r.shift()],e[t+" "]=n}}function le(e){return e[S]=!0,e}function ce(e){var t=C.createElement("fieldset");try{return!!e(t)}catch(e){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function fe(e,t){var n=e.split("|"),r=n.length;while(r--)b.attrHandle[n[r]]=t}function pe(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&e.sourceIndex-t.sourceIndex;if(r)return r;if(n)while(n=n.nextSibling)if(n===t)return-1;return e?1:-1}function de(t){return function(e){return"input"===e.nodeName.toLowerCase()&&e.type===t}}function he(n){return function(e){var t=e.nodeName.toLowerCase();return("input"===t||"button"===t)&&e.type===n}}function ge(t){return function(e){return"form"in e?e.parentNode&&!1===e.disabled?"label"in e?"label"in e.parentNode?e.parentNode.disabled===t:e.disabled===t:e.isDisabled===t||e.isDisabled!==!t&&ae(e)===t:e.disabled===t:"label"in e&&e.disabled===t}}function ve(a){return le(function(o){return o=+o,le(function(e,t){var n,r=a([],e.length,o),i=r.length;while(i--)e[n=r[i]]&&(e[n]=!(t[n]=e[n]))})})}function ye(e){return e&&"undefined"!=typeof e.getElementsByTagName&&e}for(e in d=se.support={},i=se.isXML=function(e){var t=e.namespaceURI,n=(e.ownerDocument||e).documentElement;return!Y.test(t||n&&n.nodeName||"HTML")},T=se.setDocument=function(e){var t,n,r=e?e.ownerDocument||e:p;return r!=C&&9===r.nodeType&&r.documentElement&&(a=(C=r).documentElement,E=!i(C),p!=C&&(n=C.defaultView)&&n.top!==n&&(n.addEventListener?n.addEventListener("unload",oe,!1):n.attachEvent&&n.attachEvent("onunload",oe)),d.scope=ce(function(e){return a.appendChild(e).appendChild(C.createElement("div")),"undefined"!=typeof e.querySelectorAll&&!e.querySelectorAll(":scope fieldset div").length}),d.attributes=ce(function(e){return e.className="i",!e.getAttribute("className")}),d.getElementsByTagName=ce(function(e){return e.appendChild(C.createComment("")),!e.getElementsByTagName("*").length}),d.getElementsByClassName=K.test(C.getElementsByClassName),d.getById=ce(function(e){return a.appendChild(e).id=S,!C.getElementsByName||!C.getElementsByName(S).length}),d.getById?(b.filter.ID=function(e){var t=e.replace(te,ne);return function(e){return e.getAttribute("id")===t}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n=t.getElementById(e);return n?[n]:[]}}):(b.filter.ID=function(e){var n=e.replace(te,ne);return function(e){var t="undefined"!=typeof e.getAttributeNode&&e.getAttributeNode("id");return t&&t.value===n}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n,r,i,o=t.getElementById(e);if(o){if((n=o.getAttributeNode("id"))&&n.value===e)return[o];i=t.getElementsByName(e),r=0;while(o=i[r++])if((n=o.getAttributeNode("id"))&&n.value===e)return[o]}return[]}}),b.find.TAG=d.getElementsByTagName?function(e,t){return"undefined"!=typeof t.getElementsByTagName?t.getElementsByTagName(e):d.qsa?t.querySelectorAll(e):void 0}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if("*"===e){while(n=o[i++])1===n.nodeType&&r.push(n);return r}return o},b.find.CLASS=d.getElementsByClassName&&function(e,t){if("undefined"!=typeof t.getElementsByClassName&&E)return t.getElementsByClassName(e)},s=[],v=[],(d.qsa=K.test(C.querySelectorAll))&&(ce(function(e){var t;a.appendChild(e).innerHTML="",e.querySelectorAll("[msallowcapture^='']").length&&v.push("[*^$]="+M+"*(?:''|\"\")"),e.querySelectorAll("[selected]").length||v.push("\\["+M+"*(?:value|"+R+")"),e.querySelectorAll("[id~="+S+"-]").length||v.push("~="),(t=C.createElement("input")).setAttribute("name",""),e.appendChild(t),e.querySelectorAll("[name='']").length||v.push("\\["+M+"*name"+M+"*="+M+"*(?:''|\"\")"),e.querySelectorAll(":checked").length||v.push(":checked"),e.querySelectorAll("a#"+S+"+*").length||v.push(".#.+[+~]"),e.querySelectorAll("\\\f"),v.push("[\\r\\n\\f]")}),ce(function(e){e.innerHTML="";var t=C.createElement("input");t.setAttribute("type","hidden"),e.appendChild(t).setAttribute("name","D"),e.querySelectorAll("[name=d]").length&&v.push("name"+M+"*[*^$|!~]?="),2!==e.querySelectorAll(":enabled").length&&v.push(":enabled",":disabled"),a.appendChild(e).disabled=!0,2!==e.querySelectorAll(":disabled").length&&v.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),v.push(",.*:")})),(d.matchesSelector=K.test(c=a.matches||a.webkitMatchesSelector||a.mozMatchesSelector||a.oMatchesSelector||a.msMatchesSelector))&&ce(function(e){d.disconnectedMatch=c.call(e,"*"),c.call(e,"[s!='']:x"),s.push("!=",F)}),v=v.length&&new RegExp(v.join("|")),s=s.length&&new RegExp(s.join("|")),t=K.test(a.compareDocumentPosition),y=t||K.test(a.contains)?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)while(t=t.parentNode)if(t===e)return!0;return!1},D=t?function(e,t){if(e===t)return l=!0,0;var n=!e.compareDocumentPosition-!t.compareDocumentPosition;return n||(1&(n=(e.ownerDocument||e)==(t.ownerDocument||t)?e.compareDocumentPosition(t):1)||!d.sortDetached&&t.compareDocumentPosition(e)===n?e==C||e.ownerDocument==p&&y(p,e)?-1:t==C||t.ownerDocument==p&&y(p,t)?1:u?P(u,e)-P(u,t):0:4&n?-1:1)}:function(e,t){if(e===t)return l=!0,0;var n,r=0,i=e.parentNode,o=t.parentNode,a=[e],s=[t];if(!i||!o)return e==C?-1:t==C?1:i?-1:o?1:u?P(u,e)-P(u,t):0;if(i===o)return pe(e,t);n=e;while(n=n.parentNode)a.unshift(n);n=t;while(n=n.parentNode)s.unshift(n);while(a[r]===s[r])r++;return r?pe(a[r],s[r]):a[r]==p?-1:s[r]==p?1:0}),C},se.matches=function(e,t){return se(e,null,null,t)},se.matchesSelector=function(e,t){if(T(e),d.matchesSelector&&E&&!N[t+" "]&&(!s||!s.test(t))&&(!v||!v.test(t)))try{var n=c.call(e,t);if(n||d.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(e){N(t,!0)}return 0":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(te,ne),e[3]=(e[3]||e[4]||e[5]||"").replace(te,ne),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||se.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&se.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return G.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&X.test(n)&&(t=h(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(te,ne).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=m[e+" "];return t||(t=new RegExp("(^|"+M+")"+e+"("+M+"|$)"))&&m(e,function(e){return t.test("string"==typeof e.className&&e.className||"undefined"!=typeof e.getAttribute&&e.getAttribute("class")||"")})},ATTR:function(n,r,i){return function(e){var t=se.attr(e,n);return null==t?"!="===r:!r||(t+="","="===r?t===i:"!="===r?t!==i:"^="===r?i&&0===t.indexOf(i):"*="===r?i&&-1:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function D(e,n,r){return m(n)?S.grep(e,function(e,t){return!!n.call(e,t,e)!==r}):n.nodeType?S.grep(e,function(e){return e===n!==r}):"string"!=typeof n?S.grep(e,function(e){return-1)[^>]*|#([\w-]+))$/;(S.fn.init=function(e,t,n){var r,i;if(!e)return this;if(n=n||j,"string"==typeof e){if(!(r="<"===e[0]&&">"===e[e.length-1]&&3<=e.length?[null,e,null]:q.exec(e))||!r[1]&&t)return!t||t.jquery?(t||n).find(e):this.constructor(t).find(e);if(r[1]){if(t=t instanceof S?t[0]:t,S.merge(this,S.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:E,!0)),N.test(r[1])&&S.isPlainObject(t))for(r in t)m(this[r])?this[r](t[r]):this.attr(r,t[r]);return this}return(i=E.getElementById(r[2]))&&(this[0]=i,this.length=1),this}return e.nodeType?(this[0]=e,this.length=1,this):m(e)?void 0!==n.ready?n.ready(e):e(S):S.makeArray(e,this)}).prototype=S.fn,j=S(E);var L=/^(?:parents|prev(?:Until|All))/,H={children:!0,contents:!0,next:!0,prev:!0};function O(e,t){while((e=e[t])&&1!==e.nodeType);return e}S.fn.extend({has:function(e){var t=S(e,this),n=t.length;return this.filter(function(){for(var e=0;e\x20\t\r\n\f]*)/i,he=/^$|^module$|\/(?:java|ecma)script/i;ce=E.createDocumentFragment().appendChild(E.createElement("div")),(fe=E.createElement("input")).setAttribute("type","radio"),fe.setAttribute("checked","checked"),fe.setAttribute("name","t"),ce.appendChild(fe),y.checkClone=ce.cloneNode(!0).cloneNode(!0).lastChild.checked,ce.innerHTML="",y.noCloneChecked=!!ce.cloneNode(!0).lastChild.defaultValue,ce.innerHTML="",y.option=!!ce.lastChild;var ge={thead:[1,"","
"],col:[2,"","
"],tr:[2,"","
"],td:[3,"","
"],_default:[0,"",""]};function ve(e,t){var n;return n="undefined"!=typeof e.getElementsByTagName?e.getElementsByTagName(t||"*"):"undefined"!=typeof e.querySelectorAll?e.querySelectorAll(t||"*"):[],void 0===t||t&&A(e,t)?S.merge([e],n):n}function ye(e,t){for(var n=0,r=e.length;n",""]);var me=/<|&#?\w+;/;function xe(e,t,n,r,i){for(var o,a,s,u,l,c,f=t.createDocumentFragment(),p=[],d=0,h=e.length;d\s*$/g;function qe(e,t){return A(e,"table")&&A(11!==t.nodeType?t:t.firstChild,"tr")&&S(e).children("tbody")[0]||e}function Le(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function He(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute("type"),e}function Oe(e,t){var n,r,i,o,a,s;if(1===t.nodeType){if(Y.hasData(e)&&(s=Y.get(e).events))for(i in Y.remove(t,"handle events"),s)for(n=0,r=s[i].length;n").attr(n.scriptAttrs||{}).prop({charset:n.scriptCharset,src:n.url}).on("load error",i=function(e){r.remove(),i=null,e&&t("error"===e.type?404:200,e.type)}),E.head.appendChild(r[0])},abort:function(){i&&i()}}});var Ut,Xt=[],Vt=/(=)\?(?=&|$)|\?\?/;S.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=Xt.pop()||S.expando+"_"+Ct.guid++;return this[e]=!0,e}}),S.ajaxPrefilter("json jsonp",function(e,t,n){var r,i,o,a=!1!==e.jsonp&&(Vt.test(e.url)?"url":"string"==typeof e.data&&0===(e.contentType||"").indexOf("application/x-www-form-urlencoded")&&Vt.test(e.data)&&"data");if(a||"jsonp"===e.dataTypes[0])return r=e.jsonpCallback=m(e.jsonpCallback)?e.jsonpCallback():e.jsonpCallback,a?e[a]=e[a].replace(Vt,"$1"+r):!1!==e.jsonp&&(e.url+=(Et.test(e.url)?"&":"?")+e.jsonp+"="+r),e.converters["script json"]=function(){return o||S.error(r+" was not called"),o[0]},e.dataTypes[0]="json",i=C[r],C[r]=function(){o=arguments},n.always(function(){void 0===i?S(C).removeProp(r):C[r]=i,e[r]&&(e.jsonpCallback=t.jsonpCallback,Xt.push(r)),o&&m(i)&&i(o[0]),o=i=void 0}),"script"}),y.createHTMLDocument=((Ut=E.implementation.createHTMLDocument("").body).innerHTML="
",2===Ut.childNodes.length),S.parseHTML=function(e,t,n){return"string"!=typeof e?[]:("boolean"==typeof t&&(n=t,t=!1),t||(y.createHTMLDocument?((r=(t=E.implementation.createHTMLDocument("")).createElement("base")).href=E.location.href,t.head.appendChild(r)):t=E),o=!n&&[],(i=N.exec(e))?[t.createElement(i[1])]:(i=xe([e],t,o),o&&o.length&&S(o).remove(),S.merge([],i.childNodes)));var r,i,o},S.fn.load=function(e,t,n){var r,i,o,a=this,s=e.indexOf(" ");return-1").append(S.parseHTML(e)).find(r):e)}).always(n&&function(e,t){a.each(function(){n.apply(this,o||[e.responseText,t,e])})}),this},S.expr.pseudos.animated=function(t){return S.grep(S.timers,function(e){return t===e.elem}).length},S.offset={setOffset:function(e,t,n){var r,i,o,a,s,u,l=S.css(e,"position"),c=S(e),f={};"static"===l&&(e.style.position="relative"),s=c.offset(),o=S.css(e,"top"),u=S.css(e,"left"),("absolute"===l||"fixed"===l)&&-1<(o+u).indexOf("auto")?(a=(r=c.position()).top,i=r.left):(a=parseFloat(o)||0,i=parseFloat(u)||0),m(t)&&(t=t.call(e,n,S.extend({},s))),null!=t.top&&(f.top=t.top-s.top+a),null!=t.left&&(f.left=t.left-s.left+i),"using"in t?t.using.call(e,f):("number"==typeof f.top&&(f.top+="px"),"number"==typeof f.left&&(f.left+="px"),c.css(f))}},S.fn.extend({offset:function(t){if(arguments.length)return void 0===t?this:this.each(function(e){S.offset.setOffset(this,t,e)});var e,n,r=this[0];return r?r.getClientRects().length?(e=r.getBoundingClientRect(),n=r.ownerDocument.defaultView,{top:e.top+n.pageYOffset,left:e.left+n.pageXOffset}):{top:0,left:0}:void 0},position:function(){if(this[0]){var e,t,n,r=this[0],i={top:0,left:0};if("fixed"===S.css(r,"position"))t=r.getBoundingClientRect();else{t=this.offset(),n=r.ownerDocument,e=r.offsetParent||n.documentElement;while(e&&(e===n.body||e===n.documentElement)&&"static"===S.css(e,"position"))e=e.parentNode;e&&e!==r&&1===e.nodeType&&((i=S(e).offset()).top+=S.css(e,"borderTopWidth",!0),i.left+=S.css(e,"borderLeftWidth",!0))}return{top:t.top-i.top-S.css(r,"marginTop",!0),left:t.left-i.left-S.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent;while(e&&"static"===S.css(e,"position"))e=e.offsetParent;return e||re})}}),S.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(t,i){var o="pageYOffset"===i;S.fn[t]=function(e){return $(this,function(e,t,n){var r;if(x(e)?r=e:9===e.nodeType&&(r=e.defaultView),void 0===n)return r?r[i]:e[t];r?r.scrollTo(o?r.pageXOffset:n,o?n:r.pageYOffset):e[t]=n},t,e,arguments.length)}}),S.each(["top","left"],function(e,n){S.cssHooks[n]=$e(y.pixelPosition,function(e,t){if(t)return t=Be(e,n),Me.test(t)?S(e).position()[n]+"px":t})}),S.each({Height:"height",Width:"width"},function(a,s){S.each({padding:"inner"+a,content:s,"":"outer"+a},function(r,o){S.fn[o]=function(e,t){var n=arguments.length&&(r||"boolean"!=typeof e),i=r||(!0===e||!0===t?"margin":"border");return $(this,function(e,t,n){var r;return x(e)?0===o.indexOf("outer")?e["inner"+a]:e.document.documentElement["client"+a]:9===e.nodeType?(r=e.documentElement,Math.max(e.body["scroll"+a],r["scroll"+a],e.body["offset"+a],r["offset"+a],r["client"+a])):void 0===n?S.css(e,t,i):S.style(e,t,n,i)},s,n?e:void 0,n)}})}),S.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){S.fn[t]=function(e){return this.on(t,e)}}),S.fn.extend({bind:function(e,t,n){return this.on(e,null,t,n)},unbind:function(e,t){return this.off(e,null,t)},delegate:function(e,t,n,r){return this.on(t,e,n,r)},undelegate:function(e,t,n){return 1===arguments.length?this.off(e,"**"):this.off(t,e||"**",n)},hover:function(e,t){return this.mouseenter(e).mouseleave(t||e)}}),S.each("blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu".split(" "),function(e,n){S.fn[n]=function(e,t){return 0li-check-green \ No newline at end of file diff --git a/interface/static/li-shield-error.png b/interface/static/li-shield-error.png deleted file mode 100644 index b81525a9b..000000000 Binary files a/interface/static/li-shield-error.png and /dev/null differ diff --git a/interface/static/li-shield-error.svg b/interface/static/li-shield-error.svg deleted file mode 100644 index 822726bcd..000000000 --- a/interface/static/li-shield-error.svg +++ /dev/null @@ -1 +0,0 @@ -li-shield-error \ No newline at end of file diff --git a/interface/static/li-shield-ok.png b/interface/static/li-shield-ok.png deleted file mode 100644 index 848c8a391..000000000 Binary files a/interface/static/li-shield-ok.png and /dev/null differ diff --git a/interface/static/li-shield-ok.svg b/interface/static/li-shield-ok.svg deleted file mode 100644 index 58bd76fd3..000000000 --- a/interface/static/li-shield-ok.svg +++ /dev/null @@ -1 +0,0 @@ -li-shield-ok \ No newline at end of file diff --git a/interface/static/li-shield-warning.png b/interface/static/li-shield-warning.png deleted file mode 100644 index 3e69fac99..000000000 Binary files a/interface/static/li-shield-warning.png and /dev/null differ diff --git a/interface/static/li-shield-warning.svg b/interface/static/li-shield-warning.svg deleted file mode 100644 index 8f7de6fab..000000000 --- a/interface/static/li-shield-warning.svg +++ /dev/null @@ -1 +0,0 @@ -li-shield-warning \ No newline at end of file diff --git a/interface/static/logo-300w.png b/interface/static/logo-300w.png deleted file mode 100644 index d144ac79c..000000000 Binary files a/interface/static/logo-300w.png and /dev/null differ diff --git a/interface/static/logo-tablet_en.png b/interface/static/logo-tablet_en.png deleted file mode 100644 index b60314c70..000000000 Binary files a/interface/static/logo-tablet_en.png and /dev/null differ diff --git a/interface/static/logo-tablet_en.svg b/interface/static/logo-tablet_en.svg deleted file mode 100644 index c2910b81d..000000000 --- a/interface/static/logo-tablet_en.svg +++ /dev/null @@ -1 +0,0 @@ -logo-internetnlnl-tablet-en \ No newline at end of file diff --git a/interface/static/logo-tablet_nl.png b/interface/static/logo-tablet_nl.png deleted file mode 100644 index 6ad191478..000000000 Binary files a/interface/static/logo-tablet_nl.png and /dev/null differ diff --git a/interface/static/logo-tablet_nl.svg b/interface/static/logo-tablet_nl.svg deleted file mode 100644 index 66259a6db..000000000 --- a/interface/static/logo-tablet_nl.svg +++ /dev/null @@ -1 +0,0 @@ -logo-internetnlnl-tablet-nl \ No newline at end of file diff --git a/interface/static/logo_en.png b/interface/static/logo_en.png deleted file mode 100644 index 98c9daf35..000000000 Binary files a/interface/static/logo_en.png and /dev/null differ diff --git a/interface/static/logo_en.svg b/interface/static/logo_en.svg deleted file mode 100644 index d98bc5093..000000000 --- a/interface/static/logo_en.svg +++ /dev/null @@ -1 +0,0 @@ -logo-internetnl-en \ No newline at end of file diff --git a/interface/static/logo_nl.png b/interface/static/logo_nl.png deleted file mode 100644 index db969993d..000000000 Binary files a/interface/static/logo_nl.png and /dev/null differ diff --git a/interface/static/logo_nl.svg b/interface/static/logo_nl.svg deleted file mode 100644 index c51a55f04..000000000 --- a/interface/static/logo_nl.svg +++ /dev/null @@ -1 +0,0 @@ -logo-internetnl-nl \ No newline at end of file diff --git a/interface/static/logos/logo-mobile.svg b/interface/static/logos/logo-mobile.svg new file mode 100644 index 000000000..cb7627789 --- /dev/null +++ b/interface/static/logos/logo-mobile.svg @@ -0,0 +1,44 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/interface/static/logos/logo-white-2.svg b/interface/static/logos/logo-white-2.svg new file mode 100644 index 000000000..088c46bd1 --- /dev/null +++ b/interface/static/logos/logo-white-2.svg @@ -0,0 +1,35 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/interface/static/logos/logo-white-alt.svg b/interface/static/logos/logo-white-alt.svg new file mode 100644 index 000000000..bfbaa23d3 --- /dev/null +++ b/interface/static/logos/logo-white-alt.svg @@ -0,0 +1,72 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/interface/static/logos/logo-white-mobile.svg b/interface/static/logos/logo-white-mobile.svg new file mode 100644 index 000000000..5d0aafdb3 --- /dev/null +++ b/interface/static/logos/logo-white-mobile.svg @@ -0,0 +1,42 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/interface/static/logos/logo-white.svg b/interface/static/logos/logo-white.svg new file mode 100644 index 000000000..78dc4dd65 --- /dev/null +++ b/interface/static/logos/logo-white.svg @@ -0,0 +1,65 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/interface/static/logos/logo.svg b/interface/static/logos/logo.svg new file mode 100644 index 000000000..0963c3cb8 --- /dev/null +++ b/interface/static/logos/logo.svg @@ -0,0 +1,107 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/interface/static/probe-animation-ready.gif b/interface/static/probe-animation-ready.gif deleted file mode 100644 index fbced67d4..000000000 Binary files a/interface/static/probe-animation-ready.gif and /dev/null differ diff --git a/interface/static/probe-animation.gif b/interface/static/probe-animation.gif deleted file mode 100644 index d9480c161..000000000 Binary files a/interface/static/probe-animation.gif and /dev/null differ diff --git a/interface/static/probe-error.png b/interface/static/probe-error.png deleted file mode 100644 index ee097c86f..000000000 Binary files a/interface/static/probe-error.png and /dev/null differ diff --git a/interface/static/probe-error.svg b/interface/static/probe-error.svg deleted file mode 100644 index e2500e095..000000000 --- a/interface/static/probe-error.svg +++ /dev/null @@ -1 +0,0 @@ -probe-error \ No newline at end of file diff --git a/interface/static/progress-meter2x.png b/interface/static/progress-meter2x.png deleted file mode 100644 index 686ef32a3..000000000 Binary files a/interface/static/progress-meter2x.png and /dev/null differ diff --git a/interface/static/push-open.png b/interface/static/push-open.png deleted file mode 100644 index 6a0765dd5..000000000 Binary files a/interface/static/push-open.png and /dev/null differ diff --git a/interface/static/twitter16x16.png b/interface/static/twitter16x16.png deleted file mode 100644 index 5c4d5bf83..000000000 Binary files a/interface/static/twitter16x16.png and /dev/null differ diff --git a/interface/static/twitter24x24.png b/interface/static/twitter24x24.png deleted file mode 100644 index 16893bb32..000000000 Binary files a/interface/static/twitter24x24.png and /dev/null differ diff --git a/interface/static/twitter32x32.png b/interface/static/twitter32x32.png deleted file mode 100644 index dc5e3c315..000000000 Binary files a/interface/static/twitter32x32.png and /dev/null differ diff --git a/interface/static/uxwing/icon-mastodonfollow-small.png b/interface/static/uxwing/icon-mastodonfollow-small.png deleted file mode 100644 index c01924224..000000000 Binary files a/interface/static/uxwing/icon-mastodonfollow-small.png and /dev/null differ diff --git a/interface/static/uxwing/icon-mastodonfollow.png b/interface/static/uxwing/icon-mastodonfollow.png deleted file mode 100644 index 1108e098d..000000000 Binary files a/interface/static/uxwing/icon-mastodonfollow.png and /dev/null differ diff --git a/interface/templates/404.html b/interface/templates/404.html index a07ff3770..7d5668176 100644 --- a/interface/templates/404.html +++ b/interface/templates/404.html @@ -1,16 +1,47 @@ {% extends "base.html" %} {% load static %} - {% block maincontent %} -
-
-
-
-

404 {{pagetitle}}

- -
- {% include "content.html" with name="page404 content" %} -
-
-
+
+
+
+

404

+

{% include "string.html" with name="page404 title" %}

+ +
+
+
+
+
+

{% include "string.html" with name="page404 contact" %}

+
    +
  • +
    +

    {% include "string.html" with name="contact_email_title_newstring" %}

    +

    + {% include "string.html" with name="contact_page_email_description_newstring" %} + vraag@internet.nl +

    +
    +
  • +
  • +
    +

    {% include "string.html" with name="contact_help_title_newstring" %}

    +

    + {% include "string.html" with name="contact_page_help_description_newstring" %} + Github account +

    +
    +
  • +
  • +
    +

    {% include "string.html" with name="contact_visit_title_newstring" %}

    +

    {% include "string.html" with name="contact_page_visit_description_newstring" %}

    +
    +
  • +
+
+
{% endblock %} diff --git a/interface/templates/about.html b/interface/templates/about.html index 67e9da066..d0ead5f56 100644 --- a/interface/templates/about.html +++ b/interface/templates/about.html @@ -2,23 +2,177 @@ {% load static %} {% load translate %} +{% block scripting %} + +{% endblock %} + {% block maincontent %} -
-
- {% if "INTERNETNL_BRANDING"|get_settings_value %} - {% include "content.html" with name="about content" %} - {% else %} - {% include "content.html" with name="about content custom" %} - {% endif %} -
-
-