Commit 68b94e1b authored by chenty's avatar chenty

Finished modification for final upload.

parent 729e6730
The MIT License (MIT)
Copyright (c) 2020 SBofGaySchoolBuPaAnything
Copyright (c) 2020 cJMT team
Permission is hereby granted, free of charge, to any person obtaining a copy of
this software and associated documentation files (the "Software"), to deal in
......
# CJMT - Containerized Java Modeling Tools
# cJMT
## 整合步骤
CJMT is a distributed platform JMT task execution.
#### 1. 调整
This platform aims to provide a easy-deploy and easy-use system which organize and make full use of
a cluster of computers where JMT tasks can be executed parallel.
- hzj按照如下要求调整:
The system has the following features:
1. 将jinja模版开始与结束标志调整为[[与]]
1. 所有HTTP API的URL调整为/api/XXX
1. 使用pip3 freeze > requirements.txt命令将需要用到的第三方库导出。导出后进行检查,删去所有本项目用不到的库,仅保留本项目需要用到的库
1. 提交任务时,假设任务中的xml文件名称为XXX.jsimw(其实就是个xml),则Execute Command应为
```bash
java -cp /usr/local/bin/JMT-singlejar-1.0.4.jar jmt.commandline.Jmt sim XXX.jsimw -seed lwj给你的随机种子参数 -maxtime lwj给你的maxtime参数
cat XXX.jsimw-result.jsim
```
- jxy、lwj按照如下要求调整前端页面:
1. 将jinja模版开始与结束标志调整为[[与]]
1. 所有Ajax请求URL按照hzj调整好的HTTP API URL进行调整(/api/XXX)
1. 所有html文件放入webpage文件夹中,注意两人html文件名称不要冲突(提前商量好),直接放入webpage,不要放入子目录。首页命名为index.html
1. 所有静态文件放入webpage/res中,注意两人静态文件路径不要冲突(提前商量好)
1. 调整所有页面跳转的URL,如需跳转到webpage/XXX.html,URL应修改为XXX。如果需要跳转到webpage/index.html,URL应修改为./
1. 调整所有静态文件URL,如需访问webpage/res/XXX,URL应修改为res/XXX
- High availability: The system is robust and can tolerate failures of up to half of the nodes.
- Scalability: The system can be scaled up and down easily to reach a balance between performance and resources.
- lhs使用pip3 freeze > requirements.txt命令将需要用到的第三方库导出。导出后进行检查,删去所有本项目用不到的库,仅保留本项目需要用到的库
The system consists of three types of nodes, including Judicator (monitors the cluster, provides RPC interfaces and
maintain data), Executor (reports to Judicators and executes computing tasks) and Gateway (provides HTTP API and a
user-friendly website).
#### 2. 独立测试
The system is developed using Python language, and uses Etcd for clustering and service discovering, MongoDB with
replica set for data storage, Uwsgi for web server and Apache Thrift for RPC interfaces. The system is also designed to
work majorly in docker containerized environment.
- lwj、jxy测试方法:将Ajax注释掉,改为:console输出ajax的参数,检查是否符合约定格式;然后假设成功/失败,后端已返回对应数据,直接调用对应的
回调函数,传入(仿造后端返回数据)符合约定格式的参数
- hzj测试方法:Postman模拟浏览器进行Ajax访问
- lhs测试方法:直接向函数中传递(仿造lwj的请求数据)符合约定格式的参数,检查输出
- hzj、jxy按照约定的协议格式分别进行Ajax访问独立测试
- hzj、lwj按照约定的协议格式分别进行Ajax访问独立测试
- lwj、lhs按照约定的协议格式分别进行JMT XML转换功能独立测试
- hzj按照cty提供的HTTP API格式,检查是否能够发送符合格式的请求,并处理符返回数据(可使用cty在CSG VM上部署的集群测试)(这个你应该已经做过了……)
## Getting Started
#### 3. hzj、jxy代码整合与测试
The easiest way of getting and deploying the system is to use pre-built docker image from
[docker hub](https://hub.docker.com/repository/docker/comradestukov/cjmt).
- hzj建立一个webpage文件夹,将flask的template目录修改为该文件夹路径
- hzj在flask中加入以下view函数
```python
@app.route("/res/<path:path>", methods=["GET"])
def res(path):
return flask.send_from_directory(到webpage的路径 + "/res", path)
@app.route("/<path:page>", methods=["GET"])
def webpage(page):
return flask.render_template(page + ".html", **flask.request.args.to_dict(flat=True))
@app.route("/", methods=["GET"])
def index():
return flask.render_template("index.html", **flask.request.args)
```bash
CJMT='comradestukov/cjmt:v0.1'
docker pull $CJMT
```
- jxy将整合好的webpage文件夹发送给hzj,hzj将其与自己的webpage文件夹合并
- hzj在本地启动flask,测试整合后整个系统能否工作(最好两个人语音/视频一起测试),如有问题,由对应负责的大佬负责修改,然后继续测试,直到工作正常
Then, deploy the first Judicator.
#### 4. hzj、lwj、lhs代码整合与测试
```bash
CJMT='comradestukov/cjmt:v0.1'
IP=`ifconfig | grep -Eo 'inet (addr:)?([0-9]*\.){3}[0-9]*' | grep -Eo '([0-9]*\.){3}[0-9]*' | grep -v '127.0.0.1'`
docker container run -v /var/run/docker.sock:/var/run/docker.sock \
-p 2000:2000 -p 2001:2001 -p 3000:3000 -p 4000:4000 $CJMT judicator \
--docker-sock=unix:///var/run/docker.sock \
--boot-print-log \
--etcd-print-log \
--mongodb-print-log \
--main-print-log \
--etcd-cluster-init-independent \
--etcd-advertise-address=$IP \
--mongodb-advertise-address=$IP \
--main-advertise-address=$IP \
--etcd-advertise-peer-port=DOCKER \
--etcd-advertise-client-port=DOCKER \
--mongodb-advertise-port=DOCKER \
--main-advertise-port=DOCKER
```
- lhs将自己的python文件与requirements.txt发送给hzj,hzj修改对应的view函数,调用由lhs提供的JMT XML翻译函数,调用关系应为:
After the Judicator is stable, deploy a Gateway.
lwj <-- Ajax --> hzj <-- python import --> lhs
```bash
CJMT='comradestukov/cjmt:v0.1'
IP=`ifconfig | grep -Eo 'inet (addr:)?([0-9]*\.){3}[0-9]*' | grep -Eo '([0-9]*\.){3}[0-9]*' | grep -v '127.0.0.1'`
docker container run -v /var/run/docker.sock:/var/run/docker.sock \
-p 7000:7000 $CJMT gateway \
--docker-sock=unix:///var/run/docker.sock \
--boot-print-log \
--etcd-print-log \
--uwsgi-print-log \
--etcd-cluster-join-member-client=http://$IP:2001
```
- jxy将整合好的webpage文件夹发送给hzj,hzj将其与自己的webpage文件夹合并
- hzj在本地启动flask,测试整合后整个系统能否工作(最好三个人语音/视频一起测试),如有问题,由对应负责的大佬负责修改,然后继续测试,直到工作正常
- hzj在某个能够访问CSG VM的地方,用cty部署的集群测试整个系统是否能正常工作(最好四个人语音/视频一起测试)
You have to have at least one Executor to execute tasks.
**注意:部署的系统没有安装JMT,所有提交的任务肯定run failed……所以任务实际执行先不用测试……
建议hzj在请求任务结果的那部分mock一个fake的xml,来检查任务执行结果查看**
```bash
CJMT='comradestukov/cjmt:v0.1'
IP=`ifconfig | grep -Eo 'inet (addr:)?([0-9]*\.){3}[0-9]*' | grep -Eo '([0-9]*\.){3}[0-9]*' | grep -v '127.0.0.1'`
docker container run -v /var/run/docker.sock:/var/run/docker.sock $CJMT executor \
--docker-sock=unix:///var/run/docker.sock \
--boot-print-log \
--etcd-print-log \
--main-print-log \
--etcd-cluster-join-member-client=http://$IP:2001
```
#### **至此,除了JMT任务实际执行,整个系统其余部分应该都能够正常工作。**
You can have more Executors and Gateways using the commands above. If you wish to have more Judicators, use
the following commands.
#### 一定要保证能够正常工作!尤其是JMT XML转换的部分,一定要保证前端输入能够产生JMT能识别的XML;然后JMT输出的XML能够被前端显示!
```bash
CJMT='comradestukov/cjmt:v0.1'
IP=`ifconfig | grep -Eo 'inet (addr:)?([0-9]*\.){3}[0-9]*' | grep -Eo '([0-9]*\.){3}[0-9]*' | grep -v '127.0.0.1'`
docker container run -v /var/run/docker.sock:/var/run/docker.sock \
--expose 2000 \
--expose 2001 \
--expose 3000 \
--expose 4000 -P $CJMT judicator \
--docker-sock=unix:///var/run/docker.sock \
--boot-print-log \
--etcd-print-log \
--mongodb-print-log \
--main-print-log \
--etcd-cluster-join-member-client=http://$IP:2001 \
--etcd-advertise-address=$IP \
--mongodb-advertise-address=$IP \
--main-advertise-address=$IP \
--etcd-advertise-peer-port=DOCKER \
--etcd-advertise-client-port=DOCKER \
--mongodb-advertise-port=DOCKER \
--main-advertise-port=DOCKER
```
#### 5. hzj、cty代码整合与测试
## Next Steps
- hzj调整所有需要调用cty的HTTP API的地方,cty的HTTP API的URL改为request.url_root + "/api/XXX"
- hzj将自己的flask view函数部分添加至gateway/server.pyServer类的load_response_function中,并照葫芦画瓢做相应调整(如将app调整为self)
- hzj将自己的flask初始化部分(如数据库初始化等)添加至gateway/server.pyServer类的构造函数中,将最后清理部分添加至Server类的析构函数中,并做
相应调整
- hzj将lhs与自己其他辅助python文件放入utility中,并修改对应的import路径
- hzj将整合的webpage文件夹放入gateway中
- hzj将自己与lhs整合后的requirements.txt与提供的requirements.txt整合
- cty进行docker打包测试,测试整个系统的所有功能是否能够正常工作(最好五个人语音/视频一起测试)
Please view [documents index](document/README.md) to make learn more about the system.
#### 6. 文档撰写
## Acknowledgement
- jxy、lwj负责撰写usage.md
- 其余部分由cty撰写
- **License:** This program is published under [MIT License](LICENSE.txt).
- **Author:** cJMT Team
# T1 - CJMT
CJMT is a distributed platform prototype for general computing task execution.
This platform aims to provide a easy-deploy and easy-use system which organize and make full use of
a cluster of computers where general computing tasks on command line (e.g. program compiling, model simulation, numeric
computing) can be executed parallel.
The system has the following features:
- High availability: The system is robust and can tolerate failures of up to half of the nodes.
- Scalability: The system can be scaled up and down easily to reach a balance between performance and resources.
- Extensibility: The system provides HTTP API and is easy to extent.
The system consists of three types of nodes, including Judicator (monitors the cluster, provides RPC interfaces and
maintain data), Executor (reports to Judicators and executes computing tasks) and Gateway (provides HTTP API and a
user-friendly website).
The system is developed using Python language, and uses Etcd for clustering and service discovering, MongoDB with
replica set for data storage, Uwsgi for web server and Apache Thrift for RPC interfaces. The system is also designed to
work majorly in docker containerized environment.
## Getting Started
#### Deployment
The easiest way of getting and deploying the system is to use pre-built docker image from
[docker hub](https://hub.docker.com/repository/docker/comradestukov/cjmt).
```bash
CJMT='comradestukov/cjmt:v0.1'
docker pull $CJMT
```
Then, deploy the first Judicator.
```bash
CJMT='comradestukov/cjmt:v0.1'
IP=`ifconfig | grep -Eo 'inet (addr:)?([0-9]*\.){3}[0-9]*' | grep -Eo '([0-9]*\.){3}[0-9]*' | grep -v '127.0.0.1'`
docker container run -v /var/run/docker.sock:/var/run/docker.sock \
-p 2000:2000 -p 2001:2001 -p 3000:3000 -p 4000:4000 $CJMT judicator \
--docker-sock=unix:///var/run/docker.sock \
--boot-print-log \
--etcd-print-log \
--mongodb-print-log \
--main-print-log \
--etcd-cluster-init-independent \
--etcd-advertise-address=$IP \
--mongodb-advertise-address=$IP \
--main-advertise-address=$IP \
--etcd-advertise-peer-port=DOCKER \
--etcd-advertise-client-port=DOCKER \
--mongodb-advertise-port=DOCKER \
--main-advertise-port=DOCKER
```
After the Judicator is stable, deploy a Gateway.
```bash
CJMT='comradestukov/cjmt:v0.1'
IP=`ifconfig | grep -Eo 'inet (addr:)?([0-9]*\.){3}[0-9]*' | grep -Eo '([0-9]*\.){3}[0-9]*' | grep -v '127.0.0.1'`
docker container run -v /var/run/docker.sock:/var/run/docker.sock \
-p 7000:7000 $CJMT gateway \
--docker-sock=unix:///var/run/docker.sock \
--boot-print-log \
--etcd-print-log \
--uwsgi-print-log \
--etcd-cluster-join-member-client=http://$IP:2001
```
You have to have at least one Executor to execute tasks.
```bash
CJMT='comradestukov/cjmt:v0.1'
IP=`ifconfig | grep -Eo 'inet (addr:)?([0-9]*\.){3}[0-9]*' | grep -Eo '([0-9]*\.){3}[0-9]*' | grep -v '127.0.0.1'`
docker container run -v /var/run/docker.sock:/var/run/docker.sock $CJMT executor \
--docker-sock=unix:///var/run/docker.sock \
--boot-print-log \
--etcd-print-log \
--main-print-log \
--etcd-cluster-join-member-client=http://$IP:2001
```
You can have more Executors and Gateways using the commands above. If you wish to have more Judicators, use
the following commands.
```bash
CJMT='comradestukov/cjmt:v0.1'
IP=`ifconfig | grep -Eo 'inet (addr:)?([0-9]*\.){3}[0-9]*' | grep -Eo '([0-9]*\.){3}[0-9]*' | grep -v '127.0.0.1'`
docker container run -v /var/run/docker.sock:/var/run/docker.sock \
--expose 2000 \
--expose 2001 \
--expose 3000 \
--expose 4000 -P $CJMT judicator \
--docker-sock=unix:///var/run/docker.sock \
--boot-print-log \
--etcd-print-log \
--mongodb-print-log \
--main-print-log \
--etcd-cluster-join-member-client=http://$IP:2001 \
--etcd-advertise-address=$IP \
--mongodb-advertise-address=$IP \
--main-advertise-address=$IP \
--etcd-advertise-peer-port=DOCKER \
--etcd-advertise-client-port=DOCKER \
--mongodb-advertise-port=DOCKER \
--main-advertise-port=DOCKER
```
#### Usage
Now we can execute our first task.
Visit http://localhost:7000/ and get into the system. You will be redirected to the search page which should look
like the following (though there should be no tasks).
![Website View](document/img/task_search.png)
Choose STATUS - Executors to confirm there is at least one Executor running. Then, choose TASK - Add tab in the right
slide bar of the website.
Fill in the form with the following parameters (keep void if not specified).
- **User Id:** 0
- **Compile Source File Name:** main.cpp
- **Compile Source Text:**
```cpp
#include <iostream>
using namespace std;
char str[100];
int main()
{
cin.getline(str, 100);
cout << "From CJMT: " << str << endl;
return 0;
}
```
- **Compile Command:** g++ -g -Wall -o main main.cpp
- **Compile Timeout:** 10
- **Execute Input:** Hello World!
- **Execute Command:** ./main
- **Execute Timeout:** 1
Click Add button at the bottom of the pages, and wait for a few seconds on the task view page. The task should be
assigned and executed. Upon finishing execution, you should see results like the following.
![Execution Result](document/img/task_view.png)
## Next Steps
Please view [documents index](document/README.md) to make learn more about the system.
## Acknowledgement
- **License:** This program is published under [MIT License](LICENSE.txt).
- **Author:** SBofGaySchoolBuPaAnything *(Used Name: Eshttc_Cty, ComradeStukov)*
- **Contact:** Any bugs, issues, questions or suggestions please send to author's private email: 1532422769@qq.com,
or official college email: tc2819@ic.ac.uk, 15031211@buaa.edu.cn;
# -*- coding: utf-8 -*-
# The MIT License (MIT)
# Copyright (c) 2020 SBofGaySchoolBuPaAnything
# Copyright (c) 2020 cJMT team
#
# Permission is hereby granted, free of charge, to any person obtaining a copy
# of this software and associated documentation files (the "Software"), to deal
......
# -*- coding: utf-8 -*-
# The MIT License (MIT)
# Copyright (c) 2020 SBofGaySchoolBuPaAnything
# Copyright (c) 2020 cJMT team
#
# Permission is hereby granted, free of charge, to any person obtaining a copy
# of this software and associated documentation files (the "Software"), to deal
......
......@@ -134,7 +134,7 @@
<li><span class="icon fa-map-marker"></span> Imperial College London, South Kensington, London SW7 2AZ</li>
</ul>
<div class="copyright">
&copy; 2020 <a href="http://www.comradestukov.com">JMT online</a>.</strong> All rights
&copy; 2020 <a href="http://jmt.sourceforge.net">JMT online</a>.</strong> All rights
reserved.
</div>
</div>
......
......@@ -155,7 +155,7 @@
<li><span class="icon fa-map-marker"></span> Imperial College London, South Kensington, London SW7 2AZ</li>
</ul>
<div class="copyright">
&copy; 2020 <a href="http://www.comradestukov.com">JMT Online</a>.</strong> All rights
&copy; 2020 <a href="http://jmt.sourceforge.net">JMT Online</a>.</strong> All rights
reserved.
</div>
</div>
......
......@@ -12,5 +12,4 @@ This page is a index for all documents.
## Documents for Developers
- **[Architecture](architecture.md)**
- **[HTTP API](http_api.md)**
- **[Todo List](todo_list.md)**
......@@ -95,7 +95,7 @@ report, the Executor Main will collect all tasks, either completed or still runn
Judicators through RPC invoking. As response, the Judicator will send back two lists, including tasks which should be
deleted from the current Executor, and tasks newly assigned to the Executor. While corresponding tasks are deleted,
those assigned tasks will be stored, and for each of them, a new thread will be generated. The thread will take proper
actions and swarm subprocess to compile and execute the task as well as maintaining its data.
actions and swarm subprocess to execute the JMT task as well as maintaining its data.
The Executor processes relationship looks like the following.
......
......@@ -8,6 +8,7 @@ docker push comradestukov/cjmt:latest
#### Single container IP
```
IP=`ifconfig | grep -Eo 'inet (addr:)?([0-9]*\.){3}[0-9]*' | grep -Eo '([0-9]*\.){3}[0-9]*' | grep -v '127.0.0.1'`
IP=192.168.10.142
......
......@@ -4,7 +4,7 @@ This page contains todo list for the whole project.
## Short Term
- Modify author and copyright.
- None.
#### Finished / Canceled:
......@@ -17,6 +17,9 @@ usage section, change general computing task execution into JMT simulation, and
- Integrate all modules.
- Simple tests, including unit test for the backend and user test for the whole system.
- Deployment.
- Modify author and copyright.
- Modify the index and usage documents.
- Finally pack and deploy.
## Long Term
......
......@@ -2,41 +2,11 @@
This page introduces how to use the system to execute tasks through website.
*Same operations can be carried out through HTTP APIs. See [http_api.md](http_api.md) for details.*
## Principles and Directory structure
A task is described as a sequence of shell (bash) commands. It is divided into two parts: compile command and
execute command.
Upon running, compile command will be executed first, and then, if succeeded, execute command will be executed with
input stream redirected from provided execute input. Both compilation and execution output and error stream will be
recorded and later returned.
When task is executing, the working directory of the task looks like the following.
```
work directory
|
|---- data
| |
| |---- [files unzipped from execute data]
|
|---- compile.sh (compile command)
|
|---- execute.in (execute input)
|
|---- execute.sh (execute command)
|
|---- [files unzipped from compile source]
```
## Website view
The website looks like the following.
![Website View](img/task_search.png)
![Website View](img/view.png)
## Add Task
......@@ -44,21 +14,10 @@ Choose TASK - Add tab in the right slide bar of the website.
You have to fill in a form to describe the task.
- **User Id:** An int indicating the submitting user. It will only be used as a reference for later searching.
- **Compile Source:** The compile source zip file.
- **Compile Source File Name** and **Compile Source Text:** You can create a compile source zip file contains only one file
with name specified by Compile Source File Name and content by Compile Source Text. These should be both filled or
empty, and will be overwritten if Compile Source has been uploaded.
- **Compile Command:** Bash command for compilation.
- **Compile Timeout:** Timeout for compilation. 0 indicating unlimited compilation timeout.
- **Execute Input:** Input stream of execution.
- **Execute Data:** The execute data zip file.
- **Execute Data File Name** and **Execute Data Text:** You can create an execute data zip file contains only one file with
name specified by Execute Data File Name and content by Execute Data Text. These should be both filled or empty, and
will be overwritten if Execute Data has been uploaded.
- **Execute Command:** Bash command for execution.
- **Execute Timeout:** Timeout for execution. 0 indicating unlimited execution timeout.
- **Execution Standard:** Standard output of execution. It will only be used as a reference for checking execution result.
- **Model JSON/XML:** The model you want to solve, either in JSON or XML form.
- **Is JSON:** If the above model is in JSON form.
- **Random Seed:** The random seed parameter for JMT.
- **Max Time:** The max time parameter for JMT.
## Search Task, View Task and Cancel Task
......@@ -67,7 +26,6 @@ Choose TASK - Search tab in the right slide bar of the website.
You can search tasks with conditions:
- **Task Id**
- **User Id**
- **Start time (earliest time of task submission)**
- **End time (latest time of task submission)**
......
# -*- coding: utf-8 -*-
# The MIT License (MIT)
# Copyright (c) 2020 SBofGaySchoolBuPaAnything
# Copyright (c) 2020 cJMT team
#
# Permission is hereby granted, free of charge, to any person obtaining a copy
# of this software and associated documentation files (the "Software"), to deal
......
......@@ -2,7 +2,7 @@
# -*- coding: utf-8 -*-
# The MIT License (MIT)
# Copyright (c) 2020 SBofGaySchoolBuPaAnything
# Copyright (c) 2020 cJMT team
#
# Permission is hereby granted, free of charge, to any person obtaining a copy
# of this software and associated documentation files (the "Software"), to deal
......
......@@ -2,7 +2,7 @@
# -*- coding: utf-8 -*-
# The MIT License (MIT)
# Copyright (c) 2020 SBofGaySchoolBuPaAnything
# Copyright (c) 2020 cJMT team
#
# Permission is hereby granted, free of charge, to any person obtaining a copy
# of this software and associated documentation files (the "Software"), to deal
......
......@@ -2,7 +2,7 @@
# -*- coding: utf-8 -*-
# The MIT License (MIT)
# Copyright (c) 2020 SBofGaySchoolBuPaAnything
# Copyright (c) 2020 cJMT team
#
# Permission is hereby granted, free of charge, to any person obtaining a copy
# of this software and associated documentation files (the "Software"), to deal
......
# -*- coding: utf-8 -*-
# The MIT License (MIT)
# Copyright (c) 2020 SBofGaySchoolBuPaAnything
# Copyright (c) 2020 cJMT team
#
# Permission is hereby granted, free of charge, to any person obtaining a copy
# of this software and associated documentation files (the "Software"), to deal
......
......@@ -2,7 +2,7 @@
# -*- coding: utf-8 -*-
# The MIT License (MIT)
# Copyright (c) 2020 SBofGaySchoolBuPaAnything
# Copyright (c) 2020 cJMT team
#
# Permission is hereby granted, free of charge, to any person obtaining a copy
# of this software and associated documentation files (the "Software"), to deal
......
......@@ -2,7 +2,7 @@
# -*- coding: utf-8 -*-
# The MIT License (MIT)
# Copyright (c) 2020 SBofGaySchoolBuPaAnything
# Copyright (c) 2020 cJMT team
#
# Permission is hereby granted, free of charge, to any person obtaining a copy
# of this software and associated documentation files (the "Software"), to deal
......
# -*- coding: utf-8 -*-
# The MIT License (MIT)
# Copyright (c) 2020 SBofGaySchoolBuPaAnything
# Copyright (c) 2020 cJMT team
#
# Permission is hereby granted, free of charge, to any person obtaining a copy
# of this software and associated documentation files (the "Software"), to deal
......
......@@ -2,7 +2,7 @@
# -*- coding: utf-8 -*-
# The MIT License (MIT)
# Copyright (c) 2020 SBofGaySchoolBuPaAnything
# Copyright (c) 2020 cJMT team
#
# Permission is hereby granted, free of charge, to any person obtaining a copy
# of this software and associated documentation files (the "Software"), to deal
......
......@@ -129,12 +129,10 @@
<div class="Touch">
<h2>Get In Touch</h2>
<ul class="connect-us">
<li><span class="icon fa-phone"></span> <a href="#">(000) 000-0000</a></li>
<li><span class="icon fa-envelope"></span> <a href="#">information@untitled.tld</a></li>
<li><span class="icon fa-map-marker"></span> Imperial College London, South Kensington, London SW7 2AZ</li>
</ul>
<div class="copyright">
&copy; 2020 <a href="http://www.comradestukov.com">JMT online</a>.</strong> All rights
&copy; 2020 <a href="http://jmt.sourceforge.net">JMT online</a>.</strong> All rights
reserved.
</div>
</div>
......
......@@ -150,12 +150,10 @@
<div class="Touch">
<h2>Get In Touch</h2>
<ul class="connect-us">
<li><span class="icon fa-phone"></span> <a href="#">(000) 000-0000</a></li>
<li><span class="icon fa-envelope"></span> <a href="#">information@untitled.tld</a></li>
<li><span class="icon fa-map-marker"></span> Imperial College London, South Kensington, London SW7 2AZ</li>
</ul>
<div class="copyright">
&copy; 2020 <a href="http://www.comradestukov.com">JMT Online</a>.</strong> All rights
&copy; 2020 <a href="http://jmt.sourceforge.net">JMT Online</a>.</strong> All rights
reserved.
</div>
</div>
......
# -*- coding: utf-8 -*-
# The MIT License (MIT)
# Copyright (c) 2020 SBofGaySchoolBuPaAnything
# Copyright (c) 2020 cJMT team
#
# Permission is hereby granted, free of charge, to any person obtaining a copy
# of this software and associated documentation files (the "Software"), to deal
......
......@@ -2,7 +2,7 @@
# -*- coding: utf-8 -*-
# The MIT License (MIT)