├── CTF ├── __init__.py ├── utils │ ├── __init__.py │ ├── invitation │ │ ├── __init__.py │ │ └── model.py │ ├── UTILS_SHOULD_BE_UPLOADED_HERE │ ├── check_user │ │ ├── __init__.py │ │ ├── requirements.txt │ │ ├── README.md │ │ └── CheckUser.py │ ├── game_crawler │ │ ├── requirements.txt │ │ ├── README.md │ │ ├── __init__.py │ │ ├── model.py │ │ └── game.py │ └── util.py ├── static │ ├── css │ │ ├── style.css │ │ ├── addons │ │ │ ├── directives.min.css │ │ │ ├── rating.min.css │ │ │ ├── directives.min.css.map │ │ │ ├── rating.min.css.map │ │ │ ├── jquery.zmd.hierarchical-display.min.css │ │ │ ├── jquery.zmd.hierarchical-display.min.css.map │ │ │ ├── datatables.min.css │ │ │ ├── datatables-select.min.css │ │ │ ├── datatables.min.css.map │ │ │ └── datatables-select.min.css.map │ │ ├── brands.min.css │ │ ├── solid.min.css │ │ ├── regular.min.css │ │ ├── brands.css │ │ ├── solid.css │ │ ├── regular.css │ │ ├── forgotpwd.css │ │ ├── base.css │ │ ├── navigator.css │ │ ├── svg-with-js.min.css │ │ └── svg-with-js.css │ ├── img │ │ ├── fakeLogo.JPG │ │ └── scuctf.JPG │ ├── upload │ │ └── avatar.jpg │ ├── fonts │ │ ├── glyphicons-halflings-regular.eot │ │ ├── glyphicons-halflings-regular.ttf │ │ ├── glyphicons-halflings-regular.woff │ │ └── glyphicons-halflings-regular.woff2 │ └── js │ │ ├── jquery-ui-1.12.1.custom │ │ ├── images │ │ │ ├── ui-icons_444444_256x240.png │ │ │ ├── ui-icons_555555_256x240.png │ │ │ ├── ui-icons_777620_256x240.png │ │ │ ├── ui-icons_777777_256x240.png │ │ │ ├── ui-icons_cc0000_256x240.png │ │ │ └── ui-icons_ffffff_256x240.png │ │ ├── LICENSE.txt │ │ ├── package.json │ │ ├── jquery-ui.theme.min.css │ │ └── AUTHORS.txt │ │ ├── npm.js │ │ ├── addons │ │ ├── flag.min.js │ │ ├── directives.min.js │ │ ├── flag.min.js.map │ │ ├── directives.min.js.map │ │ └── rating.min.js │ │ ├── modules │ │ ├── animations-extended.min.js │ │ ├── scrolling-navbar.min.js │ │ ├── animations-extended.min.js.map │ │ ├── scrolling-navbar.min.js.map │ │ ├── treeview.min.js │ │ └── wow.min.js │ │ ├── navigator.js │ │ ├── mdb.lite.min.js.map │ │ └── conflict-detection.min.js ├── admin.py ├── tests.py ├── apps.py ├── urls.py ├── forms.py ├── auth.py ├── models.py └── views.py ├── SCUCTF_CMS ├── __init__.py ├── asgi.py ├── wsgi.py ├── urls.py └── settings.py ├── .idea ├── .gitignore ├── vcs.xml ├── inspectionProfiles │ └── profiles_settings.xml ├── modules.xml ├── misc.xml ├── SCUCTF_CMS.iml ├── markdown-navigator.xml └── markdown-navigator-enh.xml ├── README.md ├── templates ├── user_center.html ├── registration │ ├── password_reset_email.html │ ├── password_reset_complete.html │ ├── password_reset_done.html │ ├── password_reset_confirm.html │ └── password_reset_form.html ├── index.html ├── register.html ├── base.html ├── forgotPwd.html └── login.html ├── manage.py └── .gitignore /CTF/__init__.py: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /CTF/utils/__init__.py: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /SCUCTF_CMS/__init__.py: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /CTF/static/css/style.css: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /CTF/utils/invitation/__init__.py: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /CTF/utils/UTILS_SHOULD_BE_UPLOADED_HERE: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /CTF/utils/check_user/__init__.py: -------------------------------------------------------------------------------- 1 | from .CheckUser import * -------------------------------------------------------------------------------- /.idea/.gitignore: -------------------------------------------------------------------------------- 1 | 2 | # Default ignored files 3 | /workspace.xml -------------------------------------------------------------------------------- /CTF/utils/check_user/requirements.txt: -------------------------------------------------------------------------------- 1 | requests 2 | bs4 3 | re -------------------------------------------------------------------------------- /CTF/utils/game_crawler/requirements.txt: -------------------------------------------------------------------------------- 1 | requests 2 | bs4 3 | lxml -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # SCUCTF-CMS 2 | A cms system for Sichuan University CTF Association 3 | -------------------------------------------------------------------------------- /CTF/admin.py: -------------------------------------------------------------------------------- 1 | from django.contrib import admin 2 | 3 | # Register your models here. 4 | -------------------------------------------------------------------------------- /CTF/tests.py: -------------------------------------------------------------------------------- 1 | from django.test import TestCase 2 | 3 | # Create your tests here. 4 | -------------------------------------------------------------------------------- /CTF/static/img/fakeLogo.JPG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/scu-ctf/SCUCTF-CMS/HEAD/CTF/static/img/fakeLogo.JPG -------------------------------------------------------------------------------- /CTF/static/img/scuctf.JPG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/scu-ctf/SCUCTF-CMS/HEAD/CTF/static/img/scuctf.JPG -------------------------------------------------------------------------------- /CTF/apps.py: -------------------------------------------------------------------------------- 1 | from django.apps import AppConfig 2 | 3 | 4 | class CtfConfig(AppConfig): 5 | name = 'CTF' 6 | -------------------------------------------------------------------------------- /CTF/static/upload/avatar.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/scu-ctf/SCUCTF-CMS/HEAD/CTF/static/upload/avatar.jpg -------------------------------------------------------------------------------- /CTF/static/fonts/glyphicons-halflings-regular.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/scu-ctf/SCUCTF-CMS/HEAD/CTF/static/fonts/glyphicons-halflings-regular.eot -------------------------------------------------------------------------------- /CTF/static/fonts/glyphicons-halflings-regular.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/scu-ctf/SCUCTF-CMS/HEAD/CTF/static/fonts/glyphicons-halflings-regular.ttf -------------------------------------------------------------------------------- /CTF/static/fonts/glyphicons-halflings-regular.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/scu-ctf/SCUCTF-CMS/HEAD/CTF/static/fonts/glyphicons-halflings-regular.woff -------------------------------------------------------------------------------- /CTF/static/fonts/glyphicons-halflings-regular.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/scu-ctf/SCUCTF-CMS/HEAD/CTF/static/fonts/glyphicons-halflings-regular.woff2 -------------------------------------------------------------------------------- /CTF/static/js/jquery-ui-1.12.1.custom/images/ui-icons_444444_256x240.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/scu-ctf/SCUCTF-CMS/HEAD/CTF/static/js/jquery-ui-1.12.1.custom/images/ui-icons_444444_256x240.png -------------------------------------------------------------------------------- /CTF/static/js/jquery-ui-1.12.1.custom/images/ui-icons_555555_256x240.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/scu-ctf/SCUCTF-CMS/HEAD/CTF/static/js/jquery-ui-1.12.1.custom/images/ui-icons_555555_256x240.png -------------------------------------------------------------------------------- /CTF/static/js/jquery-ui-1.12.1.custom/images/ui-icons_777620_256x240.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/scu-ctf/SCUCTF-CMS/HEAD/CTF/static/js/jquery-ui-1.12.1.custom/images/ui-icons_777620_256x240.png -------------------------------------------------------------------------------- /CTF/static/js/jquery-ui-1.12.1.custom/images/ui-icons_777777_256x240.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/scu-ctf/SCUCTF-CMS/HEAD/CTF/static/js/jquery-ui-1.12.1.custom/images/ui-icons_777777_256x240.png -------------------------------------------------------------------------------- /CTF/static/js/jquery-ui-1.12.1.custom/images/ui-icons_cc0000_256x240.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/scu-ctf/SCUCTF-CMS/HEAD/CTF/static/js/jquery-ui-1.12.1.custom/images/ui-icons_cc0000_256x240.png -------------------------------------------------------------------------------- /CTF/static/js/jquery-ui-1.12.1.custom/images/ui-icons_ffffff_256x240.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/scu-ctf/SCUCTF-CMS/HEAD/CTF/static/js/jquery-ui-1.12.1.custom/images/ui-icons_ffffff_256x240.png -------------------------------------------------------------------------------- /templates/user_center.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 个人中心 6 | 7 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /.idea/vcs.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /templates/registration/password_reset_email.html: -------------------------------------------------------------------------------- 1 |

{{ user.username }}

,你好,你之所以收到这封邮件,是因为你正在进行重置密码操作, 2 | 重置密码点击{{ protocol }}://{{ domain }}{% url "password_reset_confirm" uidb64=uid token=token %} 3 | 4 | -------------------------------------------------------------------------------- /.idea/inspectionProfiles/profiles_settings.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 6 | -------------------------------------------------------------------------------- /CTF/utils/invitation/model.py: -------------------------------------------------------------------------------- 1 | from django.db.models import Model, CharField, DateTimeField, IntegerField,ForeignKey 2 | 3 | 4 | class InvitationCode(Model): 5 | id = IntegerField(primary_key=True) # 唯一标识符 6 | from_uid=ForeignKey() -------------------------------------------------------------------------------- /CTF/utils/util.py: -------------------------------------------------------------------------------- 1 | import uuid 2 | from hashlib import md5 3 | 4 | 5 | def random_md5() -> str: 6 | """ 7 | 生成UUID并区哈希 -> 生成随机哈希 8 | :return: 生成的哈希 9 | """ 10 | return md5(uuid.uuid4().bytes).hexdigest() 11 | 12 | -------------------------------------------------------------------------------- /CTF/utils/game_crawler/README.md: -------------------------------------------------------------------------------- 1 | # 比赛信息爬取模块 2 | 3 | ## 相关函数 4 | 5 | |函数名|参数|返回值|说明| 6 | |---|---|---|---| 7 | |get_inf|空|空|可以设置为计划任务自动爬取比赛信息储存到数据库中| 8 | 9 | ## 相关类 10 | 11 | |类名|说明| 12 | |---|---| 13 | |GameInformation|ORM类,用于创建存储相关信息的数据表| 14 | -------------------------------------------------------------------------------- /CTF/utils/game_crawler/__init__.py: -------------------------------------------------------------------------------- 1 | from .game import * 2 | # 引入所有的类和函数 3 | 4 | import sched 5 | import time 6 | 7 | # 用于启动定时任务 8 | 9 | scheduler = sched.scheduler(time.time, time.sleep) 10 | scheduler.enter(3600, 1, get_inf, ()) 11 | scheduler.run() 12 | -------------------------------------------------------------------------------- /.idea/modules.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /.idea/misc.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 6 | 7 | -------------------------------------------------------------------------------- /CTF/utils/check_user/README.md: -------------------------------------------------------------------------------- 1 | # 判断用户是否存在并获取用户名模块 2 | 3 | ## 相关函数 4 | 5 | |函数名|参数|返回值|说明| 6 | |---|---|---|---| 7 | |operate|空|boolean|判断是否成功登录川大综合信息门户网站| 8 | |get_response|空|text|获取网页响应文件| 9 | |get_name|空|用户姓名|可以从川大综合信息门户网站获取用户姓名| 10 | 11 | ## 相关类 12 | 13 | |类名|说明| 14 | |---|---| 15 | |Login|用于判断用户是否存在并获取用户名| 16 | -------------------------------------------------------------------------------- /CTF/static/css/addons/directives.min.css: -------------------------------------------------------------------------------- 1 | .opacity-0{opacity:0}.opacity-10{opacity:.1}.opacity-20{opacity:.2}.opacity-30{opacity:.3}.opacity-40{opacity:.4}.opacity-50{opacity:.5}.opacity-60{opacity:.6}.opacity-70{opacity:.7}.opacity-80{opacity:.8}.opacity-90{opacity:.9}.opacity-100{opacity:1} 2 | 3 | 4 | /*# sourceMappingURL=directives.min.css.map*/ -------------------------------------------------------------------------------- /CTF/static/css/addons/rating.min.css: -------------------------------------------------------------------------------- 1 | .mdb-rating .rate-popover{color:#808080}.mdb-rating .live{color:#000}.mdb-rating .oneStar{color:#44370f}.mdb-rating .twoStars{color:#96781e}.mdb-rating .threeStars{color:#e2b52e}.mdb-rating .fourStars{color:#f1ba12}.mdb-rating .fiveStars{color:#f3cb06}.mdb-rating .amber-text{color:#ffc107} 2 | 3 | 4 | /*# sourceMappingURL=rating.min.css.map*/ -------------------------------------------------------------------------------- /CTF/urls.py: -------------------------------------------------------------------------------- 1 | from django.urls import path, re_path 2 | from . import views 3 | from django.conf.urls import url 4 | 5 | app_name = "CTF" 6 | urlpatterns = [ 7 | path('login/', views.login, name='login'), 8 | path('register/', views.register, name="register"), 9 | path('logout/', views.logout, name='logout'), 10 | path('index/', views.index, name="index"), 11 | path('user_center/', views.user_center, name='user_center') 12 | ] 13 | -------------------------------------------------------------------------------- /templates/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 测试首页 6 | 7 | 8 | 所有HTML文档都在这儿 9 | {% if user.is_authenticated %} 10 |

Welcome, {{ user.get_username }}. Thanks for logging in.

11 | logout here 12 | {% else %} 13 |

Welcome, new user. Please log in.

14 | {% endif %} 15 | 16 | -------------------------------------------------------------------------------- /SCUCTF_CMS/asgi.py: -------------------------------------------------------------------------------- 1 | """ 2 | ASGI config for SCUCTF_CMS project. 3 | 4 | It exposes the ASGI callable as a module-level variable named ``application``. 5 | 6 | For more information on this file, see 7 | https://docs.djangoproject.com/en/3.0/howto/deployment/asgi/ 8 | """ 9 | 10 | import os 11 | 12 | from django.core.asgi import get_asgi_application 13 | 14 | os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'SCUCTF_CMS.settings') 15 | 16 | application = get_asgi_application() 17 | -------------------------------------------------------------------------------- /SCUCTF_CMS/wsgi.py: -------------------------------------------------------------------------------- 1 | """ 2 | WSGI config for SCUCTF_CMS project. 3 | 4 | It exposes the WSGI callable as a module-level variable named ``application``. 5 | 6 | For more information on this file, see 7 | https://docs.djangoproject.com/en/3.0/howto/deployment/wsgi/ 8 | """ 9 | 10 | import os 11 | 12 | from django.core.wsgi import get_wsgi_application 13 | 14 | os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'SCUCTF_CMS.settings') 15 | 16 | application = get_wsgi_application() 17 | -------------------------------------------------------------------------------- /CTF/utils/game_crawler/model.py: -------------------------------------------------------------------------------- 1 | from django.db.models import Model, TextField, IntegerField, DateField 2 | 3 | 4 | # Use class Model to manage database 5 | 6 | class GameInformation(Model): 7 | id = IntegerField(primary_key=True) # 标识符 8 | name = TextField(null=False) # 比赛名称 9 | type = TextField(null=False) # 比赛类型 10 | hyperlink = TextField() # 报名链接 11 | date = DateField(null=False) 12 | pic_addr = TextField(null=False) 13 | location = TextField(null=False) 14 | -------------------------------------------------------------------------------- /CTF/static/js/npm.js: -------------------------------------------------------------------------------- 1 | // This file is autogenerated via the `commonjs` Grunt task. You can require() this file in a CommonJS environment. 2 | require('../../js/transition.js') 3 | require('../../js/alert.js') 4 | require('../../js/button.js') 5 | require('../../js/carousel.js') 6 | require('../../js/collapse.js') 7 | require('../../js/dropdown.js') 8 | require('../../js/modal.js') 9 | require('../../js/tooltip.js') 10 | require('../../js/popover.js') 11 | require('../../js/scrollspy.js') 12 | require('../../js/tab.js') 13 | require('../../js/affix.js') -------------------------------------------------------------------------------- /CTF/static/css/addons/directives.min.css.map: -------------------------------------------------------------------------------- 1 | {"version":3,"sources":["webpack:///./src/scss/addons/_directives.scss"],"names":[],"mappings":"AAAA,WAAW,UAAU,YAAY,WAAW,YAAY,WAAW,YAAY,WAAW,YAAY,WAAW,YAAY,WAAW,YAAY,WAAW,YAAY,WAAW,YAAY,WAAW,YAAY,WAAW,aAAa","file":"css/addons/directives.min.css","sourcesContent":[".opacity-0{opacity:0}.opacity-10{opacity:.1}.opacity-20{opacity:.2}.opacity-30{opacity:.3}.opacity-40{opacity:.4}.opacity-50{opacity:.5}.opacity-60{opacity:.6}.opacity-70{opacity:.7}.opacity-80{opacity:.8}.opacity-90{opacity:.9}.opacity-100{opacity:1}\n"],"sourceRoot":""} -------------------------------------------------------------------------------- /CTF/static/css/addons/rating.min.css.map: -------------------------------------------------------------------------------- 1 | {"version":3,"sources":["webpack:///./src/scss/addons/_rating.scss"],"names":[],"mappings":"AAAA,0BAA0B,cAAc,kBAAkB,WAAW,qBAAqB,cAAc,sBAAsB,cAAc,wBAAwB,cAAc,uBAAuB,cAAc,uBAAuB,cAAc,wBAAwB","file":"css/addons/rating.min.css","sourcesContent":[".mdb-rating .rate-popover{color:#808080}.mdb-rating .live{color:#000}.mdb-rating .oneStar{color:#44370f}.mdb-rating .twoStars{color:#96781e}.mdb-rating .threeStars{color:#e2b52e}.mdb-rating .fourStars{color:#f1ba12}.mdb-rating .fiveStars{color:#f3cb06}.mdb-rating .amber-text{color:#ffc107}\n"],"sourceRoot":""} -------------------------------------------------------------------------------- /CTF/static/css/brands.min.css: -------------------------------------------------------------------------------- 1 | /*! 2 | * Font Awesome Free 5.11.2 by @fontawesome - https://fontawesome.com 3 | * License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) 4 | */ 5 | @font-face{font-family:"Font Awesome 5 Brands";font-style:normal;font-weight:normal;font-display:auto;src:url(../webfonts/fa-brands-400.eot);src:url(../webfonts/fa-brands-400.eot?#iefix) format("embedded-opentype"),url(../webfonts/fa-brands-400.woff2) format("woff2"),url(../webfonts/fa-brands-400.woff) format("woff"),url(../webfonts/fa-brands-400.ttf) format("truetype"),url(../webfonts/fa-brands-400.svg#fontawesome) format("svg")}.fab{font-family:"Font Awesome 5 Brands"} -------------------------------------------------------------------------------- /CTF/static/css/solid.min.css: -------------------------------------------------------------------------------- 1 | /*! 2 | * Font Awesome Free 5.11.2 by @fontawesome - https://fontawesome.com 3 | * License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) 4 | */ 5 | @font-face{font-family:"Font Awesome 5 Free";font-style:normal;font-weight:900;font-display:auto;src:url(../webfonts/fa-solid-900.eot);src:url(../webfonts/fa-solid-900.eot?#iefix) format("embedded-opentype"),url(../webfonts/fa-solid-900.woff2) format("woff2"),url(../webfonts/fa-solid-900.woff) format("woff"),url(../webfonts/fa-solid-900.ttf) format("truetype"),url(../webfonts/fa-solid-900.svg#fontawesome) format("svg")}.fa,.fas{font-family:"Font Awesome 5 Free";font-weight:900} -------------------------------------------------------------------------------- /CTF/static/css/regular.min.css: -------------------------------------------------------------------------------- 1 | /*! 2 | * Font Awesome Free 5.11.2 by @fontawesome - https://fontawesome.com 3 | * License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) 4 | */ 5 | @font-face{font-family:"Font Awesome 5 Free";font-style:normal;font-weight:400;font-display:auto;src:url(../webfonts/fa-regular-400.eot);src:url(../webfonts/fa-regular-400.eot?#iefix) format("embedded-opentype"),url(../webfonts/fa-regular-400.woff2) format("woff2"),url(../webfonts/fa-regular-400.woff) format("woff"),url(../webfonts/fa-regular-400.ttf) format("truetype"),url(../webfonts/fa-regular-400.svg#fontawesome) format("svg")}.far{font-family:"Font Awesome 5 Free";font-weight:400} -------------------------------------------------------------------------------- /manage.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | """Django's command-line utility for administrative tasks.""" 3 | import os 4 | import sys 5 | 6 | 7 | def main(): 8 | os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'SCUCTF_CMS.settings') 9 | try: 10 | from django.core.management import execute_from_command_line 11 | except ImportError as exc: 12 | raise ImportError( 13 | "Couldn't import Django. Are you sure it's installed and " 14 | "available on your PYTHONPATH environment variable? Did you " 15 | "forget to activate a virtual environment?" 16 | ) from exc 17 | execute_from_command_line(sys.argv) 18 | 19 | 20 | if __name__ == '__main__': 21 | main() 22 | -------------------------------------------------------------------------------- /CTF/static/css/brands.css: -------------------------------------------------------------------------------- 1 | /*! 2 | * Font Awesome Free 5.11.2 by @fontawesome - https://fontawesome.com 3 | * License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) 4 | */ 5 | @font-face { 6 | font-family: 'Font Awesome 5 Brands'; 7 | font-style: normal; 8 | font-weight: normal; 9 | font-display: auto; 10 | src: url("../webfonts/fa-brands-400.eot"); 11 | src: url("../webfonts/fa-brands-400.eot?#iefix") format("embedded-opentype"), url("../webfonts/fa-brands-400.woff2") format("woff2"), url("../webfonts/fa-brands-400.woff") format("woff"), url("../webfonts/fa-brands-400.ttf") format("truetype"), url("../webfonts/fa-brands-400.svg#fontawesome") format("svg"); } 12 | 13 | .fab { 14 | font-family: 'Font Awesome 5 Brands'; } 15 | -------------------------------------------------------------------------------- /CTF/static/css/solid.css: -------------------------------------------------------------------------------- 1 | /*! 2 | * Font Awesome Free 5.11.2 by @fontawesome - https://fontawesome.com 3 | * License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) 4 | */ 5 | @font-face { 6 | font-family: 'Font Awesome 5 Free'; 7 | font-style: normal; 8 | font-weight: 900; 9 | font-display: auto; 10 | src: url("../webfonts/fa-solid-900.eot"); 11 | src: url("../webfonts/fa-solid-900.eot?#iefix") format("embedded-opentype"), url("../webfonts/fa-solid-900.woff2") format("woff2"), url("../webfonts/fa-solid-900.woff") format("woff"), url("../webfonts/fa-solid-900.ttf") format("truetype"), url("../webfonts/fa-solid-900.svg#fontawesome") format("svg"); } 12 | 13 | .fa, 14 | .fas { 15 | font-family: 'Font Awesome 5 Free'; 16 | font-weight: 900; } 17 | -------------------------------------------------------------------------------- /CTF/static/css/regular.css: -------------------------------------------------------------------------------- 1 | /*! 2 | * Font Awesome Free 5.11.2 by @fontawesome - https://fontawesome.com 3 | * License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) 4 | */ 5 | @font-face { 6 | font-family: 'Font Awesome 5 Free'; 7 | font-style: normal; 8 | font-weight: 400; 9 | font-display: auto; 10 | src: url("../webfonts/fa-regular-400.eot"); 11 | src: url("../webfonts/fa-regular-400.eot?#iefix") format("embedded-opentype"), url("../webfonts/fa-regular-400.woff2") format("woff2"), url("../webfonts/fa-regular-400.woff") format("woff"), url("../webfonts/fa-regular-400.ttf") format("truetype"), url("../webfonts/fa-regular-400.svg#fontawesome") format("svg"); } 12 | 13 | .far { 14 | font-family: 'Font Awesome 5 Free'; 15 | font-weight: 400; } 16 | -------------------------------------------------------------------------------- /templates/registration/password_reset_complete.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 新密码设置成功 8 | 9 | 10 | 11 |
12 |
13 |
14 |

SCU_CTF

15 |

新密码设置成功,点击返回登录页面

16 |

17 | 你的口令己经设置。现在你可以继续进行登录。 18 |

19 |
20 |
21 |
22 | 23 | -------------------------------------------------------------------------------- /templates/registration/password_reset_done.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 密码重置链接已经发送 8 | 9 | 10 | 11 |
12 |
13 |
14 |

SCU_CTF

15 |

密码重置链接已经发送

16 |

17 | 如果您输入的邮件地址所对应的账户存在,设置密码的提示已经发送邮件给您,您将很快收到。 18 |

19 |

20 | 如果你没有收到邮件, 请确保您所输入的地址是正确的, 并检查您的垃圾邮件文件夹. 21 |

22 |
23 |
24 |
25 | 26 | -------------------------------------------------------------------------------- /CTF/static/js/addons/flag.min.js: -------------------------------------------------------------------------------- 1 | !function(e){var t={};function r(n){if(t[n])return t[n].exports;var o=t[n]={i:n,l:!1,exports:{}};return e[n].call(o.exports,o,o.exports,r),o.l=!0,o.exports}r.m=e,r.c=t,r.d=function(e,t,n){r.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:n})},r.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},r.t=function(e,t){if(1&t&&(e=r(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var n=Object.create(null);if(r.r(n),Object.defineProperty(n,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var o in e)r.d(n,o,function(t){return e[t]}.bind(null,o));return n},r.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return r.d(t,"a",t),t},r.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},r.p="",r(r.s=225)}({225:function(e,t,r){}}); 2 | //# sourceMappingURL=flag.min.js.map -------------------------------------------------------------------------------- /CTF/static/css/forgotpwd.css: -------------------------------------------------------------------------------- 1 | body{ 2 | background:#f0f2f5; 3 | } 4 | #email { 5 | text-align: center; 6 | } 7 | #password{ 8 | text-align: center; 9 | } 10 | #password_again{ 11 | text-align: center; 12 | } 13 | /*card start here*/ 14 | .card { 15 | background-color: #f0f2f5; 16 | /*font-size: 24px;*/ 17 | } 18 | .card-top { 19 | width:22%; 20 | margin:16em auto 0em; 21 | background: #000; 22 | padding:0.8em; 23 | text-align: center; 24 | border-radius: 5px 5px 0 0; 25 | text-transform: uppercase; 26 | position: relative; 27 | } 28 | .card-bottom { 29 | width:22%; 30 | padding: 3em; 31 | margin:0em auto 6em; 32 | background: #fff; 33 | border-radius: 0 0 5px 5px; 34 | box-shadow: 0px 0px 8px 5px rgba(0,0,0,0.1); 35 | } 36 | .card h4 { 37 | color: #FFF; 38 | } 39 | .card p { 40 | font-size: 1.2em; 41 | color: #696969; 42 | text-align:center; 43 | } 44 | /*card end here*/ 45 | -------------------------------------------------------------------------------- /CTF/static/js/addons/directives.min.js: -------------------------------------------------------------------------------- 1 | !function(e){var t={};function r(n){if(t[n])return t[n].exports;var o=t[n]={i:n,l:!1,exports:{}};return e[n].call(o.exports,o,o.exports,r),o.l=!0,o.exports}r.m=e,r.c=t,r.d=function(e,t,n){r.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:n})},r.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},r.t=function(e,t){if(1&t&&(e=r(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var n=Object.create(null);if(r.r(n),Object.defineProperty(n,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var o in e)r.d(n,o,function(t){return e[t]}.bind(null,o));return n},r.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return r.d(t,"a",t),t},r.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},r.p="",r(r.s=224)}({224:function(e,t,r){}}); 2 | //# sourceMappingURL=directives.min.js.map -------------------------------------------------------------------------------- /CTF/static/js/modules/animations-extended.min.js: -------------------------------------------------------------------------------- 1 | !function(e){var t={};function r(n){if(t[n])return t[n].exports;var o=t[n]={i:n,l:!1,exports:{}};return e[n].call(o.exports,o,o.exports,r),o.l=!0,o.exports}r.m=e,r.c=t,r.d=function(e,t,n){r.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:n})},r.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},r.t=function(e,t){if(1&t&&(e=r(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var n=Object.create(null);if(r.r(n),Object.defineProperty(n,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var o in e)r.d(n,o,function(t){return e[t]}.bind(null,o));return n},r.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return r.d(t,"a",t),t},r.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},r.p="",r(r.s=226)}({226:function(e,t,r){}}); 2 | //# sourceMappingURL=animations-extended.min.js.map -------------------------------------------------------------------------------- /SCUCTF_CMS/urls.py: -------------------------------------------------------------------------------- 1 | """SCUCTF_CMS URL Configuration 2 | 3 | The `urlpatterns` list routes URLs to views. For more information please see: 4 | https://docs.djangoproject.com/en/3.0/topics/http/urls/ 5 | Examples: 6 | Function views 7 | 1. Add an import: from my_app import views 8 | 2. Add a URL to urlpatterns: path('', views.home, name='home') 9 | Class-based views 10 | 1. Add an import: from other_app.views import Home 11 | 2. Add a URL to urlpatterns: path('', Home.as_view(), name='home') 12 | Including another URLconf 13 | 1. Import the include() function: from django.urls import include, path 14 | 2. Add a URL to urlpatterns: path('blog/', include('blog.urls')) 15 | """ 16 | from django.contrib import admin 17 | from django.urls import path, include,re_path 18 | from django.conf.urls import url 19 | from CTF.views import * 20 | 21 | urlpatterns = [ 22 | path('admin/', admin.site.urls), 23 | path('', include('CTF.urls')), 24 | path('', include('django.contrib.auth.urls')), 25 | re_path(r'^$', index, name='index') 26 | 27 | ] 28 | -------------------------------------------------------------------------------- /CTF/forms.py: -------------------------------------------------------------------------------- 1 | from django import forms 2 | from django.contrib.auth.forms import UserCreationForm 3 | from django.utils import timezone 4 | from .models import User 5 | 6 | 7 | class RegisterForm(UserCreationForm): 8 | class Meta(UserCreationForm.Meta): 9 | model = User 10 | fields = ("username", "email",) 11 | 12 | 13 | class LoginForm(forms.Form): 14 | username = forms.CharField(label="用户名", max_length=150, widget=forms.TextInput(attrs={'class': 'form-control'})) 15 | password = forms.CharField(label="密码", max_length=32, widget=forms.PasswordInput(attrs={'class': 'form-control'})) 16 | remember = forms.BooleanField(label="记住我", widget=forms.CheckboxInput(attrs={'class': 'form-check-label'})) 17 | 18 | 19 | class ForgetPasswordStep1(forms.Form): 20 | email = forms.EmailField(label="邮箱", widget=forms.EmailInput(attrs={'class': 'form-control'})) 21 | 22 | 23 | class ForgetPasswordStep2(forms.Form): 24 | password = forms.CharField(label="密码", widget=forms.PasswordInput(attrs={'class': 'form-control'})) 25 | repeat_password = forms.CharField(label="重复密码", widget=forms.PasswordInput(attrs={'class': 'form-control'})) 26 | -------------------------------------------------------------------------------- /CTF/static/css/addons/jquery.zmd.hierarchical-display.min.css: -------------------------------------------------------------------------------- 1 | .zmd-hierarchical-display{visibility:hidden}.zmd-hierarchical-display.in{visibility:visible}.zmd-hierarchical-displaying{visibility:visible}.animation{-webkit-animation-duration:1s;animation-duration:1s;-webkit-animation-fill-mode:both;animation-fill-mode:both}.animation.zoomedIn,.animation.zoomedOut{-webkit-animation-timing-function:cubic-bezier(0.55, 0, 0.1, 1);animation-timing-function:cubic-bezier(0.55, 0, 0.1, 1)}@-webkit-keyframes zoomedIn{from{-webkit-transform:scale(0);transform:scale(0)}to{-webkit-transform:scale(1);transform:scale(1)}}@keyframes zoomedIn{from{-webkit-transform:scale(0);transform:scale(0)}to{-webkit-transform:scale(1);transform:scale(1)}}@-webkit-keyframes zoomedOut{from{-webkit-transform:scale(1);transform:scale(1)}to{-webkit-transform:scale(0);transform:scale(0)}}@keyframes zoomedOut{from{-webkit-transform:scale(1);transform:scale(1)}to{-webkit-transform:scale(0);transform:scale(0)}}.zoomedIn{-webkit-animation-name:zoomedIn;animation-name:zoomedIn}.zoomedOut{-webkit-animation-name:zoomedOut;animation-name:zoomedOut} 2 | 3 | 4 | /*# sourceMappingURL=jquery.zmd.hierarchical-display.min.css.map*/ -------------------------------------------------------------------------------- /CTF/static/js/modules/scrolling-navbar.min.js: -------------------------------------------------------------------------------- 1 | !function(e){var n={};function t(r){if(n[r])return n[r].exports;var o=n[r]={i:r,l:!1,exports:{}};return e[r].call(o.exports,o,o.exports,t),o.l=!0,o.exports}t.m=e,t.c=n,t.d=function(e,n,r){t.o(e,n)||Object.defineProperty(e,n,{enumerable:!0,get:r})},t.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},t.t=function(e,n){if(1&n&&(e=t(e)),8&n)return e;if(4&n&&"object"==typeof e&&e&&e.__esModule)return e;var r=Object.create(null);if(t.r(r),Object.defineProperty(r,"default",{enumerable:!0,value:e}),2&n&&"string"!=typeof e)for(var o in e)t.d(r,o,function(n){return e[n]}.bind(null,o));return r},t.n=function(e){var n=e&&e.__esModule?function(){return e.default}:function(){return e};return t.d(n,"a",n),n},t.o=function(e,n){return Object.prototype.hasOwnProperty.call(e,n)},t.p="",t(t.s=133)}({133:function(e,n){jQuery((function(e){e(window).on("scroll",(function(){var n=e(".navbar");n.length&&e(".scrolling-navbar")[n.offset().top>50?"addClass":"removeClass"]("top-nav-collapse")}))}))}}); 2 | //# sourceMappingURL=scrolling-navbar.min.js.map -------------------------------------------------------------------------------- /.idea/SCUCTF_CMS.iml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 27 | 28 | -------------------------------------------------------------------------------- /CTF/static/css/base.css: -------------------------------------------------------------------------------- 1 | .topBar{ 2 | height: 70px; 3 | width: 100%; 4 | text-align: center; 5 | display: flex; 6 | justify-content: space-around; 7 | align-items: center; 8 | background-color: white; 9 | box-shadow: 0px 20px 20px -20px #5E5E5E; 10 | } 11 | .topBar #scuctfLogo{ 12 | width: 10%; 13 | } 14 | .topBar .topBarLinks{ 15 | height: 100%; 16 | width: 50%; 17 | display: flex; 18 | justify-content: space-around; 19 | align-items: center; 20 | } 21 | .topBar .topBarLinks div{ 22 | height: 100%; 23 | width: 20%; 24 | text-align: center; 25 | } 26 | .topBar .topBarLinks div:hover{ 27 | border-bottom: 4px solid #1890ff; 28 | } 29 | .topBar .topBarLinks a{ 30 | color: grey; 31 | font-size: 20px; 32 | font-weight:bold; 33 | text-decoration: none; 34 | line-height: 70px; 35 | } 36 | html{ 37 | background-color: #f0f2f5; 38 | margin: 0; 39 | } 40 | body{ 41 | margin: 0; 42 | } 43 | .content{ 44 | height: 100%; 45 | } 46 | .footer{ 47 | bottom: 10px; 48 | height: 70px; 49 | width: 100%; 50 | text-align: center; 51 | display: flex; 52 | justify-content: center; 53 | align-items: center; 54 | background-color: white; 55 | box-shadow: 0px 20px 20px -20px #5E5E5E; 56 | } 57 | -------------------------------------------------------------------------------- /CTF/static/css/navigator.css: -------------------------------------------------------------------------------- 1 | .topBar{ 2 | height: 70px; 3 | width: 100%; 4 | text-align: center; 5 | display: flex; 6 | justify-content: space-around; 7 | align-items: center; 8 | background-color: white; 9 | box-shadow: 0px 20px 20px -20px #5E5E5E; 10 | } 11 | .topBar #scuctfLogo{ 12 | width: 10%; 13 | } 14 | .topBar .topBarLinks{ 15 | height: 100%; 16 | width: 50%; 17 | display: flex; 18 | justify-content: space-around; 19 | align-items: center; 20 | } 21 | .topBar .topBarLinks div{ 22 | height: 100%; 23 | width: 20%; 24 | text-align: center; 25 | } 26 | .topBar .topBarLinks div:hover{ 27 | border-bottom: 4px solid #1890ff; 28 | } 29 | .topBar .topBarLinks a{ 30 | color: grey; 31 | font-size: 20px; 32 | font-weight:bold; 33 | text-decoration: none; 34 | line-height: 70px; 35 | } 36 | html{ 37 | background-color: #f0f2f5; 38 | margin: 0; 39 | } 40 | body{ 41 | margin: 0; 42 | } 43 | .content{ 44 | height: 100%; 45 | } 46 | .footer{ 47 | bottom: 10px; 48 | height: 70px; 49 | width: 100%; 50 | text-align: center; 51 | display: flex; 52 | justify-content: center; 53 | align-items: center; 54 | background-color: white; 55 | box-shadow: 0px 20px 20px -20px #5E5E5E; 56 | } 57 | -------------------------------------------------------------------------------- /templates/register.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 注册 8 | 9 | 14 | 15 | 16 |
17 |
18 |
19 |
20 |

注册

21 |
22 | {% csrf_token %} 23 | {% for field in form %} 24 | {{ field.label_tag }} 25 | {{ field }} 26 | {{ field.errors }} 27 | {% if field.help_text %} 28 |

{{ field.help_text|safe }}

29 | {% endif %} 30 | {% endfor %} 31 | 32 |
33 |
34 |
35 |
36 |
37 | 38 | 39 | -------------------------------------------------------------------------------- /CTF/auth.py: -------------------------------------------------------------------------------- 1 | from .models import User 2 | from time import time 3 | from django.contrib.auth import authenticate, login 4 | 5 | 6 | def create_user(username: str, password: str, email: str) -> bool: 7 | """ 8 | 注册普通用户 9 | :param username: 用户名 10 | :param password: 密码 11 | :param email: 邮件 12 | :return: 成功返回true/false 13 | """ 14 | try: 15 | uid = User.objects.count() # Dirty Work, start from 0 16 | User.objects.create_user(uid=uid, username=username, password=password, email=email, points=0, admin_level=0, 17 | is_scuer=False, email_verified=False).save() 18 | return True 19 | except: 20 | return False 21 | 22 | 23 | def create_superuser(username: str, password: str, email: str) -> bool: 24 | """ 25 | 注册管理员用户 26 | :param username: 用户名 27 | :param password: 密码 28 | :param email: 邮件 29 | :return: 成功返回true/false 30 | """ 31 | try: 32 | User.objects.create_user(username=username, password=password, email=email, points=0, is_superuser=True, 33 | admin_level=1, is_scuer=False, email_verified=False, register_time=time()).save() 34 | return True 35 | except: 36 | return False 37 | 38 | 39 | def try_login(request, username, password): 40 | user = authenticate(username=username, password=password) 41 | if user: 42 | login(request, user) 43 | return True 44 | return False 45 | -------------------------------------------------------------------------------- /templates/registration/password_reset_confirm.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 设置新密码 8 | 9 | 14 | 15 | 16 |
17 |
18 |
19 |
20 |

SCU_CTF

21 |

设置新密码

22 |
23 | {% csrf_token %} 24 | {{ form.non_field_errors }} 25 | {% for field in form %} 26 | {{ field.label_tag }} 27 | {{ field }} 28 | {{ field.errors }} 29 | {% if field.help_text %} 30 |

{{ field.help_text|safe }}

31 | {% endif %} 32 | {% endfor %} 33 | 34 |
35 |
36 |
37 |
38 |
39 | 40 | -------------------------------------------------------------------------------- /CTF/static/css/addons/jquery.zmd.hierarchical-display.min.css.map: -------------------------------------------------------------------------------- 1 | {"version":3,"sources":["webpack:///./src/scss/addons/_hierarchical-display.scss"],"names":[],"mappings":"AAAA,0BAA0B,kBAAkB,6BAA6B,mBAAmB,6BAA6B,mBAAmB,WAAW,8BAA8B,sBAAsB,iCAAiC,yBAAyB,yCAAyC,gEAAgE,wDAAwD,4BAA4B,KAAK,2BAA2B,mBAAmB,GAAG,2BAA2B,oBAAoB,oBAAoB,KAAK,2BAA2B,mBAAmB,GAAG,2BAA2B,oBAAoB,6BAA6B,KAAK,2BAA2B,mBAAmB,GAAG,2BAA2B,oBAAoB,qBAAqB,KAAK,2BAA2B,mBAAmB,GAAG,2BAA2B,oBAAoB,UAAU,gCAAgC,wBAAwB,WAAW,iCAAiC","file":"css/addons/jquery.zmd.hierarchical-display.min.css","sourcesContent":[".zmd-hierarchical-display{visibility:hidden}.zmd-hierarchical-display.in{visibility:visible}.zmd-hierarchical-displaying{visibility:visible}.animation{-webkit-animation-duration:1s;animation-duration:1s;-webkit-animation-fill-mode:both;animation-fill-mode:both}.animation.zoomedIn,.animation.zoomedOut{-webkit-animation-timing-function:cubic-bezier(0.55, 0, 0.1, 1);animation-timing-function:cubic-bezier(0.55, 0, 0.1, 1)}@-webkit-keyframes zoomedIn{from{-webkit-transform:scale(0);transform:scale(0)}to{-webkit-transform:scale(1);transform:scale(1)}}@keyframes zoomedIn{from{-webkit-transform:scale(0);transform:scale(0)}to{-webkit-transform:scale(1);transform:scale(1)}}@-webkit-keyframes zoomedOut{from{-webkit-transform:scale(1);transform:scale(1)}to{-webkit-transform:scale(0);transform:scale(0)}}@keyframes zoomedOut{from{-webkit-transform:scale(1);transform:scale(1)}to{-webkit-transform:scale(0);transform:scale(0)}}.zoomedIn{-webkit-animation-name:zoomedIn;animation-name:zoomedIn}.zoomedOut{-webkit-animation-name:zoomedOut;animation-name:zoomedOut}\n"],"sourceRoot":""} -------------------------------------------------------------------------------- /templates/registration/password_reset_form.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 重置密码 8 | 9 | 14 | 15 | 16 |
17 |
18 |
19 |
20 |

SCU_CTF

21 |

重置密码

22 |
23 | {% csrf_token %} 24 | {{ form.non_field_errors }} 25 | {% for field in form %} 26 | {{ field.label_tag }} 27 | {{ field }} 28 | {{ field.errors }} 29 | {% if field.help_text %} 30 |

{{ field.help_text|safe }}

31 | {% endif %} 32 | {% endfor %} 33 | 34 |
35 |
36 |
37 |
38 |
39 | 40 | -------------------------------------------------------------------------------- /CTF/static/js/navigator.js: -------------------------------------------------------------------------------- 1 | $(document).ready(function() { 2 | $(".topBar .topBarLinks #homeLink").mouseenter(function() { 3 | $(this).animate({ 4 | backgroundColor: "#f0f2f5" 5 | }, 500); 6 | }); 7 | $(".topBar .topBarLinks #homeLink").mouseleave(function() { 8 | $(this).animate({ 9 | backgroundColor: "#ffffff" 10 | }, 500); 11 | }); 12 | $(".topBar .topBarLinks #newsLink").mouseenter(function() { 13 | $(this).animate({ 14 | backgroundColor: "#f0f2f5" 15 | }, 500); 16 | }); 17 | $(".topBar .topBarLinks #newsLink").mouseleave(function() { 18 | $(this).animate({ 19 | backgroundColor: "#ffffff" 20 | }, 500); 21 | }); 22 | $(".topBar .topBarLinks #challengesLink").mouseenter(function() { 23 | $(this).animate({ 24 | backgroundColor: "#f0f2f5" 25 | }, 500); 26 | }); 27 | $(".topBar .topBarLinks #challengesLink").mouseleave(function() { 28 | $(this).animate({ 29 | backgroundColor: "#ffffff" 30 | }, 500); 31 | }); 32 | $(".topBar .topBarLinks #toolsLink").mouseenter(function() { 33 | $(this).animate({ 34 | backgroundColor: "#f0f2f5" 35 | }, 500); 36 | }); 37 | $(".topBar .topBarLinks #toolsLink").mouseleave(function() { 38 | $(this).animate({ 39 | backgroundColor: "#ffffff" 40 | }, 500); 41 | }); 42 | $(".topBar .topBarLinks #aboutLink").mouseenter(function() { 43 | $(this).animate({ 44 | backgroundColor: "#f0f2f5" 45 | }, 500); 46 | }); 47 | $(".topBar .topBarLinks #aboutLink").mouseleave(function() { 48 | $(this).animate({ 49 | backgroundColor: "#ffffff" 50 | }, 500); 51 | }); 52 | }); -------------------------------------------------------------------------------- /CTF/utils/game_crawler/game.py: -------------------------------------------------------------------------------- 1 | import requests 2 | from bs4 import BeautifulSoup 3 | import lxml 4 | import re 5 | from .model import GameInformation 6 | 7 | 8 | def get_inf(): 9 | url = "https://www.xctf.org.cn/ctfs/recently/" 10 | param = {"page": 1} 11 | try: 12 | res = requests.get(url=url, params=param, timeout=3) 13 | except: 14 | return False # 请求失败返回False 15 | soup = BeautifulSoup(res.text, "lxml") 16 | game_list = soup.find(class_="nearest pad10T").find_all("li") 17 | for i in game_list: 18 | date = i.find(class_="x2_timeInterval").string 19 | if ("2020" not in date): # 只爬取2020年之后的数据 20 | break 21 | pattern = re.compile(r'[(](.*?)[)]', re.S) 22 | jpg_addr = i.find("a")["style"] 23 | jpg_addr = "https://www.xctf.org.cn" + re.findall(pattern, jpg_addr)[0] 24 | apply_addr = "https://www.xctf.org.cn" + \ 25 | i.find(class_="x2_hotTitle")["href"] 26 | game_name = i.find(class_="x2_hotTitle").find("span").string 27 | game_type = i.find(class_="x2_nearType").string 28 | addr = i.find(class_="x2_nearplace mrg5T").string 29 | 30 | try: 31 | # 判断是否存在记录 32 | GameInformation.objects.get(name=game_name) 33 | except: 34 | # 不存在就添加 35 | new_game_record = GameInformation(name=game_name, type=game_type, hyperlink=apply_addr, date=date, 36 | pic_addr=jpg_addr, location=addr) 37 | new_game_record.save() 38 | # 39 | # print("jpg addr is :" + jpg_addr) 40 | # print("apply addr is: " + apply_addr) 41 | # print("game name is: " + game_name) 42 | # print("game type is: " + game_type) 43 | # print("addr is: " + addr) 44 | # print("date is: " + date) 45 | -------------------------------------------------------------------------------- /CTF/models.py: -------------------------------------------------------------------------------- 1 | from django.db import models 2 | from django.contrib.auth.models import AbstractUser 3 | 4 | 5 | class User(AbstractUser): 6 | # 用户唯一识别码 7 | uid = models.IntegerField(blank=False, null=False, unique=True, help_text='用户唯一识别码', primary_key=True) 8 | 9 | # 用户名/昵称(已经被系统实现了) 10 | # username = models.CharField(blank=False, null=False, unique=True, max_length=256, help_text='用户名/昵称') 11 | # 邮箱(已经被系统实现了) 12 | # email = models.EmailField(blank=False, null=False, unique=True, max_length=256, help_text='邮箱') 13 | # 密码(已经被系统实现了,哈希保存) 14 | # password = models.CharField(blank=False, null=False, max_length=32, help_text='密码') 15 | 16 | # 头像路径 17 | avatar = models.CharField(default="/static/upload/avatar.jpg", blank=False, null=True, unique=True, max_length=64, 18 | help_text='头像') 19 | 20 | # 积分: 可在商城兑换的积分,不是CTF比赛的积分 21 | points = models.IntegerField(default=0, blank=False, null=False, help_text='积分') 22 | # 是否为管理员(已经被系统实现了,名为is_superuser) 23 | # is_admin = models.BooleanField(default=False, blank=False, null=False, help_text='是否为管理员') 24 | 25 | # 管理员等级: 26 | # 0. 无任何权限 27 | # 1. 超级管理员 28 | # 2. 文章管理员 29 | # 剩下的以后加 30 | admin_level = models.IntegerField(default=0, blank=False, null=False, help_text='管理员等级') 31 | 32 | # 是否被封(已经被系统实现了,名为is_active) 33 | # is_banned = models.BooleanField(default=False, blank=False, null=False, help_text='是否被封') 34 | 35 | # 是否是本校人员 36 | is_scuer = models.BooleanField(default=False, blank=False, null=False, help_text='是否是本校人员') 37 | # 邮箱是否经过验证 38 | email_verified = models.BooleanField(default=False, blank=False, null=False, help_text='邮箱是否经过验证') 39 | # 注册时间 40 | register_time = models.DateTimeField(auto_now_add=True, editable=False, help_text='注册时间') 41 | 42 | # 上次登录时间(已经被系统实现了) 43 | # last_login = models.DateTimeField(auto_now_add=True, auto_now=True, help_text='上次登录时间') 44 | class Meta(AbstractUser.Meta): 45 | pass 46 | -------------------------------------------------------------------------------- /CTF/static/js/jquery-ui-1.12.1.custom/LICENSE.txt: -------------------------------------------------------------------------------- 1 | Copyright jQuery Foundation and other contributors, https://jquery.org/ 2 | 3 | This software consists of voluntary contributions made by many 4 | individuals. For exact contribution history, see the revision history 5 | available at https://github.com/jquery/jquery-ui 6 | 7 | The following license applies to all parts of this software except as 8 | documented below: 9 | 10 | ==== 11 | 12 | Permission is hereby granted, free of charge, to any person obtaining 13 | a copy of this software and associated documentation files (the 14 | "Software"), to deal in the Software without restriction, including 15 | without limitation the rights to use, copy, modify, merge, publish, 16 | distribute, sublicense, and/or sell copies of the Software, and to 17 | permit persons to whom the Software is furnished to do so, subject to 18 | the following conditions: 19 | 20 | The above copyright notice and this permission notice shall be 21 | included in all copies or substantial portions of the Software. 22 | 23 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 24 | EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 25 | MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 26 | NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE 27 | LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION 28 | OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION 29 | WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 30 | 31 | ==== 32 | 33 | Copyright and related rights for sample code are waived via CC0. Sample 34 | code is defined as all source code contained within the demos directory. 35 | 36 | CC0: http://creativecommons.org/publicdomain/zero/1.0/ 37 | 38 | ==== 39 | 40 | All files located in the node_modules and external directories are 41 | externally maintained libraries used by this software which have their 42 | own licenses; we recommend you read them, as their terms may differ from 43 | the terms above. 44 | -------------------------------------------------------------------------------- /CTF/static/js/jquery-ui-1.12.1.custom/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "jquery-ui", 3 | "title": "jQuery UI", 4 | "description": "A curated set of user interface interactions, effects, widgets, and themes built on top of the jQuery JavaScript Library.", 5 | "version": "1.12.1", 6 | "homepage": "http://jqueryui.com", 7 | "author": { 8 | "name": "jQuery Foundation and other contributors", 9 | "url": "https://github.com/jquery/jquery-ui/blob/1.12.1/AUTHORS.txt" 10 | }, 11 | "main": "ui/widget.js", 12 | "maintainers": [ 13 | { 14 | "name": "Scott González", 15 | "email": "scott.gonzalez@gmail.com", 16 | "url": "http://scottgonzalez.com" 17 | }, 18 | { 19 | "name": "Jörn Zaefferer", 20 | "email": "joern.zaefferer@gmail.com", 21 | "url": "http://bassistance.de" 22 | }, 23 | { 24 | "name": "Mike Sherov", 25 | "email": "mike.sherov@gmail.com", 26 | "url": "http://mike.sherov.com" 27 | }, 28 | { 29 | "name": "TJ VanToll", 30 | "email": "tj.vantoll@gmail.com", 31 | "url": "http://tjvantoll.com" 32 | }, 33 | { 34 | "name": "Felix Nagel", 35 | "email": "info@felixnagel.com", 36 | "url": "http://www.felixnagel.com" 37 | }, 38 | { 39 | "name": "Alex Schmitz", 40 | "email": "arschmitz@gmail.com", 41 | "url": "https://github.com/arschmitz" 42 | } 43 | ], 44 | "repository": { 45 | "type": "git", 46 | "url": "git://github.com/jquery/jquery-ui.git" 47 | }, 48 | "bugs": "https://bugs.jqueryui.com/", 49 | "license": "MIT", 50 | "scripts": { 51 | "test": "grunt" 52 | }, 53 | "dependencies": {}, 54 | "devDependencies": { 55 | "commitplease": "2.3.0", 56 | "grunt": "0.4.5", 57 | "grunt-bowercopy": "1.2.4", 58 | "grunt-cli": "0.1.13", 59 | "grunt-compare-size": "0.4.0", 60 | "grunt-contrib-concat": "0.5.1", 61 | "grunt-contrib-csslint": "0.5.0", 62 | "grunt-contrib-jshint": "0.12.0", 63 | "grunt-contrib-qunit": "1.0.1", 64 | "grunt-contrib-requirejs": "0.4.4", 65 | "grunt-contrib-uglify": "0.11.1", 66 | "grunt-git-authors": "3.1.0", 67 | "grunt-html": "6.0.0", 68 | "grunt-jscs": "2.1.0", 69 | "load-grunt-tasks": "3.4.0", 70 | "rimraf": "2.5.1", 71 | "testswarm": "1.1.0" 72 | }, 73 | "keywords": [] 74 | } 75 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | /.idea/ 2 | 3 | # macOS trash 4 | .DS_Store 5 | .AppleDouble 6 | .LSOverride 7 | 8 | # Django # 9 | *.log 10 | *.pot 11 | *.pyc 12 | __pycache__ 13 | db.sqlite3 14 | media 15 | 16 | # Backup files # 17 | *.bak 18 | 19 | # If you are using PyCharm # 20 | .idea/**/workspace.xml 21 | .idea/**/tasks.xml 22 | .idea/dictionaries 23 | .idea/**/dataSources/ 24 | .idea/**/dataSources.ids 25 | .idea/**/dataSources.xml 26 | .idea/**/dataSources.local.xml 27 | .idea/**/sqlDataSources.xml 28 | .idea/**/dynamic.xml 29 | .idea/**/uiDesigner.xml 30 | .idea/**/gradle.xml 31 | .idea/**/libraries 32 | *.iws /out/ 33 | 34 | # Python # 35 | *.py[cod] 36 | *$py.class 37 | 38 | # Distribution / packaging 39 | .Python build/ 40 | develop-eggs/ 41 | dist/ 42 | downloads/ 43 | eggs/ 44 | .eggs/ 45 | lib/ 46 | lib64/ 47 | parts/ 48 | sdist/ 49 | var/ 50 | wheels/ 51 | *.egg-info/ 52 | .installed.cfg 53 | *.egg 54 | *.manifest 55 | *.spec 56 | 57 | # Installer logs 58 | pip-log.txt 59 | pip-delete-this-directory.txt 60 | 61 | # Unit test / coverage reports 62 | htmlcov/ 63 | .tox/ 64 | .coverage 65 | .coverage.* 66 | .cache 67 | .pytest_cache/ 68 | nosetests.xml 69 | coverage.xml 70 | *.cover 71 | .hypothesis/ 72 | 73 | # Jupyter Notebook 74 | .ipynb_checkpoints 75 | 76 | # pyenv 77 | .python-version 78 | 79 | # celery 80 | celerybeat-schedule.* 81 | 82 | # SageMath parsed files 83 | *.sage.py 84 | 85 | # Environments 86 | .env 87 | .venv 88 | env/ 89 | venv/ 90 | ENV/ 91 | env.bak/ 92 | venv.bak/ 93 | 94 | # mkdocs documentation 95 | /site 96 | 97 | # mypy 98 | .mypy_cache/ 99 | 100 | # Sublime Text # 101 | *.tmlanguage.cache 102 | *.tmPreferences.cache 103 | *.stTheme.cache 104 | *.sublime-workspace 105 | *.sublime-project 106 | 107 | # sftp configuration file 108 | sftp-config.json 109 | 110 | # Package control specific files Package 111 | Control.last-run 112 | Control.ca-list 113 | Control.ca-bundle 114 | Control.system-ca-bundle 115 | GitHub.sublime-settings 116 | 117 | # Visual Studio Code # 118 | .vscode/* 119 | !.vscode/settings.json 120 | !.vscode/tasks.json 121 | !.vscode/launch.json 122 | !.vscode/extensions.json 123 | .history 124 | 125 | # Databse File 126 | *.db 127 | */migrations/* -------------------------------------------------------------------------------- /.idea/markdown-navigator.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 29 | 30 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | -------------------------------------------------------------------------------- /templates/base.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | {% block title %}{% endblock %} 5 | {% load static %} 6 | 7 | {% block css %} 8 | {% endblock %} 9 | 10 | 11 | 12 |
13 | 14 | 21 |
userName
22 |
23 |
24 | {% block content %} 25 | {% endblock %} 26 | {#
#} 27 | {##} 28 | {#
#} 29 | {#
#} 30 | {##} 31 | {#
#} 32 | {#
#} 33 | {##} 34 | {#
#} 35 | {#
#} 36 | {##} 37 | {#
#} 38 | {#
#} 39 | {##} 40 | {#
#} 41 |
42 | 45 | 46 | 47 | 48 | 102 | {% block script %} 103 | {% endblock %} 104 | -------------------------------------------------------------------------------- /CTF/static/css/addons/datatables.min.css: -------------------------------------------------------------------------------- 1 | div.dataTables_wrapper div.dataTables_length select,div.dataTables_wrapper div.dataTables_length input{width:auto}div.dataTables_wrapper div.dataTables_length.d-flex.flex-row label{margin-top:1.2rem;margin-right:1rem}div.dataTables_wrapper div.dataTables_length.d-flex.flex-row .select-wrapper.mdb-select span,div.dataTables_wrapper div.dataTables_length.d-flex.flex-row .select-wrapper.mdb-select .select-dropdown{margin-top:1rem}div.dataTables_wrapper div.dataTables_length label,div.dataTables_wrapper div.dataTables_filter label{padding-top:.5rem;padding-bottom:.5rem;font-weight:400;text-align:left}div.dataTables_wrapper div.dataTables_filter{text-align:right}div.dataTables_wrapper div.dataTables_filter select,div.dataTables_wrapper div.dataTables_filter input{width:auto}div.dataTables_wrapper div.dataTables_filter input{display:inline-block;margin-left:.5rem}div.dataTables_wrapper div.dataTables_info,div.dataTables_wrapper div.dataTables_paginate{padding-top:1rem;padding-bottom:1rem;font-weight:400}div.dataTables_wrapper div.dataTables_paginate{margin:0;text-align:right}div.dataTables_wrapper div.dataTables_paginate ul.pagination{-ms-flex-pack:end;justify-content:flex-end;-webkit-box-pack:end}div.dataTables_wrapper div.dataTables_paginate ul.pagination .page-item.active .page-link:focus{background-color:#4285f4}div.dataTables_wrapper div.dataTables_paginate ul.pagination .page-item .page-link:focus{-webkit-box-shadow:none;box-shadow:none}@media (max-width: 767px){div.dataTables_wrapper div .dataTables_length,div.dataTables_wrapper div .dataTables_filter,div.dataTables_wrapper div .dataTables_info,div.dataTables_wrapper div .dataTables_paginate ul.pagination{-ms-flex-pack:center;justify-content:center;text-align:center;-webkit-box-pack:center}}.bs-select select{display:inline-block !important}table.dataTable thead{cursor:pointer}table.dataTable thead>tr>th.sorting_asc,table.dataTable thead>tr>th.sorting_desc,table.dataTable thead>tr>th.sorting,table.dataTable thead>tr>td.sorting_asc,table.dataTable thead>tr>td.sorting_desc,table.dataTable thead>tr>td.sorting{padding-right:30px}table.dataTable thead>tr>th:active,table.dataTable thead>tr>td:active{outline:none}table.dataTable thead .sorting,table.dataTable thead .sorting_asc,table.dataTable thead .sorting_desc,table.dataTable thead .sorting_asc_disabled,table.dataTable thead .sorting_desc_disabled{position:relative;cursor:pointer}table.dataTable thead .sorting:before,table.dataTable thead .sorting:after,table.dataTable thead .sorting_asc:before,table.dataTable thead .sorting_asc:after,table.dataTable thead .sorting_desc:before,table.dataTable thead .sorting_desc:after,table.dataTable thead .sorting_asc_disabled:before,table.dataTable thead .sorting_asc_disabled:after,table.dataTable thead .sorting_desc_disabled:before,table.dataTable thead .sorting_desc_disabled:after{position:absolute;bottom:.9em;display:block;opacity:.3}table.dataTable thead .sorting:before,table.dataTable thead .sorting_asc:before,table.dataTable thead .sorting_desc:before,table.dataTable thead .sorting_asc_disabled:before,table.dataTable thead .sorting_desc_disabled:before{right:1em;font-family:"Font Awesome\ 5 Free", sans-serif;font-size:1rem;font-weight:900;content:"\f0de"}table.dataTable thead .sorting:after,table.dataTable thead .sorting_asc:after,table.dataTable thead .sorting_desc:after,table.dataTable thead .sorting_asc_disabled:after,table.dataTable thead .sorting_desc_disabled:after{right:16px;font-family:"Font Awesome\ 5 Free", sans-serif;font-size:1rem;font-weight:900;content:"\f0dd"}table.dataTable thead .sorting_asc:before,table.dataTable thead .sorting_desc:after{opacity:1}table.dataTable thead .sorting_asc_disabled:before,table.dataTable thead .sorting_desc_disabled:after{opacity:0} 2 | 3 | 4 | /*# sourceMappingURL=datatables.min.css.map*/ -------------------------------------------------------------------------------- /CTF/static/css/addons/datatables-select.min.css: -------------------------------------------------------------------------------- 1 | table.dataTable tbody>tr.selected,table.dataTable tbody>tr>.selected{background-color:#b0bed9}table.dataTable.stripe tbody>tr.odd.selected,table.dataTable.stripe tbody>tr.odd>.selected,table.dataTable.display tbody>tr.odd.selected,table.dataTable.display tbody>tr.odd>.selected{background-color:#acbad4}table.dataTable.hover tbody>tr.selected:hover,table.dataTable.hover tbody>tr>.selected:hover,table.dataTable.display tbody>tr.selected:hover,table.dataTable.display tbody>tr>.selected:hover{background-color:#aab7d1}table.dataTable.order-column tbody>tr.selected>.sorting_1,table.dataTable.order-column tbody>tr.selected>.sorting_2,table.dataTable.order-column tbody>tr.selected>.sorting_3,table.dataTable.display tbody>tr.selected>.sorting_1,table.dataTable.display tbody>tr.selected>.sorting_2,table.dataTable.display tbody>tr.selected>.sorting_3{background-color:#acbad5}table.dataTable.order-column tbody>tr>.selected,table.dataTable.display tbody>tr>.selected{background-color:#acbad5}table.dataTable.display tbody>tr.odd.selected>.sorting_1,table.dataTable.order-column.stripe tbody>tr.odd.selected>.sorting_1{background-color:#a6b4cd}table.dataTable.display tbody>tr.odd.selected>.sorting_2,table.dataTable.order-column.stripe tbody>tr.odd.selected>.sorting_2{background-color:#a8b5cf}table.dataTable.display tbody>tr.odd.selected>.sorting_3,table.dataTable.order-column.stripe tbody>tr.odd.selected>.sorting_3{background-color:#a9b7d1}table.dataTable.display tbody>tr.even.selected>.sorting_1,table.dataTable.order-column.stripe tbody>tr.even.selected>.sorting_1{background-color:#acbad5}table.dataTable.display tbody>tr.even.selected>.sorting_2,table.dataTable.order-column.stripe tbody>tr.even.selected>.sorting_2{background-color:#aebcd6}table.dataTable.display tbody>tr.even.selected>.sorting_3,table.dataTable.order-column.stripe tbody>tr.even.selected>.sorting_3{background-color:#afbdd8}table.dataTable.display tbody>tr.odd>.selected,table.dataTable.order-column.stripe tbody>tr.odd>.selected{background-color:#a6b4cd}table.dataTable.display tbody>tr.even>.selected,table.dataTable.order-column.stripe tbody>tr.even>.selected{background-color:#acbad5}table.dataTable.display tbody>tr.selected:hover>.sorting_1,table.dataTable.order-column.hover tbody>tr.selected:hover>.sorting_1{background-color:#a2aec7}table.dataTable.display tbody>tr.selected:hover>.sorting_2,table.dataTable.order-column.hover tbody>tr.selected:hover>.sorting_2{background-color:#a3b0c9}table.dataTable.display tbody>tr.selected:hover>.sorting_3,table.dataTable.order-column.hover tbody>tr.selected:hover>.sorting_3{background-color:#a5b2cb}table.dataTable.display tbody>tr:hover>.selected,table.dataTable.display tbody>tr>.selected:hover,table.dataTable.order-column.hover tbody>tr:hover>.selected,table.dataTable.order-column.hover tbody>tr>.selected:hover{background-color:#a2aec7}table.dataTable tbody td.select-checkbox,table.dataTable tbody th.select-checkbox{position:relative}table.dataTable tbody td.select-checkbox:before,table.dataTable tbody td.select-checkbox:after,table.dataTable tbody th.select-checkbox:before,table.dataTable tbody th.select-checkbox:after{position:absolute;top:1.2em;left:50%;-webkit-box-sizing:border-box;box-sizing:border-box;display:block;width:12px;height:12px}table.dataTable tbody td.select-checkbox:before,table.dataTable tbody th.select-checkbox:before{margin-top:4px;margin-left:-6px;content:" ";border:1px solid #000;border-radius:3px}table.dataTable tr.selected td.select-checkbox:after,table.dataTable tr.selected th.select-checkbox:after{margin-top:0;margin-left:-4px;text-align:center;text-shadow:1px 1px #b0bed9, -1px -1px #b0bed9, 1px -1px #b0bed9, -1px 1px #b0bed9;content:"\2714"}div.dataTables_wrapper span.select-info,div.dataTables_wrapper span.select-item{margin-left:.5em}@media screen and (max-width: 640px){div.dataTables_wrapper span.select-info,div.dataTables_wrapper span.select-item{display:block;margin-left:0}} 2 | 3 | 4 | /*# sourceMappingURL=datatables-select.min.css.map*/ -------------------------------------------------------------------------------- /CTF/utils/check_user/CheckUser.py: -------------------------------------------------------------------------------- 1 | import requests 2 | from bs4 import BeautifulSoup 3 | import re 4 | 5 | ''' 6 | 注释: 7 | 1.输入用户名和密码并传入Login 8 | 2.参数condition中的handleLoginSuccessed是登陆成功的响应头,如果用户账户密码错误则响应头中出现handleLoginFailure 9 | 3.由于学校网站有点神奇,本来输入错误就需要输入验证码的,但是如果刷新下网页验证码就消失了,所以就不用那么麻烦将验证码返 10 | 回前端了 11 | 4.成功验证以后返回用户名字 12 | 5.学校网站太水了就不增加try容错了 13 | ''' 14 | 15 | 16 | class Login: 17 | def __init__(self, username, passpord): 18 | self.u_name = username 19 | self.u_pass = passpord 20 | self.session = requests.session() 21 | 22 | def __get_response(self): 23 | try: 24 | postdata = {'Login.Token1': self.u_name, 'Login.Token2': self.u_pass, 25 | 'goto': 'http://my.scu.edu.cn/loginSuccess.portal', 26 | 'gotoOnFail': 'http://my.scu.edu.cn/loginFailure.portal'} 27 | headers = { 28 | 'Referer': 'http://my.scu.edu.cn/', # 伪装成从CSDN博客搜索到的文章 29 | 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.75 Safari/537.36', 30 | # 伪装成浏览器 31 | 'Connection': 'keep-alive', 32 | 'Accept-language': 'zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2', 33 | 'Accept-encoding': 'gzip, deflate', 34 | 'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8', 35 | 'Host': 'my.scu.edu.cn' 36 | } 37 | response = self.session.post('http://my.scu.edu.cn/userPasswordValidate.portal', data=postdata, 38 | headers=headers, 39 | timeout=3) 40 | if response.status_code == requests.codes.ok: 41 | return response.text 42 | return None 43 | except requests.RequestException: 44 | print('请求出错') 45 | return None 46 | 47 | def check_auth(self): 48 | """ 49 | Try login to check the availability of the account. 50 | :return: True for success 51 | """ 52 | text1 = self.__get_response() 53 | condition = 'handleLoginSuccessed' 54 | if condition in text1: 55 | return True 56 | else: 57 | return False 58 | 59 | def get_name(self): 60 | """ 61 | Try get name of the account. 62 | :return: a string for name 63 | """ 64 | url = 'http://my.scu.edu.cn/' 65 | headers = { 66 | 'Referer': 'http://my.scu.edu.cn/', 67 | 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.75 Safari/537.36', 68 | 'Connection': 'keep-alive', 69 | 'Accept-language': 'zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2', 70 | 'Accept-encoding': 'gzip, deflate', 71 | 'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8', 72 | 'Host': 'my.scu.edu.cn' 73 | } 74 | response = self.session.get(url, headers=headers, timeout=3) 75 | html = response.text 76 | soup = BeautifulSoup(html, 'html.parser') 77 | get_name = re.split(r':', soup.li.text) 78 | result = get_name[1] 79 | return result 80 | # if response3.status_code == 200: 81 | # with open('douban3.html', 'w') as file: 82 | # file.write(response3.text) 83 | 84 | 85 | if __name__ == '__main__': 86 | username = input('username:') 87 | password = input('password:') 88 | while True: 89 | generator = Login(username, password) 90 | status = generator.check_auth() 91 | if status: 92 | print(generator.get_name()) 93 | print('登录验证成功') 94 | break 95 | else: 96 | print('用户不存在或密码错误,请重新输入') 97 | username = input('username:') 98 | password = input('password:') 99 | -------------------------------------------------------------------------------- /templates/forgotPwd.html: -------------------------------------------------------------------------------- 1 | {% extends "base.html" %} 2 | {% block title %}找回密码{% endblock %} 3 | {% block css %} 4 | {% load static %} 5 | 6 | 7 | 8 | 9 | {% endblock %} 10 | 11 |
12 |
13 | 14 |
15 | 16 |
17 | 找回密码 18 |
19 | 20 | 21 |
22 | {% if step == 1 %} 23 | 24 |
25 | {% csrf_token %} 26 | 27 | {{ form.non_field_errors }} 28 | 29 |
30 | {{ form.email }} 31 | 32 | {{ form.email.errors }} 33 | {% if form.email.help_text %} 34 |

{{ form.email.help_text|safe }}

35 | {% endif %} 36 |
37 | 38 | 41 | 42 |
43 | 44 | {% elif step == 2 %} 45 |
46 | {% csrf_token %} 47 | 48 | {{ form.non_field_errors }} 49 | 50 |
51 | {{ form.password }} 52 | 53 | {{ form.password.errors }} 54 | {% if form.password.help_text %} 55 |

{{ form.password.help_text|safe }}

56 | {% endif %} 57 |
58 |
59 | {{ form.repeat_password }} 60 | 61 | {{ form.repeat_password.errors }} 62 | {% if form.repeat_password.help_text %} 63 |

{{ form.repeat_password.help_text|safe }}

64 | {% endif %} 65 |
66 | 67 | 70 |
71 | {% elif step == 3 %} 72 |

恭喜您,密码修改成功!

73 | {% endif %} 74 |
75 | 76 |
77 | 78 |
79 |
80 | 81 | {% block script %} 82 | 83 | 84 | 85 | 86 | {% endblock %} -------------------------------------------------------------------------------- /SCUCTF_CMS/settings.py: -------------------------------------------------------------------------------- 1 | """ 2 | Django settings for SCUCTF_CMS project. 3 | 4 | Generated by 'django-admin startproject' using Django 3.0.2. 5 | 6 | For more information on this file, see 7 | https://docs.djangoproject.com/en/3.0/topics/settings/ 8 | 9 | For the full list of settings and their values, see 10 | https://docs.djangoproject.com/en/3.0/ref/settings/ 11 | """ 12 | 13 | import os 14 | 15 | # Build paths inside the project like this: os.path.join(BASE_DIR, ...) 16 | BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) 17 | 18 | # Quick-start development settings - unsuitable for production 19 | # See https://docs.djangoproject.com/en/3.0/howto/deployment/checklist/ 20 | 21 | # SECURITY WARNING: keep the secret key used in production secret! 22 | SECRET_KEY = 'o7www+yar34ll5+4k19mn!yu=f9ycjdpc3+ndv$p639%=9j!#l' 23 | 24 | # SECURITY WARNING: don't run with debug turned on in production! 25 | DEBUG = True 26 | 27 | ALLOWED_HOSTS = [] 28 | 29 | # Application definition 30 | 31 | INSTALLED_APPS = [ 32 | 'django.contrib.admin', 33 | 'django.contrib.auth', 34 | 'django.contrib.contenttypes', 35 | 'django.contrib.sessions', 36 | 'django.contrib.messages', 37 | 'django.contrib.staticfiles', 38 | 'CTF.apps.CtfConfig', 39 | ] 40 | 41 | MIDDLEWARE = [ 42 | 'django.middleware.security.SecurityMiddleware', 43 | 'django.contrib.sessions.middleware.SessionMiddleware', 44 | 'django.middleware.common.CommonMiddleware', 45 | 'django.middleware.csrf.CsrfViewMiddleware', 46 | 'django.contrib.auth.middleware.AuthenticationMiddleware', 47 | 'django.contrib.messages.middleware.MessageMiddleware', 48 | 'django.middleware.clickjacking.XFrameOptionsMiddleware', 49 | ] 50 | 51 | ROOT_URLCONF = 'SCUCTF_CMS.urls' 52 | 53 | TEMPLATES = [ 54 | { 55 | 'BACKEND': 'django.template.backends.django.DjangoTemplates', 56 | 'DIRS': [os.path.join(BASE_DIR, 'templates')] 57 | , 58 | 'APP_DIRS': True, 59 | 'OPTIONS': { 60 | 'context_processors': [ 61 | 'django.template.context_processors.debug', 62 | 'django.template.context_processors.request', 63 | 'django.contrib.auth.context_processors.auth', 64 | 'django.contrib.messages.context_processors.messages', 65 | ], 66 | }, 67 | }, 68 | ] 69 | 70 | WSGI_APPLICATION = 'SCUCTF_CMS.wsgi.application' 71 | 72 | # AUTH_USER_MODEL = 'CTF.models.User' 73 | 74 | # Database 75 | # https://docs.djangoproject.com/en/3.0/ref/settings/#databases 76 | 77 | DATABASES = { 78 | 'default': { 79 | 'ENGINE': 'django.db.backends.sqlite3', 80 | 'NAME': os.path.join(BASE_DIR, 'data.db') 81 | } 82 | } 83 | 84 | AUTH_USER_MODEL = 'CTF.User' 85 | 86 | # Password validation 87 | # https://docs.djangoproject.com/en/3.0/ref/settings/#auth-password-validators 88 | 89 | AUTH_PASSWORD_VALIDATORS = [ 90 | { 91 | 'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator', 92 | }, 93 | { 94 | 'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator', 95 | }, 96 | { 97 | 'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator', 98 | }, 99 | { 100 | 'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator', 101 | }, 102 | ] 103 | 104 | # Internationalization 105 | # https://docs.djangoproject.com/en/3.0/topics/i18n/ 106 | 107 | LANGUAGE_CODE = 'zh-hans' 108 | 109 | TIME_ZONE = 'Asia/Shanghai' 110 | 111 | USE_I18N = True 112 | 113 | USE_L10N = True 114 | 115 | USE_TZ = True 116 | 117 | # Static files (CSS, JavaScript, Images) 118 | # https://docs.djangoproject.com/en/3.0/howto/static-files/ 119 | 120 | STATIC_URL = '/static/' 121 | STATIC_ROOT = os.path.join(BASE_DIR, 'clollected_static') 122 | 123 | # 邮箱设置 124 | 125 | # EMAIL_BACKEND = 'django.core.mail.backends.console.EmailBackend' 126 | 127 | EMAIL_HOST = "" 128 | EMAIL_HOST_USER = "" 129 | EMAIL_HOST_PASSWORD = "" 130 | EMAIL_PORT = 465 131 | EMAIL_USE_SSL = True 132 | DEFAULT_FROM_EMAIL = EMAIL_HOST_USER 133 | 134 | STATICFILES_DIRS = [os.path.join(BASE_DIR, "CTF", "static")] 135 | 136 | LOGIN_URL = "/login" 137 | -------------------------------------------------------------------------------- /CTF/views.py: -------------------------------------------------------------------------------- 1 | from django.shortcuts import render, redirect, HttpResponseRedirect 2 | from django.contrib.auth import logout as logout_ 3 | from django.contrib.auth.decorators import login_required 4 | from .forms import RegisterForm, LoginForm 5 | from .auth import create_user, try_login 6 | from SCUCTF_CMS.settings import STATIC_URL 7 | from .utils import util 8 | 9 | 10 | # Create your views here. 11 | 12 | 13 | def index(request): 14 | """ 15 | 首页显示,如果已经登录,就显示个人中心,不显示登录和注册按钮 16 | 如果未登录,就显示登录和注册按钮,不显示个人中心 17 | :param request: 用户请求 18 | :return: 返回渲染后页面 19 | """ 20 | if request.user.is_authenticated: 21 | return render(request, 'index.html', { 22 | 'user': request.user 23 | }) 24 | else: 25 | return render(request, 'index.html') 26 | 27 | 28 | def register(request): 29 | """ 30 | 注册账户 31 | :param request: 32 | """ 33 | if request.user.is_authenticated: 34 | return redirect(index) 35 | if request.method == 'POST': 36 | form = RegisterForm(request.POST) 37 | if form.is_valid(): 38 | username = form.cleaned_data['username'] 39 | password = form.cleaned_data['password1'] 40 | email = form.cleaned_data['email'] 41 | if create_user(username, password, email): 42 | return redirect(index) 43 | form = RegisterForm() 44 | return render(request, 'register.html', {'form': form}) 45 | 46 | 47 | def login(request): 48 | """ 49 | 登录账户 50 | :param request: 51 | """ 52 | if request.user.is_authenticated: 53 | return redirect(index) 54 | if request.method == 'POST': 55 | form = LoginForm(request.POST) 56 | if form.is_valid(): 57 | username = form.cleaned_data['username'] 58 | password = form.cleaned_data['password'] 59 | if try_login(request, username, password): 60 | next_url = request.GET.get('next', False) 61 | if next_url: 62 | return HttpResponseRedirect(next_url) 63 | return redirect(index) 64 | form = LoginForm() 65 | return render(request, 'login.html', {'form': form}) 66 | 67 | 68 | @login_required 69 | def logout(request): 70 | """ 71 | 登出账户 72 | :param request: 这个我觉得不用说明 73 | :return: null 74 | """ 75 | if request.user.is_authenticated: 76 | logout_(request) 77 | return redirect(index) 78 | 79 | 80 | @login_required 81 | def user_center(request): 82 | """ 83 | 个人中心页面,根据setting_type判断用户更改了哪些资料,若没有setting_type或设置错误,则返回用户信息 84 | :param request: 85 | :return: 86 | """ 87 | if request.method == 'POST': 88 | setting_type = request.POST.get('type', None) 89 | if not setting_type: 90 | return render('user_center.html', request, { 91 | 'user': request.user 92 | }) 93 | # 设置头像 94 | if setting_type == 1: 95 | avatar = request.FILES.get("avatar", None) 96 | # 没有对头像文件格式进行检查直接按照jpg存放 97 | if avatar: 98 | path = STATIC_URL + util.random_md5() 99 | f = open('%s.png' % path, 'wb+') 100 | for chunk in avatar.chunks(): 101 | f.write(chunk) 102 | f.close() 103 | request.user.save(avatar=path) 104 | return render(request, 'user_center.html', { 105 | 'user': request.user, 106 | 'tips': '头像修改成功' 107 | }) 108 | return render(request, 'user_center.html', { 109 | 'user': request.user, 110 | 'tips': '请上传头像' 111 | }) 112 | # 保留 113 | elif setting_type == 2: 114 | pass 115 | # 更改密码 116 | elif setting_type == 3: 117 | pass 118 | # 川大认证 119 | elif setting_type == 4: 120 | pass 121 | else: 122 | return render('user_center.html', request, { 123 | 'user': request.user, 124 | 'tips': '参数错误' 125 | }) 126 | print(request.user.username) 127 | return render(request, 'user_center.html', { 128 | 'user': request.user 129 | }) 130 | -------------------------------------------------------------------------------- /CTF/static/css/addons/datatables.min.css.map: -------------------------------------------------------------------------------- 1 | {"version":3,"sources":["webpack:///./src/scss/addons/_datatables.scss"],"names":[],"mappings":"AAAA,uGAAuG,WAAW,mEAAmE,kBAAkB,kBAAkB,sMAAsM,gBAAgB,sGAAsG,kBAAkB,qBAAqB,gBAAgB,gBAAgB,6CAA6C,iBAAiB,uGAAuG,WAAW,mDAAmD,qBAAqB,kBAAkB,0FAA0F,iBAAiB,oBAAoB,gBAAgB,+CAA+C,SAAS,iBAAiB,6DAA6D,kBAAkB,yBAAyB,qBAAqB,gGAAgG,yBAAyB,yFAAyF,wBAAwB,gBAAgB,0BAA0B,sMAAsM,qBAAqB,uBAAuB,kBAAkB,yBAAyB,kBAAkB,gCAAgC,sBAAsB,eAAe,0OAA0O,mBAAmB,sEAAsE,aAAa,+LAA+L,kBAAkB,eAAe,+bAA+b,kBAAkB,YAAY,cAAc,WAAW,kOAAkO,UAAU,+CAA+C,eAAe,gBAAgB,gBAAgB,6NAA6N,WAAW,+CAA+C,eAAe,gBAAgB,gBAAgB,oFAAoF,UAAU,sGAAsG","file":"css/addons/datatables.min.css","sourcesContent":["div.dataTables_wrapper div.dataTables_length select,div.dataTables_wrapper div.dataTables_length input{width:auto}div.dataTables_wrapper div.dataTables_length.d-flex.flex-row label{margin-top:1.2rem;margin-right:1rem}div.dataTables_wrapper div.dataTables_length.d-flex.flex-row .select-wrapper.mdb-select span,div.dataTables_wrapper div.dataTables_length.d-flex.flex-row .select-wrapper.mdb-select .select-dropdown{margin-top:1rem}div.dataTables_wrapper div.dataTables_length label,div.dataTables_wrapper div.dataTables_filter label{padding-top:.5rem;padding-bottom:.5rem;font-weight:400;text-align:left}div.dataTables_wrapper div.dataTables_filter{text-align:right}div.dataTables_wrapper div.dataTables_filter select,div.dataTables_wrapper div.dataTables_filter input{width:auto}div.dataTables_wrapper div.dataTables_filter input{display:inline-block;margin-left:.5rem}div.dataTables_wrapper div.dataTables_info,div.dataTables_wrapper div.dataTables_paginate{padding-top:1rem;padding-bottom:1rem;font-weight:400}div.dataTables_wrapper div.dataTables_paginate{margin:0;text-align:right}div.dataTables_wrapper div.dataTables_paginate ul.pagination{-ms-flex-pack:end;justify-content:flex-end;-webkit-box-pack:end}div.dataTables_wrapper div.dataTables_paginate ul.pagination .page-item.active .page-link:focus{background-color:#4285f4}div.dataTables_wrapper div.dataTables_paginate ul.pagination .page-item .page-link:focus{-webkit-box-shadow:none;box-shadow:none}@media (max-width: 767px){div.dataTables_wrapper div .dataTables_length,div.dataTables_wrapper div .dataTables_filter,div.dataTables_wrapper div .dataTables_info,div.dataTables_wrapper div .dataTables_paginate ul.pagination{-ms-flex-pack:center;justify-content:center;text-align:center;-webkit-box-pack:center}}.bs-select select{display:inline-block !important}table.dataTable thead{cursor:pointer}table.dataTable thead>tr>th.sorting_asc,table.dataTable thead>tr>th.sorting_desc,table.dataTable thead>tr>th.sorting,table.dataTable thead>tr>td.sorting_asc,table.dataTable thead>tr>td.sorting_desc,table.dataTable thead>tr>td.sorting{padding-right:30px}table.dataTable thead>tr>th:active,table.dataTable thead>tr>td:active{outline:none}table.dataTable thead .sorting,table.dataTable thead .sorting_asc,table.dataTable thead .sorting_desc,table.dataTable thead .sorting_asc_disabled,table.dataTable thead .sorting_desc_disabled{position:relative;cursor:pointer}table.dataTable thead .sorting:before,table.dataTable thead .sorting:after,table.dataTable thead .sorting_asc:before,table.dataTable thead .sorting_asc:after,table.dataTable thead .sorting_desc:before,table.dataTable thead .sorting_desc:after,table.dataTable thead .sorting_asc_disabled:before,table.dataTable thead .sorting_asc_disabled:after,table.dataTable thead .sorting_desc_disabled:before,table.dataTable thead .sorting_desc_disabled:after{position:absolute;bottom:.9em;display:block;opacity:.3}table.dataTable thead .sorting:before,table.dataTable thead .sorting_asc:before,table.dataTable thead .sorting_desc:before,table.dataTable thead .sorting_asc_disabled:before,table.dataTable thead .sorting_desc_disabled:before{right:1em;font-family:\"Font Awesome\\ 5 Free\", sans-serif;font-size:1rem;font-weight:900;content:\"\\f0de\"}table.dataTable thead .sorting:after,table.dataTable thead .sorting_asc:after,table.dataTable thead .sorting_desc:after,table.dataTable thead .sorting_asc_disabled:after,table.dataTable thead .sorting_desc_disabled:after{right:16px;font-family:\"Font Awesome\\ 5 Free\", sans-serif;font-size:1rem;font-weight:900;content:\"\\f0dd\"}table.dataTable thead .sorting_asc:before,table.dataTable thead .sorting_desc:after{opacity:1}table.dataTable thead .sorting_asc_disabled:before,table.dataTable thead .sorting_desc_disabled:after{opacity:0}\n"],"sourceRoot":""} -------------------------------------------------------------------------------- /CTF/static/css/addons/datatables-select.min.css.map: -------------------------------------------------------------------------------- 1 | {"version":3,"sources":["webpack:///./src/scss/addons/_datatables-select.scss"],"names":[],"mappings":"AAAA,qEAAqE,yBAAyB,wLAAwL,yBAAyB,8LAA8L,yBAAyB,6UAA6U,yBAAyB,2FAA2F,yBAAyB,8HAA8H,yBAAyB,8HAA8H,yBAAyB,8HAA8H,yBAAyB,gIAAgI,yBAAyB,gIAAgI,yBAAyB,gIAAgI,yBAAyB,0GAA0G,yBAAyB,4GAA4G,yBAAyB,iIAAiI,yBAAyB,iIAAiI,yBAAyB,iIAAiI,yBAAyB,0NAA0N,yBAAyB,kFAAkF,kBAAkB,8LAA8L,kBAAkB,UAAU,SAAS,8BAA8B,sBAAsB,cAAc,WAAW,YAAY,gGAAgG,eAAe,iBAAiB,YAAY,sBAAsB,kBAAkB,0GAA0G,aAAa,iBAAiB,kBAAkB,mFAAmF,gBAAgB,gFAAgF,iBAAiB,qCAAqC,gFAAgF,cAAc","file":"css/addons/datatables-select.min.css","sourcesContent":["table.dataTable tbody>tr.selected,table.dataTable tbody>tr>.selected{background-color:#b0bed9}table.dataTable.stripe tbody>tr.odd.selected,table.dataTable.stripe tbody>tr.odd>.selected,table.dataTable.display tbody>tr.odd.selected,table.dataTable.display tbody>tr.odd>.selected{background-color:#acbad4}table.dataTable.hover tbody>tr.selected:hover,table.dataTable.hover tbody>tr>.selected:hover,table.dataTable.display tbody>tr.selected:hover,table.dataTable.display tbody>tr>.selected:hover{background-color:#aab7d1}table.dataTable.order-column tbody>tr.selected>.sorting_1,table.dataTable.order-column tbody>tr.selected>.sorting_2,table.dataTable.order-column tbody>tr.selected>.sorting_3,table.dataTable.display tbody>tr.selected>.sorting_1,table.dataTable.display tbody>tr.selected>.sorting_2,table.dataTable.display tbody>tr.selected>.sorting_3{background-color:#acbad5}table.dataTable.order-column tbody>tr>.selected,table.dataTable.display tbody>tr>.selected{background-color:#acbad5}table.dataTable.display tbody>tr.odd.selected>.sorting_1,table.dataTable.order-column.stripe tbody>tr.odd.selected>.sorting_1{background-color:#a6b4cd}table.dataTable.display tbody>tr.odd.selected>.sorting_2,table.dataTable.order-column.stripe tbody>tr.odd.selected>.sorting_2{background-color:#a8b5cf}table.dataTable.display tbody>tr.odd.selected>.sorting_3,table.dataTable.order-column.stripe tbody>tr.odd.selected>.sorting_3{background-color:#a9b7d1}table.dataTable.display tbody>tr.even.selected>.sorting_1,table.dataTable.order-column.stripe tbody>tr.even.selected>.sorting_1{background-color:#acbad5}table.dataTable.display tbody>tr.even.selected>.sorting_2,table.dataTable.order-column.stripe tbody>tr.even.selected>.sorting_2{background-color:#aebcd6}table.dataTable.display tbody>tr.even.selected>.sorting_3,table.dataTable.order-column.stripe tbody>tr.even.selected>.sorting_3{background-color:#afbdd8}table.dataTable.display tbody>tr.odd>.selected,table.dataTable.order-column.stripe tbody>tr.odd>.selected{background-color:#a6b4cd}table.dataTable.display tbody>tr.even>.selected,table.dataTable.order-column.stripe tbody>tr.even>.selected{background-color:#acbad5}table.dataTable.display tbody>tr.selected:hover>.sorting_1,table.dataTable.order-column.hover tbody>tr.selected:hover>.sorting_1{background-color:#a2aec7}table.dataTable.display tbody>tr.selected:hover>.sorting_2,table.dataTable.order-column.hover tbody>tr.selected:hover>.sorting_2{background-color:#a3b0c9}table.dataTable.display tbody>tr.selected:hover>.sorting_3,table.dataTable.order-column.hover tbody>tr.selected:hover>.sorting_3{background-color:#a5b2cb}table.dataTable.display tbody>tr:hover>.selected,table.dataTable.display tbody>tr>.selected:hover,table.dataTable.order-column.hover tbody>tr:hover>.selected,table.dataTable.order-column.hover tbody>tr>.selected:hover{background-color:#a2aec7}table.dataTable tbody td.select-checkbox,table.dataTable tbody th.select-checkbox{position:relative}table.dataTable tbody td.select-checkbox:before,table.dataTable tbody td.select-checkbox:after,table.dataTable tbody th.select-checkbox:before,table.dataTable tbody th.select-checkbox:after{position:absolute;top:1.2em;left:50%;-webkit-box-sizing:border-box;box-sizing:border-box;display:block;width:12px;height:12px}table.dataTable tbody td.select-checkbox:before,table.dataTable tbody th.select-checkbox:before{margin-top:4px;margin-left:-6px;content:\" \";border:1px solid #000;border-radius:3px}table.dataTable tr.selected td.select-checkbox:after,table.dataTable tr.selected th.select-checkbox:after{margin-top:0;margin-left:-4px;text-align:center;text-shadow:1px 1px #b0bed9, -1px -1px #b0bed9, 1px -1px #b0bed9, -1px 1px #b0bed9;content:\"\\2714\"}div.dataTables_wrapper span.select-info,div.dataTables_wrapper span.select-item{margin-left:.5em}@media screen and (max-width: 640px){div.dataTables_wrapper span.select-info,div.dataTables_wrapper span.select-item{display:block;margin-left:0}}\n"],"sourceRoot":""} -------------------------------------------------------------------------------- /.idea/markdown-navigator-enh.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | -------------------------------------------------------------------------------- /CTF/static/js/mdb.lite.min.js.map: -------------------------------------------------------------------------------- 1 | {"version":3,"sources":["webpack:///webpack/bootstrap"],"names":["installedModules","__webpack_require__","moduleId","exports","module","i","l","modules","call","m","c","d","name","getter","o","Object","defineProperty","enumerable","get","r","Symbol","toStringTag","value","t","mode","__esModule","ns","create","key","bind","n","object","property","prototype","hasOwnProperty","p","s"],"mappings":"aACE,IAAIA,EAAmB,GAGvB,SAASC,EAAoBC,GAG5B,GAAGF,EAAiBE,GACnB,OAAOF,EAAiBE,GAAUC,QAGnC,IAAIC,EAASJ,EAAiBE,GAAY,CACzCG,EAAGH,EACHI,GAAG,EACHH,QAAS,IAUV,OANAI,EAAQL,GAAUM,KAAKJ,EAAOD,QAASC,EAAQA,EAAOD,QAASF,GAG/DG,EAAOE,GAAI,EAGJF,EAAOD,QAKfF,EAAoBQ,EAAIF,EAGxBN,EAAoBS,EAAIV,EAGxBC,EAAoBU,EAAI,SAASR,EAASS,EAAMC,GAC3CZ,EAAoBa,EAAEX,EAASS,IAClCG,OAAOC,eAAeb,EAASS,EAAM,CAAEK,YAAY,EAAMC,IAAKL,KAKhEZ,EAAoBkB,EAAI,SAAShB,GACX,oBAAXiB,QAA0BA,OAAOC,aAC1CN,OAAOC,eAAeb,EAASiB,OAAOC,YAAa,CAAEC,MAAO,WAE7DP,OAAOC,eAAeb,EAAS,aAAc,CAAEmB,OAAO,KAQvDrB,EAAoBsB,EAAI,SAASD,EAAOE,GAEvC,GADU,EAAPA,IAAUF,EAAQrB,EAAoBqB,IAC/B,EAAPE,EAAU,OAAOF,EACpB,GAAW,EAAPE,GAA8B,iBAAVF,GAAsBA,GAASA,EAAMG,WAAY,OAAOH,EAChF,IAAII,EAAKX,OAAOY,OAAO,MAGvB,GAFA1B,EAAoBkB,EAAEO,GACtBX,OAAOC,eAAeU,EAAI,UAAW,CAAET,YAAY,EAAMK,MAAOA,IACtD,EAAPE,GAA4B,iBAATF,EAAmB,IAAI,IAAIM,KAAON,EAAOrB,EAAoBU,EAAEe,EAAIE,EAAK,SAASA,GAAO,OAAON,EAAMM,IAAQC,KAAK,KAAMD,IAC9I,OAAOF,GAIRzB,EAAoB6B,EAAI,SAAS1B,GAChC,IAAIS,EAAST,GAAUA,EAAOqB,WAC7B,WAAwB,OAAOrB,EAAgB,SAC/C,WAA8B,OAAOA,GAEtC,OADAH,EAAoBU,EAAEE,EAAQ,IAAKA,GAC5BA,GAIRZ,EAAoBa,EAAI,SAASiB,EAAQC,GAAY,OAAOjB,OAAOkB,UAAUC,eAAe1B,KAAKuB,EAAQC,IAGzG/B,EAAoBkC,EAAI,GAIjBlC,EAAoBA,EAAoBmC,EAAI,K","file":"js/mdb.lite.min.js","sourcesContent":[" \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n \t\t}\n \t};\n\n \t// define __esModule on exports\n \t__webpack_require__.r = function(exports) {\n \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n \t\t}\n \t\tObject.defineProperty(exports, '__esModule', { value: true });\n \t};\n\n \t// create a fake namespace object\n \t// mode & 1: value is a module id, require it\n \t// mode & 2: merge all properties of value into the ns\n \t// mode & 4: return value when already ns object\n \t// mode & 8|1: behave like require\n \t__webpack_require__.t = function(value, mode) {\n \t\tif(mode & 1) value = __webpack_require__(value);\n \t\tif(mode & 8) return value;\n \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n \t\tvar ns = Object.create(null);\n \t\t__webpack_require__.r(ns);\n \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n \t\treturn ns;\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = 199);\n"],"sourceRoot":""} -------------------------------------------------------------------------------- /CTF/static/js/addons/flag.min.js.map: -------------------------------------------------------------------------------- 1 | {"version":3,"sources":["webpack:///webpack/bootstrap"],"names":["installedModules","__webpack_require__","moduleId","exports","module","i","l","modules","call","m","c","d","name","getter","o","Object","defineProperty","enumerable","get","r","Symbol","toStringTag","value","t","mode","__esModule","ns","create","key","bind","n","object","property","prototype","hasOwnProperty","p","s"],"mappings":"aACE,IAAIA,EAAmB,GAGvB,SAASC,EAAoBC,GAG5B,GAAGF,EAAiBE,GACnB,OAAOF,EAAiBE,GAAUC,QAGnC,IAAIC,EAASJ,EAAiBE,GAAY,CACzCG,EAAGH,EACHI,GAAG,EACHH,QAAS,IAUV,OANAI,EAAQL,GAAUM,KAAKJ,EAAOD,QAASC,EAAQA,EAAOD,QAASF,GAG/DG,EAAOE,GAAI,EAGJF,EAAOD,QAKfF,EAAoBQ,EAAIF,EAGxBN,EAAoBS,EAAIV,EAGxBC,EAAoBU,EAAI,SAASR,EAASS,EAAMC,GAC3CZ,EAAoBa,EAAEX,EAASS,IAClCG,OAAOC,eAAeb,EAASS,EAAM,CAAEK,YAAY,EAAMC,IAAKL,KAKhEZ,EAAoBkB,EAAI,SAAShB,GACX,oBAAXiB,QAA0BA,OAAOC,aAC1CN,OAAOC,eAAeb,EAASiB,OAAOC,YAAa,CAAEC,MAAO,WAE7DP,OAAOC,eAAeb,EAAS,aAAc,CAAEmB,OAAO,KAQvDrB,EAAoBsB,EAAI,SAASD,EAAOE,GAEvC,GADU,EAAPA,IAAUF,EAAQrB,EAAoBqB,IAC/B,EAAPE,EAAU,OAAOF,EACpB,GAAW,EAAPE,GAA8B,iBAAVF,GAAsBA,GAASA,EAAMG,WAAY,OAAOH,EAChF,IAAII,EAAKX,OAAOY,OAAO,MAGvB,GAFA1B,EAAoBkB,EAAEO,GACtBX,OAAOC,eAAeU,EAAI,UAAW,CAAET,YAAY,EAAMK,MAAOA,IACtD,EAAPE,GAA4B,iBAATF,EAAmB,IAAI,IAAIM,KAAON,EAAOrB,EAAoBU,EAAEe,EAAIE,EAAK,SAASA,GAAO,OAAON,EAAMM,IAAQC,KAAK,KAAMD,IAC9I,OAAOF,GAIRzB,EAAoB6B,EAAI,SAAS1B,GAChC,IAAIS,EAAST,GAAUA,EAAOqB,WAC7B,WAAwB,OAAOrB,EAAgB,SAC/C,WAA8B,OAAOA,GAEtC,OADAH,EAAoBU,EAAEE,EAAQ,IAAKA,GAC5BA,GAIRZ,EAAoBa,EAAI,SAASiB,EAAQC,GAAY,OAAOjB,OAAOkB,UAAUC,eAAe1B,KAAKuB,EAAQC,IAGzG/B,EAAoBkC,EAAI,GAIjBlC,EAAoBA,EAAoBmC,EAAI,K","file":"js/addons/flag.min.js","sourcesContent":[" \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n \t\t}\n \t};\n\n \t// define __esModule on exports\n \t__webpack_require__.r = function(exports) {\n \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n \t\t}\n \t\tObject.defineProperty(exports, '__esModule', { value: true });\n \t};\n\n \t// create a fake namespace object\n \t// mode & 1: value is a module id, require it\n \t// mode & 2: merge all properties of value into the ns\n \t// mode & 4: return value when already ns object\n \t// mode & 8|1: behave like require\n \t__webpack_require__.t = function(value, mode) {\n \t\tif(mode & 1) value = __webpack_require__(value);\n \t\tif(mode & 8) return value;\n \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n \t\tvar ns = Object.create(null);\n \t\t__webpack_require__.r(ns);\n \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n \t\treturn ns;\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = 225);\n"],"sourceRoot":""} -------------------------------------------------------------------------------- /CTF/static/js/addons/directives.min.js.map: -------------------------------------------------------------------------------- 1 | {"version":3,"sources":["webpack:///webpack/bootstrap"],"names":["installedModules","__webpack_require__","moduleId","exports","module","i","l","modules","call","m","c","d","name","getter","o","Object","defineProperty","enumerable","get","r","Symbol","toStringTag","value","t","mode","__esModule","ns","create","key","bind","n","object","property","prototype","hasOwnProperty","p","s"],"mappings":"aACE,IAAIA,EAAmB,GAGvB,SAASC,EAAoBC,GAG5B,GAAGF,EAAiBE,GACnB,OAAOF,EAAiBE,GAAUC,QAGnC,IAAIC,EAASJ,EAAiBE,GAAY,CACzCG,EAAGH,EACHI,GAAG,EACHH,QAAS,IAUV,OANAI,EAAQL,GAAUM,KAAKJ,EAAOD,QAASC,EAAQA,EAAOD,QAASF,GAG/DG,EAAOE,GAAI,EAGJF,EAAOD,QAKfF,EAAoBQ,EAAIF,EAGxBN,EAAoBS,EAAIV,EAGxBC,EAAoBU,EAAI,SAASR,EAASS,EAAMC,GAC3CZ,EAAoBa,EAAEX,EAASS,IAClCG,OAAOC,eAAeb,EAASS,EAAM,CAAEK,YAAY,EAAMC,IAAKL,KAKhEZ,EAAoBkB,EAAI,SAAShB,GACX,oBAAXiB,QAA0BA,OAAOC,aAC1CN,OAAOC,eAAeb,EAASiB,OAAOC,YAAa,CAAEC,MAAO,WAE7DP,OAAOC,eAAeb,EAAS,aAAc,CAAEmB,OAAO,KAQvDrB,EAAoBsB,EAAI,SAASD,EAAOE,GAEvC,GADU,EAAPA,IAAUF,EAAQrB,EAAoBqB,IAC/B,EAAPE,EAAU,OAAOF,EACpB,GAAW,EAAPE,GAA8B,iBAAVF,GAAsBA,GAASA,EAAMG,WAAY,OAAOH,EAChF,IAAII,EAAKX,OAAOY,OAAO,MAGvB,GAFA1B,EAAoBkB,EAAEO,GACtBX,OAAOC,eAAeU,EAAI,UAAW,CAAET,YAAY,EAAMK,MAAOA,IACtD,EAAPE,GAA4B,iBAATF,EAAmB,IAAI,IAAIM,KAAON,EAAOrB,EAAoBU,EAAEe,EAAIE,EAAK,SAASA,GAAO,OAAON,EAAMM,IAAQC,KAAK,KAAMD,IAC9I,OAAOF,GAIRzB,EAAoB6B,EAAI,SAAS1B,GAChC,IAAIS,EAAST,GAAUA,EAAOqB,WAC7B,WAAwB,OAAOrB,EAAgB,SAC/C,WAA8B,OAAOA,GAEtC,OADAH,EAAoBU,EAAEE,EAAQ,IAAKA,GAC5BA,GAIRZ,EAAoBa,EAAI,SAASiB,EAAQC,GAAY,OAAOjB,OAAOkB,UAAUC,eAAe1B,KAAKuB,EAAQC,IAGzG/B,EAAoBkC,EAAI,GAIjBlC,EAAoBA,EAAoBmC,EAAI,K","file":"js/addons/directives.min.js","sourcesContent":[" \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n \t\t}\n \t};\n\n \t// define __esModule on exports\n \t__webpack_require__.r = function(exports) {\n \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n \t\t}\n \t\tObject.defineProperty(exports, '__esModule', { value: true });\n \t};\n\n \t// create a fake namespace object\n \t// mode & 1: value is a module id, require it\n \t// mode & 2: merge all properties of value into the ns\n \t// mode & 4: return value when already ns object\n \t// mode & 8|1: behave like require\n \t__webpack_require__.t = function(value, mode) {\n \t\tif(mode & 1) value = __webpack_require__(value);\n \t\tif(mode & 8) return value;\n \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n \t\tvar ns = Object.create(null);\n \t\t__webpack_require__.r(ns);\n \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n \t\treturn ns;\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = 224);\n"],"sourceRoot":""} -------------------------------------------------------------------------------- /CTF/static/js/modules/animations-extended.min.js.map: -------------------------------------------------------------------------------- 1 | {"version":3,"sources":["webpack:///webpack/bootstrap"],"names":["installedModules","__webpack_require__","moduleId","exports","module","i","l","modules","call","m","c","d","name","getter","o","Object","defineProperty","enumerable","get","r","Symbol","toStringTag","value","t","mode","__esModule","ns","create","key","bind","n","object","property","prototype","hasOwnProperty","p","s"],"mappings":"aACE,IAAIA,EAAmB,GAGvB,SAASC,EAAoBC,GAG5B,GAAGF,EAAiBE,GACnB,OAAOF,EAAiBE,GAAUC,QAGnC,IAAIC,EAASJ,EAAiBE,GAAY,CACzCG,EAAGH,EACHI,GAAG,EACHH,QAAS,IAUV,OANAI,EAAQL,GAAUM,KAAKJ,EAAOD,QAASC,EAAQA,EAAOD,QAASF,GAG/DG,EAAOE,GAAI,EAGJF,EAAOD,QAKfF,EAAoBQ,EAAIF,EAGxBN,EAAoBS,EAAIV,EAGxBC,EAAoBU,EAAI,SAASR,EAASS,EAAMC,GAC3CZ,EAAoBa,EAAEX,EAASS,IAClCG,OAAOC,eAAeb,EAASS,EAAM,CAAEK,YAAY,EAAMC,IAAKL,KAKhEZ,EAAoBkB,EAAI,SAAShB,GACX,oBAAXiB,QAA0BA,OAAOC,aAC1CN,OAAOC,eAAeb,EAASiB,OAAOC,YAAa,CAAEC,MAAO,WAE7DP,OAAOC,eAAeb,EAAS,aAAc,CAAEmB,OAAO,KAQvDrB,EAAoBsB,EAAI,SAASD,EAAOE,GAEvC,GADU,EAAPA,IAAUF,EAAQrB,EAAoBqB,IAC/B,EAAPE,EAAU,OAAOF,EACpB,GAAW,EAAPE,GAA8B,iBAAVF,GAAsBA,GAASA,EAAMG,WAAY,OAAOH,EAChF,IAAII,EAAKX,OAAOY,OAAO,MAGvB,GAFA1B,EAAoBkB,EAAEO,GACtBX,OAAOC,eAAeU,EAAI,UAAW,CAAET,YAAY,EAAMK,MAAOA,IACtD,EAAPE,GAA4B,iBAATF,EAAmB,IAAI,IAAIM,KAAON,EAAOrB,EAAoBU,EAAEe,EAAIE,EAAK,SAASA,GAAO,OAAON,EAAMM,IAAQC,KAAK,KAAMD,IAC9I,OAAOF,GAIRzB,EAAoB6B,EAAI,SAAS1B,GAChC,IAAIS,EAAST,GAAUA,EAAOqB,WAC7B,WAAwB,OAAOrB,EAAgB,SAC/C,WAA8B,OAAOA,GAEtC,OADAH,EAAoBU,EAAEE,EAAQ,IAAKA,GAC5BA,GAIRZ,EAAoBa,EAAI,SAASiB,EAAQC,GAAY,OAAOjB,OAAOkB,UAAUC,eAAe1B,KAAKuB,EAAQC,IAGzG/B,EAAoBkC,EAAI,GAIjBlC,EAAoBA,EAAoBmC,EAAI,K","file":"js/modules/animations-extended.min.js","sourcesContent":[" \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n \t\t}\n \t};\n\n \t// define __esModule on exports\n \t__webpack_require__.r = function(exports) {\n \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n \t\t}\n \t\tObject.defineProperty(exports, '__esModule', { value: true });\n \t};\n\n \t// create a fake namespace object\n \t// mode & 1: value is a module id, require it\n \t// mode & 2: merge all properties of value into the ns\n \t// mode & 4: return value when already ns object\n \t// mode & 8|1: behave like require\n \t__webpack_require__.t = function(value, mode) {\n \t\tif(mode & 1) value = __webpack_require__(value);\n \t\tif(mode & 8) return value;\n \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n \t\tvar ns = Object.create(null);\n \t\t__webpack_require__.r(ns);\n \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n \t\treturn ns;\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = 226);\n"],"sourceRoot":""} -------------------------------------------------------------------------------- /templates/login.html: -------------------------------------------------------------------------------- 1 | {% extends "base.html" %} 2 | {% block title %}登录{% endblock %} 3 | {% block css %} 4 | {% load static %} 5 | 6 | 7 | 8 | 9 | 10 | 15 | {% endblock %} 16 | {% block content %} 17 |
18 |
19 | 20 |
21 | 22 |
23 | 登录 24 |
25 | 26 | 27 |
28 | 29 | 30 |
31 | {% csrf_token %} 32 | 33 | {{ form.non_field_errors }} 34 | 35 |
36 | {{ form.username }} 37 | 38 | {{ form.username.errors }} 39 | {% if form.username.help_text %} 40 |

{{ form.username.help_text|safe }}

41 | {% endif %} 42 |
43 |
44 | {{ form.password }} 45 | 46 | {{ form.password.errors }} 47 | {% if form.password.help_text %} 48 |

{{ form.password.help_text|safe }}

49 | {% endif %} 50 |
51 | 52 |
53 |
54 | 55 |
56 | {{ form.remember }} 57 | 58 |
59 |
60 |
61 | 62 | 忘记密码? 63 |
64 |
65 | 66 | 67 | 70 | 71 | 72 |

没有帐号? 73 | 注册 74 |

75 | 76 | 77 |

或者使用其它方式登录:

78 | 79 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | 89 | 90 | 91 |
92 | 93 | 94 |
95 | 96 |
97 | 98 |
99 |
100 | {% endblock %} 101 | {% block script %} 102 | 103 | 104 | 105 | {% endblock %} -------------------------------------------------------------------------------- /CTF/static/js/modules/scrolling-navbar.min.js.map: -------------------------------------------------------------------------------- 1 | {"version":3,"sources":["webpack:///webpack/bootstrap","webpack:///./src/js/free/scrolling-navbar.js"],"names":["installedModules","__webpack_require__","moduleId","exports","module","i","l","modules","call","m","c","d","name","getter","o","Object","defineProperty","enumerable","get","r","Symbol","toStringTag","value","t","mode","__esModule","ns","create","key","bind","n","object","property","prototype","hasOwnProperty","p","s","jQuery","$","window","on","$navbar","length","offset","top"],"mappings":"aACE,IAAIA,EAAmB,GAGvB,SAASC,EAAoBC,GAG5B,GAAGF,EAAiBE,GACnB,OAAOF,EAAiBE,GAAUC,QAGnC,IAAIC,EAASJ,EAAiBE,GAAY,CACzCG,EAAGH,EACHI,GAAG,EACHH,QAAS,IAUV,OANAI,EAAQL,GAAUM,KAAKJ,EAAOD,QAASC,EAAQA,EAAOD,QAASF,GAG/DG,EAAOE,GAAI,EAGJF,EAAOD,QAKfF,EAAoBQ,EAAIF,EAGxBN,EAAoBS,EAAIV,EAGxBC,EAAoBU,EAAI,SAASR,EAASS,EAAMC,GAC3CZ,EAAoBa,EAAEX,EAASS,IAClCG,OAAOC,eAAeb,EAASS,EAAM,CAAEK,YAAY,EAAMC,IAAKL,KAKhEZ,EAAoBkB,EAAI,SAAShB,GACX,oBAAXiB,QAA0BA,OAAOC,aAC1CN,OAAOC,eAAeb,EAASiB,OAAOC,YAAa,CAAEC,MAAO,WAE7DP,OAAOC,eAAeb,EAAS,aAAc,CAAEmB,OAAO,KAQvDrB,EAAoBsB,EAAI,SAASD,EAAOE,GAEvC,GADU,EAAPA,IAAUF,EAAQrB,EAAoBqB,IAC/B,EAAPE,EAAU,OAAOF,EACpB,GAAW,EAAPE,GAA8B,iBAAVF,GAAsBA,GAASA,EAAMG,WAAY,OAAOH,EAChF,IAAII,EAAKX,OAAOY,OAAO,MAGvB,GAFA1B,EAAoBkB,EAAEO,GACtBX,OAAOC,eAAeU,EAAI,UAAW,CAAET,YAAY,EAAMK,MAAOA,IACtD,EAAPE,GAA4B,iBAATF,EAAmB,IAAI,IAAIM,KAAON,EAAOrB,EAAoBU,EAAEe,EAAIE,EAAK,SAASA,GAAO,OAAON,EAAMM,IAAQC,KAAK,KAAMD,IAC9I,OAAOF,GAIRzB,EAAoB6B,EAAI,SAAS1B,GAChC,IAAIS,EAAST,GAAUA,EAAOqB,WAC7B,WAAwB,OAAOrB,EAAgB,SAC/C,WAA8B,OAAOA,GAEtC,OADAH,EAAoBU,EAAEE,EAAQ,IAAKA,GAC5BA,GAIRZ,EAAoBa,EAAI,SAASiB,EAAQC,GAAY,OAAOjB,OAAOkB,UAAUC,eAAe1B,KAAKuB,EAAQC,IAGzG/B,EAAoBkC,EAAI,GAIjBlC,EAAoBA,EAAoBmC,EAAI,K,oBClFrDC,QAAO,SAAUC,GAIfA,EAAEC,QAAQC,GAAG,UAAU,WAErB,IAAMC,EAAUH,EAAE,WAEbG,EAAQC,QAEbJ,EAAE,qBAAqBG,EAAQE,SAASC,IARN,GAQ0C,WAAa,eAAe","file":"js/modules/scrolling-navbar.min.js","sourcesContent":[" \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n \t\t}\n \t};\n\n \t// define __esModule on exports\n \t__webpack_require__.r = function(exports) {\n \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n \t\t}\n \t\tObject.defineProperty(exports, '__esModule', { value: true });\n \t};\n\n \t// create a fake namespace object\n \t// mode & 1: value is a module id, require it\n \t// mode & 2: merge all properties of value into the ns\n \t// mode & 4: return value when already ns object\n \t// mode & 8|1: behave like require\n \t__webpack_require__.t = function(value, mode) {\n \t\tif(mode & 1) value = __webpack_require__(value);\n \t\tif(mode & 8) return value;\n \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n \t\tvar ns = Object.create(null);\n \t\t__webpack_require__.r(ns);\n \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n \t\treturn ns;\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = 133);\n","jQuery(function ($) {\r\n\r\n const SCROLLING_NAVBAR_OFFSET_TOP = 50;\r\n\r\n $(window).on('scroll', () => {\r\n\r\n const $navbar = $('.navbar');\r\n \r\n if (!$navbar.length) return;\r\n\r\n $('.scrolling-navbar')[$navbar.offset().top > SCROLLING_NAVBAR_OFFSET_TOP ? 'addClass' : 'removeClass']('top-nav-collapse');\r\n });\r\n});\r\n"],"sourceRoot":""} -------------------------------------------------------------------------------- /CTF/static/css/svg-with-js.min.css: -------------------------------------------------------------------------------- 1 | /*! 2 | * Font Awesome Free 5.11.2 by @fontawesome - https://fontawesome.com 3 | * License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) 4 | */ 5 | .svg-inline--fa,svg:not(:root).svg-inline--fa{overflow:visible}.svg-inline--fa{display:inline-block;font-size:inherit;height:1em;vertical-align:-.125em}.svg-inline--fa.fa-lg{vertical-align:-.225em}.svg-inline--fa.fa-w-1{width:.0625em}.svg-inline--fa.fa-w-2{width:.125em}.svg-inline--fa.fa-w-3{width:.1875em}.svg-inline--fa.fa-w-4{width:.25em}.svg-inline--fa.fa-w-5{width:.3125em}.svg-inline--fa.fa-w-6{width:.375em}.svg-inline--fa.fa-w-7{width:.4375em}.svg-inline--fa.fa-w-8{width:.5em}.svg-inline--fa.fa-w-9{width:.5625em}.svg-inline--fa.fa-w-10{width:.625em}.svg-inline--fa.fa-w-11{width:.6875em}.svg-inline--fa.fa-w-12{width:.75em}.svg-inline--fa.fa-w-13{width:.8125em}.svg-inline--fa.fa-w-14{width:.875em}.svg-inline--fa.fa-w-15{width:.9375em}.svg-inline--fa.fa-w-16{width:1em}.svg-inline--fa.fa-w-17{width:1.0625em}.svg-inline--fa.fa-w-18{width:1.125em}.svg-inline--fa.fa-w-19{width:1.1875em}.svg-inline--fa.fa-w-20{width:1.25em}.svg-inline--fa.fa-pull-left{margin-right:.3em;width:auto}.svg-inline--fa.fa-pull-right{margin-left:.3em;width:auto}.svg-inline--fa.fa-border{height:1.5em}.svg-inline--fa.fa-li{width:2em}.svg-inline--fa.fa-fw{width:1.25em}.fa-layers svg.svg-inline--fa{bottom:0;left:0;margin:auto;position:absolute;right:0;top:0}.fa-layers{display:inline-block;height:1em;position:relative;text-align:center;vertical-align:-.125em;width:1em}.fa-layers svg.svg-inline--fa{-webkit-transform-origin:center center;transform-origin:center center}.fa-layers-counter,.fa-layers-text{display:inline-block;position:absolute;text-align:center}.fa-layers-text{left:50%;top:50%;-webkit-transform:translate(-50%,-50%);transform:translate(-50%,-50%);-webkit-transform-origin:center center;transform-origin:center center}.fa-layers-counter{background-color:#ff253a;border-radius:1em;-webkit-box-sizing:border-box;box-sizing:border-box;color:#fff;height:1.5em;line-height:1;max-width:5em;min-width:1.5em;overflow:hidden;padding:.25em;right:0;text-overflow:ellipsis;top:0;-webkit-transform:scale(.25);transform:scale(.25);-webkit-transform-origin:top right;transform-origin:top right}.fa-layers-bottom-right{bottom:0;right:0;top:auto;-webkit-transform:scale(.25);transform:scale(.25);-webkit-transform-origin:bottom right;transform-origin:bottom right}.fa-layers-bottom-left{bottom:0;left:0;right:auto;top:auto;-webkit-transform:scale(.25);transform:scale(.25);-webkit-transform-origin:bottom left;transform-origin:bottom left}.fa-layers-top-right{right:0;top:0;-webkit-transform:scale(.25);transform:scale(.25);-webkit-transform-origin:top right;transform-origin:top right}.fa-layers-top-left{left:0;right:auto;top:0;-webkit-transform:scale(.25);transform:scale(.25);-webkit-transform-origin:top left;transform-origin:top left}.fa-lg{font-size:1.33333em;line-height:.75em;vertical-align:-.0667em}.fa-xs{font-size:.75em}.fa-sm{font-size:.875em}.fa-1x{font-size:1em}.fa-2x{font-size:2em}.fa-3x{font-size:3em}.fa-4x{font-size:4em}.fa-5x{font-size:5em}.fa-6x{font-size:6em}.fa-7x{font-size:7em}.fa-8x{font-size:8em}.fa-9x{font-size:9em}.fa-10x{font-size:10em}.fa-fw{text-align:center;width:1.25em}.fa-ul{list-style-type:none;margin-left:2.5em;padding-left:0}.fa-ul>li{position:relative}.fa-li{left:-2em;position:absolute;text-align:center;width:2em;line-height:inherit}.fa-border{border:.08em solid #eee;border-radius:.1em;padding:.2em .25em .15em}.fa-pull-left{float:left}.fa-pull-right{float:right}.fa.fa-pull-left,.fab.fa-pull-left,.fal.fa-pull-left,.far.fa-pull-left,.fas.fa-pull-left{margin-right:.3em}.fa.fa-pull-right,.fab.fa-pull-right,.fal.fa-pull-right,.far.fa-pull-right,.fas.fa-pull-right{margin-left:.3em}.fa-spin{-webkit-animation:fa-spin 2s linear infinite;animation:fa-spin 2s linear infinite}.fa-pulse{-webkit-animation:fa-spin 1s steps(8) infinite;animation:fa-spin 1s steps(8) infinite}@-webkit-keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}to{-webkit-transform:rotate(1turn);transform:rotate(1turn)}}@keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}to{-webkit-transform:rotate(1turn);transform:rotate(1turn)}}.fa-rotate-90{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=1)";-webkit-transform:rotate(90deg);transform:rotate(90deg)}.fa-rotate-180{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2)";-webkit-transform:rotate(180deg);transform:rotate(180deg)}.fa-rotate-270{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=3)";-webkit-transform:rotate(270deg);transform:rotate(270deg)}.fa-flip-horizontal{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1)";-webkit-transform:scaleX(-1);transform:scaleX(-1)}.fa-flip-vertical{-webkit-transform:scaleY(-1);transform:scaleY(-1)}.fa-flip-both,.fa-flip-horizontal.fa-flip-vertical,.fa-flip-vertical{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)"}.fa-flip-both,.fa-flip-horizontal.fa-flip-vertical{-webkit-transform:scale(-1);transform:scale(-1)}:root .fa-flip-both,:root .fa-flip-horizontal,:root .fa-flip-vertical,:root .fa-rotate-90,:root .fa-rotate-180,:root .fa-rotate-270{-webkit-filter:none;filter:none}.fa-stack{display:inline-block;height:2em;position:relative;width:2.5em}.fa-stack-1x,.fa-stack-2x{bottom:0;left:0;margin:auto;position:absolute;right:0;top:0}.svg-inline--fa.fa-stack-1x{height:1em;width:1.25em}.svg-inline--fa.fa-stack-2x{height:2em;width:2.5em}.fa-inverse{color:#fff}.sr-only{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.sr-only-focusable:active,.sr-only-focusable:focus{clip:auto;height:auto;margin:0;overflow:visible;position:static;width:auto}.svg-inline--fa .fa-primary{fill:var(--fa-primary-color,currentColor);opacity:1;opacity:var(--fa-primary-opacity,1)}.svg-inline--fa .fa-secondary{fill:var(--fa-secondary-color,currentColor)}.svg-inline--fa .fa-secondary,.svg-inline--fa.fa-swap-opacity .fa-primary{opacity:.4;opacity:var(--fa-secondary-opacity,.4)}.svg-inline--fa.fa-swap-opacity .fa-secondary{opacity:1;opacity:var(--fa-primary-opacity,1)}.svg-inline--fa mask .fa-primary,.svg-inline--fa mask .fa-secondary{fill:#000}.fad.fa-inverse{color:#fff} -------------------------------------------------------------------------------- /CTF/static/css/svg-with-js.css: -------------------------------------------------------------------------------- 1 | /*! 2 | * Font Awesome Free 5.11.2 by @fontawesome - https://fontawesome.com 3 | * License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) 4 | */ 5 | svg:not(:root).svg-inline--fa { 6 | overflow: visible; } 7 | 8 | .svg-inline--fa { 9 | display: inline-block; 10 | font-size: inherit; 11 | height: 1em; 12 | overflow: visible; 13 | vertical-align: -.125em; } 14 | .svg-inline--fa.fa-lg { 15 | vertical-align: -.225em; } 16 | .svg-inline--fa.fa-w-1 { 17 | width: 0.0625em; } 18 | .svg-inline--fa.fa-w-2 { 19 | width: 0.125em; } 20 | .svg-inline--fa.fa-w-3 { 21 | width: 0.1875em; } 22 | .svg-inline--fa.fa-w-4 { 23 | width: 0.25em; } 24 | .svg-inline--fa.fa-w-5 { 25 | width: 0.3125em; } 26 | .svg-inline--fa.fa-w-6 { 27 | width: 0.375em; } 28 | .svg-inline--fa.fa-w-7 { 29 | width: 0.4375em; } 30 | .svg-inline--fa.fa-w-8 { 31 | width: 0.5em; } 32 | .svg-inline--fa.fa-w-9 { 33 | width: 0.5625em; } 34 | .svg-inline--fa.fa-w-10 { 35 | width: 0.625em; } 36 | .svg-inline--fa.fa-w-11 { 37 | width: 0.6875em; } 38 | .svg-inline--fa.fa-w-12 { 39 | width: 0.75em; } 40 | .svg-inline--fa.fa-w-13 { 41 | width: 0.8125em; } 42 | .svg-inline--fa.fa-w-14 { 43 | width: 0.875em; } 44 | .svg-inline--fa.fa-w-15 { 45 | width: 0.9375em; } 46 | .svg-inline--fa.fa-w-16 { 47 | width: 1em; } 48 | .svg-inline--fa.fa-w-17 { 49 | width: 1.0625em; } 50 | .svg-inline--fa.fa-w-18 { 51 | width: 1.125em; } 52 | .svg-inline--fa.fa-w-19 { 53 | width: 1.1875em; } 54 | .svg-inline--fa.fa-w-20 { 55 | width: 1.25em; } 56 | .svg-inline--fa.fa-pull-left { 57 | margin-right: .3em; 58 | width: auto; } 59 | .svg-inline--fa.fa-pull-right { 60 | margin-left: .3em; 61 | width: auto; } 62 | .svg-inline--fa.fa-border { 63 | height: 1.5em; } 64 | .svg-inline--fa.fa-li { 65 | width: 2em; } 66 | .svg-inline--fa.fa-fw { 67 | width: 1.25em; } 68 | 69 | .fa-layers svg.svg-inline--fa { 70 | bottom: 0; 71 | left: 0; 72 | margin: auto; 73 | position: absolute; 74 | right: 0; 75 | top: 0; } 76 | 77 | .fa-layers { 78 | display: inline-block; 79 | height: 1em; 80 | position: relative; 81 | text-align: center; 82 | vertical-align: -.125em; 83 | width: 1em; } 84 | .fa-layers svg.svg-inline--fa { 85 | -webkit-transform-origin: center center; 86 | transform-origin: center center; } 87 | 88 | .fa-layers-text, .fa-layers-counter { 89 | display: inline-block; 90 | position: absolute; 91 | text-align: center; } 92 | 93 | .fa-layers-text { 94 | left: 50%; 95 | top: 50%; 96 | -webkit-transform: translate(-50%, -50%); 97 | transform: translate(-50%, -50%); 98 | -webkit-transform-origin: center center; 99 | transform-origin: center center; } 100 | 101 | .fa-layers-counter { 102 | background-color: #ff253a; 103 | border-radius: 1em; 104 | -webkit-box-sizing: border-box; 105 | box-sizing: border-box; 106 | color: #fff; 107 | height: 1.5em; 108 | line-height: 1; 109 | max-width: 5em; 110 | min-width: 1.5em; 111 | overflow: hidden; 112 | padding: .25em; 113 | right: 0; 114 | text-overflow: ellipsis; 115 | top: 0; 116 | -webkit-transform: scale(0.25); 117 | transform: scale(0.25); 118 | -webkit-transform-origin: top right; 119 | transform-origin: top right; } 120 | 121 | .fa-layers-bottom-right { 122 | bottom: 0; 123 | right: 0; 124 | top: auto; 125 | -webkit-transform: scale(0.25); 126 | transform: scale(0.25); 127 | -webkit-transform-origin: bottom right; 128 | transform-origin: bottom right; } 129 | 130 | .fa-layers-bottom-left { 131 | bottom: 0; 132 | left: 0; 133 | right: auto; 134 | top: auto; 135 | -webkit-transform: scale(0.25); 136 | transform: scale(0.25); 137 | -webkit-transform-origin: bottom left; 138 | transform-origin: bottom left; } 139 | 140 | .fa-layers-top-right { 141 | right: 0; 142 | top: 0; 143 | -webkit-transform: scale(0.25); 144 | transform: scale(0.25); 145 | -webkit-transform-origin: top right; 146 | transform-origin: top right; } 147 | 148 | .fa-layers-top-left { 149 | left: 0; 150 | right: auto; 151 | top: 0; 152 | -webkit-transform: scale(0.25); 153 | transform: scale(0.25); 154 | -webkit-transform-origin: top left; 155 | transform-origin: top left; } 156 | 157 | .fa-lg { 158 | font-size: 1.33333em; 159 | line-height: 0.75em; 160 | vertical-align: -.0667em; } 161 | 162 | .fa-xs { 163 | font-size: .75em; } 164 | 165 | .fa-sm { 166 | font-size: .875em; } 167 | 168 | .fa-1x { 169 | font-size: 1em; } 170 | 171 | .fa-2x { 172 | font-size: 2em; } 173 | 174 | .fa-3x { 175 | font-size: 3em; } 176 | 177 | .fa-4x { 178 | font-size: 4em; } 179 | 180 | .fa-5x { 181 | font-size: 5em; } 182 | 183 | .fa-6x { 184 | font-size: 6em; } 185 | 186 | .fa-7x { 187 | font-size: 7em; } 188 | 189 | .fa-8x { 190 | font-size: 8em; } 191 | 192 | .fa-9x { 193 | font-size: 9em; } 194 | 195 | .fa-10x { 196 | font-size: 10em; } 197 | 198 | .fa-fw { 199 | text-align: center; 200 | width: 1.25em; } 201 | 202 | .fa-ul { 203 | list-style-type: none; 204 | margin-left: 2.5em; 205 | padding-left: 0; } 206 | .fa-ul > li { 207 | position: relative; } 208 | 209 | .fa-li { 210 | left: -2em; 211 | position: absolute; 212 | text-align: center; 213 | width: 2em; 214 | line-height: inherit; } 215 | 216 | .fa-border { 217 | border: solid 0.08em #eee; 218 | border-radius: .1em; 219 | padding: .2em .25em .15em; } 220 | 221 | .fa-pull-left { 222 | float: left; } 223 | 224 | .fa-pull-right { 225 | float: right; } 226 | 227 | .fa.fa-pull-left, 228 | .fas.fa-pull-left, 229 | .far.fa-pull-left, 230 | .fal.fa-pull-left, 231 | .fab.fa-pull-left { 232 | margin-right: .3em; } 233 | 234 | .fa.fa-pull-right, 235 | .fas.fa-pull-right, 236 | .far.fa-pull-right, 237 | .fal.fa-pull-right, 238 | .fab.fa-pull-right { 239 | margin-left: .3em; } 240 | 241 | .fa-spin { 242 | -webkit-animation: fa-spin 2s infinite linear; 243 | animation: fa-spin 2s infinite linear; } 244 | 245 | .fa-pulse { 246 | -webkit-animation: fa-spin 1s infinite steps(8); 247 | animation: fa-spin 1s infinite steps(8); } 248 | 249 | @-webkit-keyframes fa-spin { 250 | 0% { 251 | -webkit-transform: rotate(0deg); 252 | transform: rotate(0deg); } 253 | 100% { 254 | -webkit-transform: rotate(360deg); 255 | transform: rotate(360deg); } } 256 | 257 | @keyframes fa-spin { 258 | 0% { 259 | -webkit-transform: rotate(0deg); 260 | transform: rotate(0deg); } 261 | 100% { 262 | -webkit-transform: rotate(360deg); 263 | transform: rotate(360deg); } } 264 | 265 | .fa-rotate-90 { 266 | -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=1)"; 267 | -webkit-transform: rotate(90deg); 268 | transform: rotate(90deg); } 269 | 270 | .fa-rotate-180 { 271 | -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=2)"; 272 | -webkit-transform: rotate(180deg); 273 | transform: rotate(180deg); } 274 | 275 | .fa-rotate-270 { 276 | -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=3)"; 277 | -webkit-transform: rotate(270deg); 278 | transform: rotate(270deg); } 279 | 280 | .fa-flip-horizontal { 281 | -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1)"; 282 | -webkit-transform: scale(-1, 1); 283 | transform: scale(-1, 1); } 284 | 285 | .fa-flip-vertical { 286 | -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)"; 287 | -webkit-transform: scale(1, -1); 288 | transform: scale(1, -1); } 289 | 290 | .fa-flip-both, .fa-flip-horizontal.fa-flip-vertical { 291 | -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)"; 292 | -webkit-transform: scale(-1, -1); 293 | transform: scale(-1, -1); } 294 | 295 | :root .fa-rotate-90, 296 | :root .fa-rotate-180, 297 | :root .fa-rotate-270, 298 | :root .fa-flip-horizontal, 299 | :root .fa-flip-vertical, 300 | :root .fa-flip-both { 301 | -webkit-filter: none; 302 | filter: none; } 303 | 304 | .fa-stack { 305 | display: inline-block; 306 | height: 2em; 307 | position: relative; 308 | width: 2.5em; } 309 | 310 | .fa-stack-1x, 311 | .fa-stack-2x { 312 | bottom: 0; 313 | left: 0; 314 | margin: auto; 315 | position: absolute; 316 | right: 0; 317 | top: 0; } 318 | 319 | .svg-inline--fa.fa-stack-1x { 320 | height: 1em; 321 | width: 1.25em; } 322 | 323 | .svg-inline--fa.fa-stack-2x { 324 | height: 2em; 325 | width: 2.5em; } 326 | 327 | .fa-inverse { 328 | color: #fff; } 329 | 330 | .sr-only { 331 | border: 0; 332 | clip: rect(0, 0, 0, 0); 333 | height: 1px; 334 | margin: -1px; 335 | overflow: hidden; 336 | padding: 0; 337 | position: absolute; 338 | width: 1px; } 339 | 340 | .sr-only-focusable:active, .sr-only-focusable:focus { 341 | clip: auto; 342 | height: auto; 343 | margin: 0; 344 | overflow: visible; 345 | position: static; 346 | width: auto; } 347 | 348 | .svg-inline--fa .fa-primary { 349 | fill: var(--fa-primary-color, currentColor); 350 | opacity: 1; 351 | opacity: var(--fa-primary-opacity, 1); } 352 | 353 | .svg-inline--fa .fa-secondary { 354 | fill: var(--fa-secondary-color, currentColor); 355 | opacity: 0.4; 356 | opacity: var(--fa-secondary-opacity, 0.4); } 357 | 358 | .svg-inline--fa.fa-swap-opacity .fa-primary { 359 | opacity: 0.4; 360 | opacity: var(--fa-secondary-opacity, 0.4); } 361 | 362 | .svg-inline--fa.fa-swap-opacity .fa-secondary { 363 | opacity: 1; 364 | opacity: var(--fa-primary-opacity, 1); } 365 | 366 | .svg-inline--fa mask .fa-primary, 367 | .svg-inline--fa mask .fa-secondary { 368 | fill: black; } 369 | 370 | .fad.fa-inverse { 371 | color: #fff; } 372 | -------------------------------------------------------------------------------- /CTF/static/js/addons/rating.min.js: -------------------------------------------------------------------------------- 1 | !function(t){var n={};function r(e){if(n[e])return n[e].exports;var o=n[e]={i:e,l:!1,exports:{}};return t[e].call(o.exports,o,o.exports,r),o.l=!0,o.exports}r.m=t,r.c=n,r.d=function(t,n,e){r.o(t,n)||Object.defineProperty(t,n,{enumerable:!0,get:e})},r.r=function(t){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(t,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(t,"__esModule",{value:!0})},r.t=function(t,n){if(1&n&&(t=r(t)),8&n)return t;if(4&n&&"object"==typeof t&&t&&t.__esModule)return t;var e=Object.create(null);if(r.r(e),Object.defineProperty(e,"default",{enumerable:!0,value:t}),2&n&&"string"!=typeof t)for(var o in t)r.d(e,o,function(n){return t[n]}.bind(null,o));return e},r.n=function(t){var n=t&&t.__esModule?function(){return t.default}:function(){return t};return r.d(n,"a",n),n},r.o=function(t,n){return Object.prototype.hasOwnProperty.call(t,n)},r.p="",r(r.s=221)}({0:function(t,n,r){(function(n){var r=function(t){return t&&t.Math==Math&&t};t.exports=r("object"==typeof globalThis&&globalThis)||r("object"==typeof window&&window)||r("object"==typeof self&&self)||r("object"==typeof n&&n)||Function("return this")()}).call(this,r(57))},1:function(t,n){t.exports=function(t){try{return!!t()}catch(t){return!0}}},10:function(t,n,r){var e=r(32),o=r(13);t.exports=function(t){return e(o(t))}},100:function(t,n,r){"use strict";var e=r(3),o=r(1),a=r(30),i=r(5),u=r(16),c=r(11),f=r(58),s=r(47),l=r(34),p=r(2)("isConcatSpreadable"),v=!o((function(){var t=[];return t[p]=!1,t.concat()[0]!==t})),d=l("concat"),y=function(t){if(!i(t))return!1;var n=t[p];return void 0!==n?!!n:a(t)};e({target:"Array",proto:!0,forced:!v||!d},{concat:function(t){var n,r,e,o,a,i=u(this),l=s(i,0),p=0;for(n=-1,e=arguments.length;n9007199254740991)throw TypeError("Maximum allowed index exceeded");for(r=0;r=9007199254740991)throw TypeError("Maximum allowed index exceeded");f(l,p++,a)}return l.length=p,l}})},11:function(t,n,r){var e=r(12),o=Math.min;t.exports=function(t){return t>0?o(e(t),9007199254740991):0}},12:function(t,n){var r=Math.ceil,e=Math.floor;t.exports=function(t){return isNaN(t=+t)?0:(t>0?e:r)(t)}},13:function(t,n){t.exports=function(t){if(null==t)throw TypeError("Can't call method on "+t);return t}},14:function(t,n,r){var e=r(0),o=r(15),a=r(6),i=r(4),u=r(21),c=r(36),f=r(22),s=f.get,l=f.enforce,p=String(c).split("toString");o("inspectSource",(function(t){return c.call(t)})),(t.exports=function(t,n,r,o){var c=!!o&&!!o.unsafe,f=!!o&&!!o.enumerable,s=!!o&&!!o.noTargetGet;"function"==typeof r&&("string"!=typeof n||i(r,"name")||a(r,"name",n),l(r).source=p.join("string"==typeof n?n:"")),t!==e?(c?!s&&t[n]&&(f=!0):delete t[n],f?t[n]=r:a(t,n,r)):f?t[n]=r:u(n,r)})(Function.prototype,"toString",(function(){return"function"==typeof this&&s(this).source||c.call(this)}))},15:function(t,n,r){var e=r(26),o=r(59);(t.exports=function(t,n){return o[t]||(o[t]=void 0!==n?n:{})})("versions",[]).push({version:"3.3.2",mode:e?"pure":"global",copyright:"© 2019 Denis Pushkarev (zloirock.ru)"})},16:function(t,n,r){var e=r(13);t.exports=function(t){return Object(e(t))}},17:function(t,n){t.exports=function(t,n){return{enumerable:!(1&t),configurable:!(2&t),writable:!(4&t),value:n}}},18:function(t,n){var r={}.toString;t.exports=function(t){return r.call(t).slice(8,-1)}},19:function(t,n,r){var e=r(5);t.exports=function(t,n){if(!e(t))return t;var r,o;if(n&&"function"==typeof(r=t.toString)&&!e(o=r.call(t)))return o;if("function"==typeof(r=t.valueOf)&&!e(o=r.call(t)))return o;if(!n&&"function"==typeof(r=t.toString)&&!e(o=r.call(t)))return o;throw TypeError("Can't convert object to primitive value")}},2:function(t,n,r){var e=r(0),o=r(15),a=r(28),i=r(46),u=e.Symbol,c=o("wks");t.exports=function(t){return c[t]||(c[t]=i&&u[t]||(i?u:a)("Symbol."+t))}},20:function(t,n){t.exports={}},21:function(t,n,r){var e=r(0),o=r(6);t.exports=function(t,n){try{o(e,t,n)}catch(r){e[t]=n}return n}},22:function(t,n,r){var e,o,a,i=r(60),u=r(0),c=r(5),f=r(6),s=r(4),l=r(23),p=r(20),v=u.WeakMap;if(i){var d=new v,y=d.get,b=d.has,h=d.set;e=function(t,n){return h.call(d,t,n),n},o=function(t){return y.call(d,t)||{}},a=function(t){return b.call(d,t)}}else{var g=l("state");p[g]=!0,e=function(t,n){return f(t,g,n),n},o=function(t){return s(t,g)?t[g]:{}},a=function(t){return s(t,g)}}t.exports={set:e,get:o,has:a,enforce:function(t){return a(t)?o(t):e(t,{})},getterFor:function(t){return function(n){var r;if(!c(n)||(r=o(n)).type!==t)throw TypeError("Incompatible receiver, "+t+" required");return r}}}},221:function(t,n,r){r(222),t.exports=r(223)},222:function(t,n,r){"use strict";r.r(n);var e;r(100);(e=jQuery).fn.mdbRate=function(){var t,n=e.fn.tooltip.Constructor.Default.whiteList;n.textarea=[],n.button=[];for(var r=e(this),o=["Very bad","Poor","OK","Good","Excellent"],a=0;a<5;a++)r.append(''));t=r.children(),r.hasClass("rating-faces")?t.addClass("far fa-meh-blank"):r.hasClass("empty-stars")?t.addClass("far fa-star"):t.addClass("fas fa-star"),t.on("mouseover",(function(){!function(n){t.parent().hasClass("rating-faces")&&t.addClass("fa-meh-blank"),r.hasClass("empty-stars")&&t.removeClass("fas"),t.removeClass("fa-angry fa-frown fa-meh fa-smile fa-laugh live oneStar twoStars threeStars fourStars fiveStars amber-text");for(var o=0;o<=n;o++)if(r.hasClass("rating-faces"))switch(e(t.get(o)).removeClass("fa-meh-blank"),e(t.get(o)).addClass("live"),n){case"0":e(t.get(o)).addClass("fa-angry");break;case"1":e(t.get(o)).addClass("fa-frown");break;case"2":e(t.get(o)).addClass("fa-meh");break;case"3":e(t.get(o)).addClass("fa-smile");break;case"4":e(t.get(o)).addClass("fa-laugh")}else if(r.hasClass("empty-stars"))switch(e(t.get(o)).addClass("fas"),n){case"0":e(t.get(o)).addClass("oneStar");break;case"1":e(t.get(o)).addClass("twoStars");break;case"2":e(t.get(o)).addClass("threeStars");break;case"3":e(t.get(o)).addClass("fourStars");break;case"4":e(t.get(o)).addClass("fiveStars")}else e(t.get(o)).addClass("amber-text")}(e(this).attr("data-index"))})),t.on("click",(function(){t.popover("hide")})),r.on("click","#voteSubmitButton",(function(){t.popover("hide")})),r.on("click","#closePopoverButton",(function(){t.popover("hide")})),r.hasClass("feedback")&&e((function(){t.popover({container:r,content:'
'})})),t.tooltip()}},223:function(t,n,r){},23:function(t,n,r){var e=r(15),o=r(28),a=e("keys");t.exports=function(t){return a[t]||(a[t]=o(t))}},24:function(t,n,r){var e=r(8),o=r(42),a=r(17),i=r(10),u=r(19),c=r(4),f=r(35),s=Object.getOwnPropertyDescriptor;n.f=e?s:function(t,n){if(t=i(t),n=u(n,!0),f)try{return s(t,n)}catch(t){}if(c(t,n))return a(!o.f.call(t,n),t[n])}},26:function(t,n){t.exports=!1},27:function(t,n,r){var e=r(39),o=r(29).concat("length","prototype");n.f=Object.getOwnPropertyNames||function(t){return e(t,o)}},28:function(t,n){var r=0,e=Math.random();t.exports=function(t){return"Symbol("+String(void 0===t?"":t)+")_"+(++r+e).toString(36)}},29:function(t,n){t.exports=["constructor","hasOwnProperty","isPrototypeOf","propertyIsEnumerable","toLocaleString","toString","valueOf"]},3:function(t,n,r){var e=r(0),o=r(24).f,a=r(6),i=r(14),u=r(21),c=r(43),f=r(50);t.exports=function(t,n){var r,s,l,p,v,d=t.target,y=t.global,b=t.stat;if(r=y?e:b?e[d]||u(d,{}):(e[d]||{}).prototype)for(s in n){if(p=n[s],l=t.noTargetGet?(v=o(r,s))&&v.value:r[s],!f(y?s:d+(b?".":"#")+s,t.forced)&&void 0!==l){if(typeof p==typeof l)continue;c(p,l)}(t.sham||l&&l.sham)&&a(p,"sham",!0),i(r,s,p,t)}}},30:function(t,n,r){var e=r(18);t.exports=Array.isArray||function(t){return"Array"==e(t)}},31:function(t,n,r){var e=r(12),o=Math.max,a=Math.min;t.exports=function(t,n){var r=e(t);return r<0?o(r+n,0):a(r,n)}},32:function(t,n,r){var e=r(1),o=r(18),a="".split;t.exports=e((function(){return!Object("z").propertyIsEnumerable(0)}))?function(t){return"String"==o(t)?a.call(t,""):Object(t)}:Object},34:function(t,n,r){var e=r(1),o=r(2)("species");t.exports=function(t){return!e((function(){var n=[];return(n.constructor={})[o]=function(){return{foo:1}},1!==n[t](Boolean).foo}))}},35:function(t,n,r){var e=r(8),o=r(1),a=r(38);t.exports=!e&&!o((function(){return 7!=Object.defineProperty(a("div"),"a",{get:function(){return 7}}).a}))},36:function(t,n,r){var e=r(15);t.exports=e("native-function-to-string",Function.toString)},37:function(t,n,r){var e=r(44),o=r(0),a=function(t){return"function"==typeof t?t:void 0};t.exports=function(t,n){return arguments.length<2?a(e[t])||a(o[t]):e[t]&&e[t][n]||o[t]&&o[t][n]}},38:function(t,n,r){var e=r(0),o=r(5),a=e.document,i=o(a)&&o(a.createElement);t.exports=function(t){return i?a.createElement(t):{}}},39:function(t,n,r){var e=r(4),o=r(10),a=r(41).indexOf,i=r(20);t.exports=function(t,n){var r,u=o(t),c=0,f=[];for(r in u)!e(i,r)&&e(u,r)&&f.push(r);for(;n.length>c;)e(u,r=n[c++])&&(~a(f,r)||f.push(r));return f}},4:function(t,n){var r={}.hasOwnProperty;t.exports=function(t,n){return r.call(t,n)}},41:function(t,n,r){var e=r(10),o=r(11),a=r(31),i=function(t){return function(n,r,i){var u,c=e(n),f=o(c.length),s=a(i,f);if(t&&r!=r){for(;f>s;)if((u=c[s++])!=u)return!0}else for(;f>s;s++)if((t||s in c)&&c[s]===r)return t||s||0;return!t&&-1}};t.exports={includes:i(!0),indexOf:i(!1)}},42:function(t,n,r){"use strict";var e={}.propertyIsEnumerable,o=Object.getOwnPropertyDescriptor,a=o&&!e.call({1:2},1);n.f=a?function(t){var n=o(this,t);return!!n&&n.enumerable}:e},43:function(t,n,r){var e=r(4),o=r(61),a=r(24),i=r(9);t.exports=function(t,n){for(var r=o(n),u=i.f,c=a.f,f=0;f0?o(r(n),9007199254740991):0}},function(n,t){var e=Math.ceil,r=Math.floor;n.exports=function(n){return isNaN(n=+n)?0:(n>0?r:e)(n)}},function(n,t){n.exports=function(n){if(null==n)throw TypeError("Can't call method on "+n);return n}},function(n,t,e){var r=e(0),o=e(15),i=e(6),c=e(4),u=e(21),f=e(36),a=e(22),s=a.get,l=a.enforce,p=String(f).split("toString");o("inspectSource",(function(n){return f.call(n)})),(n.exports=function(n,t,e,o){var f=!!o&&!!o.unsafe,a=!!o&&!!o.enumerable,s=!!o&&!!o.noTargetGet;"function"==typeof e&&("string"!=typeof t||c(e,"name")||i(e,"name",t),l(e).source=p.join("string"==typeof t?t:"")),n!==r?(f?!s&&n[t]&&(a=!0):delete n[t],a?n[t]=e:i(n,t,e)):a?n[t]=e:u(t,e)})(Function.prototype,"toString",(function(){return"function"==typeof this&&s(this).source||f.call(this)}))},function(n,t,e){var r=e(26),o=e(59);(n.exports=function(n,t){return o[n]||(o[n]=void 0!==t?t:{})})("versions",[]).push({version:"3.3.2",mode:r?"pure":"global",copyright:"© 2019 Denis Pushkarev (zloirock.ru)"})},function(n,t,e){var r=e(13);n.exports=function(n){return Object(r(n))}},function(n,t){n.exports=function(n,t){return{enumerable:!(1&n),configurable:!(2&n),writable:!(4&n),value:t}}},function(n,t){var e={}.toString;n.exports=function(n){return e.call(n).slice(8,-1)}},function(n,t,e){var r=e(5);n.exports=function(n,t){if(!r(n))return n;var e,o;if(t&&"function"==typeof(e=n.toString)&&!r(o=e.call(n)))return o;if("function"==typeof(e=n.valueOf)&&!r(o=e.call(n)))return o;if(!t&&"function"==typeof(e=n.toString)&&!r(o=e.call(n)))return o;throw TypeError("Can't convert object to primitive value")}},function(n,t){n.exports={}},function(n,t,e){var r=e(0),o=e(6);n.exports=function(n,t){try{o(r,n,t)}catch(e){r[n]=t}return t}},function(n,t,e){var r,o,i,c=e(60),u=e(0),f=e(5),a=e(6),s=e(4),l=e(23),p=e(20),v=u.WeakMap;if(c){var d=new v,y=d.get,h=d.has,g=d.set;r=function(n,t){return g.call(d,n,t),t},o=function(n){return y.call(d,n)||{}},i=function(n){return h.call(d,n)}}else{var b=l("state");p[b]=!0,r=function(n,t){return a(n,b,t),t},o=function(n){return s(n,b)?n[b]:{}},i=function(n){return s(n,b)}}n.exports={set:r,get:o,has:i,enforce:function(n){return i(n)?o(n):r(n,{})},getterFor:function(n){return function(t){var e;if(!f(t)||(e=o(t)).type!==n)throw TypeError("Incompatible receiver, "+n+" required");return e}}}},function(n,t,e){var r=e(15),o=e(28),i=r("keys");n.exports=function(n){return i[n]||(i[n]=o(n))}},function(n,t,e){var r=e(8),o=e(42),i=e(17),c=e(10),u=e(19),f=e(4),a=e(35),s=Object.getOwnPropertyDescriptor;t.f=r?s:function(n,t){if(n=c(n),t=u(t,!0),a)try{return s(n,t)}catch(n){}if(f(n,t))return i(!o.f.call(n,t),n[t])}},function(n,t,e){var r=e(72),o=e(32),i=e(16),c=e(11),u=e(47),f=[].push,a=function(n){var t=1==n,e=2==n,a=3==n,s=4==n,l=6==n,p=5==n||l;return function(v,d,y,h){for(var g,b,m=i(v),x=o(m),w=r(d,y,3),O=c(x.length),j=0,C=h||u,S=t?C(v,O):e?C(v,0):void 0;O>j;j++)if((p||j in x)&&(b=w(g=x[j],j,m),n))if(t)S[j]=b;else if(b)switch(n){case 3:return!0;case 5:return g;case 6:return j;case 2:f.call(S,g)}else if(s)return!1;return l?-1:a||s?s:S}};n.exports={forEach:a(0),map:a(1),filter:a(2),some:a(3),every:a(4),find:a(5),findIndex:a(6)}},function(n,t){n.exports=!1},function(n,t,e){var r=e(39),o=e(29).concat("length","prototype");t.f=Object.getOwnPropertyNames||function(n){return r(n,o)}},function(n,t){var e=0,r=Math.random();n.exports=function(n){return"Symbol("+String(void 0===n?"":n)+")_"+(++e+r).toString(36)}},function(n,t){n.exports=["constructor","hasOwnProperty","isPrototypeOf","propertyIsEnumerable","toLocaleString","toString","valueOf"]},function(n,t,e){var r=e(18);n.exports=Array.isArray||function(n){return"Array"==r(n)}},function(n,t,e){var r=e(12),o=Math.max,i=Math.min;n.exports=function(n,t){var e=r(n);return e<0?o(e+t,0):i(e,t)}},function(n,t,e){var r=e(1),o=e(18),i="".split;n.exports=r((function(){return!Object("z").propertyIsEnumerable(0)}))?function(n){return"String"==o(n)?i.call(n,""):Object(n)}:Object},function(n,t,e){var r=e(7),o=e(76),i=e(29),c=e(20),u=e(77),f=e(38),a=e(23)("IE_PROTO"),s=function(){},l=function(){var n,t=f("iframe"),e=i.length;for(t.style.display="none",u.appendChild(t),t.src=String("javascript:"),(n=t.contentWindow.document).open(),n.write("