From d52ceb803afbe66dde65e5d85e4aecb5545717f4 Mon Sep 17 00:00:00 2001
From: Pisces000221 <1786762946@qq.com>
Date: Sun, 3 Sep 2017 17:52:52 +0800
Subject: [PATCH 01/44] Add submission link on score & language display
---
views/submissions_item.ejs | 7 +++++--
1 file changed, 5 insertions(+), 2 deletions(-)
diff --git a/views/submissions_item.ejs b/views/submissions_item.ejs
index 1bdf133..01eff7b 100644
--- a/views/submissions_item.ejs
+++ b/views/submissions_item.ejs
@@ -55,14 +55,17 @@ Vue.component('submission-item', {
|
- {{ (data.result.score != null && data.result.score !== NaN) ? Math.floor(data.result.score) : '' }} |
+ {{ (data.result.score != null && data.result.score !== NaN) ? Math.floor(data.result.score) : '' }} |
{{ (data.result.time != null && data.result.time !== NaN) ? data.result.time.toString() + ' ms' : '' }} |
{{ (data.result.memory != null && data.result.memory !== NaN) ? data.result.memory.toString() + ' KiB' : '' }} |
| | |
- {{ data.info.language != null ? data.info.language + ' / ' : '' }}{{ data.info.codeSize }} |
+
+ {{ data.info.language }} /
+ {{ data.info.codeSize }}
+ |
{{ data.info.user }} |
{{ data.info.submitTime }} |
From 4ee5d201299f5973fd0bda19a3d877056cebadbb Mon Sep 17 00:00:00 2001
From: Pisces000221 <1786762946@qq.com>
Date: Sun, 3 Sep 2017 17:57:12 +0800
Subject: [PATCH 02/44] Silly bug, need to learn Vue again T^T
---
views/submissions_item.ejs | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/views/submissions_item.ejs b/views/submissions_item.ejs
index 01eff7b..977fc63 100644
--- a/views/submissions_item.ejs
+++ b/views/submissions_item.ejs
@@ -63,7 +63,7 @@ Vue.component('submission-item', {
|
- {{ data.info.language }} /
+ {{ data.info.language }} /
{{ data.info.codeSize }}
|
{{ data.info.user }} |
From 3fa5d25c786d508b736aa9823c158bd672478eb4 Mon Sep 17 00:00:00 2001
From: Pisces000221 <1786762946@qq.com>
Date: Fri, 3 Nov 2017 21:16:54 +0800
Subject: [PATCH 03/44] Fix score display on contest ranklist
---
views/contest_ranklist.ejs | 12 +++++++++---
1 file changed, 9 insertions(+), 3 deletions(-)
diff --git a/views/contest_ranklist.ejs b/views/contest_ranklist.ejs
index 60acede..a07877d 100644
--- a/views/contest_ranklist.ejs
+++ b/views/contest_ranklist.ejs
@@ -122,9 +122,15 @@
<% } else if (contest.type === 'noi' || contest.type === 'ioi') { %>
-
- <%= item.player.score_details[problem.id].score %>
-
+ <% if (item.player.score != null) { %>
+
+ <%= Math.round(item.player.score) %>
+
+ <% } else { %>
+
+ 0
+
+ <% } %>
<%= syzoj.utils.formatTime(item.player.score_details[problem.id].judge_state.submit_time - contest.start_time) %>
From a49cc50d9513305837f1e8a6b090870ff4a25a59 Mon Sep 17 00:00:00 2001
From: Pisces000221 <1786762946@qq.com>
Date: Fri, 3 Nov 2017 21:19:49 +0800
Subject: [PATCH 04/44] Wat
---
views/contest_ranklist.ejs | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/views/contest_ranklist.ejs b/views/contest_ranklist.ejs
index a07877d..a0841b7 100644
--- a/views/contest_ranklist.ejs
+++ b/views/contest_ranklist.ejs
@@ -122,9 +122,9 @@
<% } else if (contest.type === 'noi' || contest.type === 'ioi') { %>
- <% if (item.player.score != null) { %>
+ <% if (item.player.score_details[problem.id].score != null) { %>
- <%= Math.round(item.player.score) %>
+ <%= Math.round(item.player.score_details[problem.id].score) %>
<% } else { %>
From e3013997d2fcedf008ddaff53d3c26679cdfeeaf Mon Sep 17 00:00:00 2001
From: Pisces000221 <1786762946@qq.com>
Date: Sat, 4 Nov 2017 11:51:33 +0800
Subject: [PATCH 05/44] Fix ranklists of hidden contests accessible by URL
---
modules/contest.js | 5 +++--
1 file changed, 3 insertions(+), 2 deletions(-)
diff --git a/modules/contest.js b/modules/contest.js
index 8562f31..1be0702 100644
--- a/modules/contest.js
+++ b/modules/contest.js
@@ -131,7 +131,7 @@ app.get('/contest/:id', async (req, res) => {
let contest = await Contest.fromID(contest_id);
if (!contest) throw new ErrorMessage('无此比赛。');
- if (!contest.is_public && (!res.locals.user || !res.locals.user.is_admin)) throw new ErrorMessage('无此比赛。');
+ if (!contest.is_public && (!res.locals.user || !res.locals.user.is_admin)) throw new ErrorMessage('比赛未公开,请耐心等待 (´∀ `)');
const isSupervisior = await contest.isSupervisior(curUser);
contest.running = contest.isRunning();
@@ -232,6 +232,7 @@ app.get('/contest/:id/ranklist', async (req, res) => {
const curUser = res.locals.user;
if (!contest) throw new ErrorMessage('无此比赛。');
+ if (!contest.is_public && (!res.locals.user || !res.locals.user.is_admin)) throw new ErrorMessage('比赛未公开,请耐心等待 (´∀ `)');
if ([contest.allowedSeeingResult() && contest.allowedSeeingOthers(),
contest.isEnded(),
await contest.isSupervisior(curUser)].every(x => !x))
@@ -290,7 +291,7 @@ app.get('/contest/:id/submissions', async (req, res) => {
try {
let contest_id = parseInt(req.params.id);
let contest = await Contest.fromID(contest_id);
- if (!contest) throw new ErrorMessage('无此比赛。');
+ if (!contest.is_public && (!res.locals.user || !res.locals.user.is_admin)) throw new ErrorMessage('比赛未公开,请耐心等待 (´∀ `)');
if (contest.isEnded()) {
res.redirect(syzoj.utils.makeUrl(['submissions'], { contest: contest_id }));
From 8e24c7d7f1f1e67d435b0aa6e6645d51a2e4dd3a Mon Sep 17 00:00:00 2001
From: Pisces000221 <1786762946@qq.com>
Date: Sat, 4 Nov 2017 12:13:10 +0800
Subject: [PATCH 06/44] Fix subs of hidden contests accessible via URL
---
modules/submission.js | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/modules/submission.js b/modules/submission.js
index 2fe1aaa..51d4655 100644
--- a/modules/submission.js
+++ b/modules/submission.js
@@ -54,7 +54,7 @@ app.get('/submissions', async (req, res) => {
const contestId = Number(req.query.contest);
const contest = await Contest.fromID(contestId);
contest.ended = contest.isEnded();
- if (contest.ended || // If the contest is ended
+ if ((contest.ended && contest.is_public) || // If the contest is ended and is not hidden
(curUser && await contest.isSupervisior(curUser)) // Or if the user have the permission to check
) {
where.type = { $eq: 1 };
From ee17650f678b057e1735daf031024e60be059907 Mon Sep 17 00:00:00 2001
From: Pisces000221 <1786762946@qq.com>
Date: Sat, 4 Nov 2017 23:45:58 +0800
Subject: [PATCH 07/44] Fix able to view submission of hidden contests
---
modules/submission.js | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/modules/submission.js b/modules/submission.js
index 51d4655..01fdc7b 100644
--- a/modules/submission.js
+++ b/modules/submission.js
@@ -147,9 +147,9 @@ app.get('/submission/:id', async (req, res) => {
contest = await Contest.fromID(judge.type_info);
contest.ended = contest.isEnded();
- if (!contest.ended &&
+ if ((!contest.ended || !contest.is_public) &&
!(await judge.problem.isAllowedEditBy(res.locals.user) || await contest.isSupervisior(curUser))) {
- throw new Error("对不起,在比赛结束之前,您不能查看评测结果。");
+ throw new Error("比赛没有结束或者没有公开哦");
}
}
From 6559e1a8cd26ccad6d21ec8734f0aefda7167613 Mon Sep 17 00:00:00 2001
From: Ciel Zhao
Date: Mon, 6 Nov 2017 15:03:33 +0800
Subject: [PATCH 08/44] Fix typo
---
modules/contest.js | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/modules/contest.js b/modules/contest.js
index 1be0702..cc6d873 100644
--- a/modules/contest.js
+++ b/modules/contest.js
@@ -498,7 +498,7 @@ app.get('/contest/:id/:pid/download/additional_file', async (req, res) => {
let problem = await Problem.fromID(problem_id);
contest.ended = contest.isEnded();
- if (!(contest.isRunning() || contest.idEnded())) {
+ if (!(contest.isRunning() || contest.isEnded())) {
if (await problem.isAllowedUseBy(res.locals.user)) {
return res.redirect(syzoj.utils.makeUrl(['problem', problem_id, 'download', 'additional_file']));
}
From 227e678cf9db6ee4b3d6e2d458af069fc01b6737 Mon Sep 17 00:00:00 2001
From: Tian Yunhao
Date: Sun, 26 Nov 2017 11:27:20 +0800
Subject: [PATCH 09/44] Update judge_state.js
---
models/judge_state.js | 1 +
1 file changed, 1 insertion(+)
diff --git a/models/judge_state.js b/models/judge_state.js
index a5f546a..2fab9d0 100644
--- a/models/judge_state.js
+++ b/models/judge_state.js
@@ -194,6 +194,7 @@ class JudgeState extends Model {
this.status = 'Waiting';
await this.save();
} catch (err) {
+ console.log("Error while connecting to judge frontend: " + err.toString());
throw new ErrorMessage("无法开始评测。");
}
});
From e1365761a397914f24c72e919040a809bcd4d5a9 Mon Sep 17 00:00:00 2001
From: Pisces000221 <1786762946@qq.com>
Date: Thu, 30 Nov 2017 22:21:22 +0800
Subject: [PATCH 10/44] Fix cannot submit file when the editor is empty
---
views/problem.ejs | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/views/problem.ejs b/views/problem.ejs
index 00770e9..a511691 100644
--- a/views/problem.ejs
+++ b/views/problem.ejs
@@ -360,7 +360,7 @@ div[class*=ace_br] {
editor.renderer.updateFontSize();
function submit_code() {
- if (!editor.getValue().trim()) return false;
+ if (!$('#submit_code input[name=answer]').val().trim() && !editor.getValue().trim()) return false;
$('#submit_code input[name=language]').val($('#languages-menu .item.active').data('value'));
lastSubmitted = editor.getValue();
$('#submit_code input[name=code]').val(editor.getValue());
From 44e3bc2b4386ef7e4998708d35477f21b7577804 Mon Sep 17 00:00:00 2001
From: Pisces000221 <1786762946@qq.com>
Date: Thu, 28 Dec 2017 23:40:53 +0800
Subject: [PATCH 11/44] Hot fix for Hello 2018!
Quick and dirty, will refactor later > <
---
models/contest_ranklist.js | 10 ++++++++++
modules/contest.js | 21 ++++++++++++++++++---
views/contest_edit.ejs | 4 ++++
views/contest_ranklist.ejs | 4 ++--
4 files changed, 34 insertions(+), 5 deletions(-)
diff --git a/models/contest_ranklist.js b/models/contest_ranklist.js
index d8ea6b6..2689238 100644
--- a/models/contest_ranklist.js
+++ b/models/contest_ranklist.js
@@ -28,6 +28,7 @@ let ContestPlayer = syzoj.model('contest_player');
let model = db.define('contest_ranklist', {
id: { type: Sequelize.INTEGER, primaryKey: true, autoIncrement: true },
+ ranking_params: { type: Sequelize.TEXT, json: true },
ranklist: { type: Sequelize.TEXT, json: true }
}, {
timestamps: false,
@@ -38,6 +39,7 @@ let Model = require('./common');
class ContestRanklist extends Model {
static async create(val) {
return ContestRanklist.fromRecord(ContestRanklist.model.build(Object.assign({
+ ranking_params: '{}',
ranklist: '{}'
}, val)));
}
@@ -69,8 +71,16 @@ class ContestRanklist extends Model {
for (let player of players) {
player.latest = 0;
for (let i in player.score_details) {
+ player.score = 0;
+
let judge_state = await JudgeState.fromID(player.score_details[i].judge_id);
player.latest = Math.max(player.latest, judge_state.submit_time);
+
+ if (player.score_details[i].score != null) {
+ let multiplier = this.ranking_params[i] || 1.0;
+ player.score_details[i].weighted_score = Math.round(player.score_details[i].score * multiplier);
+ player.score += player.score_details[i].weighted_score;
+ }
}
}
diff --git a/modules/contest.js b/modules/contest.js
index 1be0702..a6bc59e 100644
--- a/modules/contest.js
+++ b/modules/contest.js
@@ -61,6 +61,8 @@ app.get('/contest/:id/edit', async (req, res) => {
if (!contest) {
contest = await Contest.create();
contest.id = 0;
+ } else {
+ await contest.loadRelationships();
}
let problems = [], admins = [];
@@ -86,20 +88,26 @@ app.post('/contest/:id/edit', async (req, res) => {
let contest_id = parseInt(req.params.id);
let contest = await Contest.fromID(contest_id);
+ let ranklist = null;
if (!contest) {
contest = await Contest.create();
contest.holder_id = res.locals.user.id;
- let ranklist = await ContestRanklist.create();
- await ranklist.save();
- contest.ranklist_id = ranklist.id;
+ ranklist = await ContestRanklist.create();
// Only new contest can be set type
if (!['noi', 'ioi', 'acm'].includes(req.body.type)) throw new ErrorMessage('无效的赛制。');
contest.type = req.body.type;
+ } else {
+ await contest.loadRelationships();
+ ranklist = contest.ranklist;
}
+ ranklist.ranking_params = JSON.parse(req.body.ranking_params);
+ await ranklist.save();
+ contest.ranklist_id = ranklist.id;
+
if (!req.body.title.trim()) throw new ErrorMessage('比赛名不能为空。');
contest.title = req.body.title;
contest.subtitle = req.body.subtitle;
@@ -247,6 +255,13 @@ app.get('/contest/:id/ranklist', async (req, res) => {
let player = await ContestPlayer.fromID(player_id);
for (let i in player.score_details) {
player.score_details[i].judge_state = await JudgeState.fromID(player.score_details[i].judge_id);
+
+ /*** XXX: Clumsy duplication, see ContestRanklist::updatePlayer() ***/
+ if (contest.type === 'noi' || contest.type === 'ioi') {
+ let multiplier = contest.ranklist.ranking_params[i] || 1.0;
+ player.score_details[i].weighted_score = player.score_details[i].score == null ? null : Math.round(player.score_details[i].score * multiplier);
+ player.score += player.score_details[i].weighted_score;
+ }
}
let user = await User.fromID(player.user_id);
diff --git a/views/contest_edit.ejs b/views/contest_edit.ejs
index e4fe124..86e8d06 100644
--- a/views/contest_edit.ejs
+++ b/views/contest_edit.ejs
@@ -47,6 +47,10 @@
+
+
+
+
diff --git a/views/contest_ranklist.ejs b/views/contest_ranklist.ejs
index a0841b7..40458dc 100644
--- a/views/contest_ranklist.ejs
+++ b/views/contest_ranklist.ejs
@@ -122,9 +122,9 @@
<% } else if (contest.type === 'noi' || contest.type === 'ioi') { %>
- <% if (item.player.score_details[problem.id].score != null) { %>
+ <% if (item.player.score_details[problem.id].weighted_score != null) { %>
- <%= Math.round(item.player.score_details[problem.id].score) %>
+ <%= Math.round(item.player.score_details[problem.id].weighted_score) %>
<% } else { %>
From 3460950fa7fe7ce971f5db6ef2412b721869e487 Mon Sep 17 00:00:00 2001
From: Pisces000221 <1786762946@qq.com>
Date: Fri, 29 Dec 2017 22:37:55 +0800
Subject: [PATCH 12/44] Hotfix
---
modules/contest.js | 5 +++++
1 file changed, 5 insertions(+)
diff --git a/modules/contest.js b/modules/contest.js
index a6bc59e..0ad9723 100644
--- a/modules/contest.js
+++ b/modules/contest.js
@@ -253,6 +253,11 @@ app.get('/contest/:id/ranklist', async (req, res) => {
let ranklist = await players_id.mapAsync(async player_id => {
let player = await ContestPlayer.fromID(player_id);
+
+ if (contest.type === 'noi' || contest.type === 'ioi') {
+ player.score = 0;
+ }
+
for (let i in player.score_details) {
player.score_details[i].judge_state = await JudgeState.fromID(player.score_details[i].judge_id);
From 5ec8eeb964a6282dbda5562960c5b647ca3547b7 Mon Sep 17 00:00:00 2001
From: Pisces000221 <1786762946@qq.com>
Date: Fri, 29 Dec 2017 22:44:16 +0800
Subject: [PATCH 13/44] Hotfix
---
views/contest_edit.ejs | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/views/contest_edit.ejs b/views/contest_edit.ejs
index 86e8d06..9162178 100644
--- a/views/contest_edit.ejs
+++ b/views/contest_edit.ejs
@@ -49,7 +49,7 @@
-
+
From c2ea6159422dc4a644faf51f1160dba29d37fae9 Mon Sep 17 00:00:00 2001
From: Pisces000221 <1786762946@qq.com>
Date: Fri, 29 Dec 2017 23:38:40 +0800
Subject: [PATCH 14/44] Hotfix, dumb mistake > <
---
models/contest_ranklist.js | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/models/contest_ranklist.js b/models/contest_ranklist.js
index 2689238..09970dd 100644
--- a/models/contest_ranklist.js
+++ b/models/contest_ranklist.js
@@ -70,9 +70,9 @@ class ContestRanklist extends Model {
if (contest.type === 'noi' || contest.type === 'ioi') {
for (let player of players) {
player.latest = 0;
- for (let i in player.score_details) {
- player.score = 0;
+ player.score = 0;
+ for (let i in player.score_details) {
let judge_state = await JudgeState.fromID(player.score_details[i].judge_id);
player.latest = Math.max(player.latest, judge_state.submit_time);
From 248ad699ab9d08828bbe17672776a7cb88d8ce3c Mon Sep 17 00:00:00 2001
From: Pisces000221 <1786762946@qq.com>
Date: Sun, 31 Dec 2017 14:12:43 +0800
Subject: [PATCH 15/44] Add score display in IOI contests
---
modules/contest.js | 3 +++
views/contest.ejs | 2 +-
2 files changed, 4 insertions(+), 1 deletion(-)
diff --git a/modules/contest.js b/modules/contest.js
index 0ad9723..2ac5101 100644
--- a/modules/contest.js
+++ b/modules/contest.js
@@ -176,6 +176,9 @@ app.get('/contest/:id', async (req, res) => {
let judge_state = await JudgeState.fromID(player.score_details[problem.problem.id].judge_id);
problem.status = judge_state.status;
problem.judge_id = player.score_details[problem.problem.id].judge_id;
+ await contest.loadRelationships();
+ let multiplier = contest.ranklist.ranking_params[problem.problem.id] || 1.0;
+ problem.feedback = (judge_state.score * multiplier).toString() + ' / ' + (100 * multiplier).toString();
}
} else if (contest.type === 'acm') {
if (player.score_details[problem.problem.id]) {
diff --git a/views/contest.ejs b/views/contest.ejs
index 2f8b4c1..8ee23a5 100644
--- a/views/contest.ejs
+++ b/views/contest.ejs
@@ -76,7 +76,7 @@
<% if (typeof problem.status === 'string') { %>
- <%= problem.status %>
+ <%= problem.feedback || problem.status %>
<% } else if (typeof problem.status === 'object') { %>
<% if (problem.status.accepted) { %>
From f1d96ded55d0416d888823331ac2ec2827a6e8b4 Mon Sep 17 00:00:00 2001
From: Menci
Date: Sat, 13 Jan 2018 00:16:05 +0800
Subject: [PATCH 16/44] Add -mx32 to C / C++ / C++11 compiler arguments
---
views/help.ejs | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/views/help.ejs b/views/help.ejs
index 7c26df1..72e7c54 100644
--- a/views/help.ejs
+++ b/views/help.ejs
@@ -5,8 +5,8 @@
- C++ 使用 g++
编译,命令为 g++ source_file.cpp -o exec_file -O2 -lm -DONLINE_JUDGE
;
-
C 使用 gcc
编译,命令为 gcc source_file.c -o exec_file -O2 -lm -DONLINE_JUDGE
;
+ C++ 使用 g++
编译,命令为 g++ source_file.cpp -o exec_file -O2 -lm -DONLINE_JUDGE -mx32
;
+
C 使用 gcc
编译,命令为 gcc source_file.c -o exec_file -O2 -lm -DONLINE_JUDGE -mx32
;
Pascal 使用 fpc
编译,命令为 fpc source_file.pas -O2
。
Java 编译时会自动检测您的代码中 public class
,如果您的代码中没有 public class
,请将入口类命名为 Main
。
C# 与 Visual Basic 使用 Mono 平台的编译器与运行环境。
From 52b5fef5b445fe744907ba8d6f1d32ca03103d74 Mon Sep 17 00:00:00 2001
From: Pisces000221 <1786762946@qq.com>
Date: Fri, 19 Jan 2018 10:36:50 +0800
Subject: [PATCH 17/44] Add reset code length subroutine
---
modules/admin.js | 6 ++++++
views/admin_other.ejs | 2 +-
2 files changed, 7 insertions(+), 1 deletion(-)
diff --git a/modules/admin.js b/modules/admin.js
index 72673b9..25c87a2 100644
--- a/modules/admin.js
+++ b/modules/admin.js
@@ -325,6 +325,12 @@ app.post('/admin/other', async (req, res) => {
for (const a of articles) {
await a.resetReplyCountAndTime();
}
+ } else if (req.body.type === 'reset_codelen') {
+ const submissions = await JudgeState.query();
+ for (const s of submissions) {
+ s.code_length = s.code.length;
+ await s.save();
+ }
} else {
throw new ErrorMessage("操作类型不正确");
}
diff --git a/views/admin_other.ejs b/views/admin_other.ejs
index d0b1ef6..e422dd0 100644
--- a/views/admin_other.ejs
+++ b/views/admin_other.ejs
@@ -3,6 +3,6 @@
<% include admin_footer %>
From bfad5f5fc0822d1b681e8d598d3012c2e3588e15 Mon Sep 17 00:00:00 2001
From: Pisces000221 <1786762946@qq.com>
Date: Fri, 19 Jan 2018 10:40:41 +0800
Subject: [PATCH 18/44] Fix output only code length miscalculated
---
modules/admin.js | 6 ++++--
1 file changed, 4 insertions(+), 2 deletions(-)
diff --git a/modules/admin.js b/modules/admin.js
index 25c87a2..54bfaa1 100644
--- a/modules/admin.js
+++ b/modules/admin.js
@@ -328,8 +328,10 @@ app.post('/admin/other', async (req, res) => {
} else if (req.body.type === 'reset_codelen') {
const submissions = await JudgeState.query();
for (const s of submissions) {
- s.code_length = s.code.length;
- await s.save();
+ if (s.type !== 'submit-answer') {
+ s.code_length = s.code.length;
+ await s.save();
+ }
}
} else {
throw new ErrorMessage("操作类型不正确");
From a8d7d86e01faa14fd612acc18f818718df3bff0c Mon Sep 17 00:00:00 2001
From: hewenyang
Date: Tue, 13 Feb 2018 15:46:01 +0800
Subject: [PATCH 19/44] Push run task to rabbitmq at web side
---
config-example.json | 3 +-
libs/judger.js | 41 +-
package-lock.json | 1316 ++++++++++++-------------------------------
package.json | 3 +
4 files changed, 405 insertions(+), 958 deletions(-)
diff --git a/config-example.json b/config-example.json
index 06d1a2a..c34c4f0 100644
--- a/config-example.json
+++ b/config-example.json
@@ -167,6 +167,7 @@
],
"session_secret": "233",
"judge_server_addr": "http://127.0.0.1:5284",
+ "rabbitMQ": "amqp://localhost/",
"judge_token": "233",
"email_jwt_secret": "test"
-}
\ No newline at end of file
+}
diff --git a/libs/judger.js b/libs/judger.js
index 638bbff..85b40e5 100644
--- a/libs/judger.js
+++ b/libs/judger.js
@@ -2,7 +2,33 @@ const enums = require('./enums'),
rp = require('request-promise'),
url = require('url');
+const amqp = require('amqplib');
const util = require('util');
+const winston = require('winston');
+const msgPack = require('msgpack-lite');
+
+let amqpConnection;
+let publicChannel;
+
+async function connect () {
+ amqpConnection = await amqp.connect(syzoj.config.rabbitMQ);
+ publicChannel = await amqpConnection.createChannel();
+ await publicChannel.assertQueue('judge', {
+ maxPriority: 5,
+ durable: true
+ });
+ await publicChannel.assertQueue('result', {
+ durable: true
+ });
+ await publicChannel.assertExchange('progress', 'fanout', {
+ durable: false
+ });
+ amqpConnection.on('error', (err) => {
+ winston.error('RabbitMQ connection failure: ${err.toString()}');
+ amqpConnection.close();
+ process.exit(1);
+ });
+}
module.exports.judge = async function (judge_state, problem, priority) {
let type, param, extraFile = null;
switch (problem.type) {
@@ -44,13 +70,8 @@ module.exports.judge = async function (judge_state, problem, priority) {
extraFileLocation: extraFile
};
- await rp(url.resolve(syzoj.config.judge_server_addr, "/daemon/task"), {
- method: 'PUT',
- body: req,
- headers: {
- Token: syzoj.config.judge_token
- },
- json: true,
- simple: true
- });
-}
\ No newline at end of file
+ // TODO: parse extraFileLocation
+ publicChannel.sendToQueue('judge', msgPack.encode({ content: req.content, extraData: null }), { priority: priority });
+}
+
+connect();
diff --git a/package-lock.json b/package-lock.json
index 71f98a6..41b2295 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -19,6 +19,11 @@
"resolved": "https://registry.npmjs.org/abab/-/abab-1.0.3.tgz",
"integrity": "sha1-uB3l9ydOxOdW15fNg08wNkJyTl0="
},
+ "abbrev": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz",
+ "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q=="
+ },
"accepts": {
"version": "1.3.3",
"resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.3.tgz",
@@ -61,6 +66,41 @@
"integrity": "sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU=",
"optional": true
},
+ "amqplib": {
+ "version": "0.5.2",
+ "resolved": "https://registry.npmjs.org/amqplib/-/amqplib-0.5.2.tgz",
+ "integrity": "sha512-l9mCs6LbydtHqRniRwYkKdqxVa6XMz3Vw1fh+2gJaaVgTM6Jk3o8RccAKWKtlhT1US5sWrFh+KKxsVUALURSIA==",
+ "requires": {
+ "bitsyntax": "0.0.4",
+ "bluebird": "3.5.0",
+ "buffer-more-ints": "0.0.2",
+ "readable-stream": "1.1.14",
+ "safe-buffer": "5.1.1"
+ },
+ "dependencies": {
+ "isarray": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz",
+ "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8="
+ },
+ "readable-stream": {
+ "version": "1.1.14",
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz",
+ "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=",
+ "requires": {
+ "core-util-is": "1.0.2",
+ "inherits": "2.0.3",
+ "isarray": "0.0.1",
+ "string_decoder": "0.10.31"
+ }
+ },
+ "string_decoder": {
+ "version": "0.10.31",
+ "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz",
+ "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ="
+ }
+ }
+ },
"ansi-regex": {
"version": "2.1.1",
"resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz",
@@ -79,6 +119,20 @@
"resolved": "https://registry.npmjs.org/append-field/-/append-field-0.1.0.tgz",
"integrity": "sha1-bdxY+gg8e8VF08WZWygwzCNm1Eo="
},
+ "aproba": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz",
+ "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw=="
+ },
+ "are-we-there-yet": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.4.tgz",
+ "integrity": "sha1-u13KOCu5TwXhUZQ3PRb9O6HKEQ0=",
+ "requires": {
+ "delegates": "1.0.0",
+ "readable-stream": "2.3.3"
+ }
+ },
"argparse": {
"version": "1.0.9",
"resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.9.tgz",
@@ -120,6 +174,11 @@
"resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-0.2.0.tgz",
"integrity": "sha1-104bh+ev/A24qttwIfP+SBAasjQ="
},
+ "async": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/async/-/async-1.0.0.tgz",
+ "integrity": "sha1-+PwEyjoTeErenhZBr5hXjPvWR6k="
+ },
"async-lock": {
"version": "0.3.10",
"resolved": "https://registry.npmjs.org/async-lock/-/async-lock-0.3.10.tgz",
@@ -148,6 +207,11 @@
"resolved": "https://registry.npmjs.org/bagpipe/-/bagpipe-0.3.5.tgz",
"integrity": "sha1-40HRZPyyTN8E6n4Ft2XsEMiupqE="
},
+ "balanced-match": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz",
+ "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c="
+ },
"base64-js": {
"version": "0.0.8",
"resolved": "https://registry.npmjs.org/base64-js/-/base64-js-0.0.8.tgz",
@@ -172,6 +236,14 @@
"resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-3.1.2.tgz",
"integrity": "sha1-8725mtUmihX8HwvtL7AY4mk/4jY="
},
+ "bitsyntax": {
+ "version": "0.0.4",
+ "resolved": "https://registry.npmjs.org/bitsyntax/-/bitsyntax-0.0.4.tgz",
+ "integrity": "sha1-6xDMb4K4xJDj6FaY8H6D1G4MuoI=",
+ "requires": {
+ "buffer-more-ints": "0.0.2"
+ }
+ },
"bl": {
"version": "1.2.1",
"resolved": "https://registry.npmjs.org/bl/-/bl-1.2.1.tgz",
@@ -180,6 +252,14 @@
"readable-stream": "2.3.3"
}
},
+ "block-stream": {
+ "version": "0.0.9",
+ "resolved": "https://registry.npmjs.org/block-stream/-/block-stream-0.0.9.tgz",
+ "integrity": "sha1-E+v+d4oDIFz+A3UUgeu0szAMEmo=",
+ "requires": {
+ "inherits": "2.0.3"
+ }
+ },
"bluebird": {
"version": "3.5.0",
"resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.0.tgz",
@@ -220,6 +300,15 @@
"hoek": "2.16.3"
}
},
+ "brace-expansion": {
+ "version": "1.1.11",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
+ "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
+ "requires": {
+ "balanced-match": "1.0.0",
+ "concat-map": "0.0.1"
+ }
+ },
"buffer": {
"version": "3.6.0",
"resolved": "https://registry.npmjs.org/buffer/-/buffer-3.6.0.tgz",
@@ -240,6 +329,11 @@
"resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz",
"integrity": "sha1-+OcRMvf/5uAaXJaXpMbz5I1cyBk="
},
+ "buffer-more-ints": {
+ "version": "0.0.2",
+ "resolved": "https://registry.npmjs.org/buffer-more-ints/-/buffer-more-ints-0.0.2.tgz",
+ "integrity": "sha1-JrOIXRD6E9t/wBquOquHAZngEkw="
+ },
"buildmail": {
"version": "3.10.0",
"resolved": "https://registry.npmjs.org/buildmail/-/buildmail-3.10.0.tgz",
@@ -369,6 +463,11 @@
"resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz",
"integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c="
},
+ "colors": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/colors/-/colors-1.0.3.tgz",
+ "integrity": "sha1-BDP0TYCWgP3rYO0mDxsMJi6CpAs="
+ },
"combined-stream": {
"version": "1.0.5",
"resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.5.tgz",
@@ -395,6 +494,11 @@
"graceful-readlink": "1.0.1"
}
},
+ "concat-map": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
+ "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s="
+ },
"concat-stream": {
"version": "1.6.0",
"resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.0.tgz",
@@ -405,6 +509,11 @@
"typedarray": "0.0.6"
}
},
+ "console-control-strings": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz",
+ "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4="
+ },
"content-disposition": {
"version": "0.5.2",
"resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.2.tgz",
@@ -556,6 +665,11 @@
}
}
},
+ "cycle": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/cycle/-/cycle-1.0.3.tgz",
+ "integrity": "sha1-IegLK+hYD5i0aPN5QwZisEbDStI="
+ },
"dashdash": {
"version": "1.14.1",
"resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz",
@@ -676,6 +790,11 @@
"resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
"integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk="
},
+ "delegates": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz",
+ "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o="
+ },
"depd": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/depd/-/depd-1.1.0.tgz",
@@ -686,6 +805,11 @@
"resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz",
"integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA="
},
+ "detect-libc": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz",
+ "integrity": "sha1-+hN8S9aY7fVc1c0CrFWfkaTEups="
+ },
"dicer": {
"version": "0.2.5",
"resolved": "https://registry.npmjs.org/dicer/-/dicer-0.2.5.tgz",
@@ -889,6 +1013,11 @@
"resolved": "https://registry.npmjs.org/etag/-/etag-1.8.0.tgz",
"integrity": "sha1-b2Ma7zNtbEY2K1F2QETOIWvjwFE="
},
+ "event-lite": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/event-lite/-/event-lite-0.1.1.tgz",
+ "integrity": "sha1-R88IqNN9C2lM23s7F7UfqsZXYIY="
+ },
"express": {
"version": "4.15.3",
"resolved": "https://registry.npmjs.org/express/-/express-4.15.3.tgz",
@@ -950,6 +1079,11 @@
"resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.0.2.tgz",
"integrity": "sha1-4QgOBljjALBilJkMxw4VAiNf1VA="
},
+ "eyes": {
+ "version": "0.1.8",
+ "resolved": "https://registry.npmjs.org/eyes/-/eyes-0.1.8.tgz",
+ "integrity": "sha1-Ys8SAjTGg3hdkCNIqADvPgzCC8A="
+ },
"fast-levenshtein": {
"version": "2.0.6",
"resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz",
@@ -1075,6 +1209,47 @@
}
}
},
+ "fs.realpath": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
+ "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8="
+ },
+ "fstream": {
+ "version": "1.0.11",
+ "resolved": "https://registry.npmjs.org/fstream/-/fstream-1.0.11.tgz",
+ "integrity": "sha1-XB+x8RdHcRTwYyoOtLcbPLD9MXE=",
+ "requires": {
+ "graceful-fs": "4.1.11",
+ "inherits": "2.0.3",
+ "mkdirp": "0.5.1",
+ "rimraf": "2.6.2"
+ }
+ },
+ "fstream-ignore": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/fstream-ignore/-/fstream-ignore-1.0.5.tgz",
+ "integrity": "sha1-nDHa40dnAY/h0kmyTa2mfQktoQU=",
+ "requires": {
+ "fstream": "1.0.11",
+ "inherits": "2.0.3",
+ "minimatch": "3.0.4"
+ }
+ },
+ "gauge": {
+ "version": "2.7.4",
+ "resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz",
+ "integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=",
+ "requires": {
+ "aproba": "1.2.0",
+ "console-control-strings": "1.1.0",
+ "has-unicode": "2.0.1",
+ "object-assign": "4.1.1",
+ "signal-exit": "3.0.2",
+ "string-width": "1.0.2",
+ "strip-ansi": "3.0.1",
+ "wide-align": "1.1.2"
+ }
+ },
"generic-pool": {
"version": "2.4.2",
"resolved": "https://registry.npmjs.org/generic-pool/-/generic-pool-2.4.2.tgz",
@@ -1113,6 +1288,19 @@
}
}
},
+ "glob": {
+ "version": "7.1.2",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz",
+ "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==",
+ "requires": {
+ "fs.realpath": "1.0.0",
+ "inflight": "1.0.6",
+ "inherits": "2.0.3",
+ "minimatch": "3.0.4",
+ "once": "1.4.0",
+ "path-is-absolute": "1.0.1"
+ }
+ },
"got": {
"version": "6.7.1",
"resolved": "https://registry.npmjs.org/got/-/got-6.7.1.tgz",
@@ -1166,6 +1354,11 @@
"har-schema": "1.0.5"
}
},
+ "has-unicode": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz",
+ "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk="
+ },
"hawk": {
"version": "3.1.3",
"resolved": "https://registry.npmjs.org/hawk/-/hawk-3.1.3.tgz",
@@ -1254,6 +1447,15 @@
"resolved": "https://registry.npmjs.org/inflection/-/inflection-1.12.0.tgz",
"integrity": "sha1-ogCTVlbW9fa8TcdQLhrstwMihBY="
},
+ "inflight": {
+ "version": "1.0.6",
+ "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
+ "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=",
+ "requires": {
+ "once": "1.4.0",
+ "wrappy": "1.0.2"
+ }
+ },
"inherits": {
"version": "2.0.3",
"resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
@@ -1264,6 +1466,11 @@
"resolved": "https://registry.npmjs.org/ini/-/ini-1.3.4.tgz",
"integrity": "sha1-BTfLedr1m1mhpRff9wbIbsA5Fi4="
},
+ "int64-buffer": {
+ "version": "0.1.10",
+ "resolved": "https://registry.npmjs.org/int64-buffer/-/int64-buffer-0.1.10.tgz",
+ "integrity": "sha1-J3siiofZWtd30HwTgyAiQGpHNCM="
+ },
"invert-kv": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz",
@@ -1367,7 +1574,14 @@
"integrity": "sha512-CbcG379L1e+mWBnLvHWWeLs8GyV/EMw862uLI3c+GxVyDHWZcjZinwuBd3iW2pgxgIlksW/1vNJa4to+RvDOww==",
"requires": {
"argparse": "1.0.9",
- "esprima": "2.7.3"
+ "esprima": "4.0.0"
+ },
+ "dependencies": {
+ "esprima": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.0.tgz",
+ "integrity": "sha512-oftTcaMu/EGrEIu904mWteKIv8vMuOgGYo7EhVJJN00R/EED9DCua/xxHRdYnKtcECzVg7xOWhflvJMnqcFZjw=="
+ }
}
},
"jsbn": {
@@ -1734,6 +1948,14 @@
"mime-db": "1.27.0"
}
},
+ "minimatch": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz",
+ "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==",
+ "requires": {
+ "brace-expansion": "1.1.11"
+ }
+ },
"minimist": {
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz",
@@ -1789,6 +2011,17 @@
"resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
"integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g="
},
+ "msgpack-lite": {
+ "version": "0.1.26",
+ "resolved": "https://registry.npmjs.org/msgpack-lite/-/msgpack-lite-0.1.26.tgz",
+ "integrity": "sha1-3TxQsm8FnyXn7e42REGDWOKprYk=",
+ "requires": {
+ "event-lite": "0.1.1",
+ "ieee754": "1.1.8",
+ "int64-buffer": "0.1.10",
+ "isarray": "1.0.0"
+ }
+ },
"multer": {
"version": "1.3.0",
"resolved": "https://registry.npmjs.org/multer/-/multer-1.3.0.tgz",
@@ -1863,6 +2096,24 @@
"win-spawn": "2.0.0"
}
},
+ "node-pre-gyp": {
+ "version": "0.6.39",
+ "resolved": "https://registry.npmjs.org/node-pre-gyp/-/node-pre-gyp-0.6.39.tgz",
+ "integrity": "sha512-OsJV74qxnvz/AMGgcfZoDaeDXKD3oY3QVIbBmwszTFkRisTSXbMQyn4UWzUMOtA5SVhrBZOTp0wcoSBgfMfMmQ==",
+ "requires": {
+ "detect-libc": "1.0.3",
+ "hawk": "3.1.3",
+ "mkdirp": "0.5.1",
+ "nopt": "4.0.1",
+ "npmlog": "4.1.2",
+ "rc": "1.2.1",
+ "request": "2.81.0",
+ "rimraf": "2.6.2",
+ "semver": "5.3.0",
+ "tar": "2.2.1",
+ "tar-pack": "3.4.1"
+ }
+ },
"nodemailer": {
"version": "4.1.0",
"resolved": "https://registry.npmjs.org/nodemailer/-/nodemailer-4.1.0.tgz",
@@ -1881,6 +2132,15 @@
"nodemailer-fetch": "1.6.0"
}
},
+ "nopt": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/nopt/-/nopt-4.0.1.tgz",
+ "integrity": "sha1-0NRoWv1UFRk8jHUFYC0NF81kR00=",
+ "requires": {
+ "abbrev": "1.1.1",
+ "osenv": "0.1.4"
+ }
+ },
"normalize-package-data": {
"version": "2.4.0",
"resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.4.0.tgz",
@@ -1892,6 +2152,17 @@
"validate-npm-package-license": "3.0.1"
}
},
+ "npmlog": {
+ "version": "4.1.2",
+ "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz",
+ "integrity": "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==",
+ "requires": {
+ "are-we-there-yet": "1.1.4",
+ "console-control-strings": "1.1.0",
+ "gauge": "2.7.4",
+ "set-blocking": "2.0.0"
+ }
+ },
"nth-check": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/nth-check/-/nth-check-1.0.1.tgz",
@@ -1959,6 +2230,11 @@
"wordwrap": "1.0.0"
}
},
+ "os-homedir": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz",
+ "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M="
+ },
"os-locale": {
"version": "1.4.0",
"resolved": "https://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz",
@@ -1972,6 +2248,15 @@
"resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz",
"integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ="
},
+ "osenv": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/osenv/-/osenv-0.1.4.tgz",
+ "integrity": "sha1-Qv5tWVPfBsgGS+bxdsPQWqqjRkQ=",
+ "requires": {
+ "os-homedir": "1.0.2",
+ "os-tmpdir": "1.0.2"
+ }
+ },
"parse-json": {
"version": "2.2.0",
"resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz",
@@ -2001,6 +2286,11 @@
"pinkie-promise": "2.0.1"
}
},
+ "path-is-absolute": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
+ "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18="
+ },
"path-to-regexp": {
"version": "0.1.7",
"resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz",
@@ -2399,6 +2689,14 @@
"debug": "2.6.7"
}
},
+ "rimraf": {
+ "version": "2.6.2",
+ "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.2.tgz",
+ "integrity": "sha512-lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w==",
+ "requires": {
+ "glob": "7.1.2"
+ }
+ },
"rndm": {
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/rndm/-/rndm-1.2.0.tgz",
@@ -2548,6 +2846,11 @@
"resolved": "https://registry.npmjs.org/shimmer/-/shimmer-1.1.0.tgz",
"integrity": "sha1-l9c3cTf/u6tCVSLkKf4KqJpIizU="
},
+ "signal-exit": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz",
+ "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0="
+ },
"slide": {
"version": "1.1.6",
"resolved": "https://registry.npmjs.org/slide/-/slide-1.1.6.tgz",
@@ -2610,944 +2913,7 @@
"integrity": "sha1-TLz5Zdi5AdGxAVy8f8QVquFX36o=",
"requires": {
"nan": "2.4.0",
- "node-pre-gyp": "0.6.31"
- },
- "dependencies": {
- "node-pre-gyp": {
- "version": "0.6.31",
- "bundled": true,
- "requires": {
- "mkdirp": "0.5.1",
- "nopt": "3.0.6",
- "npmlog": "4.0.0",
- "rc": "1.1.6",
- "request": "2.76.0",
- "rimraf": "2.5.4",
- "semver": "5.3.0",
- "tar": "2.2.1",
- "tar-pack": "3.3.0"
- },
- "dependencies": {
- "mkdirp": {
- "version": "0.5.1",
- "bundled": true,
- "requires": {
- "minimist": "0.0.8"
- },
- "dependencies": {
- "minimist": {
- "version": "0.0.8",
- "bundled": true
- }
- }
- },
- "nopt": {
- "version": "3.0.6",
- "bundled": true,
- "requires": {
- "abbrev": "1.0.9"
- },
- "dependencies": {
- "abbrev": {
- "version": "1.0.9",
- "bundled": true
- }
- }
- },
- "npmlog": {
- "version": "4.0.0",
- "bundled": true,
- "requires": {
- "are-we-there-yet": "1.1.2",
- "console-control-strings": "1.1.0",
- "gauge": "2.6.0",
- "set-blocking": "2.0.0"
- },
- "dependencies": {
- "are-we-there-yet": {
- "version": "1.1.2",
- "bundled": true,
- "requires": {
- "delegates": "1.0.0",
- "readable-stream": "2.1.5"
- },
- "dependencies": {
- "delegates": {
- "version": "1.0.0",
- "bundled": true
- },
- "readable-stream": {
- "version": "2.1.5",
- "bundled": true,
- "requires": {
- "buffer-shims": "1.0.0",
- "core-util-is": "1.0.2",
- "inherits": "2.0.3",
- "isarray": "1.0.0",
- "process-nextick-args": "1.0.7",
- "string_decoder": "0.10.31",
- "util-deprecate": "1.0.2"
- },
- "dependencies": {
- "buffer-shims": {
- "version": "1.0.0",
- "bundled": true
- },
- "core-util-is": {
- "version": "1.0.2",
- "bundled": true
- },
- "inherits": {
- "version": "2.0.3",
- "bundled": true
- },
- "isarray": {
- "version": "1.0.0",
- "bundled": true
- },
- "process-nextick-args": {
- "version": "1.0.7",
- "bundled": true
- },
- "string_decoder": {
- "version": "0.10.31",
- "bundled": true
- },
- "util-deprecate": {
- "version": "1.0.2",
- "bundled": true
- }
- }
- }
- }
- },
- "console-control-strings": {
- "version": "1.1.0",
- "bundled": true
- },
- "gauge": {
- "version": "2.6.0",
- "bundled": true,
- "requires": {
- "aproba": "1.0.4",
- "console-control-strings": "1.1.0",
- "has-color": "0.1.7",
- "has-unicode": "2.0.1",
- "object-assign": "4.1.0",
- "signal-exit": "3.0.1",
- "string-width": "1.0.2",
- "strip-ansi": "3.0.1",
- "wide-align": "1.1.0"
- },
- "dependencies": {
- "aproba": {
- "version": "1.0.4",
- "bundled": true
- },
- "has-color": {
- "version": "0.1.7",
- "bundled": true
- },
- "has-unicode": {
- "version": "2.0.1",
- "bundled": true
- },
- "object-assign": {
- "version": "4.1.0",
- "bundled": true
- },
- "signal-exit": {
- "version": "3.0.1",
- "bundled": true
- },
- "string-width": {
- "version": "1.0.2",
- "bundled": true,
- "requires": {
- "code-point-at": "1.0.1",
- "is-fullwidth-code-point": "1.0.0",
- "strip-ansi": "3.0.1"
- },
- "dependencies": {
- "code-point-at": {
- "version": "1.0.1",
- "bundled": true,
- "requires": {
- "number-is-nan": "1.0.1"
- },
- "dependencies": {
- "number-is-nan": {
- "version": "1.0.1",
- "bundled": true
- }
- }
- },
- "is-fullwidth-code-point": {
- "version": "1.0.0",
- "bundled": true,
- "requires": {
- "number-is-nan": "1.0.1"
- },
- "dependencies": {
- "number-is-nan": {
- "version": "1.0.1",
- "bundled": true
- }
- }
- }
- }
- },
- "strip-ansi": {
- "version": "3.0.1",
- "bundled": true,
- "requires": {
- "ansi-regex": "2.0.0"
- },
- "dependencies": {
- "ansi-regex": {
- "version": "2.0.0",
- "bundled": true
- }
- }
- },
- "wide-align": {
- "version": "1.1.0",
- "bundled": true,
- "requires": {
- "string-width": "1.0.2"
- }
- }
- }
- },
- "set-blocking": {
- "version": "2.0.0",
- "bundled": true
- }
- }
- },
- "rc": {
- "version": "1.1.6",
- "bundled": true,
- "requires": {
- "deep-extend": "0.4.1",
- "ini": "1.3.4",
- "minimist": "1.2.0",
- "strip-json-comments": "1.0.4"
- },
- "dependencies": {
- "deep-extend": {
- "version": "0.4.1",
- "bundled": true
- },
- "ini": {
- "version": "1.3.4",
- "bundled": true
- },
- "minimist": {
- "version": "1.2.0",
- "bundled": true
- },
- "strip-json-comments": {
- "version": "1.0.4",
- "bundled": true
- }
- }
- },
- "request": {
- "version": "2.76.0",
- "bundled": true,
- "requires": {
- "aws-sign2": "0.6.0",
- "aws4": "1.5.0",
- "caseless": "0.11.0",
- "combined-stream": "1.0.5",
- "extend": "3.0.0",
- "forever-agent": "0.6.1",
- "form-data": "2.1.1",
- "har-validator": "2.0.6",
- "hawk": "3.1.3",
- "http-signature": "1.1.1",
- "is-typedarray": "1.0.0",
- "isstream": "0.1.2",
- "json-stringify-safe": "5.0.1",
- "mime-types": "2.1.12",
- "node-uuid": "1.4.7",
- "oauth-sign": "0.8.2",
- "qs": "6.3.0",
- "stringstream": "0.0.5",
- "tough-cookie": "2.3.2",
- "tunnel-agent": "0.4.3"
- },
- "dependencies": {
- "aws-sign2": {
- "version": "0.6.0",
- "bundled": true
- },
- "aws4": {
- "version": "1.5.0",
- "bundled": true
- },
- "caseless": {
- "version": "0.11.0",
- "bundled": true
- },
- "combined-stream": {
- "version": "1.0.5",
- "bundled": true,
- "requires": {
- "delayed-stream": "1.0.0"
- },
- "dependencies": {
- "delayed-stream": {
- "version": "1.0.0",
- "bundled": true
- }
- }
- },
- "extend": {
- "version": "3.0.0",
- "bundled": true
- },
- "forever-agent": {
- "version": "0.6.1",
- "bundled": true
- },
- "form-data": {
- "version": "2.1.1",
- "bundled": true,
- "requires": {
- "asynckit": "0.4.0",
- "combined-stream": "1.0.5",
- "mime-types": "2.1.12"
- },
- "dependencies": {
- "asynckit": {
- "version": "0.4.0",
- "bundled": true
- }
- }
- },
- "har-validator": {
- "version": "2.0.6",
- "bundled": true,
- "requires": {
- "chalk": "1.1.3",
- "commander": "2.9.0",
- "is-my-json-valid": "2.15.0",
- "pinkie-promise": "2.0.1"
- },
- "dependencies": {
- "chalk": {
- "version": "1.1.3",
- "bundled": true,
- "requires": {
- "ansi-styles": "2.2.1",
- "escape-string-regexp": "1.0.5",
- "has-ansi": "2.0.0",
- "strip-ansi": "3.0.1",
- "supports-color": "2.0.0"
- },
- "dependencies": {
- "ansi-styles": {
- "version": "2.2.1",
- "bundled": true
- },
- "escape-string-regexp": {
- "version": "1.0.5",
- "bundled": true
- },
- "has-ansi": {
- "version": "2.0.0",
- "bundled": true,
- "requires": {
- "ansi-regex": "2.0.0"
- },
- "dependencies": {
- "ansi-regex": {
- "version": "2.0.0",
- "bundled": true
- }
- }
- },
- "strip-ansi": {
- "version": "3.0.1",
- "bundled": true,
- "requires": {
- "ansi-regex": "2.0.0"
- },
- "dependencies": {
- "ansi-regex": {
- "version": "2.0.0",
- "bundled": true
- }
- }
- },
- "supports-color": {
- "version": "2.0.0",
- "bundled": true
- }
- }
- },
- "commander": {
- "version": "2.9.0",
- "bundled": true,
- "requires": {
- "graceful-readlink": "1.0.1"
- },
- "dependencies": {
- "graceful-readlink": {
- "version": "1.0.1",
- "bundled": true
- }
- }
- },
- "is-my-json-valid": {
- "version": "2.15.0",
- "bundled": true,
- "requires": {
- "generate-function": "2.0.0",
- "generate-object-property": "1.2.0",
- "jsonpointer": "4.0.0",
- "xtend": "4.0.1"
- },
- "dependencies": {
- "generate-function": {
- "version": "2.0.0",
- "bundled": true
- },
- "generate-object-property": {
- "version": "1.2.0",
- "bundled": true,
- "requires": {
- "is-property": "1.0.2"
- },
- "dependencies": {
- "is-property": {
- "version": "1.0.2",
- "bundled": true
- }
- }
- },
- "jsonpointer": {
- "version": "4.0.0",
- "bundled": true
- },
- "xtend": {
- "version": "4.0.1",
- "bundled": true
- }
- }
- },
- "pinkie-promise": {
- "version": "2.0.1",
- "bundled": true,
- "requires": {
- "pinkie": "2.0.4"
- },
- "dependencies": {
- "pinkie": {
- "version": "2.0.4",
- "bundled": true
- }
- }
- }
- }
- },
- "hawk": {
- "version": "3.1.3",
- "bundled": true,
- "requires": {
- "boom": "2.10.1",
- "cryptiles": "2.0.5",
- "hoek": "2.16.3",
- "sntp": "1.0.9"
- },
- "dependencies": {
- "boom": {
- "version": "2.10.1",
- "bundled": true,
- "requires": {
- "hoek": "2.16.3"
- }
- },
- "cryptiles": {
- "version": "2.0.5",
- "bundled": true,
- "requires": {
- "boom": "2.10.1"
- }
- },
- "hoek": {
- "version": "2.16.3",
- "bundled": true
- },
- "sntp": {
- "version": "1.0.9",
- "bundled": true,
- "requires": {
- "hoek": "2.16.3"
- }
- }
- }
- },
- "http-signature": {
- "version": "1.1.1",
- "bundled": true,
- "requires": {
- "assert-plus": "0.2.0",
- "jsprim": "1.3.1",
- "sshpk": "1.10.1"
- },
- "dependencies": {
- "assert-plus": {
- "version": "0.2.0",
- "bundled": true
- },
- "jsprim": {
- "version": "1.3.1",
- "bundled": true,
- "requires": {
- "extsprintf": "1.0.2",
- "json-schema": "0.2.3",
- "verror": "1.3.6"
- },
- "dependencies": {
- "extsprintf": {
- "version": "1.0.2",
- "bundled": true
- },
- "json-schema": {
- "version": "0.2.3",
- "bundled": true
- },
- "verror": {
- "version": "1.3.6",
- "bundled": true,
- "requires": {
- "extsprintf": "1.0.2"
- }
- }
- }
- },
- "sshpk": {
- "version": "1.10.1",
- "bundled": true,
- "requires": {
- "asn1": "0.2.3",
- "assert-plus": "1.0.0",
- "bcrypt-pbkdf": "1.0.0",
- "dashdash": "1.14.0",
- "ecc-jsbn": "0.1.1",
- "getpass": "0.1.6",
- "jodid25519": "1.0.2",
- "jsbn": "0.1.0",
- "tweetnacl": "0.14.3"
- },
- "dependencies": {
- "asn1": {
- "version": "0.2.3",
- "bundled": true
- },
- "assert-plus": {
- "version": "1.0.0",
- "bundled": true
- },
- "bcrypt-pbkdf": {
- "version": "1.0.0",
- "bundled": true,
- "optional": true,
- "requires": {
- "tweetnacl": "0.14.3"
- }
- },
- "dashdash": {
- "version": "1.14.0",
- "bundled": true,
- "requires": {
- "assert-plus": "1.0.0"
- }
- },
- "ecc-jsbn": {
- "version": "0.1.1",
- "bundled": true,
- "optional": true,
- "requires": {
- "jsbn": "0.1.0"
- }
- },
- "getpass": {
- "version": "0.1.6",
- "bundled": true,
- "requires": {
- "assert-plus": "1.0.0"
- }
- },
- "jodid25519": {
- "version": "1.0.2",
- "bundled": true,
- "optional": true,
- "requires": {
- "jsbn": "0.1.0"
- }
- },
- "jsbn": {
- "version": "0.1.0",
- "bundled": true,
- "optional": true
- },
- "tweetnacl": {
- "version": "0.14.3",
- "bundled": true,
- "optional": true
- }
- }
- }
- }
- },
- "is-typedarray": {
- "version": "1.0.0",
- "bundled": true
- },
- "isstream": {
- "version": "0.1.2",
- "bundled": true
- },
- "json-stringify-safe": {
- "version": "5.0.1",
- "bundled": true
- },
- "mime-types": {
- "version": "2.1.12",
- "bundled": true,
- "requires": {
- "mime-db": "1.24.0"
- },
- "dependencies": {
- "mime-db": {
- "version": "1.24.0",
- "bundled": true
- }
- }
- },
- "node-uuid": {
- "version": "1.4.7",
- "bundled": true
- },
- "oauth-sign": {
- "version": "0.8.2",
- "bundled": true
- },
- "qs": {
- "version": "6.3.0",
- "bundled": true
- },
- "stringstream": {
- "version": "0.0.5",
- "bundled": true
- },
- "tough-cookie": {
- "version": "2.3.2",
- "bundled": true,
- "requires": {
- "punycode": "1.4.1"
- },
- "dependencies": {
- "punycode": {
- "version": "1.4.1",
- "bundled": true
- }
- }
- },
- "tunnel-agent": {
- "version": "0.4.3",
- "bundled": true
- }
- }
- },
- "rimraf": {
- "version": "2.5.4",
- "bundled": true,
- "requires": {
- "glob": "7.1.1"
- },
- "dependencies": {
- "glob": {
- "version": "7.1.1",
- "bundled": true,
- "requires": {
- "fs.realpath": "1.0.0",
- "inflight": "1.0.6",
- "inherits": "2.0.3",
- "minimatch": "3.0.3",
- "once": "1.4.0",
- "path-is-absolute": "1.0.1"
- },
- "dependencies": {
- "fs.realpath": {
- "version": "1.0.0",
- "bundled": true
- },
- "inflight": {
- "version": "1.0.6",
- "bundled": true,
- "requires": {
- "once": "1.4.0",
- "wrappy": "1.0.2"
- },
- "dependencies": {
- "wrappy": {
- "version": "1.0.2",
- "bundled": true
- }
- }
- },
- "inherits": {
- "version": "2.0.3",
- "bundled": true
- },
- "minimatch": {
- "version": "3.0.3",
- "bundled": true,
- "requires": {
- "brace-expansion": "1.1.6"
- },
- "dependencies": {
- "brace-expansion": {
- "version": "1.1.6",
- "bundled": true,
- "requires": {
- "balanced-match": "0.4.2",
- "concat-map": "0.0.1"
- },
- "dependencies": {
- "balanced-match": {
- "version": "0.4.2",
- "bundled": true
- },
- "concat-map": {
- "version": "0.0.1",
- "bundled": true
- }
- }
- }
- }
- },
- "once": {
- "version": "1.4.0",
- "bundled": true,
- "requires": {
- "wrappy": "1.0.2"
- },
- "dependencies": {
- "wrappy": {
- "version": "1.0.2",
- "bundled": true
- }
- }
- },
- "path-is-absolute": {
- "version": "1.0.1",
- "bundled": true
- }
- }
- }
- }
- },
- "semver": {
- "version": "5.3.0",
- "bundled": true
- },
- "tar": {
- "version": "2.2.1",
- "bundled": true,
- "requires": {
- "block-stream": "0.0.9",
- "fstream": "1.0.10",
- "inherits": "2.0.3"
- },
- "dependencies": {
- "block-stream": {
- "version": "0.0.9",
- "bundled": true,
- "requires": {
- "inherits": "2.0.3"
- }
- },
- "fstream": {
- "version": "1.0.10",
- "bundled": true,
- "requires": {
- "graceful-fs": "4.1.9",
- "inherits": "2.0.3",
- "mkdirp": "0.5.1",
- "rimraf": "2.5.4"
- },
- "dependencies": {
- "graceful-fs": {
- "version": "4.1.9",
- "bundled": true
- }
- }
- },
- "inherits": {
- "version": "2.0.3",
- "bundled": true
- }
- }
- },
- "tar-pack": {
- "version": "3.3.0",
- "bundled": true,
- "requires": {
- "debug": "2.2.0",
- "fstream": "1.0.10",
- "fstream-ignore": "1.0.5",
- "once": "1.3.3",
- "readable-stream": "2.1.5",
- "rimraf": "2.5.4",
- "tar": "2.2.1",
- "uid-number": "0.0.6"
- },
- "dependencies": {
- "debug": {
- "version": "2.2.0",
- "bundled": true,
- "requires": {
- "ms": "0.7.1"
- },
- "dependencies": {
- "ms": {
- "version": "0.7.1",
- "bundled": true
- }
- }
- },
- "fstream": {
- "version": "1.0.10",
- "bundled": true,
- "requires": {
- "graceful-fs": "4.1.9",
- "inherits": "2.0.3",
- "mkdirp": "0.5.1",
- "rimraf": "2.5.4"
- },
- "dependencies": {
- "graceful-fs": {
- "version": "4.1.9",
- "bundled": true
- },
- "inherits": {
- "version": "2.0.3",
- "bundled": true
- }
- }
- },
- "fstream-ignore": {
- "version": "1.0.5",
- "bundled": true,
- "requires": {
- "fstream": "1.0.10",
- "inherits": "2.0.3",
- "minimatch": "3.0.3"
- },
- "dependencies": {
- "inherits": {
- "version": "2.0.3",
- "bundled": true
- },
- "minimatch": {
- "version": "3.0.3",
- "bundled": true,
- "requires": {
- "brace-expansion": "1.1.6"
- },
- "dependencies": {
- "brace-expansion": {
- "version": "1.1.6",
- "bundled": true,
- "requires": {
- "balanced-match": "0.4.2",
- "concat-map": "0.0.1"
- },
- "dependencies": {
- "balanced-match": {
- "version": "0.4.2",
- "bundled": true
- },
- "concat-map": {
- "version": "0.0.1",
- "bundled": true
- }
- }
- }
- }
- }
- }
- },
- "once": {
- "version": "1.3.3",
- "bundled": true,
- "requires": {
- "wrappy": "1.0.2"
- },
- "dependencies": {
- "wrappy": {
- "version": "1.0.2",
- "bundled": true
- }
- }
- },
- "readable-stream": {
- "version": "2.1.5",
- "bundled": true,
- "requires": {
- "buffer-shims": "1.0.0",
- "core-util-is": "1.0.2",
- "inherits": "2.0.3",
- "isarray": "1.0.0",
- "process-nextick-args": "1.0.7",
- "string_decoder": "0.10.31",
- "util-deprecate": "1.0.2"
- },
- "dependencies": {
- "buffer-shims": {
- "version": "1.0.0",
- "bundled": true
- },
- "core-util-is": {
- "version": "1.0.2",
- "bundled": true
- },
- "inherits": {
- "version": "2.0.3",
- "bundled": true
- },
- "isarray": {
- "version": "1.0.0",
- "bundled": true
- },
- "process-nextick-args": {
- "version": "1.0.7",
- "bundled": true
- },
- "string_decoder": {
- "version": "0.10.31",
- "bundled": true
- },
- "util-deprecate": {
- "version": "1.0.2",
- "bundled": true
- }
- }
- },
- "uid-number": {
- "version": "0.0.6",
- "bundled": true
- }
- }
- }
- }
- }
+ "node-pre-gyp": "0.6.39"
}
},
"sqlstring": {
@@ -3577,6 +2943,11 @@
}
}
},
+ "stack-trace": {
+ "version": "0.0.10",
+ "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.10.tgz",
+ "integrity": "sha1-VHxws0fo0ytOEI6hoqFZ5f3eGcA="
+ },
"statuses": {
"version": "1.3.1",
"resolved": "https://registry.npmjs.org/statuses/-/statuses-1.3.1.tgz",
@@ -3592,14 +2963,6 @@
"resolved": "https://registry.npmjs.org/streamsearch/-/streamsearch-0.1.2.tgz",
"integrity": "sha1-gIudDlb8Jz2Am6VzOOkpkZoanxo="
},
- "string_decoder": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz",
- "integrity": "sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ==",
- "requires": {
- "safe-buffer": "5.1.1"
- }
- },
"string-width": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz",
@@ -3610,6 +2973,14 @@
"strip-ansi": "3.0.1"
}
},
+ "string_decoder": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz",
+ "integrity": "sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ==",
+ "requires": {
+ "safe-buffer": "5.1.1"
+ }
+ },
"stringstream": {
"version": "0.0.5",
"resolved": "https://registry.npmjs.org/stringstream/-/stringstream-0.0.5.tgz",
@@ -3666,6 +3037,31 @@
"random-js": "1.0.8"
}
},
+ "tar": {
+ "version": "2.2.1",
+ "resolved": "https://registry.npmjs.org/tar/-/tar-2.2.1.tgz",
+ "integrity": "sha1-jk0qJWwOIYXGsYrWlK7JaLg8sdE=",
+ "requires": {
+ "block-stream": "0.0.9",
+ "fstream": "1.0.11",
+ "inherits": "2.0.3"
+ }
+ },
+ "tar-pack": {
+ "version": "3.4.1",
+ "resolved": "https://registry.npmjs.org/tar-pack/-/tar-pack-3.4.1.tgz",
+ "integrity": "sha512-PPRybI9+jM5tjtCbN2cxmmRU7YmqT3Zv/UDy48tAh2XRkLa9bAORtSWLkVc13+GJF+cdTh1yEnHEk3cpTaL5Kg==",
+ "requires": {
+ "debug": "2.6.7",
+ "fstream": "1.0.11",
+ "fstream-ignore": "1.0.5",
+ "once": "1.4.0",
+ "readable-stream": "2.3.3",
+ "rimraf": "2.6.2",
+ "tar": "2.2.1",
+ "uid-number": "0.0.6"
+ }
+ },
"tar-stream": {
"version": "1.5.4",
"resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-1.5.4.tgz",
@@ -3848,6 +3244,11 @@
"resolved": "https://registry.npmjs.org/typical/-/typical-2.6.1.tgz",
"integrity": "sha1-XAgOXWYcu+OCWdLnCjxyU+hziB0="
},
+ "uid-number": {
+ "version": "0.0.6",
+ "resolved": "https://registry.npmjs.org/uid-number/-/uid-number-0.0.6.tgz",
+ "integrity": "sha1-DqEOgDXo61uOREnwbaHHMGY7qoE="
+ },
"uid-safe": {
"version": "2.1.4",
"resolved": "https://registry.npmjs.org/uid-safe/-/uid-safe-2.1.4.tgz",
@@ -4001,6 +3402,14 @@
"resolved": "https://registry.npmjs.org/which-module/-/which-module-1.0.0.tgz",
"integrity": "sha1-u6Y8qGGUiZT/MHc2CJ47lgJsKk8="
},
+ "wide-align": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.2.tgz",
+ "integrity": "sha512-ijDLlyQ7s6x1JgCLur53osjm/UXUYD9+0PbYKrBsYisYXzCxN+HC3mYDNy/dWdmf3AwqwU3CXwDCvsNgGK1S0w==",
+ "requires": {
+ "string-width": "1.0.2"
+ }
+ },
"win-spawn": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/win-spawn/-/win-spawn-2.0.0.tgz",
@@ -4011,6 +3420,19 @@
"resolved": "https://registry.npmjs.org/window-size/-/window-size-0.1.4.tgz",
"integrity": "sha1-+OGqHuWlPsW/FR/6CXQqatdpeHY="
},
+ "winston": {
+ "version": "2.4.0",
+ "resolved": "https://registry.npmjs.org/winston/-/winston-2.4.0.tgz",
+ "integrity": "sha1-gIBQuT1SZh7Z+2wms/DIJnCLCu4=",
+ "requires": {
+ "async": "1.0.0",
+ "colors": "1.0.3",
+ "cycle": "1.0.3",
+ "eyes": "0.1.8",
+ "isstream": "0.1.2",
+ "stack-trace": "0.0.10"
+ }
+ },
"wkx": {
"version": "0.2.0",
"resolved": "https://registry.npmjs.org/wkx/-/wkx-0.2.0.tgz",
diff --git a/package.json b/package.json
index e843190..78a2b8a 100644
--- a/package.json
+++ b/package.json
@@ -23,6 +23,7 @@
},
"homepage": "https://github.com/syzoj/syzoj#readme",
"dependencies": {
+ "amqplib": "^0.5.2",
"ansi-to-html": "^0.4.2",
"async-lock": "^0.3.9",
"body-parser": "^1.15.2",
@@ -42,6 +43,7 @@
"jsonwebtoken": "^7.4.3",
"moemark-renderer": "^1.2.6",
"moment": "^2.15.0",
+ "msgpack-lite": "^0.1.26",
"multer": "^1.2.0",
"mysql": "^2.11.1",
"node-7z": "^0.4.0",
@@ -57,6 +59,7 @@
"syzoj-divine": "^1.0.2",
"tmp-promise": "^1.0.3",
"waliyun": "^3.1.1",
+ "winston": "^2.3.1",
"xss": "^0.3.3"
}
}
From f149f5656b1ab85625af8f91d9c8c5b35d7cfee4 Mon Sep 17 00:00:00 2001
From: hewenyang
Date: Tue, 13 Feb 2018 17:50:02 +0800
Subject: [PATCH 20/44] Handle finished judge reports at web side
---
libs/judgeResult.js | 78 +++++++++++++++++++++++++++++++++++++++
libs/judger.js | 51 ++++++++++++++++++++++---
libs/judger_interfaces.js | 53 ++++++++++++++++++++++++++
modules/api_v2.js | 49 ------------------------
modules/winston.js | 23 ++++++++++++
5 files changed, 199 insertions(+), 55 deletions(-)
create mode 100644 libs/judgeResult.js
create mode 100644 libs/judger_interfaces.js
create mode 100644 modules/winston.js
diff --git a/libs/judgeResult.js b/libs/judgeResult.js
new file mode 100644
index 0000000..88959cf
--- /dev/null
+++ b/libs/judgeResult.js
@@ -0,0 +1,78 @@
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+const _ = require("lodash");
+const winston = require("winston");
+const interfaces_1 = require("./judger_interfaces");
+const compileError = "Compile Error", systemError = "System Error", testdataError = "No Testdata";
+exports.statusToString = {};
+exports.statusToString[interfaces_1.TestcaseResultType.Accepted] = "Accepted";
+exports.statusToString[interfaces_1.TestcaseResultType.WrongAnswer] = "Wrong Answer";
+exports.statusToString[interfaces_1.TestcaseResultType.PartiallyCorrect] = "Partially Correct";
+exports.statusToString[interfaces_1.TestcaseResultType.MemoryLimitExceeded] = "Memory Limit Exceeded";
+exports.statusToString[interfaces_1.TestcaseResultType.TimeLimitExceeded] = "Time Limit Exceeded";
+exports.statusToString[interfaces_1.TestcaseResultType.OutputLimitExceeded] = "Output Limit Exceeded";
+exports.statusToString[interfaces_1.TestcaseResultType.RuntimeError] = "Runtime Error";
+exports.statusToString[interfaces_1.TestcaseResultType.FileError] = "File Error";
+exports.statusToString[interfaces_1.TestcaseResultType.JudgementFailed] = "Judgement Failed";
+exports.statusToString[interfaces_1.TestcaseResultType.InvalidInteraction] = "Invalid Interaction";
+function firstNonAC(t) {
+ if (t.every(v => v === interfaces_1.TestcaseResultType.Accepted)) {
+ return interfaces_1.TestcaseResultType.Accepted;
+ }
+ else {
+ return t.find(r => r !== interfaces_1.TestcaseResultType.Accepted);
+ }
+}
+exports.firstNonAC = firstNonAC;
+function convertResult(taskId, source) {
+ winston.debug(`Converting result for ${taskId}`, source);
+ let time = null, memory = null, score = null, done = true, statusString = null;
+ if (source.compile && source.compile.status === interfaces_1.TaskStatus.Failed) {
+ statusString = compileError;
+ }
+ else if (source.error != null) {
+ done = false;
+ if (source.error === interfaces_1.ErrorType.TestDataError) {
+ statusString = testdataError;
+ }
+ else {
+ statusString = systemError;
+ }
+ }
+ else if (source.judge != null && source.judge.subtasks != null) {
+ const forEveryTestcase = function (map, reduce) {
+ const list = source.judge.subtasks.map(s => reduce(s.cases.filter(c => c.result != null).map(c => map(c.result))));
+ if (list.every(x => x == null))
+ return null;
+ else
+ return reduce(list);
+ };
+ time = forEveryTestcase(c => c.time, _.sum);
+ memory = forEveryTestcase(c => c.memory, _.max);
+ if (source.judge.subtasks.some(s => s.cases.some(c => c.status === interfaces_1.TaskStatus.Failed))) {
+ winston.debug(`Some subtasks failed, returning system error`);
+ statusString = systemError;
+ }
+ else {
+ score = _.sum(source.judge.subtasks.map(s => s.score));
+ const finalResult = forEveryTestcase(c => c.type, firstNonAC);
+ statusString = exports.statusToString[finalResult];
+ }
+ }
+ else {
+ statusString = systemError;
+ }
+ const result = {
+ taskId: taskId,
+ time: time,
+ memory: memory,
+ score: score,
+ statusNumber: done ? interfaces_1.TaskStatus.Done : interfaces_1.TaskStatus.Failed,
+ statusString: statusString,
+ result: source
+ };
+ winston.debug(`Result for ${taskId}`, result);
+ return result;
+}
+exports.convertResult = convertResult;
+//# sourceMappingURL=judgeResult.js.map
diff --git a/libs/judger.js b/libs/judger.js
index 85b40e5..b5ed963 100644
--- a/libs/judger.js
+++ b/libs/judger.js
@@ -6,29 +6,68 @@ const amqp = require('amqplib');
const util = require('util');
const winston = require('winston');
const msgPack = require('msgpack-lite');
+const interface = require('./judger_interfaces');
+const judgeResult = require('./judgeResult');
let amqpConnection;
-let publicChannel;
+let amqpSendChannel;
+let amqpConsumeChannel;
async function connect () {
amqpConnection = await amqp.connect(syzoj.config.rabbitMQ);
- publicChannel = await amqpConnection.createChannel();
- await publicChannel.assertQueue('judge', {
+ amqpSendChannel = await amqpConnection.createChannel();
+ await amqpSendChannel.assertQueue('judge', {
maxPriority: 5,
durable: true
});
- await publicChannel.assertQueue('result', {
+ await amqpSendChannel.assertQueue('result', {
durable: true
});
- await publicChannel.assertExchange('progress', 'fanout', {
+ await amqpSendChannel.assertExchange('progress', 'fanout', {
durable: false
});
+ amqpConsumeChannel = await amqpConnection.createChannel();
+ amqpConsumeChannel.prefetch(1);
+ winston.debug('Winston test');
+ amqpConsumeChannel.consume('result', async (msg) => {
+ (async(msg) => {
+ const data = msgPack.decode(msg.content);
+ winston.verbose('Received report for task ' + data.taskId);
+ let JudgeState = syzoj.model('judge_state');
+ let judge_state = await JudgeState.findOne({ where: { task_id: data.taskId } });
+ if(data.type === interface.ProgressReportType.Finished) {
+ const convertedResult = judgeResult.convertResult(data.taskId, data.progress);
+ winston.verbose('Reporting report finished: ' + data.taskId);
+ const payload = msgPack.encode({ type: interface.ProgressReportType.Reported, taskId: data.taskId });
+ amqpSendChannel.publish('progress', '', payload);
+ if(!judge_state) return;
+ judge_state.score = convertedResult.score;
+ judge_state.pending = false;
+ judge_state.status = convertedResult.statusString;
+ judge_state.total_time = convertedResult.time;
+ judge_state.max_memory = convertedResult.memory;
+ judge_state.result = convertedResult.result;
+ await judge_state.save();
+ await judge_state.updateRelatedInfo();
+ } else {
+ if(!judge_state) return;
+ judge_state.compilation = data.progress;
+ await judge_state.save();
+ }
+ })(msg).then(async() => {
+ amqpConsumeChannel.ack(msg)
+ }, async(err) => {
+ winston.error('Error handling report', err);
+ amqpConsumeChannel.nack(msg, false, false);
+ });
+ });
amqpConnection.on('error', (err) => {
winston.error('RabbitMQ connection failure: ${err.toString()}');
amqpConnection.close();
process.exit(1);
});
}
+
module.exports.judge = async function (judge_state, problem, priority) {
let type, param, extraFile = null;
switch (problem.type) {
@@ -71,7 +110,7 @@ module.exports.judge = async function (judge_state, problem, priority) {
};
// TODO: parse extraFileLocation
- publicChannel.sendToQueue('judge', msgPack.encode({ content: req.content, extraData: null }), { priority: priority });
+ amqpSendChannel.sendToQueue('judge', msgPack.encode({ content: req.content, extraData: null }), { priority: priority });
}
connect();
diff --git a/libs/judger_interfaces.js b/libs/judger_interfaces.js
new file mode 100644
index 0000000..a463f1a
--- /dev/null
+++ b/libs/judger_interfaces.js
@@ -0,0 +1,53 @@
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+var RPCTaskType;
+(function (RPCTaskType) {
+ RPCTaskType[RPCTaskType["Compile"] = 1] = "Compile";
+ RPCTaskType[RPCTaskType["RunStandard"] = 2] = "RunStandard";
+ RPCTaskType[RPCTaskType["RunSubmitAnswer"] = 3] = "RunSubmitAnswer";
+ RPCTaskType[RPCTaskType["RunInteraction"] = 4] = "RunInteraction";
+})(RPCTaskType = exports.RPCTaskType || (exports.RPCTaskType = {}));
+;
+var ErrorType;
+(function (ErrorType) {
+ ErrorType[ErrorType["SystemError"] = 0] = "SystemError";
+ ErrorType[ErrorType["TestDataError"] = 1] = "TestDataError";
+})(ErrorType = exports.ErrorType || (exports.ErrorType = {}));
+var TaskStatus;
+(function (TaskStatus) {
+ TaskStatus[TaskStatus["Waiting"] = 0] = "Waiting";
+ TaskStatus[TaskStatus["Running"] = 1] = "Running";
+ TaskStatus[TaskStatus["Done"] = 2] = "Done";
+ TaskStatus[TaskStatus["Failed"] = 3] = "Failed";
+ TaskStatus[TaskStatus["Skipped"] = 4] = "Skipped";
+})(TaskStatus = exports.TaskStatus || (exports.TaskStatus = {}));
+var TestcaseResultType;
+(function (TestcaseResultType) {
+ TestcaseResultType[TestcaseResultType["Accepted"] = 1] = "Accepted";
+ TestcaseResultType[TestcaseResultType["WrongAnswer"] = 2] = "WrongAnswer";
+ TestcaseResultType[TestcaseResultType["PartiallyCorrect"] = 3] = "PartiallyCorrect";
+ TestcaseResultType[TestcaseResultType["MemoryLimitExceeded"] = 4] = "MemoryLimitExceeded";
+ TestcaseResultType[TestcaseResultType["TimeLimitExceeded"] = 5] = "TimeLimitExceeded";
+ TestcaseResultType[TestcaseResultType["OutputLimitExceeded"] = 6] = "OutputLimitExceeded";
+ TestcaseResultType[TestcaseResultType["FileError"] = 7] = "FileError";
+ TestcaseResultType[TestcaseResultType["RuntimeError"] = 8] = "RuntimeError";
+ TestcaseResultType[TestcaseResultType["JudgementFailed"] = 9] = "JudgementFailed";
+ TestcaseResultType[TestcaseResultType["InvalidInteraction"] = 10] = "InvalidInteraction";
+})(TestcaseResultType = exports.TestcaseResultType || (exports.TestcaseResultType = {}));
+var RPCReplyType;
+(function (RPCReplyType) {
+ RPCReplyType[RPCReplyType["Started"] = 1] = "Started";
+ RPCReplyType[RPCReplyType["Finished"] = 2] = "Finished";
+ RPCReplyType[RPCReplyType["Error"] = 3] = "Error";
+})(RPCReplyType = exports.RPCReplyType || (exports.RPCReplyType = {}));
+var ProgressReportType;
+(function (ProgressReportType) {
+ ProgressReportType[ProgressReportType["Started"] = 1] = "Started";
+ ProgressReportType[ProgressReportType["Compiled"] = 2] = "Compiled";
+ ProgressReportType[ProgressReportType["Progress"] = 3] = "Progress";
+ ProgressReportType[ProgressReportType["Finished"] = 4] = "Finished";
+ ProgressReportType[ProgressReportType["Reported"] = 5] = "Reported";
+})(ProgressReportType = exports.ProgressReportType || (exports.ProgressReportType = {}));
+exports.redisBinarySuffix = '-bin';
+exports.redisMetadataSuffix = '-meta';
+//# sourceMappingURL=interfaces.js.map
\ No newline at end of file
diff --git a/modules/api_v2.js b/modules/api_v2.js
index 3dd25de..3819433 100644
--- a/modules/api_v2.js
+++ b/modules/api_v2.js
@@ -111,52 +111,3 @@ app.apiRouter.post('/api/v2/markdown', async (req, res) => {
res.send(e);
}
});
-
-app.apiRouter.post('/api/v2/judge/compiled', async (req, res) => {
- try {
- if (req.get('Token') !== syzoj.config.judge_token) return res.status(403).send({ err: 'Incorrect token' });
- let data = req.body;
-
- let JudgeState = syzoj.model('judge_state');
- let judge_state = await JudgeState.findOne({ where: { task_id: req.body.taskId } });
- if (!judge_state) {
- res.send({ return: 1 }); // The task might have been rejudging.
- return;
- }
- judge_state.compilation = req.body.result;
- await judge_state.save();
-
- res.send({ return: 0 });
- } catch (e) {
- syzoj.log(e);
- res.status(500).send(e);
- }
-});
-
-app.apiRouter.post('/api/v2/judge/finished', async (req, res) => {
- try {
- if (req.get('Token') !== syzoj.config.judge_token) return res.status(403).send({ err: 'Incorrect token' });
- let data = req.body;
-
- let JudgeState = syzoj.model('judge_state');
- let judge_state = await JudgeState.findOne({ where: { task_id: req.body.taskId } });
- if (!judge_state) {
- res.send({ return: 1 }); // The task might have been rejudging.
- return;
- }
- // await judge_state.updateResult(JSON.parse(req.body));
- judge_state.score = data.score;
- judge_state.pending = false;
- judge_state.status = data.statusString;
- judge_state.total_time = data.time;
- judge_state.max_memory = data.memory;
- judge_state.result = data.result;
- await judge_state.save();
- await judge_state.updateRelatedInfo();
-
- res.send({ return: 0 });
- } catch (e) {
- syzoj.log(e);
- res.status(500).send(e);
- }
-});
diff --git a/modules/winston.js b/modules/winston.js
new file mode 100644
index 0000000..4849203
--- /dev/null
+++ b/modules/winston.js
@@ -0,0 +1,23 @@
+const winston = require('winston');
+const _ = require('lodash');
+const util = require('util');
+
+function formatter(args) {
+ var msg = args.level + ' - ' + args.message + (_.isEmpty(args.meta) ? '' : (' - ' + util.inspect(args.meta)));
+ return msg;
+}
+
+function configureWinston(verbose) {
+ winston.configure({
+ transports: [
+ new (winston.transports.Console)({ formatter: formatter })
+ ]
+ });
+ if (verbose) {
+ winston.level = 'debug';
+ } else {
+ winston.level = 'info';
+ }
+}
+
+configureWinston(false);
From 9eeb1fde5d9ee8e81021bd230fe480055c0fde11 Mon Sep 17 00:00:00 2001
From: hewenyang
Date: Tue, 13 Feb 2018 21:06:16 +0800
Subject: [PATCH 21/44] Implement judge status tracking
---
app.js | 6 +-
libs/judger.js | 32 +++-
{modules => libs}/winston.js | 2 +-
modules/socketio.js | 298 ++++++++++++++++++++++++++++++++
package-lock.json | 324 +++++++++++++++++++++++++++++++++++
package.json | 2 +
views/submission.ejs | 4 +-
7 files changed, 663 insertions(+), 5 deletions(-)
rename {modules => libs}/winston.js (91%)
create mode 100644 modules/socketio.js
diff --git a/app.js b/app.js
index a91284a..fe2b9f8 100644
--- a/app.js
+++ b/app.js
@@ -39,12 +39,16 @@ global.syzoj = {
console.log(obj);
},
async run() {
+ let winstonLib = require('./libs/winston');
+ winstonLib.configureWinston(true);
+
let Express = require('express');
global.app = Express();
syzoj.production = app.get('env') === 'production';
- app.listen(parseInt(syzoj.config.port), syzoj.config.hostname, () => {
+ app.server = require('http').createServer(app);
+ app.server.listen(parseInt(syzoj.config.port), syzoj.config.hostname, () => {
this.log(`SYZOJ is listening on ${syzoj.config.hostname}:${parseInt(syzoj.config.port)}...`);
});
diff --git a/libs/judger.js b/libs/judger.js
index b5ed963..cb4a67b 100644
--- a/libs/judger.js
+++ b/libs/judger.js
@@ -49,10 +49,12 @@ async function connect () {
judge_state.result = convertedResult.result;
await judge_state.save();
await judge_state.updateRelatedInfo();
- } else {
+ } else if(data.type == interface.ProgressReportType.Compiled) {
if(!judge_state) return;
judge_state.compilation = data.progress;
await judge_state.save();
+ } else {
+ winston.error("Unsupported result type: " + data.type);
}
})(msg).then(async() => {
amqpConsumeChannel.ack(msg)
@@ -61,6 +63,34 @@ async function connect () {
amqpConsumeChannel.nack(msg, false, false);
});
});
+ socketio = require('../modules/socketio');
+ const progressChannel = await amqpConnection.createChannel();
+ const queueName = (await progressChannel.assertQueue('', { exclusive: true })).queue;
+ await progressChannel.bindQueue(queueName, 'progress', '');
+ await progressChannel.consume(queueName, (msg) => {
+ const data = msgPack.decode(msg.content);
+ winston.verbose(`Got result from progress exchange, id: ${data.taskId}`);
+
+ (async (result) => {
+ if (result.type === interface.ProgressReportType.Started) {
+ socketio.createTask(result.taskId);
+ } else if (result.type === interface.ProgressReportType.Compiled) {
+ socketio.updateCompileStatus(result.taskId, result.progress);
+ } else if (result.type === interface.ProgressReportType.Progress) {
+ socketio.updateProgress(result.taskId, result.progress);
+ } else if (result.type === interface.ProgressReportType.Finished) {
+ socketio.updateResult(result.taskId, result.progress);
+ } else if (result.type === interface.ProgressReportType.Reported) {
+ socketio.cleanupProgress(result.taskId);
+ }
+ })(data).then(async() => {
+ progressChannel.ack(msg)
+ }, async(err) => {
+ winston.error('Error handling progress', err);
+ progressChannel.nack(msg, false, false);
+ });
+ });
+ winston.debug('Created progress exchange queue', queueName);
amqpConnection.on('error', (err) => {
winston.error('RabbitMQ connection failure: ${err.toString()}');
amqpConnection.close();
diff --git a/modules/winston.js b/libs/winston.js
similarity index 91%
rename from modules/winston.js
rename to libs/winston.js
index 4849203..dfd668a 100644
--- a/modules/winston.js
+++ b/libs/winston.js
@@ -20,4 +20,4 @@ function configureWinston(verbose) {
}
}
-configureWinston(false);
+module.exports.configureWinston = configureWinston;
diff --git a/modules/socketio.js b/modules/socketio.js
new file mode 100644
index 0000000..bced125
--- /dev/null
+++ b/modules/socketio.js
@@ -0,0 +1,298 @@
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+const socketio = require("socket.io");
+const diff = require("jsondiffpatch");
+const jwt = require("jsonwebtoken");
+const winston = require("winston");
+const judgeResult_1 = require("../libs/judgeResult");
+const interfaces_1 = require("../libs/judger_interfaces");
+let ioInstance;
+let detailProgressNamespace;
+let roughProgressNamespace;
+let compileProgressNamespace;
+const currentJudgeList = {};
+const finishedJudgeList = {};
+const compiledList = [];
+const clientDetailProgressList = {};
+const clientDisplayConfigList = {};
+
+function processOverallResult(source, config) {
+ if (source == null)
+ return null;
+ if (source.error != null) {
+ return {
+ error: source.error,
+ systemMessage: source.systemMessage
+ };
+ }
+ return {
+ compile: source.compile,
+ judge: config.showDetailResult ? (source.judge && {
+ subtasks: source.judge.subtasks && source.judge.subtasks.map(st => ({
+ score: st.score,
+ cases: st.cases.map(cs => ({
+ status: cs.status,
+ result: cs.result && {
+ type: cs.result.type,
+ time: config.showUsage ? cs.result.time : undefined,
+ memory: config.showUsage ? cs.result.memory : undefined,
+ scoringRate: cs.result.scoringRate,
+ systemMessage: cs.result.systemMessage,
+ input: config.showTestdata ? cs.result.input : undefined,
+ output: config.showTestdata ? cs.result.output : undefined,
+ userOutput: config.showTestdata ? cs.result.userOutput : undefined,
+ userError: config.showTestdata ? cs.result.userError : undefined,
+ spjMessage: config.showTestdata ? cs.result.spjMessage : undefined,
+ }
+ }))
+ }))
+ }) : null
+ };
+}
+function getCompileStatus(status) {
+ if (["System Error", "Compile Error", "No Testdata"].includes(status)) {
+ return status;
+ }
+ else {
+ return "Submitted";
+ }
+}
+function processRoughResult(source, config) {
+ const result = config.showResult ?
+ source.result :
+ getCompileStatus(source.result);
+ return {
+ result: result,
+ time: config.showUsage ? source.time : null,
+ memory: config.showUsage ? source.memory : null,
+ score: config.showScore ? source.score : null
+ };
+}
+function forAllClients(ns, taskId, exec) {
+ ns.in(taskId.toString()).clients((err, clients) => {
+ if (!err) {
+ clients.forEach(client => {
+ exec(client);
+ });
+ }
+ else {
+ winston.warn(`Error while listing socketio clients in ${taskId}`, err);
+ }
+ });
+}
+function initializeSocketIO(s) {
+ ioInstance = socketio(s);
+ const initializeNamespace = (name, exec) => {
+ winston.debug('initializing socketIO', name);
+ const newNamespace = ioInstance.of('/' + name);
+ newNamespace.on('connection', (socket) => {
+ socket.on('disconnect', () => {
+ winston.info(`Client ${socket.id} disconnected.`);
+ delete clientDisplayConfigList[socket.id];
+ if (clientDetailProgressList[socket.id]) {
+ delete clientDetailProgressList[socket.id];
+ }
+ });
+ socket.on('join', (reqJwt, cb) => {
+ winston.info(`Client ${socket.id} connected.`);
+ let req;
+ try {
+ req = jwt.verify(reqJwt, syzoj.config.judge_token);
+ if (req.type !== name) {
+ throw new Error("Request type in token mismatch.");
+ }
+ clientDisplayConfigList[socket.id] = req.displayConfig;
+ const taskId = req.taskId;
+ winston.verbose(`A client trying to join ${name} namespace for ${taskId}.`);
+ socket.join(taskId.toString());
+ exec(req, socket).then(x => cb(x), err => cb({ ok: false, message: err.toString() }));
+ }
+ catch (err) {
+ winston.info('Error while joining.');
+ cb({
+ ok: false,
+ message: err.toString()
+ });
+ return;
+ }
+ });
+ });
+ return newNamespace;
+ };
+ detailProgressNamespace = initializeNamespace('detail', async (req, socket) => {
+ const taskId = req.taskId;
+ if (finishedJudgeList[taskId]) {
+ winston.debug(`Judge task #${taskId} has been finished, ${JSON.stringify(currentJudgeList[taskId])}`);
+ return {
+ ok: true,
+ running: false,
+ finished: true,
+ result: processOverallResult(currentJudgeList[taskId], clientDisplayConfigList[socket.id]),
+ roughResult: processRoughResult(finishedJudgeList[taskId], clientDisplayConfigList[socket.id])
+ };
+ }
+ else {
+ winston.debug(`Judge task #${taskId} has not been finished`);
+ if (currentJudgeList[taskId]) {
+ clientDetailProgressList[socket.id] = {
+ version: 0,
+ content: processOverallResult(currentJudgeList[taskId], clientDisplayConfigList[socket.id])
+ };
+ return {
+ ok: true,
+ finished: false,
+ running: true,
+ current: clientDetailProgressList[socket.id]
+ };
+ }
+ else {
+ return {
+ ok: true,
+ finished: false,
+ running: false
+ };
+ }
+ }
+ });
+ roughProgressNamespace = initializeNamespace('rough', async (req, socket) => {
+ const taskId = req.taskId;
+ if (finishedJudgeList[taskId]) {
+ return {
+ ok: true,
+ running: false,
+ finished: true,
+ result: processRoughResult(finishedJudgeList[taskId], clientDisplayConfigList[socket.id])
+ };
+ }
+ else if (currentJudgeList[taskId]) {
+ return {
+ ok: true,
+ running: true,
+ finished: false
+ };
+ }
+ else {
+ return {
+ ok: true,
+ running: false,
+ finished: false
+ };
+ }
+ });
+ compileProgressNamespace = initializeNamespace('compile', async (req, socket) => {
+ const taskId = req.taskId;
+ if (compiledList[taskId]) {
+ return {
+ ok: true,
+ running: false,
+ finished: true,
+ result: compiledList[taskId]
+ };
+ }
+ else if (currentJudgeList[taskId]) {
+ return {
+ ok: true,
+ running: true,
+ finished: false
+ };
+ }
+ else {
+ return {
+ ok: true,
+ running: false,
+ finished: false
+ };
+ }
+ });
+}
+exports.initializeSocketIO = initializeSocketIO;
+function createTask(taskId) {
+ winston.debug(`Judge task #${taskId} has started`);
+ currentJudgeList[taskId] = {};
+ finishedJudgeList[taskId] = null;
+ forAllClients(detailProgressNamespace, taskId, (clientId) => {
+ clientDetailProgressList[clientId] = {
+ version: 0,
+ content: {}
+ };
+ });
+ roughProgressNamespace.to(taskId.toString()).emit("start", { taskId: taskId });
+ detailProgressNamespace.to(taskId.toString()).emit("start", { taskId: taskId });
+ compileProgressNamespace.to(taskId.toString()).emit("start", { taskId: taskId });
+}
+exports.createTask = createTask;
+function updateCompileStatus(taskId, result) {
+ winston.debug(`Updating compilation status for #${taskId}`);
+ compiledList[taskId] = { result: result.status === interfaces_1.TaskStatus.Done ? 'Submitted' : 'Compile Error' };
+ compileProgressNamespace.to(taskId.toString()).emit('finish', {
+ taskId: taskId,
+ result: compiledList[taskId]
+ });
+}
+exports.updateCompileStatus = updateCompileStatus;
+function updateProgress(taskId, data) {
+ winston.verbose(`Updating progress for #${taskId}`);
+ currentJudgeList[taskId] = data;
+ forAllClients(detailProgressNamespace, taskId, (client) => {
+ winston.debug(`Pushing progress update to ${client}`);
+ if (clientDetailProgressList[client] && clientDisplayConfigList[client]) {
+ const original = clientDetailProgressList[client].content;
+ const updated = processOverallResult(currentJudgeList[taskId], clientDisplayConfigList[client]);
+ const version = clientDetailProgressList[client].version;
+ detailProgressNamespace.sockets[client].emit('update', {
+ taskId: taskId,
+ from: version,
+ to: version + 1,
+ delta: diff.diff(original, updated)
+ });
+ clientDetailProgressList[client].version++;
+ }
+ });
+}
+exports.updateProgress = updateProgress;
+function updateResult(taskId, data) {
+ currentJudgeList[taskId] = data;
+ if (compiledList[taskId] == null) {
+ if (data.error != null) {
+ compiledList[taskId] = { result: "System Error" };
+ compileProgressNamespace.to(taskId.toString()).emit('finish', {
+ taskId: taskId,
+ result: compiledList[taskId]
+ });
+ }
+ }
+ const finalResult = judgeResult_1.convertResult(taskId, data);
+ const roughResult = {
+ result: finalResult.statusString,
+ time: finalResult.time,
+ memory: finalResult.memory,
+ score: finalResult.score
+ };
+ finishedJudgeList[taskId] = roughResult;
+ forAllClients(roughProgressNamespace, taskId, (client) => {
+ winston.debug(`Pushing rough result to ${client}`);
+ roughProgressNamespace.sockets[client].emit('finish', {
+ taskId: taskId,
+ result: processRoughResult(finishedJudgeList[taskId], clientDisplayConfigList[client])
+ });
+ });
+ forAllClients(detailProgressNamespace, taskId, (client) => {
+ if (clientDisplayConfigList[client]) {
+ winston.debug(`Pushing detail result to ${client}`);
+ detailProgressNamespace.sockets[client].emit('finish', {
+ taskId: taskId,
+ result: processOverallResult(currentJudgeList[taskId], clientDisplayConfigList[client]),
+ roughResult: processRoughResult(finishedJudgeList[taskId], clientDisplayConfigList[client])
+ });
+ delete clientDetailProgressList[client];
+ }
+ });
+}
+exports.updateResult = updateResult;
+function cleanupProgress(taskId) {
+ setTimeout(() => { delete currentJudgeList[taskId]; }, 10000);
+}
+exports.cleanupProgress = cleanupProgress;
+//# sourceMappingURL=socketio.js.map
+
+initializeSocketIO(app.server);
diff --git a/package-lock.json b/package-lock.json
index 41b2295..9ccd318 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -51,6 +51,11 @@
"resolved": "https://registry.npmjs.org/addressparser/-/addressparser-1.0.1.tgz",
"integrity": "sha1-R6++GiqSYhkdtoOOT9HTm0CCF0Y="
},
+ "after": {
+ "version": "0.8.2",
+ "resolved": "https://registry.npmjs.org/after/-/after-0.8.2.tgz",
+ "integrity": "sha1-/ts5T58OAqqXaOcCvaI7UF+ufh8="
+ },
"ajv": {
"version": "4.11.8",
"resolved": "https://registry.npmjs.org/ajv/-/ajv-4.11.8.tgz",
@@ -106,6 +111,11 @@
"resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz",
"integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8="
},
+ "ansi-styles": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-1.1.0.tgz",
+ "integrity": "sha1-6uy/Zs1waIJ2Cy9GkVgrj1XXp94="
+ },
"ansi-to-html": {
"version": "0.4.2",
"resolved": "https://registry.npmjs.org/ansi-to-html/-/ansi-to-html-0.4.2.tgz",
@@ -164,6 +174,11 @@
"resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.2.tgz",
"integrity": "sha1-X8w3OSB3VyPP1k1lxkvvU7+eum0="
},
+ "arraybuffer.slice": {
+ "version": "0.0.7",
+ "resolved": "https://registry.npmjs.org/arraybuffer.slice/-/arraybuffer.slice-0.0.7.tgz",
+ "integrity": "sha512-wGUIVQXuehL5TCqQun8OW81jGzAWycqzFF8lFp+GOM5BXLYj3bKNsYC4daB7n6XjCqxQA/qgTJ+8ANR3acjrog=="
+ },
"asn1": {
"version": "0.2.3",
"resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.3.tgz",
@@ -179,6 +194,11 @@
"resolved": "https://registry.npmjs.org/async/-/async-1.0.0.tgz",
"integrity": "sha1-+PwEyjoTeErenhZBr5hXjPvWR6k="
},
+ "async-limiter": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.0.tgz",
+ "integrity": "sha512-jp/uFnooOiO+L211eZOoSyzpOITMXx1rBITauYykG3BRYPu8h0UcxsPNB04RR5vo4Tyz3+ay17tR6JVf9qzYWg=="
+ },
"async-lock": {
"version": "0.3.10",
"resolved": "https://registry.npmjs.org/async-lock/-/async-lock-0.3.10.tgz",
@@ -202,6 +222,11 @@
"resolved": "https://registry.npmjs.org/aws4/-/aws4-1.6.0.tgz",
"integrity": "sha1-g+9cqGCysy5KDe7e6MdxudtXRx4="
},
+ "backo2": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/backo2/-/backo2-1.0.2.tgz",
+ "integrity": "sha1-MasayLEpNjRj41s+u2n038+6eUc="
+ },
"bagpipe": {
"version": "0.3.5",
"resolved": "https://registry.npmjs.org/bagpipe/-/bagpipe-0.3.5.tgz",
@@ -212,11 +237,21 @@
"resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz",
"integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c="
},
+ "base64-arraybuffer": {
+ "version": "0.1.5",
+ "resolved": "https://registry.npmjs.org/base64-arraybuffer/-/base64-arraybuffer-0.1.5.tgz",
+ "integrity": "sha1-c5JncZI7Whl0etZmqlzUv5xunOg="
+ },
"base64-js": {
"version": "0.0.8",
"resolved": "https://registry.npmjs.org/base64-js/-/base64-js-0.0.8.tgz",
"integrity": "sha1-EQHpVE9KdrG8OybUUsqW16NeeXg="
},
+ "base64id": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/base64id/-/base64id-1.0.0.tgz",
+ "integrity": "sha1-R2iMuZu2gE8OBtPnY7HDLlfY5rY="
+ },
"base64url": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/base64url/-/base64url-2.0.0.tgz",
@@ -231,6 +266,14 @@
"tweetnacl": "0.14.5"
}
},
+ "better-assert": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/better-assert/-/better-assert-1.0.2.tgz",
+ "integrity": "sha1-QIZrnhueC1W0gYlDEeaPr/rrxSI=",
+ "requires": {
+ "callsite": "1.0.0"
+ }
+ },
"bignumber.js": {
"version": "3.1.2",
"resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-3.1.2.tgz",
@@ -252,6 +295,11 @@
"readable-stream": "2.3.3"
}
},
+ "blob": {
+ "version": "0.0.4",
+ "resolved": "https://registry.npmjs.org/blob/-/blob-0.0.4.tgz",
+ "integrity": "sha1-vPEwUspURj8w+fx+lbmkdjCpSSE="
+ },
"block-stream": {
"version": "0.0.9",
"resolved": "https://registry.npmjs.org/block-stream/-/block-stream-0.0.9.tgz",
@@ -406,6 +454,11 @@
"resolved": "https://registry.npmjs.org/bytes/-/bytes-2.4.0.tgz",
"integrity": "sha1-fZcZb51br39pNeJZhVSe3SpsIzk="
},
+ "callsite": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/callsite/-/callsite-1.0.0.tgz",
+ "integrity": "sha1-KAOY5dZkvXQDi28JBRU+borxvCA="
+ },
"camelcase": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz",
@@ -430,6 +483,33 @@
"tunnel-agent": "0.4.3"
}
},
+ "chalk": {
+ "version": "0.5.1",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-0.5.1.tgz",
+ "integrity": "sha1-Zjs6ZItotV0EaQ1JFnqoN4WPIXQ=",
+ "requires": {
+ "ansi-styles": "1.1.0",
+ "escape-string-regexp": "1.0.5",
+ "has-ansi": "0.1.0",
+ "strip-ansi": "0.3.0",
+ "supports-color": "0.2.0"
+ },
+ "dependencies": {
+ "ansi-regex": {
+ "version": "0.2.1",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-0.2.1.tgz",
+ "integrity": "sha1-DY6UaWej2BQ/k+JOKYUl/BsiNfk="
+ },
+ "strip-ansi": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-0.3.0.tgz",
+ "integrity": "sha1-JfSOoiynkYfzF0pNuHWTR7sSYiA=",
+ "requires": {
+ "ansi-regex": "0.2.1"
+ }
+ }
+ }
+ },
"cheerio": {
"version": "1.0.0-rc.2",
"resolved": "https://registry.npmjs.org/cheerio/-/cheerio-1.0.0-rc.2.tgz",
@@ -494,6 +574,21 @@
"graceful-readlink": "1.0.1"
}
},
+ "component-bind": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/component-bind/-/component-bind-1.0.0.tgz",
+ "integrity": "sha1-AMYIq33Nk4l8AAllGx06jh5zu9E="
+ },
+ "component-emitter": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz",
+ "integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY="
+ },
+ "component-inherit": {
+ "version": "0.0.3",
+ "resolved": "https://registry.npmjs.org/component-inherit/-/component-inherit-0.0.3.tgz",
+ "integrity": "sha1-ZF/ErfWLcrZJ1crmUTVhnbJv8UM="
+ },
"concat-map": {
"version": "0.0.1",
"resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
@@ -958,6 +1053,70 @@
"once": "1.4.0"
}
},
+ "engine.io": {
+ "version": "3.1.4",
+ "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-3.1.4.tgz",
+ "integrity": "sha1-PQIRtwpVLOhB/8fahiezAamkFi4=",
+ "requires": {
+ "accepts": "1.3.3",
+ "base64id": "1.0.0",
+ "cookie": "0.3.1",
+ "debug": "2.6.9",
+ "engine.io-parser": "2.1.2",
+ "uws": "0.14.5",
+ "ws": "3.3.3"
+ },
+ "dependencies": {
+ "debug": {
+ "version": "2.6.9",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+ "requires": {
+ "ms": "2.0.0"
+ }
+ }
+ }
+ },
+ "engine.io-client": {
+ "version": "3.1.4",
+ "resolved": "https://registry.npmjs.org/engine.io-client/-/engine.io-client-3.1.4.tgz",
+ "integrity": "sha1-T88TcLRxY70s6b4nM5ckMDUNTqE=",
+ "requires": {
+ "component-emitter": "1.2.1",
+ "component-inherit": "0.0.3",
+ "debug": "2.6.9",
+ "engine.io-parser": "2.1.2",
+ "has-cors": "1.1.0",
+ "indexof": "0.0.1",
+ "parseqs": "0.0.5",
+ "parseuri": "0.0.5",
+ "ws": "3.3.3",
+ "xmlhttprequest-ssl": "1.5.5",
+ "yeast": "0.1.2"
+ },
+ "dependencies": {
+ "debug": {
+ "version": "2.6.9",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+ "requires": {
+ "ms": "2.0.0"
+ }
+ }
+ }
+ },
+ "engine.io-parser": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-2.1.2.tgz",
+ "integrity": "sha512-dInLFzr80RijZ1rGpx1+56/uFoH7/7InhH3kZt+Ms6hT8tNx3NGW/WNSA/f8As1WkOfkuyb3tnRyuXGxusclMw==",
+ "requires": {
+ "after": "0.8.2",
+ "arraybuffer.slice": "0.0.7",
+ "base64-arraybuffer": "0.1.5",
+ "blob": "0.0.4",
+ "has-binary2": "1.0.2"
+ }
+ },
"entities": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/entities/-/entities-1.1.1.tgz",
@@ -1354,6 +1513,41 @@
"har-schema": "1.0.5"
}
},
+ "has-ansi": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-0.1.0.tgz",
+ "integrity": "sha1-hPJlqujA5qiKEtcCKJS3VoiUxi4=",
+ "requires": {
+ "ansi-regex": "0.2.1"
+ },
+ "dependencies": {
+ "ansi-regex": {
+ "version": "0.2.1",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-0.2.1.tgz",
+ "integrity": "sha1-DY6UaWej2BQ/k+JOKYUl/BsiNfk="
+ }
+ }
+ },
+ "has-binary2": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/has-binary2/-/has-binary2-1.0.2.tgz",
+ "integrity": "sha1-6D26SfC5vk0CbSc2U1DZ8D9Uvpg=",
+ "requires": {
+ "isarray": "2.0.1"
+ },
+ "dependencies": {
+ "isarray": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.1.tgz",
+ "integrity": "sha1-o32U7ZzaLVmGXJ92/llu4fM4dB4="
+ }
+ }
+ },
+ "has-cors": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/has-cors/-/has-cors-1.1.0.tgz",
+ "integrity": "sha1-XkdHk/fqmEPRu5nCPu9J/xJv/zk="
+ },
"has-unicode": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz",
@@ -1442,6 +1636,11 @@
"resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz",
"integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o="
},
+ "indexof": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/indexof/-/indexof-0.0.1.tgz",
+ "integrity": "sha1-gtwzbSMrkGIXnQWrMpOmYFn9Q10="
+ },
"inflection": {
"version": "1.12.0",
"resolved": "https://registry.npmjs.org/inflection/-/inflection-1.12.0.tgz",
@@ -1641,6 +1840,14 @@
"resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz",
"integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus="
},
+ "jsondiffpatch": {
+ "version": "0.2.4",
+ "resolved": "https://registry.npmjs.org/jsondiffpatch/-/jsondiffpatch-0.2.4.tgz",
+ "integrity": "sha1-1LbFOz/H2htLkcHCrsi5MrdRHVw=",
+ "requires": {
+ "chalk": "0.5.1"
+ }
+ },
"jsonfile": {
"version": "2.4.0",
"resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-2.4.0.tgz",
@@ -2191,6 +2398,11 @@
"resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
"integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM="
},
+ "object-component": {
+ "version": "0.0.3",
+ "resolved": "https://registry.npmjs.org/object-component/-/object-component-0.0.3.tgz",
+ "integrity": "sha1-8MaapQ78lbhmwYb0AKM3acsvEpE="
+ },
"object-keys": {
"version": "0.4.0",
"resolved": "https://registry.npmjs.org/object-keys/-/object-keys-0.4.0.tgz",
@@ -2273,6 +2485,22 @@
"@types/node": "6.0.83"
}
},
+ "parseqs": {
+ "version": "0.0.5",
+ "resolved": "https://registry.npmjs.org/parseqs/-/parseqs-0.0.5.tgz",
+ "integrity": "sha1-1SCKNzjkZ2bikbouoXNoSSGouJ0=",
+ "requires": {
+ "better-assert": "1.0.2"
+ }
+ },
+ "parseuri": {
+ "version": "0.0.5",
+ "resolved": "https://registry.npmjs.org/parseuri/-/parseuri-0.0.5.tgz",
+ "integrity": "sha1-gCBKUNTbt3m/3G6+J3jZDkvOMgo=",
+ "requires": {
+ "better-assert": "1.0.2"
+ }
+ },
"parseurl": {
"version": "1.3.1",
"resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.1.tgz",
@@ -2864,6 +3092,61 @@
"hoek": "2.16.3"
}
},
+ "socket.io": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-2.0.4.tgz",
+ "integrity": "sha1-waRZDO/4fs8TxyZS8Eb3FrKeYBQ=",
+ "requires": {
+ "debug": "2.6.7",
+ "engine.io": "3.1.4",
+ "socket.io-adapter": "1.1.1",
+ "socket.io-client": "2.0.4",
+ "socket.io-parser": "3.1.2"
+ }
+ },
+ "socket.io-adapter": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-1.1.1.tgz",
+ "integrity": "sha1-KoBeihTWNyEk3ZFZrUUC+MsH8Gs="
+ },
+ "socket.io-client": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/socket.io-client/-/socket.io-client-2.0.4.tgz",
+ "integrity": "sha1-CRilUkBtxeVAs4Dc2Xr8SmQzL44=",
+ "requires": {
+ "backo2": "1.0.2",
+ "base64-arraybuffer": "0.1.5",
+ "component-bind": "1.0.0",
+ "component-emitter": "1.2.1",
+ "debug": "2.6.7",
+ "engine.io-client": "3.1.4",
+ "has-cors": "1.1.0",
+ "indexof": "0.0.1",
+ "object-component": "0.0.3",
+ "parseqs": "0.0.5",
+ "parseuri": "0.0.5",
+ "socket.io-parser": "3.1.2",
+ "to-array": "0.1.4"
+ }
+ },
+ "socket.io-parser": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-3.1.2.tgz",
+ "integrity": "sha1-28IoIVH8T6675Aru3Ady66YZ9/I=",
+ "requires": {
+ "component-emitter": "1.2.1",
+ "debug": "2.6.7",
+ "has-binary2": "1.0.2",
+ "isarray": "2.0.1"
+ },
+ "dependencies": {
+ "isarray": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.1.tgz",
+ "integrity": "sha1-o32U7ZzaLVmGXJ92/llu4fM4dB4="
+ }
+ }
+ },
"source-map": {
"version": "0.2.0",
"resolved": "https://registry.npmjs.org/source-map/-/source-map-0.2.0.tgz",
@@ -3023,6 +3306,11 @@
"escape-string-regexp": "1.0.5"
}
},
+ "supports-color": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-0.2.0.tgz",
+ "integrity": "sha1-2S3iaU6z9nMjlz1649i1W0wiGQo="
+ },
"symbol-tree": {
"version": "3.2.2",
"resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.2.tgz",
@@ -3167,6 +3455,11 @@
"tmp": "0.0.31"
}
},
+ "to-array": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/to-array/-/to-array-0.1.4.tgz",
+ "integrity": "sha1-F+bBH3PdTz10zaek/zI46a2b+JA="
+ },
"topo": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/topo/-/topo-1.1.0.tgz",
@@ -3257,6 +3550,11 @@
"random-bytes": "1.0.0"
}
},
+ "ultron": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/ultron/-/ultron-1.1.1.tgz",
+ "integrity": "sha512-UIEXBNeYmKptWH6z8ZnqTeS8fV74zG0/eRU9VGkpzz+LIJNs8W/zM/L+7ctCkRrgbNnnR0xxw4bKOr0cW0N0Og=="
+ },
"unbzip2-stream": {
"version": "1.2.4",
"resolved": "https://registry.npmjs.org/unbzip2-stream/-/unbzip2-stream-1.2.4.tgz",
@@ -3304,6 +3602,12 @@
"resolved": "https://registry.npmjs.org/uuid/-/uuid-3.1.0.tgz",
"integrity": "sha512-DIWtzUkw04M4k3bf1IcpS2tngXEL26YUD2M0tMDUpnUrz2hgzUBlD55a4FjdLGPvfHxS6uluGWvaVEqgBcVa+g=="
},
+ "uws": {
+ "version": "0.14.5",
+ "resolved": "https://registry.npmjs.org/uws/-/uws-0.14.5.tgz",
+ "integrity": "sha1-Z6rzPEaypYel9mZtAPdpEyjxSdw=",
+ "optional": true
+ },
"validate-npm-package-license": {
"version": "3.0.1",
"resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.1.tgz",
@@ -3467,6 +3771,16 @@
"slide": "1.1.6"
}
},
+ "ws": {
+ "version": "3.3.3",
+ "resolved": "https://registry.npmjs.org/ws/-/ws-3.3.3.tgz",
+ "integrity": "sha512-nnWLa/NwZSt4KQJu51MYlCcSQ5g7INpOrOMt4XV8j4dqTXdmlUmSHQ8/oLC069ckre0fRsgfvsKwbTdtKLCDkA==",
+ "requires": {
+ "async-limiter": "1.0.0",
+ "safe-buffer": "5.1.1",
+ "ultron": "1.1.1"
+ }
+ },
"xml-mapping": {
"version": "1.7.1",
"resolved": "https://registry.npmjs.org/xml-mapping/-/xml-mapping-1.7.1.tgz",
@@ -3498,6 +3812,11 @@
"resolved": "https://registry.npmjs.org/xmldom/-/xmldom-0.1.27.tgz",
"integrity": "sha1-1QH5ezvbQDr4757MIFcxh6rawOk="
},
+ "xmlhttprequest-ssl": {
+ "version": "1.5.5",
+ "resolved": "https://registry.npmjs.org/xmlhttprequest-ssl/-/xmlhttprequest-ssl-1.5.5.tgz",
+ "integrity": "sha1-wodrBhaKrcQOV9l+gRkayPQ5iz4="
+ },
"xpath": {
"version": "0.0.24",
"resolved": "https://registry.npmjs.org/xpath/-/xpath-0.0.24.tgz",
@@ -3575,6 +3894,11 @@
"buffer-crc32": "0.2.13",
"fd-slicer": "1.0.1"
}
+ },
+ "yeast": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/yeast/-/yeast-0.1.2.tgz",
+ "integrity": "sha1-AI4G2AlDIMNy28L47XagymyKxBk="
}
}
}
diff --git a/package.json b/package.json
index 78a2b8a..67c278d 100644
--- a/package.json
+++ b/package.json
@@ -40,6 +40,7 @@
"fs-extra": "^4.0.1",
"gravatar": "^1.5.2",
"js-yaml": "^3.9.0",
+ "jsondiffpatch": "0.2.4",
"jsonwebtoken": "^7.4.3",
"moemark-renderer": "^1.2.6",
"moment": "^2.15.0",
@@ -55,6 +56,7 @@
"sendmail": "^1.1.1",
"sequelize": "^3.24.3",
"session-file-store": "^1.0.0",
+ "socket.io": "^2.0.3",
"sqlite3": "^3.1.4",
"syzoj-divine": "^1.0.2",
"tmp-promise": "^1.0.3",
diff --git a/views/submission.ejs b/views/submission.ejs
index 13e2cd9..13fb3e7 100644
--- a/views/submission.ejs
+++ b/views/submission.ejs
@@ -108,7 +108,7 @@ Vue.component("code-box", {
template: "#codeBoxTemplate",
props: ['title', 'content', 'escape'],
});
-const socketUrl = <%- syzoj.utils.judgeServer('detail') %>;
+const socketUrl = "/detail";
const displayConfig = <%- JSON.stringify(displayConfig) %>;
const token = <%- JSON.stringify(socketToken) %>;
@@ -268,4 +268,4 @@ if (token != null) {
}
-<% include footer %>
\ No newline at end of file
+<% include footer %>
From 641f94b0a06bfc83485919fe2287eced9ea08624 Mon Sep 17 00:00:00 2001
From: hewenyang
Date: Tue, 13 Feb 2018 21:19:47 +0800
Subject: [PATCH 22/44] Remove external judge server entirely
---
config-example.json | 2 --
views/submissions.ejs | 2 +-
2 files changed, 1 insertion(+), 3 deletions(-)
diff --git a/config-example.json b/config-example.json
index c34c4f0..8f79a71 100644
--- a/config-example.json
+++ b/config-example.json
@@ -166,8 +166,6 @@
}
],
"session_secret": "233",
- "judge_server_addr": "http://127.0.0.1:5284",
"rabbitMQ": "amqp://localhost/",
- "judge_token": "233",
"email_jwt_secret": "test"
}
diff --git a/views/submissions.ejs b/views/submissions.ejs
index dd7b9a4..616164f 100644
--- a/views/submissions.ejs
+++ b/views/submissions.ejs
@@ -114,7 +114,7 @@ $(function () {
$('#select_status').dropdown();
});
const itemList = <%- JSON.stringify(items) %>;
-const socketUrl = <%- syzoj.utils.judgeServer(pushType) %>;
+const socketUrl = "/rough";
const displayConfig = <%- JSON.stringify(displayConfig) %>;
const vueApp = new Vue({
From 1244a8d7a1673a8a914d9d71b3aa3d94e48b68d2 Mon Sep 17 00:00:00 2001
From: hewenyang
Date: Wed, 14 Feb 2018 09:55:13 +0800
Subject: [PATCH 23/44] Upload data for answer submission problems and fix some
horrible mistakes
---
config-example.json | 1 +
libs/judger.js | 24 ++++++++++--------------
2 files changed, 11 insertions(+), 14 deletions(-)
diff --git a/config-example.json b/config-example.json
index 8f79a71..e6d89cc 100644
--- a/config-example.json
+++ b/config-example.json
@@ -167,5 +167,6 @@
],
"session_secret": "233",
"rabbitMQ": "amqp://localhost/",
+ "judge_token": "233",
"email_jwt_secret": "test"
}
diff --git a/libs/judger.js b/libs/judger.js
index cb4a67b..aef341f 100644
--- a/libs/judger.js
+++ b/libs/judger.js
@@ -28,7 +28,6 @@ async function connect () {
});
amqpConsumeChannel = await amqpConnection.createChannel();
amqpConsumeChannel.prefetch(1);
- winston.debug('Winston test');
amqpConsumeChannel.consume('result', async (msg) => {
(async(msg) => {
const data = msgPack.decode(msg.content);
@@ -99,12 +98,13 @@ async function connect () {
}
module.exports.judge = async function (judge_state, problem, priority) {
- let type, param, extraFile = null;
+ let type, param, extraData = null;
switch (problem.type) {
case 'submit-answer':
type = enums.ProblemType.AnswerSubmission;
param = null;
- extraFile = 'static/uploads/answer/' + judge_state.code;
+ let fs = Promise.promisifyAll(require('fs-extra'));
+ extraData = await fs.readFileAsync(syzoj.model('file').resolvePath('answer', judge_state.code));
break;
case 'interaction':
type = enums.ProblemType.Interaction;
@@ -128,19 +128,15 @@ module.exports.judge = async function (judge_state, problem, priority) {
break;
}
- const req = {
- content: {
- taskId: judge_state.task_id,
- testData: problem.id.toString(),
- type: type,
- priority: priority,
- param: param
- },
- extraFileLocation: extraFile
+ const content = {
+ taskId: judge_state.task_id,
+ testData: problem.id.toString(),
+ type: type,
+ priority: priority,
+ param: param
};
- // TODO: parse extraFileLocation
- amqpSendChannel.sendToQueue('judge', msgPack.encode({ content: req.content, extraData: null }), { priority: priority });
+ amqpSendChannel.sendToQueue('judge', msgPack.encode({ content: content, extraData: extraData }), { priority: priority });
}
connect();
From f1d29a04e678e90403e7c08f20d5ef9a6b079ab6 Mon Sep 17 00:00:00 2001
From: hewenyang
Date: Wed, 14 Feb 2018 17:16:32 +0800
Subject: [PATCH 24/44] Some minor tweaks
---
app.js | 6 +++---
libs/judgeResult.js | 36 ++++++++++++++++++------------------
libs/judger.js | 3 +--
modules/socketio.js | 8 ++++----
4 files changed, 26 insertions(+), 27 deletions(-)
diff --git a/app.js b/app.js
index fe2b9f8..9af6d40 100644
--- a/app.js
+++ b/app.js
@@ -39,13 +39,12 @@ global.syzoj = {
console.log(obj);
},
async run() {
- let winstonLib = require('./libs/winston');
- winstonLib.configureWinston(true);
-
let Express = require('express');
global.app = Express();
syzoj.production = app.get('env') === 'production';
+ let winstonLib = require('./libs/winston');
+ winstonLib.configureWinston(!syzoj.production);
app.server = require('http').createServer(app);
app.server.listen(parseInt(syzoj.config.port), syzoj.config.hostname, () => {
@@ -86,6 +85,7 @@ global.syzoj = {
app.use(csurf({ cookie: true }));
await this.connectDatabase();
+ await this.lib('judger').connect();
this.loadModules();
},
async connectDatabase() {
diff --git a/libs/judgeResult.js b/libs/judgeResult.js
index 88959cf..ddd8197 100644
--- a/libs/judgeResult.js
+++ b/libs/judgeResult.js
@@ -2,37 +2,37 @@
Object.defineProperty(exports, "__esModule", { value: true });
const _ = require("lodash");
const winston = require("winston");
-const interfaces_1 = require("./judger_interfaces");
+const interfaces = require("./judger_interfaces");
const compileError = "Compile Error", systemError = "System Error", testdataError = "No Testdata";
exports.statusToString = {};
-exports.statusToString[interfaces_1.TestcaseResultType.Accepted] = "Accepted";
-exports.statusToString[interfaces_1.TestcaseResultType.WrongAnswer] = "Wrong Answer";
-exports.statusToString[interfaces_1.TestcaseResultType.PartiallyCorrect] = "Partially Correct";
-exports.statusToString[interfaces_1.TestcaseResultType.MemoryLimitExceeded] = "Memory Limit Exceeded";
-exports.statusToString[interfaces_1.TestcaseResultType.TimeLimitExceeded] = "Time Limit Exceeded";
-exports.statusToString[interfaces_1.TestcaseResultType.OutputLimitExceeded] = "Output Limit Exceeded";
-exports.statusToString[interfaces_1.TestcaseResultType.RuntimeError] = "Runtime Error";
-exports.statusToString[interfaces_1.TestcaseResultType.FileError] = "File Error";
-exports.statusToString[interfaces_1.TestcaseResultType.JudgementFailed] = "Judgement Failed";
-exports.statusToString[interfaces_1.TestcaseResultType.InvalidInteraction] = "Invalid Interaction";
+exports.statusToString[interfaces.TestcaseResultType.Accepted] = "Accepted";
+exports.statusToString[interfaces.TestcaseResultType.WrongAnswer] = "Wrong Answer";
+exports.statusToString[interfaces.TestcaseResultType.PartiallyCorrect] = "Partially Correct";
+exports.statusToString[interfaces.TestcaseResultType.MemoryLimitExceeded] = "Memory Limit Exceeded";
+exports.statusToString[interfaces.TestcaseResultType.TimeLimitExceeded] = "Time Limit Exceeded";
+exports.statusToString[interfaces.TestcaseResultType.OutputLimitExceeded] = "Output Limit Exceeded";
+exports.statusToString[interfaces.TestcaseResultType.RuntimeError] = "Runtime Error";
+exports.statusToString[interfaces.TestcaseResultType.FileError] = "File Error";
+exports.statusToString[interfaces.TestcaseResultType.JudgementFailed] = "Judgement Failed";
+exports.statusToString[interfaces.TestcaseResultType.InvalidInteraction] = "Invalid Interaction";
function firstNonAC(t) {
- if (t.every(v => v === interfaces_1.TestcaseResultType.Accepted)) {
- return interfaces_1.TestcaseResultType.Accepted;
+ if (t.every(v => v === interfaces.TestcaseResultType.Accepted)) {
+ return interfaces.TestcaseResultType.Accepted;
}
else {
- return t.find(r => r !== interfaces_1.TestcaseResultType.Accepted);
+ return t.find(r => r !== interfaces.TestcaseResultType.Accepted);
}
}
exports.firstNonAC = firstNonAC;
function convertResult(taskId, source) {
winston.debug(`Converting result for ${taskId}`, source);
let time = null, memory = null, score = null, done = true, statusString = null;
- if (source.compile && source.compile.status === interfaces_1.TaskStatus.Failed) {
+ if (source.compile && source.compile.status === interfaces.TaskStatus.Failed) {
statusString = compileError;
}
else if (source.error != null) {
done = false;
- if (source.error === interfaces_1.ErrorType.TestDataError) {
+ if (source.error === interfaces.ErrorType.TestDataError) {
statusString = testdataError;
}
else {
@@ -49,7 +49,7 @@ function convertResult(taskId, source) {
};
time = forEveryTestcase(c => c.time, _.sum);
memory = forEveryTestcase(c => c.memory, _.max);
- if (source.judge.subtasks.some(s => s.cases.some(c => c.status === interfaces_1.TaskStatus.Failed))) {
+ if (source.judge.subtasks.some(s => s.cases.some(c => c.status === interfaces.TaskStatus.Failed))) {
winston.debug(`Some subtasks failed, returning system error`);
statusString = systemError;
}
@@ -67,7 +67,7 @@ function convertResult(taskId, source) {
time: time,
memory: memory,
score: score,
- statusNumber: done ? interfaces_1.TaskStatus.Done : interfaces_1.TaskStatus.Failed,
+ statusNumber: done ? interfaces.TaskStatus.Done : interfaces.TaskStatus.Failed,
statusString: statusString,
result: source
};
diff --git a/libs/judger.js b/libs/judger.js
index aef341f..38cb20c 100644
--- a/libs/judger.js
+++ b/libs/judger.js
@@ -96,6 +96,7 @@ async function connect () {
process.exit(1);
});
}
+module.exports.connect = connect;
module.exports.judge = async function (judge_state, problem, priority) {
let type, param, extraData = null;
@@ -138,5 +139,3 @@ module.exports.judge = async function (judge_state, problem, priority) {
amqpSendChannel.sendToQueue('judge', msgPack.encode({ content: content, extraData: extraData }), { priority: priority });
}
-
-connect();
diff --git a/modules/socketio.js b/modules/socketio.js
index bced125..cd137c1 100644
--- a/modules/socketio.js
+++ b/modules/socketio.js
@@ -4,8 +4,8 @@ const socketio = require("socket.io");
const diff = require("jsondiffpatch");
const jwt = require("jsonwebtoken");
const winston = require("winston");
-const judgeResult_1 = require("../libs/judgeResult");
-const interfaces_1 = require("../libs/judger_interfaces");
+const judgeResult = require("../libs/judgeResult");
+const interfaces = require("../libs/judger_interfaces");
let ioInstance;
let detailProgressNamespace;
let roughProgressNamespace;
@@ -223,7 +223,7 @@ function createTask(taskId) {
exports.createTask = createTask;
function updateCompileStatus(taskId, result) {
winston.debug(`Updating compilation status for #${taskId}`);
- compiledList[taskId] = { result: result.status === interfaces_1.TaskStatus.Done ? 'Submitted' : 'Compile Error' };
+ compiledList[taskId] = { result: result.status === interfaces.TaskStatus.Done ? 'Submitted' : 'Compile Error' };
compileProgressNamespace.to(taskId.toString()).emit('finish', {
taskId: taskId,
result: compiledList[taskId]
@@ -261,7 +261,7 @@ function updateResult(taskId, data) {
});
}
}
- const finalResult = judgeResult_1.convertResult(taskId, data);
+ const finalResult = judgeResult.convertResult(taskId, data);
const roughResult = {
result: finalResult.statusString,
time: finalResult.time,
From 59eaa0a073cbef832f0822deef846f2c16b007f9 Mon Sep 17 00:00:00 2001
From: Tian Yunhao
Date: Wed, 14 Feb 2018 23:25:07 +0800
Subject: [PATCH 25/44] Update README.md
---
README.md | 4 +++-
1 file changed, 3 insertions(+), 1 deletion(-)
diff --git a/README.md b/README.md
index faec80b..aa467cc 100644
--- a/README.md
+++ b/README.md
@@ -5,6 +5,8 @@ The UI is powered by [Semantic UI](http://semantic-ui.com/).
Template designed & coded by [Sengxian](https://www.sengxian.com) and [Menci](https://men.ci).
# Deploying
+**Warning** The following content is **outdated**. Please refer to https://syzoj-demo.t123yh.xyz:20170/article/1 for a detailed guide and a demo server.
+
There's currently *no* stable version of SYZOJ 2, but you can use the unstable version from git.
```
@@ -161,4 +163,4 @@ systemctl restart syzoj-judge
"allowUnauthorizedTls": false
}
},
-```
\ No newline at end of file
+```
From 71605cb66ffea4c2291bf70bbb251f9199e9f460 Mon Sep 17 00:00:00 2001
From: hewenyang
Date: Thu, 15 Feb 2018 00:35:40 +0800
Subject: [PATCH 26/44] Fix bug where skipped subtasks with NULL time & memory
field cause total time to be NaN and fail to be written to database
---
libs/judgeResult.js | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/libs/judgeResult.js b/libs/judgeResult.js
index ddd8197..96537e4 100644
--- a/libs/judgeResult.js
+++ b/libs/judgeResult.js
@@ -47,8 +47,8 @@ function convertResult(taskId, source) {
else
return reduce(list);
};
- time = forEveryTestcase(c => c.time, _.sum);
- memory = forEveryTestcase(c => c.memory, _.max);
+ time = forEveryTestcase(c => (c.time ? c.time : 0), _.sum);
+ memory = forEveryTestcase(c => (c.memory ? c.memory : 0), _.max);
if (source.judge.subtasks.some(s => s.cases.some(c => c.status === interfaces.TaskStatus.Failed))) {
winston.debug(`Some subtasks failed, returning system error`);
statusString = systemError;
From 214cf694cc711a17576a439456e65458e733aee7 Mon Sep 17 00:00:00 2001
From: hewenyang
Date: Thu, 15 Feb 2018 18:58:22 +0800
Subject: [PATCH 27/44] Import also problem types
---
models/problem.js | 1 +
modules/problem.js | 2 ++
2 files changed, 3 insertions(+)
diff --git a/models/problem.js b/models/problem.js
index 2f79e6b..1e6a32f 100644
--- a/models/problem.js
+++ b/models/problem.js
@@ -454,6 +454,7 @@ class Problem extends Model {
if (this.time_limit > syzoj.config.limit.time_limit) return 'Time limit too large';
if (this.memory_limit <= 0) return 'Invalid memory limit';
if (this.memory_limit > syzoj.config.limit.memory_limit) return 'Memory limit too large';
+ if (!['traditional', 'submit-answer', 'interaction'].includes(this.type)) return 'Invalid problem type';
if (this.type === 'traditional') {
let filenameRE = /^[\w \-\+\.]*$/;
diff --git a/modules/problem.js b/modules/problem.js
index 2c8ad01..05e0b38 100644
--- a/modules/problem.js
+++ b/modules/problem.js
@@ -279,6 +279,7 @@ app.get('/problem/:id/export', async (req, res) => {
file_io: problem.file_io,
file_io_input_name: problem.file_io_input_name,
file_io_output_name: problem.file_io_output_name,
+ type: problem.type,
tags: []
};
@@ -464,6 +465,7 @@ app.post('/problem/:id/import', async (req, res) => {
problem.file_io = json.obj.file_io;
problem.file_io_input_name = json.obj.file_io_input_name;
problem.file_io_output_name = json.obj.file_io_output_name;
+ if(json.obj.type) problem.type = json.obj.type;
let validateMsg = await problem.validate();
if (validateMsg) throw new ErrorMessage('无效的题目数据配置。', null, validateMsg);
From 6a13fba0c3fc68e3134fc0e7760ed001956ae64f Mon Sep 17 00:00:00 2001
From: Menci
Date: Fri, 16 Feb 2018 13:55:18 +0800
Subject: [PATCH 28/44] Correct code style
---
modules/problem.js | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/modules/problem.js b/modules/problem.js
index 05e0b38..fea51a9 100644
--- a/modules/problem.js
+++ b/modules/problem.js
@@ -465,7 +465,7 @@ app.post('/problem/:id/import', async (req, res) => {
problem.file_io = json.obj.file_io;
problem.file_io_input_name = json.obj.file_io_input_name;
problem.file_io_output_name = json.obj.file_io_output_name;
- if(json.obj.type) problem.type = json.obj.type;
+ if (json.obj.type) problem.type = json.obj.type;
let validateMsg = await problem.validate();
if (validateMsg) throw new ErrorMessage('无效的题目数据配置。', null, validateMsg);
From 4c673956959532d61b8f9ba0be3191a054b4371a Mon Sep 17 00:00:00 2001
From: GoldIMax
Date: Fri, 16 Feb 2018 18:46:40 +0800
Subject: [PATCH 29/44] add font config
---
static/style.css | 36 ++++++++++++++++++++++++++++++++++++
1 file changed, 36 insertions(+)
diff --git a/static/style.css b/static/style.css
index f8a5cb8..a898f90 100644
--- a/static/style.css
+++ b/static/style.css
@@ -305,6 +305,42 @@
unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2212, U+2215;
}
+.ui.header,
+.ui.button,
+.ui.input input,
+.ui.menu,
+.ui.form input:not([type]),
+.ui.form input[type=date],
+.ui.form input[type=datetime-local],
+.ui.form input[type=email],
+.ui.form input[type=file],
+.ui.form input[type=number],
+.ui.form input[type=password],
+.ui.form input[type=search],
+.ui.form input[type=tel],
+.ui.form input[type=text],
+.ui.form input[type=time],
+.ui.form input[type=url],
+h1,
+h2,
+h3,
+h4,
+h5,
+body
+ {
+ font-family:
+ -apple-system,
+ 'PingFang SC',/* Apple */
+ 'Source Han Sans SC',
+ 'Noto Sans CJK SC', /* Google */
+ 'Microsoft Yahei',
+ 'Lantinghei SC',
+ 'Hiragino Sans GB',
+ 'Microsoft Sans Serif', /* M$ */
+ 'WenQuanYi Micro Hei', /* *nix */
+ sans-serif;
+}
+
.font-content {
font-family: 'Open Sans', 'Source Han Sans SC', 'Noto Sans CJK SC', 'PingFang SC', 'Hiragino Sans GB', 'Microsoft Yahei', sans-serif;
}
From 938e3ff38b3593b55e3863f1eff2f64f9ca8d484 Mon Sep 17 00:00:00 2001
From: hewenyang
Date: Mon, 26 Feb 2018 21:58:59 +0800
Subject: [PATCH 30/44] A quick-and-dirty patch to fix mobile device
compatiility
---
views/header.ejs | 1 +
1 file changed, 1 insertion(+)
diff --git a/views/header.ejs b/views/header.ejs
index 7713ffd..44d718a 100644
--- a/views/header.ejs
+++ b/views/header.ejs
@@ -4,6 +4,7 @@
+
<%= title %> - <%= syzoj.config.title %>
From 1ca916581d0bf5323df5f1b68c7a0e0fbd65fed0 Mon Sep 17 00:00:00 2001
From: hewenyang
Date: Wed, 21 Feb 2018 20:30:46 +0800
Subject: [PATCH 31/44] Fix SQL statement with poor performance
---
modules/submission.js | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/modules/submission.js b/modules/submission.js
index 01fdc7b..5e3b3aa 100644
--- a/modules/submission.js
+++ b/modules/submission.js
@@ -105,7 +105,7 @@ app.get('/submissions', async (req, res) => {
}
let paginate = syzoj.utils.paginate(await JudgeState.count(where), req.query.page, syzoj.config.page.judge_state);
- let judge_state = await JudgeState.query(paginate, where, [['submit_time', 'desc']]);
+ let judge_state = await JudgeState.query(paginate, where, [['id', 'desc']]);
await judge_state.forEachAsync(async obj => obj.loadRelationships());
From 9bb847e1222bf674993386cbadc53fff1357cfb4 Mon Sep 17 00:00:00 2001
From: hewenyang
Date: Fri, 23 Feb 2018 18:01:44 +0800
Subject: [PATCH 32/44] Fix logic to make room for performance improvement
---
modules/submission.js | 22 +++++++++++++++-------
1 file changed, 15 insertions(+), 7 deletions(-)
diff --git a/modules/submission.js b/modules/submission.js
index 5e3b3aa..826111c 100644
--- a/modules/submission.js
+++ b/modules/submission.js
@@ -22,6 +22,7 @@
let JudgeState = syzoj.model('judge_state');
let User = syzoj.model('user');
let Contest = syzoj.model('contest');
+let Problem = syzoj.model('problem');
const jwt = require('jsonwebtoken');
const { getSubmissionInfo, getRoughResult, processOverallResult } = require('../libs/submissions_process');
@@ -89,15 +90,22 @@ app.get('/submissions', async (req, res) => {
if (!inContest && (!curUser || !await curUser.hasPrivilege('manage_problem'))) {
if (req.query.problem_id) {
- where.problem_id = {
- $and: [
- { $in: syzoj.db.literal('(SELECT `id` FROM `problem` WHERE `is_public` = 1' + (res.locals.user ? (' OR `user_id` = ' + res.locals.user.id) : '') + ')') },
- { $eq: where.problem_id = parseInt(req.query.problem_id) || -1 }
- ]
- };
+ let problem_id = parseInt(req.query.problem_id);
+ let problem = await Problem.fromID(problem_id);
+ if(!problem)
+ throw new ErrorMessage("无此题目。");
+ if(await problem.isAllowedUseBy(res.locals.user)) {
+ where.problem_id = {
+ $and: [
+ { $eq: where.problem_id = problem_id }
+ ]
+ };
+ } else {
+ throw new ErrorMessage("您没有权限进行此操作。");
+ }
} else {
where.problem_id = {
- $in: syzoj.db.literal('(SELECT `id` FROM `problem` WHERE `is_public` = 1' + (res.locals.user ? (' OR `user_id` = ' + res.locals.user.id) : '') + ')'),
+ $in: syzoj.db.literal('(SELECT `id` FROM `problem` WHERE `is_public` = 1)'),
};
}
} else {
From d5bcbe8fb79e80f9d603b764ac787295cceffa34 Mon Sep 17 00:00:00 2001
From: hewenyang
Date: Sun, 25 Feb 2018 19:12:15 +0800
Subject: [PATCH 33/44] Add is_public field to judge_state table
---
models/judge_state.js | 9 +++++++--
modules/problem.js | 8 ++++++--
modules/submission.js | 4 ++--
3 files changed, 15 insertions(+), 6 deletions(-)
diff --git a/models/judge_state.js b/models/judge_state.js
index 2fab9d0..84e895b 100644
--- a/models/judge_state.js
+++ b/models/judge_state.js
@@ -60,7 +60,8 @@ let model = db.define('judge_state', {
* use this way represent because it's easy to expand // Menci:这锅我不背,是 Chenyao 留下来的坑。
*/
type: { type: Sequelize.INTEGER },
- type_info: { type: Sequelize.INTEGER }
+ type_info: { type: Sequelize.INTEGER },
+ is_public: { type: Sequelize.BOOLEAN }
}, {
timestamps: false,
tableName: 'judge_state',
@@ -79,6 +80,9 @@ let model = db.define('judge_state', {
},
{
fields: ['task_id'],
+ },
+ {
+ fields: ['is_public', 'id']
}
]
});
@@ -104,7 +108,8 @@ class JudgeState extends Model {
max_memory: null,
status: 'Unknown',
result: null,
- task_id: randomstring.generate(10)
+ task_id: randomstring.generate(10),
+ is_public: false
}, val)));
}
diff --git a/modules/problem.js b/modules/problem.js
index fea51a9..96b2b30 100644
--- a/modules/problem.js
+++ b/modules/problem.js
@@ -583,6 +583,8 @@ async function setPublic(req, res, is_public) {
problem.publicizer_id = res.locals.user.id;
await problem.save();
+ await syzoj.db.query("UPDATE `judge_state` JOIN `problem` ON `problem`.`id` = `judge_state`.`problem_id` SET `judge_state`.`is_public` = `problem`.`is_public` WHERE `problem`.`id` = " + id);
+
res.redirect(syzoj.utils.makeUrl(['problem', id]));
} catch (e) {
syzoj.log(e);
@@ -636,7 +638,8 @@ app.post('/problem/:id/submit', app.multer.fields([{ name: 'answer', maxCount: 1
code_length: size,
language: null,
user_id: curUser.id,
- problem_id: req.params.id
+ problem_id: req.params.id,
+ is_public: problem.is_public
});
} else {
let code;
@@ -654,7 +657,8 @@ app.post('/problem/:id/submit', app.multer.fields([{ name: 'answer', maxCount: 1
code_length: code.length,
language: req.body.language,
user_id: curUser.id,
- problem_id: req.params.id
+ problem_id: req.params.id,
+ is_public: problem.is_public
});
}
diff --git a/modules/submission.js b/modules/submission.js
index 826111c..5bf3826 100644
--- a/modules/submission.js
+++ b/modules/submission.js
@@ -104,8 +104,8 @@ app.get('/submissions', async (req, res) => {
throw new ErrorMessage("您没有权限进行此操作。");
}
} else {
- where.problem_id = {
- $in: syzoj.db.literal('(SELECT `id` FROM `problem` WHERE `is_public` = 1)'),
+ where.is_public = {
+ $eq: true,
};
}
} else {
From c9c9fd001c01ab77345ee65fe291e75b91c32742 Mon Sep 17 00:00:00 2001
From: hewenyang
Date: Sun, 25 Feb 2018 19:36:43 +0800
Subject: [PATCH 34/44] Fix index
---
models/judge_state.js | 2 +-
modules/submission.js | 2 +-
2 files changed, 2 insertions(+), 2 deletions(-)
diff --git a/models/judge_state.js b/models/judge_state.js
index 84e895b..5fb5edc 100644
--- a/models/judge_state.js
+++ b/models/judge_state.js
@@ -82,7 +82,7 @@ let model = db.define('judge_state', {
fields: ['task_id'],
},
{
- fields: ['is_public', 'id']
+ fields: ['id', 'is_public', 'type_info', 'type']
}
]
});
diff --git a/modules/submission.js b/modules/submission.js
index 5bf3826..65b21ac 100644
--- a/modules/submission.js
+++ b/modules/submission.js
@@ -50,7 +50,7 @@ app.get('/submissions', async (req, res) => {
else if (req.query.submitter) where.user_id = -1;
if (!req.query.contest) {
- where.type = { $ne: 1 };
+ where.type = { $eq: 0 };
} else {
const contestId = Number(req.query.contest);
const contest = await Contest.fromID(contestId);
From 95fb3b507a5cd424feabe3e70280102833c50a3d Mon Sep 17 00:00:00 2001
From: hewenyang
Date: Sun, 25 Feb 2018 19:55:53 +0800
Subject: [PATCH 35/44] Update README.md and add upgrade instructions
---
README.md | 8 ++++++++
1 file changed, 8 insertions(+)
diff --git a/README.md b/README.md
index aa467cc..ce95eb7 100644
--- a/README.md
+++ b/README.md
@@ -4,6 +4,14 @@ An OnlineJudge System for OI.
The UI is powered by [Semantic UI](http://semantic-ui.com/).
Template designed & coded by [Sengxian](https://www.sengxian.com) and [Menci](https://men.ci).
+# Upgrading
+Because of an update to the database structure, users who upgrade from a commit BEFORE 4c673956959532d61b8f9ba0be3191a054b4371a **MUST** perform the following SQL on the database:
+```sql
+ALTER TABLE `judge_state` ADD `is_public` TINYINT(1) NOT NULL AFTER `compilation`;
+UPDATE `judge_state` JOIN `problem` ON `problem`.`id` = `judge_state`.`problem_id` SET `judge_state`.`is_public` = `problem`.`is_public`;
+ALTER TABLE `syzoj`.`judge_state` ADD INDEX `judge_state_is_public` (`id`, `is_public`, `type_info`, `type`);
+```
+
# Deploying
**Warning** The following content is **outdated**. Please refer to https://syzoj-demo.t123yh.xyz:20170/article/1 for a detailed guide and a demo server.
From c96233d22116ead6e4112a1251fa27a12fe56b4d Mon Sep 17 00:00:00 2001
From: Pisces000221 <1786762946@qq.com>
Date: Thu, 5 Apr 2018 14:06:53 +0800
Subject: [PATCH 36/44] Stay compatible with Hitokoto API update
---
views/index.ejs | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/views/index.ejs b/views/index.ejs
index cddf805..0c6994f 100644
--- a/views/index.ejs
+++ b/views/index.ejs
@@ -81,7 +81,7 @@
+
@@ -28,7 +55,7 @@
-
+
@@ -39,8 +66,8 @@
-
得分
-
{{ Math.trunc(subtask.score) }}
+
+ 得分:{{ Math.trunc(subtask.score) }}
@@ -57,22 +84,22 @@
- 得分率
-
{{ Math.trunc(curCase.result.scoringRate * 100) }}
+
+ 得分:{{ Math.trunc(curCase.result.scoringRate * 100) }}
-
用时
-
{{ curCase.result.time }} ms
+
+ 用时:{{ curCase.result.time }} ms
-
内存
-
{{ curCase.result.memory }} KiB
+
+ 内存:{{ curCase.result.memory }} KiB
-
-
+
+
@@ -93,9 +120,10 @@
<% include submissions_item %>
-<% include footer %>
\ No newline at end of file
+<% include footer %>
diff --git a/views/submissions_item.ejs b/views/submissions_item.ejs
index 977fc63..673983e 100644
--- a/views/submissions_item.ejs
+++ b/views/submissions_item.ejs
@@ -43,7 +43,7 @@ Vue.component('submission-item', {
}
},
mounted() {
- textFit(this.$refs.problemLabel, { maxFontSize: 14 });
+ textFit(this.$refs.problemLabelTextFit, { maxFontSize: 14 });
}
});
@@ -51,7 +51,7 @@ Vue.component('submission-item', {
\ No newline at end of file
+
From 25bb4935a6f8721cddccebf7c874e88a57a3900a Mon Sep 17 00:00:00 2001
From: Menci
Date: Tue, 1 May 2018 12:06:29 +0800
Subject: [PATCH 40/44] Ctrl + A on submission page to select code
---
views/submission.ejs | 12 ++++++++++++
1 file changed, 12 insertions(+)
diff --git a/views/submission.ejs b/views/submission.ejs
index 703824f..77b97f0 100644
--- a/views/submission.ejs
+++ b/views/submission.ejs
@@ -295,5 +295,17 @@ if (token != null) {
loadSocketIO();
}
+
<% include footer %>
From 0239f82a1f2f649ee16fea9ec0589b1f328a2aca Mon Sep 17 00:00:00 2001
From: Menci
Date: Wed, 22 Aug 2018 15:51:07 +0800
Subject: [PATCH 41/44] Allow Data URIs in XSS filter
---
utility.js | 5 ++++-
1 file changed, 4 insertions(+), 1 deletion(-)
diff --git a/utility.js b/utility.js
index dc891e6..77bd9eb 100644
--- a/utility.js
+++ b/utility.js
@@ -100,7 +100,10 @@ module.exports = {
})
},
whiteList: whiteList,
- stripIgnoreTag: true
+ stripIgnoreTag: true,
+ onTagAttr: (tag, name, value, isWhiteAttr) => {
+ if (tag.toLowerCase() === 'img' && name.toLowerCase() === 'src' && value.startsWith('data:image/')) return name + '="' + XSS.escapeAttrValue(value) + '"';
+ }
});
let replaceXSS = s => {
s = xss.process(s);
From 33efb33474a69e2d27f3c7569feb80bd2f97255e Mon Sep 17 00:00:00 2001
From: Menci
Date: Tue, 23 Oct 2018 20:00:43 +0800
Subject: [PATCH 42/44] Some fixes and updates
---
app.js | 3 -
config-example.json | 7 +-
modules/admin.js | 5 +-
package-lock.json | 3904 --
package.json | 2 +-
...b56b8RgXW8FArifk_vArhqVIZ0nv9q090hN8.woff2 | Bin 20444 -> 0 bytes
static/fonts/1YwB1sO8YE1Lyjf12WNiUA.woff2 | Bin 23216 -> 0 bytes
...O5bWGqF5A9baEERJtnKITppOI_IvcXXDNrsc.woff2 | Bin 5740 -> 0 bytes
...0lyKKNxRlL28RnxJtnKITppOI_IvcXXDNrsc.woff2 | Bin 5332 -> 0 bytes
static/fonts/H2DMvhDLycM56KNuAtbJYA.woff2 | Bin 22656 -> 0 bytes
...x_noxlxhrhMQYEFtXRa8TVwTICgirnJhmVJw.woff2 | Bin 24132 -> 0 bytes
...oAWT7BTt32Z01mxJtnKITppOI_IvcXXDNrsc.woff2 | Bin 16868 -> 0 bytes
...B6EMdfHrEVqA1KRJtnKITppOI_IvcXXDNrsc.woff2 | Bin 2332 -> 0 bytes
...coH0WBoUxiaYK3_Y6323mHUZFJMgTvxaG2iE.woff2 | Bin 5084 -> 0 bytes
static/fonts/PLygLKRVCQnA5fhu3qk5fQ.woff2 | Bin 24092 -> 0 bytes
...tR36kaC0GEAetxgalQocB-__pDVGhF3uS2Ks.woff2 | Bin 7948 -> 0 bytes
...tR36kaC0GEAetxiFaMxiho_5XQnyRZzQsrZs.woff2 | Bin 2348 -> 0 bytes
...tR36kaC0GEAetxi_vZmeiCMnoWNN9rHBYaTc.woff2 | Bin 9684 -> 0 bytes
...tR36kaC0GEAetxmhQUTDJGru-0vvUpABgH8I.woff2 | Bin 5572 -> 0 bytes
...tR36kaC0GEAetxolIZu-HDpmDIZMigmsroc4.woff2 | Bin 14932 -> 0 bytes
...tR36kaC0GEAetxp6iIh_FvlUHQwED9Yt5Kbw.woff2 | Bin 15800 -> 0 bytes
...tR36kaC0GEAetxujkDdvhIIFj_YMdgqpnSB0.woff2 | Bin 11668 -> 0 bytes
...TmqiVp7vzi-Q5URJtnKITppOI_IvcXXDNrsc.woff2 | Bin 9676 -> 0 bytes
static/fonts/UyBMtLsHKBKXelqf4x7VRQ.woff2 | Bin 5148 -> 0 bytes
...eg6Qs9YzV9OSqZfesZW2xOQ-xsNqO47m55DA.woff2 | Bin 5224 -> 0 bytes
...G95tk6mOqHQfRBCEAvth_LlrfE80CYdSH47w.woff2 | Bin 17360 -> 0 bytes
...Brn4kERxqtaUH3VtXRa8TVwTICgirnJhmVJw.woff2 | Bin 15572 -> 0 bytes
...OKiLJc3WVjuplzBWV49_lSm1NYrwo-zkhivY.woff2 | Bin 2332 -> 0 bytes
...OKiLJc3WVjuplzD0LW-43aMEzIO6XUTLjad8.woff2 | Bin 12640 -> 0 bytes
...OKiLJc3WVjuplzJX5f-9o1vgP2EXwfjgl7AY.woff2 | Bin 9848 -> 0 bytes
...OKiLJc3WVjuplzK-j2U0lmluP9RWlSytm3ho.woff2 | Bin 17880 -> 0 bytes
...OKiLJc3WVjuplzKaRobkAwv3vxw3jMhVENGA.woff2 | Bin 8528 -> 0 bytes
...OKiLJc3WVjuplzOgdm0LZdjqr5-oayXSOefg.woff2 | Bin 16276 -> 0 bytes
...OKiLJc3WVjuplzP8zf_FOSsgRmwsS7Aa9k2w.woff2 | Bin 5832 -> 0 bytes
...ET9fUeobQW7jkRRJtnKITppOI_IvcXXDNrsc.woff2 | Bin 12288 -> 0 bytes
...8I15wypJXxuGMBiYE0-AqJ3nfInTTiDXDjU4.woff2 | Bin 11908 -> 0 bytes
...8I15wypJXxuGMBjTOQ_MqJVwkKsUn0wKzc2I.woff2 | Bin 16164 -> 0 bytes
...8I15wypJXxuGMBjUj_cnvWIuuBMVgbX098Mw.woff2 | Bin 9700 -> 0 bytes
...8I15wypJXxuGMBkbcKLIaa1LC45dFaAfauRA.woff2 | Bin 2296 -> 0 bytes
...8I15wypJXxuGMBmo_sUJ8uO4YLWRInS22T3Y.woff2 | Bin 7792 -> 0 bytes
...8I15wypJXxuGMBo4P5ICox8Kq3LLUNMylGO4.woff2 | Bin 14968 -> 0 bytes
...8I15wypJXxuGMBr6up8jxqWt8HVA3mDhkV_0.woff2 | Bin 5504 -> 0 bytes
...2726on7jbcb_pAhJtnKITppOI_IvcXXDNrsc.woff2 | Bin 8160 -> 0 bytes
static/libs/Chart.js/Chart.bundle.js | 16570 -------
static/libs/Chart.js/Chart.bundle.min.js | 16 -
static/libs/Chart.js/Chart.js | 12269 -----
static/libs/Chart.js/Chart.min.js | 14 -
static/libs/KaTeX/contrib/auto-render.min.js | 1 -
static/libs/KaTeX/fonts/KaTeX_AMS-Regular.eot | Bin 71656 -> 0 bytes
static/libs/KaTeX/fonts/KaTeX_AMS-Regular.ttf | Bin 71428 -> 0 bytes
.../libs/KaTeX/fonts/KaTeX_AMS-Regular.woff | Bin 40200 -> 0 bytes
.../libs/KaTeX/fonts/KaTeX_AMS-Regular.woff2 | Bin 33188 -> 0 bytes
.../KaTeX/fonts/KaTeX_Caligraphic-Bold.eot | Bin 19836 -> 0 bytes
.../KaTeX/fonts/KaTeX_Caligraphic-Bold.ttf | Bin 19588 -> 0 bytes
.../KaTeX/fonts/KaTeX_Caligraphic-Bold.woff | Bin 12136 -> 0 bytes
.../KaTeX/fonts/KaTeX_Caligraphic-Bold.woff2 | Bin 10604 -> 0 bytes
.../KaTeX/fonts/KaTeX_Caligraphic-Regular.eot | Bin 19220 -> 0 bytes
.../KaTeX/fonts/KaTeX_Caligraphic-Regular.ttf | Bin 18960 -> 0 bytes
.../fonts/KaTeX_Caligraphic-Regular.woff | Bin 11868 -> 0 bytes
.../fonts/KaTeX_Caligraphic-Regular.woff2 | Bin 10396 -> 0 bytes
.../libs/KaTeX/fonts/KaTeX_Fraktur-Bold.eot | Bin 36200 -> 0 bytes
.../libs/KaTeX/fonts/KaTeX_Fraktur-Bold.ttf | Bin 35968 -> 0 bytes
.../libs/KaTeX/fonts/KaTeX_Fraktur-Bold.woff | Bin 23388 -> 0 bytes
.../libs/KaTeX/fonts/KaTeX_Fraktur-Bold.woff2 | Bin 20476 -> 0 bytes
.../KaTeX/fonts/KaTeX_Fraktur-Regular.eot | Bin 34896 -> 0 bytes
.../KaTeX/fonts/KaTeX_Fraktur-Regular.ttf | Bin 34652 -> 0 bytes
.../KaTeX/fonts/KaTeX_Fraktur-Regular.woff | Bin 22844 -> 0 bytes
.../KaTeX/fonts/KaTeX_Fraktur-Regular.woff2 | Bin 19868 -> 0 bytes
static/libs/KaTeX/fonts/KaTeX_Main-Bold.eot | Bin 60688 -> 0 bytes
static/libs/KaTeX/fonts/KaTeX_Main-Bold.ttf | Bin 60468 -> 0 bytes
static/libs/KaTeX/fonts/KaTeX_Main-Bold.woff | Bin 35480 -> 0 bytes
static/libs/KaTeX/fonts/KaTeX_Main-Bold.woff2 | Bin 29492 -> 0 bytes
static/libs/KaTeX/fonts/KaTeX_Main-Italic.eot | Bin 44132 -> 0 bytes
static/libs/KaTeX/fonts/KaTeX_Main-Italic.ttf | Bin 43904 -> 0 bytes
.../libs/KaTeX/fonts/KaTeX_Main-Italic.woff | Bin 24880 -> 0 bytes
.../libs/KaTeX/fonts/KaTeX_Main-Italic.woff2 | Bin 21032 -> 0 bytes
.../libs/KaTeX/fonts/KaTeX_Main-Regular.eot | Bin 68228 -> 0 bytes
.../libs/KaTeX/fonts/KaTeX_Main-Regular.ttf | Bin 67996 -> 0 bytes
.../libs/KaTeX/fonts/KaTeX_Main-Regular.woff | Bin 37620 -> 0 bytes
.../libs/KaTeX/fonts/KaTeX_Main-Regular.woff2 | Bin 31220 -> 0 bytes
.../KaTeX/fonts/KaTeX_Math-BoldItalic.eot | Bin 39990 -> 0 bytes
.../KaTeX/fonts/KaTeX_Math-BoldItalic.ttf | Bin 39744 -> 0 bytes
.../KaTeX/fonts/KaTeX_Math-BoldItalic.woff | Bin 23192 -> 0 bytes
.../KaTeX/fonts/KaTeX_Math-BoldItalic.woff2 | Bin 20036 -> 0 bytes
static/libs/KaTeX/fonts/KaTeX_Math-Italic.eot | Bin 41676 -> 0 bytes
static/libs/KaTeX/fonts/KaTeX_Math-Italic.ttf | Bin 41448 -> 0 bytes
.../libs/KaTeX/fonts/KaTeX_Math-Italic.woff | Bin 23820 -> 0 bytes
.../libs/KaTeX/fonts/KaTeX_Math-Italic.woff2 | Bin 20432 -> 0 bytes
.../libs/KaTeX/fonts/KaTeX_Math-Regular.eot | Bin 41536 -> 0 bytes
.../libs/KaTeX/fonts/KaTeX_Math-Regular.ttf | Bin 41304 -> 0 bytes
.../libs/KaTeX/fonts/KaTeX_Math-Regular.woff | Bin 23712 -> 0 bytes
.../libs/KaTeX/fonts/KaTeX_Math-Regular.woff2 | Bin 20344 -> 0 bytes
.../libs/KaTeX/fonts/KaTeX_SansSerif-Bold.eot | Bin 34204 -> 0 bytes
.../libs/KaTeX/fonts/KaTeX_SansSerif-Bold.ttf | Bin 33964 -> 0 bytes
.../KaTeX/fonts/KaTeX_SansSerif-Bold.woff | Bin 19196 -> 0 bytes
.../KaTeX/fonts/KaTeX_SansSerif-Bold.woff2 | Bin 16020 -> 0 bytes
.../KaTeX/fonts/KaTeX_SansSerif-Italic.eot | Bin 31320 -> 0 bytes
.../KaTeX/fonts/KaTeX_SansSerif-Italic.ttf | Bin 31072 -> 0 bytes
.../KaTeX/fonts/KaTeX_SansSerif-Italic.woff | Bin 18080 -> 0 bytes
.../KaTeX/fonts/KaTeX_SansSerif-Italic.woff2 | Bin 15152 -> 0 bytes
.../KaTeX/fonts/KaTeX_SansSerif-Regular.eot | Bin 30212 -> 0 bytes
.../KaTeX/fonts/KaTeX_SansSerif-Regular.ttf | Bin 29960 -> 0 bytes
.../KaTeX/fonts/KaTeX_SansSerif-Regular.woff | Bin 16744 -> 0 bytes
.../KaTeX/fonts/KaTeX_SansSerif-Regular.woff2 | Bin 13908 -> 0 bytes
.../libs/KaTeX/fonts/KaTeX_Script-Regular.eot | Bin 25104 -> 0 bytes
.../libs/KaTeX/fonts/KaTeX_Script-Regular.ttf | Bin 24864 -> 0 bytes
.../KaTeX/fonts/KaTeX_Script-Regular.woff | Bin 13856 -> 0 bytes
.../KaTeX/fonts/KaTeX_Script-Regular.woff2 | Bin 12276 -> 0 bytes
.../libs/KaTeX/fonts/KaTeX_Size1-Regular.eot | Bin 13408 -> 0 bytes
.../libs/KaTeX/fonts/KaTeX_Size1-Regular.ttf | Bin 13172 -> 0 bytes
.../libs/KaTeX/fonts/KaTeX_Size1-Regular.woff | Bin 6980 -> 0 bytes
.../KaTeX/fonts/KaTeX_Size1-Regular.woff2 | Bin 5820 -> 0 bytes
.../libs/KaTeX/fonts/KaTeX_Size2-Regular.eot | Bin 12648 -> 0 bytes
.../libs/KaTeX/fonts/KaTeX_Size2-Regular.ttf | Bin 12412 -> 0 bytes
.../libs/KaTeX/fonts/KaTeX_Size2-Regular.woff | Bin 6684 -> 0 bytes
.../KaTeX/fonts/KaTeX_Size2-Regular.woff2 | Bin 5560 -> 0 bytes
.../libs/KaTeX/fonts/KaTeX_Size3-Regular.eot | Bin 8596 -> 0 bytes
.../libs/KaTeX/fonts/KaTeX_Size3-Regular.ttf | Bin 8360 -> 0 bytes
.../libs/KaTeX/fonts/KaTeX_Size3-Regular.woff | Bin 4776 -> 0 bytes
.../KaTeX/fonts/KaTeX_Size3-Regular.woff2 | Bin 3856 -> 0 bytes
.../libs/KaTeX/fonts/KaTeX_Size4-Regular.eot | Bin 11520 -> 0 bytes
.../libs/KaTeX/fonts/KaTeX_Size4-Regular.ttf | Bin 11284 -> 0 bytes
.../libs/KaTeX/fonts/KaTeX_Size4-Regular.woff | Bin 6456 -> 0 bytes
.../KaTeX/fonts/KaTeX_Size4-Regular.woff2 | Bin 5172 -> 0 bytes
.../KaTeX/fonts/KaTeX_Typewriter-Regular.eot | Bin 35784 -> 0 bytes
.../KaTeX/fonts/KaTeX_Typewriter-Regular.ttf | Bin 35528 -> 0 bytes
.../KaTeX/fonts/KaTeX_Typewriter-Regular.woff | Bin 20712 -> 0 bytes
.../fonts/KaTeX_Typewriter-Regular.woff2 | Bin 17344 -> 0 bytes
static/libs/KaTeX/katex.min.css | 1 -
static/libs/KaTeX/katex.min.js | 4 -
static/libs/ace/ace.js | 14 -
static/libs/ace/ext-beautify.js | 5 -
static/libs/ace/ext-chromevox.js | 5 -
static/libs/ace/ext-elastic_tabstops_lite.js | 5 -
static/libs/ace/ext-emmet.js | 5 -
static/libs/ace/ext-error_marker.js | 5 -
static/libs/ace/ext-keybinding_menu.js | 5 -
static/libs/ace/ext-language_tools.js | 5 -
static/libs/ace/ext-linking.js | 5 -
static/libs/ace/ext-modelist.js | 5 -
static/libs/ace/ext-old_ie.js | 5 -
static/libs/ace/ext-searchbox.js | 5 -
static/libs/ace/ext-settings_menu.js | 5 -
static/libs/ace/ext-spellcheck.js | 5 -
static/libs/ace/ext-split.js | 5 -
static/libs/ace/ext-static_highlight.js | 5 -
static/libs/ace/ext-statusbar.js | 5 -
static/libs/ace/ext-textarea.js | 5 -
static/libs/ace/ext-themelist.js | 5 -
static/libs/ace/ext-whitespace.js | 5 -
static/libs/ace/keybinding-emacs.js | 1 -
static/libs/ace/keybinding-vim.js | 1 -
static/libs/ace/mode-abap.js | 1 -
static/libs/ace/mode-abc.js | 1 -
static/libs/ace/mode-actionscript.js | 1 -
static/libs/ace/mode-ada.js | 1 -
static/libs/ace/mode-apache_conf.js | 1 -
static/libs/ace/mode-applescript.js | 1 -
static/libs/ace/mode-asciidoc.js | 1 -
static/libs/ace/mode-assembly_x86.js | 1 -
static/libs/ace/mode-autohotkey.js | 1 -
static/libs/ace/mode-batchfile.js | 1 -
static/libs/ace/mode-bro.js | 1 -
static/libs/ace/mode-c9search.js | 1 -
static/libs/ace/mode-c_cpp.js | 1 -
static/libs/ace/mode-cirru.js | 1 -
static/libs/ace/mode-clojure.js | 1 -
static/libs/ace/mode-cobol.js | 1 -
static/libs/ace/mode-coffee.js | 1 -
static/libs/ace/mode-coldfusion.js | 1 -
static/libs/ace/mode-csharp.js | 1 -
static/libs/ace/mode-css.js | 1 -
static/libs/ace/mode-curly.js | 1 -
static/libs/ace/mode-d.js | 1 -
static/libs/ace/mode-dart.js | 1 -
static/libs/ace/mode-diff.js | 1 -
static/libs/ace/mode-django.js | 1 -
static/libs/ace/mode-dockerfile.js | 1 -
static/libs/ace/mode-dot.js | 1 -
static/libs/ace/mode-drools.js | 1 -
static/libs/ace/mode-eiffel.js | 1 -
static/libs/ace/mode-ejs.js | 1 -
static/libs/ace/mode-elixir.js | 1 -
static/libs/ace/mode-elm.js | 1 -
static/libs/ace/mode-erlang.js | 1 -
static/libs/ace/mode-forth.js | 1 -
static/libs/ace/mode-fortran.js | 1 -
static/libs/ace/mode-ftl.js | 1 -
static/libs/ace/mode-gcode.js | 1 -
static/libs/ace/mode-gherkin.js | 1 -
static/libs/ace/mode-gitignore.js | 1 -
static/libs/ace/mode-glsl.js | 1 -
static/libs/ace/mode-gobstones.js | 1 -
static/libs/ace/mode-golang.js | 1 -
static/libs/ace/mode-groovy.js | 1 -
static/libs/ace/mode-haml.js | 1 -
static/libs/ace/mode-handlebars.js | 1 -
static/libs/ace/mode-haskell.js | 1 -
static/libs/ace/mode-haskell_cabal.js | 1 -
static/libs/ace/mode-haxe.js | 1 -
static/libs/ace/mode-hjson.js | 1 -
static/libs/ace/mode-html.js | 1 -
static/libs/ace/mode-html_elixir.js | 1 -
static/libs/ace/mode-html_ruby.js | 1 -
static/libs/ace/mode-ini.js | 1 -
static/libs/ace/mode-io.js | 1 -
static/libs/ace/mode-jack.js | 1 -
static/libs/ace/mode-jade.js | 1 -
static/libs/ace/mode-java.js | 1 -
static/libs/ace/mode-javascript.js | 1 -
static/libs/ace/mode-json.js | 1 -
static/libs/ace/mode-jsoniq.js | 1 -
static/libs/ace/mode-jsp.js | 1 -
static/libs/ace/mode-jsx.js | 1 -
static/libs/ace/mode-julia.js | 1 -
static/libs/ace/mode-kotlin.js | 1 -
static/libs/ace/mode-latex.js | 1 -
static/libs/ace/mode-lean.js | 1 -
static/libs/ace/mode-less.js | 1 -
static/libs/ace/mode-liquid.js | 1 -
static/libs/ace/mode-lisp.js | 1 -
static/libs/ace/mode-live_script.js | 1 -
static/libs/ace/mode-livescript.js | 1 -
static/libs/ace/mode-logiql.js | 1 -
static/libs/ace/mode-lsl.js | 1 -
static/libs/ace/mode-lua.js | 1 -
static/libs/ace/mode-luapage.js | 1 -
static/libs/ace/mode-lucene.js | 1 -
static/libs/ace/mode-makefile.js | 1 -
static/libs/ace/mode-markdown.js | 1 -
static/libs/ace/mode-mask.js | 1 -
static/libs/ace/mode-matlab.js | 1 -
static/libs/ace/mode-maze.js | 1 -
static/libs/ace/mode-mel.js | 1 -
static/libs/ace/mode-mips_assembler.js | 1 -
static/libs/ace/mode-mipsassembler.js | 1 -
static/libs/ace/mode-mushcode.js | 1 -
static/libs/ace/mode-mysql.js | 1 -
static/libs/ace/mode-nix.js | 1 -
static/libs/ace/mode-nsis.js | 1 -
static/libs/ace/mode-objectivec.js | 1 -
static/libs/ace/mode-ocaml.js | 1 -
static/libs/ace/mode-pascal.js | 1 -
static/libs/ace/mode-perl.js | 1 -
static/libs/ace/mode-pgsql.js | 1 -
static/libs/ace/mode-php.js | 1 -
static/libs/ace/mode-plain_text.js | 1 -
static/libs/ace/mode-powershell.js | 1 -
static/libs/ace/mode-praat.js | 1 -
static/libs/ace/mode-prolog.js | 1 -
static/libs/ace/mode-properties.js | 1 -
static/libs/ace/mode-protobuf.js | 1 -
static/libs/ace/mode-python.js | 1 -
static/libs/ace/mode-r.js | 1 -
static/libs/ace/mode-razor.js | 1 -
static/libs/ace/mode-rdoc.js | 1 -
static/libs/ace/mode-rhtml.js | 1 -
static/libs/ace/mode-rst.js | 1 -
static/libs/ace/mode-ruby.js | 1 -
static/libs/ace/mode-rust.js | 1 -
static/libs/ace/mode-sass.js | 1 -
static/libs/ace/mode-scad.js | 1 -
static/libs/ace/mode-scala.js | 1 -
static/libs/ace/mode-scheme.js | 1 -
static/libs/ace/mode-scss.js | 1 -
static/libs/ace/mode-sh.js | 1 -
static/libs/ace/mode-sjs.js | 1 -
static/libs/ace/mode-smarty.js | 1 -
static/libs/ace/mode-snippets.js | 1 -
static/libs/ace/mode-soy_template.js | 1 -
static/libs/ace/mode-space.js | 1 -
static/libs/ace/mode-sql.js | 1 -
static/libs/ace/mode-sqlserver.js | 1 -
static/libs/ace/mode-stylus.js | 1 -
static/libs/ace/mode-svg.js | 1 -
static/libs/ace/mode-swift.js | 1 -
static/libs/ace/mode-swig.js | 1 -
static/libs/ace/mode-tcl.js | 1 -
static/libs/ace/mode-tex.js | 1 -
static/libs/ace/mode-text.js | 0
static/libs/ace/mode-textile.js | 1 -
static/libs/ace/mode-toml.js | 1 -
static/libs/ace/mode-tsx.js | 1 -
static/libs/ace/mode-twig.js | 1 -
static/libs/ace/mode-typescript.js | 1 -
static/libs/ace/mode-vala.js | 1 -
static/libs/ace/mode-vbscript.js | 1 -
static/libs/ace/mode-velocity.js | 1 -
static/libs/ace/mode-verilog.js | 1 -
static/libs/ace/mode-vhdl.js | 1 -
static/libs/ace/mode-wollok.js | 1 -
static/libs/ace/mode-xml.js | 1 -
static/libs/ace/mode-xquery.js | 1 -
static/libs/ace/mode-yaml.js | 1 -
static/libs/ace/snippets/abap.js | 1 -
static/libs/ace/snippets/abc.js | 1 -
static/libs/ace/snippets/actionscript.js | 1 -
static/libs/ace/snippets/ada.js | 1 -
static/libs/ace/snippets/apache_conf.js | 1 -
static/libs/ace/snippets/applescript.js | 1 -
static/libs/ace/snippets/asciidoc.js | 1 -
static/libs/ace/snippets/assembly_x86.js | 1 -
static/libs/ace/snippets/autohotkey.js | 1 -
static/libs/ace/snippets/batchfile.js | 1 -
static/libs/ace/snippets/bro.js | 1 -
static/libs/ace/snippets/c9search.js | 1 -
static/libs/ace/snippets/c_cpp.js | 1 -
static/libs/ace/snippets/cirru.js | 1 -
static/libs/ace/snippets/clojure.js | 1 -
static/libs/ace/snippets/cobol.js | 1 -
static/libs/ace/snippets/coffee.js | 1 -
static/libs/ace/snippets/coldfusion.js | 1 -
static/libs/ace/snippets/csharp.js | 1 -
static/libs/ace/snippets/css.js | 1 -
static/libs/ace/snippets/curly.js | 1 -
static/libs/ace/snippets/d.js | 1 -
static/libs/ace/snippets/dart.js | 1 -
static/libs/ace/snippets/diff.js | 1 -
static/libs/ace/snippets/django.js | 1 -
static/libs/ace/snippets/dockerfile.js | 1 -
static/libs/ace/snippets/dot.js | 1 -
static/libs/ace/snippets/drools.js | 1 -
static/libs/ace/snippets/eiffel.js | 1 -
static/libs/ace/snippets/ejs.js | 1 -
static/libs/ace/snippets/elixir.js | 1 -
static/libs/ace/snippets/elm.js | 1 -
static/libs/ace/snippets/erlang.js | 1 -
static/libs/ace/snippets/forth.js | 1 -
static/libs/ace/snippets/fortran.js | 1 -
static/libs/ace/snippets/ftl.js | 1 -
static/libs/ace/snippets/gcode.js | 1 -
static/libs/ace/snippets/gherkin.js | 1 -
static/libs/ace/snippets/gitignore.js | 1 -
static/libs/ace/snippets/glsl.js | 1 -
static/libs/ace/snippets/gobstones.js | 1 -
static/libs/ace/snippets/golang.js | 1 -
static/libs/ace/snippets/groovy.js | 1 -
static/libs/ace/snippets/haml.js | 1 -
static/libs/ace/snippets/handlebars.js | 1 -
static/libs/ace/snippets/haskell.js | 1 -
static/libs/ace/snippets/haskell_cabal.js | 1 -
static/libs/ace/snippets/haxe.js | 1 -
static/libs/ace/snippets/hjson.js | 1 -
static/libs/ace/snippets/html.js | 1 -
static/libs/ace/snippets/html_elixir.js | 1 -
static/libs/ace/snippets/html_ruby.js | 1 -
static/libs/ace/snippets/ini.js | 1 -
static/libs/ace/snippets/io.js | 1 -
static/libs/ace/snippets/jack.js | 1 -
static/libs/ace/snippets/jade.js | 1 -
static/libs/ace/snippets/java.js | 1 -
static/libs/ace/snippets/javascript.js | 1 -
static/libs/ace/snippets/json.js | 1 -
static/libs/ace/snippets/jsoniq.js | 1 -
static/libs/ace/snippets/jsp.js | 1 -
static/libs/ace/snippets/jsx.js | 1 -
static/libs/ace/snippets/julia.js | 1 -
static/libs/ace/snippets/kotlin.js | 1 -
static/libs/ace/snippets/latex.js | 1 -
static/libs/ace/snippets/lean.js | 1 -
static/libs/ace/snippets/less.js | 1 -
static/libs/ace/snippets/liquid.js | 1 -
static/libs/ace/snippets/lisp.js | 1 -
static/libs/ace/snippets/live_script.js | 1 -
static/libs/ace/snippets/livescript.js | 1 -
static/libs/ace/snippets/logiql.js | 1 -
static/libs/ace/snippets/lsl.js | 1 -
static/libs/ace/snippets/lua.js | 1 -
static/libs/ace/snippets/luapage.js | 1 -
static/libs/ace/snippets/lucene.js | 1 -
static/libs/ace/snippets/makefile.js | 1 -
static/libs/ace/snippets/markdown.js | 1 -
static/libs/ace/snippets/mask.js | 1 -
static/libs/ace/snippets/matlab.js | 1 -
static/libs/ace/snippets/maze.js | 1 -
static/libs/ace/snippets/mel.js | 1 -
static/libs/ace/snippets/mips_assembler.js | 1 -
static/libs/ace/snippets/mipsassembler.js | 1 -
static/libs/ace/snippets/mushcode.js | 1 -
static/libs/ace/snippets/mysql.js | 1 -
static/libs/ace/snippets/nix.js | 1 -
static/libs/ace/snippets/nsis.js | 1 -
static/libs/ace/snippets/objectivec.js | 1 -
static/libs/ace/snippets/ocaml.js | 1 -
static/libs/ace/snippets/pascal.js | 1 -
static/libs/ace/snippets/perl.js | 1 -
static/libs/ace/snippets/pgsql.js | 1 -
static/libs/ace/snippets/php.js | 1 -
static/libs/ace/snippets/plain_text.js | 1 -
static/libs/ace/snippets/powershell.js | 1 -
static/libs/ace/snippets/praat.js | 1 -
static/libs/ace/snippets/prolog.js | 1 -
static/libs/ace/snippets/properties.js | 1 -
static/libs/ace/snippets/protobuf.js | 1 -
static/libs/ace/snippets/python.js | 1 -
static/libs/ace/snippets/r.js | 1 -
static/libs/ace/snippets/razor.js | 1 -
static/libs/ace/snippets/rdoc.js | 1 -
static/libs/ace/snippets/rhtml.js | 1 -
static/libs/ace/snippets/rst.js | 1 -
static/libs/ace/snippets/ruby.js | 1 -
static/libs/ace/snippets/rust.js | 1 -
static/libs/ace/snippets/sass.js | 1 -
static/libs/ace/snippets/scad.js | 1 -
static/libs/ace/snippets/scala.js | 1 -
static/libs/ace/snippets/scheme.js | 1 -
static/libs/ace/snippets/scss.js | 1 -
static/libs/ace/snippets/sh.js | 1 -
static/libs/ace/snippets/sjs.js | 1 -
static/libs/ace/snippets/smarty.js | 1 -
static/libs/ace/snippets/snippets.js | 1 -
static/libs/ace/snippets/soy_template.js | 1 -
static/libs/ace/snippets/space.js | 1 -
static/libs/ace/snippets/sql.js | 1 -
static/libs/ace/snippets/sqlserver.js | 1 -
static/libs/ace/snippets/stylus.js | 1 -
static/libs/ace/snippets/svg.js | 1 -
static/libs/ace/snippets/swift.js | 1 -
static/libs/ace/snippets/swig.js | 1 -
static/libs/ace/snippets/tcl.js | 1 -
static/libs/ace/snippets/tex.js | 1 -
static/libs/ace/snippets/text.js | 1 -
static/libs/ace/snippets/textile.js | 1 -
static/libs/ace/snippets/toml.js | 1 -
static/libs/ace/snippets/tsx.js | 1 -
static/libs/ace/snippets/twig.js | 1 -
static/libs/ace/snippets/typescript.js | 1 -
static/libs/ace/snippets/vala.js | 1 -
static/libs/ace/snippets/vbscript.js | 1 -
static/libs/ace/snippets/velocity.js | 1 -
static/libs/ace/snippets/verilog.js | 1 -
static/libs/ace/snippets/vhdl.js | 1 -
static/libs/ace/snippets/wollok.js | 1 -
static/libs/ace/snippets/xml.js | 1 -
static/libs/ace/snippets/xquery.js | 1 -
static/libs/ace/snippets/yaml.js | 1 -
static/libs/ace/theme-ambiance.js | 1 -
static/libs/ace/theme-chaos.js | 1 -
static/libs/ace/theme-chrome.js | 1 -
static/libs/ace/theme-clouds.js | 1 -
static/libs/ace/theme-clouds_midnight.js | 1 -
static/libs/ace/theme-cobalt.js | 1 -
static/libs/ace/theme-crimson_editor.js | 1 -
static/libs/ace/theme-dawn.js | 1 -
static/libs/ace/theme-dreamweaver.js | 1 -
static/libs/ace/theme-eclipse.js | 1 -
static/libs/ace/theme-github.js | 1 -
static/libs/ace/theme-idle_fingers.js | 1 -
static/libs/ace/theme-iplastic.js | 1 -
static/libs/ace/theme-katzenmilch.js | 1 -
static/libs/ace/theme-kr_theme.js | 1 -
static/libs/ace/theme-kuroir.js | 1 -
static/libs/ace/theme-merbivore.js | 1 -
static/libs/ace/theme-merbivore_soft.js | 1 -
static/libs/ace/theme-mono_industrial.js | 1 -
static/libs/ace/theme-monokai.js | 1 -
static/libs/ace/theme-pastel_on_dark.js | 1 -
static/libs/ace/theme-solarized_dark.js | 1 -
static/libs/ace/theme-solarized_light.js | 1 -
static/libs/ace/theme-sqlserver.js | 1 -
static/libs/ace/theme-terminal.js | 1 -
static/libs/ace/theme-textmate.js | 1 -
static/libs/ace/theme-tomorrow.js | 1 -
static/libs/ace/theme-tomorrow_night.js | 1 -
static/libs/ace/theme-tomorrow_night_blue.js | 1 -
.../libs/ace/theme-tomorrow_night_bright.js | 1 -
.../libs/ace/theme-tomorrow_night_eighties.js | 1 -
static/libs/ace/theme-twilight.js | 1 -
static/libs/ace/theme-vibrant_ink.js | 1 -
static/libs/ace/theme-xcode.js | 1 -
static/libs/ace/worker-coffee.js | 1 -
static/libs/ace/worker-css.js | 1 -
static/libs/ace/worker-html.js | 1 -
static/libs/ace/worker-javascript.js | 1 -
static/libs/ace/worker-json.js | 1 -
static/libs/ace/worker-lua.js | 1 -
static/libs/ace/worker-php.js | 1 -
static/libs/ace/worker-xml.js | 1 -
static/libs/ace/worker-xquery.js | 1 -
static/libs/blueimp-md5/js/md5.js | 281 -
static/libs/blueimp-md5/js/md5.min.js | 2 -
static/libs/jquery/core.js | 476 -
static/libs/jquery/jquery.js | 10253 -----
static/libs/jquery/jquery.min.js | 4 -
static/libs/jquery/jquery.min.map | 1 -
static/libs/jquery/jquery.slim.js | 8160 ----
static/libs/jquery/jquery.slim.min.js | 4 -
static/libs/jquery/jquery.slim.min.map | 1 -
static/libs/morris.js/morris.css | 2 -
static/libs/morris.js/morris.js | 1892 -
static/libs/morris.js/morris.min.js | 7 -
static/libs/raphael/raphael.js | 8353 ----
static/libs/raphael/raphael.min.js | 3 -
static/libs/raphael/raphael.no-deps.js | 7927 ----
static/libs/raphael/raphael.no-deps.min.js | 3 -
.../libs/semantic-ui/components/accordion.css | 252 -
.../libs/semantic-ui/components/accordion.js | 610 -
.../semantic-ui/components/accordion.min.css | 9 -
.../semantic-ui/components/accordion.min.js | 10 -
static/libs/semantic-ui/components/ad.css | 275 -
static/libs/semantic-ui/components/ad.min.css | 10 -
static/libs/semantic-ui/components/api.js | 1167 -
static/libs/semantic-ui/components/api.min.js | 10 -
.../semantic-ui/components/breadcrumb.css | 124 -
.../semantic-ui/components/breadcrumb.min.css | 9 -
static/libs/semantic-ui/components/button.css | 3450 --
.../semantic-ui/components/button.min.css | 9 -
static/libs/semantic-ui/components/card.css | 964 -
.../libs/semantic-ui/components/card.min.css | 9 -
.../libs/semantic-ui/components/checkbox.css | 625 -
.../libs/semantic-ui/components/checkbox.js | 831 -
.../semantic-ui/components/checkbox.min.css | 9 -
.../semantic-ui/components/checkbox.min.js | 10 -
.../libs/semantic-ui/components/colorize.js | 274 -
.../semantic-ui/components/colorize.min.js | 11 -
.../libs/semantic-ui/components/comment.css | 270 -
.../semantic-ui/components/comment.min.css | 9 -
.../libs/semantic-ui/components/container.css | 147 -
.../semantic-ui/components/container.min.css | 9 -
static/libs/semantic-ui/components/dimmer.css | 200 -
static/libs/semantic-ui/components/dimmer.js | 708 -
.../semantic-ui/components/dimmer.min.css | 9 -
.../libs/semantic-ui/components/dimmer.min.js | 10 -
.../libs/semantic-ui/components/divider.css | 260 -
.../semantic-ui/components/divider.min.css | 9 -
.../libs/semantic-ui/components/dropdown.css | 1442 -
.../libs/semantic-ui/components/dropdown.js | 3767 --
.../semantic-ui/components/dropdown.min.css | 9 -
.../semantic-ui/components/dropdown.min.js | 11 -
static/libs/semantic-ui/components/embed.css | 166 -
static/libs/semantic-ui/components/embed.js | 696 -
.../libs/semantic-ui/components/embed.min.css | 9 -
.../libs/semantic-ui/components/embed.min.js | 10 -
static/libs/semantic-ui/components/feed.css | 296 -
.../libs/semantic-ui/components/feed.min.css | 9 -
static/libs/semantic-ui/components/flag.css | 1031 -
.../libs/semantic-ui/components/flag.min.css | 9 -
static/libs/semantic-ui/components/form.css | 1067 -
static/libs/semantic-ui/components/form.js | 1603 -
.../libs/semantic-ui/components/form.min.css | 9 -
.../libs/semantic-ui/components/form.min.js | 10 -
static/libs/semantic-ui/components/grid.css | 2002 -
.../libs/semantic-ui/components/grid.min.css | 9 -
static/libs/semantic-ui/components/header.css | 721 -
.../semantic-ui/components/header.min.css | 9 -
static/libs/semantic-ui/components/icon.css | 3292 --
.../libs/semantic-ui/components/icon.min.css | 9 -
static/libs/semantic-ui/components/image.css | 306 -
.../libs/semantic-ui/components/image.min.css | 9 -
static/libs/semantic-ui/components/input.css | 510 -
.../libs/semantic-ui/components/input.min.css | 9 -
static/libs/semantic-ui/components/item.css | 486 -
.../libs/semantic-ui/components/item.min.css | 9 -
static/libs/semantic-ui/components/label.css | 1307 -
.../libs/semantic-ui/components/label.min.css | 9 -
static/libs/semantic-ui/components/list.css | 951 -
.../libs/semantic-ui/components/list.min.css | 9 -
static/libs/semantic-ui/components/loader.css | 347 -
.../semantic-ui/components/loader.min.css | 9 -
static/libs/semantic-ui/components/menu.css | 2002 -
.../libs/semantic-ui/components/menu.min.css | 1 -
.../libs/semantic-ui/components/message.css | 477 -
.../semantic-ui/components/message.min.css | 9 -
static/libs/semantic-ui/components/modal.css | 502 -
static/libs/semantic-ui/components/modal.js | 913 -
.../libs/semantic-ui/components/modal.min.css | 9 -
.../libs/semantic-ui/components/modal.min.js | 10 -
static/libs/semantic-ui/components/nag.css | 147 -
static/libs/semantic-ui/components/nag.js | 507 -
.../libs/semantic-ui/components/nag.min.css | 9 -
static/libs/semantic-ui/components/nag.min.js | 10 -
static/libs/semantic-ui/components/popup.css | 733 -
static/libs/semantic-ui/components/popup.js | 1475 -
.../libs/semantic-ui/components/popup.min.css | 9 -
.../libs/semantic-ui/components/popup.min.js | 10 -
.../libs/semantic-ui/components/progress.css | 516 -
.../libs/semantic-ui/components/progress.js | 931 -
.../semantic-ui/components/progress.min.css | 9 -
.../semantic-ui/components/progress.min.js | 10 -
static/libs/semantic-ui/components/rail.css | 152 -
.../libs/semantic-ui/components/rail.min.css | 9 -
static/libs/semantic-ui/components/rating.css | 263 -
static/libs/semantic-ui/components/rating.js | 508 -
.../semantic-ui/components/rating.min.css | 9 -
.../libs/semantic-ui/components/rating.min.js | 10 -
static/libs/semantic-ui/components/reset.css | 424 -
.../libs/semantic-ui/components/reset.min.css | 9 -
static/libs/semantic-ui/components/reveal.css | 284 -
.../semantic-ui/components/reveal.min.css | 9 -
static/libs/semantic-ui/components/search.css | 408 -
static/libs/semantic-ui/components/search.js | 1442 -
.../semantic-ui/components/search.min.css | 9 -
.../libs/semantic-ui/components/search.min.js | 10 -
.../libs/semantic-ui/components/segment.css | 798 -
.../semantic-ui/components/segment.min.css | 9 -
static/libs/semantic-ui/components/shape.css | 157 -
static/libs/semantic-ui/components/shape.js | 921 -
.../libs/semantic-ui/components/shape.min.css | 9 -
.../libs/semantic-ui/components/shape.min.js | 10 -
.../libs/semantic-ui/components/sidebar.css | 634 -
static/libs/semantic-ui/components/sidebar.js | 1036 -
.../semantic-ui/components/sidebar.min.css | 9 -
.../semantic-ui/components/sidebar.min.js | 10 -
static/libs/semantic-ui/components/site.css | 160 -
static/libs/semantic-ui/components/site.js | 487 -
.../libs/semantic-ui/components/site.min.css | 9 -
.../libs/semantic-ui/components/site.min.js | 10 -
static/libs/semantic-ui/components/state.js | 708 -
.../libs/semantic-ui/components/state.min.js | 10 -
.../libs/semantic-ui/components/statistic.css | 569 -
.../semantic-ui/components/statistic.min.css | 9 -
static/libs/semantic-ui/components/step.css | 623 -
.../libs/semantic-ui/components/step.min.css | 9 -
static/libs/semantic-ui/components/sticky.css | 78 -
static/libs/semantic-ui/components/sticky.js | 942 -
.../semantic-ui/components/sticky.min.css | 9 -
.../libs/semantic-ui/components/sticky.min.js | 10 -
static/libs/semantic-ui/components/tab.css | 91 -
static/libs/semantic-ui/components/tab.js | 952 -
.../libs/semantic-ui/components/tab.min.css | 9 -
static/libs/semantic-ui/components/tab.min.js | 10 -
static/libs/semantic-ui/components/table.css | 1108 -
.../libs/semantic-ui/components/table.min.css | 9 -
.../semantic-ui/components/transition.css | 1964 -
.../libs/semantic-ui/components/transition.js | 1095 -
.../semantic-ui/components/transition.min.css | 9 -
.../semantic-ui/components/transition.min.js | 10 -
static/libs/semantic-ui/components/video.css | 125 -
static/libs/semantic-ui/components/video.js | 532 -
.../libs/semantic-ui/components/video.min.css | 10 -
.../libs/semantic-ui/components/video.min.js | 11 -
.../libs/semantic-ui/components/visibility.js | 1288 -
.../semantic-ui/components/visibility.min.js | 10 -
static/libs/semantic-ui/components/visit.js | 517 -
.../libs/semantic-ui/components/visit.min.js | 11 -
static/libs/semantic-ui/semantic.css | 36844 ----------------
static/libs/semantic-ui/semantic.js | 22617 ----------
static/libs/semantic-ui/semantic.min.css | 365 -
static/libs/semantic-ui/semantic.min.js | 19 -
.../themes/basic/assets/fonts/icons.eot | Bin 40166 -> 0 bytes
.../themes/basic/assets/fonts/icons.svg | 450 -
.../themes/basic/assets/fonts/icons.ttf | Bin 39924 -> 0 bytes
.../themes/basic/assets/fonts/icons.woff | Bin 24676 -> 0 bytes
.../themes/default/assets/fonts/icons.eot | Bin 165742 -> 0 bytes
.../themes/default/assets/fonts/icons.otf | Bin 93888 -> 0 bytes
.../themes/default/assets/fonts/icons.svg | 2671 --
.../themes/default/assets/fonts/icons.ttf | Bin 165548 -> 0 bytes
.../themes/default/assets/fonts/icons.woff | Bin 98024 -> 0 bytes
.../themes/default/assets/fonts/icons.woff2 | Bin 77160 -> 0 bytes
.../themes/default/assets/images/flags.png | Bin 28123 -> 0 bytes
.../github/assets/fonts/octicons-local.ttf | Bin 53604 -> 0 bytes
.../themes/github/assets/fonts/octicons.svg | 200 -
.../themes/github/assets/fonts/octicons.ttf | Bin 31740 -> 0 bytes
.../themes/github/assets/fonts/octicons.woff | Bin 17772 -> 0 bytes
.../themes/material/assets/fonts/icons.eot | Bin 143258 -> 0 bytes
.../themes/material/assets/fonts/icons.svg | 2373 -
.../themes/material/assets/fonts/icons.ttf | Bin 128180 -> 0 bytes
.../themes/material/assets/fonts/icons.woff | Bin 57620 -> 0 bytes
static/mathjax.css | 38 +-
static/script.js | 16 +-
static/style.css | 318 +-
static/textFit.js | 239 -
utility.js | 2 +-
views/admin_rating.ejs | 5 +-
views/admin_raw.ejs | 2 +-
views/article_edit.ejs | 4 +-
views/contest_edit.ejs | 4 +-
views/footer.ejs | 4 +-
views/forget.ejs | 3 +-
views/forget_confirm.ejs | 7 +-
views/header.ejs | 30 +-
views/login.ejs | 5 +-
views/problem.ejs | 6 +-
views/problem_edit.ejs | 12 +-
views/sign_up.ejs | 5 +-
views/statistics.ejs | 4 +-
views/status_label.ejs | 2 +-
views/submission.ejs | 8 +-
views/submissions.ejs | 6 +-
views/submissions_item.ejs | 5 +-
views/user.ejs | 3 +-
views/user_edit.ejs | 2 +-
682 files changed, 103 insertions(+), 194036 deletions(-)
delete mode 100644 package-lock.json
delete mode 100644 static/fonts/-_Ctzj9b56b8RgXW8FArifk_vArhqVIZ0nv9q090hN8.woff2
delete mode 100644 static/fonts/1YwB1sO8YE1Lyjf12WNiUA.woff2
delete mode 100644 static/fonts/59ZRklaO5bWGqF5A9baEERJtnKITppOI_IvcXXDNrsc.woff2
delete mode 100644 static/fonts/AcvTq8Q0lyKKNxRlL28RnxJtnKITppOI_IvcXXDNrsc.woff2
delete mode 100644 static/fonts/H2DMvhDLycM56KNuAtbJYA.woff2
delete mode 100644 static/fonts/HkF_qI1x_noxlxhrhMQYEFtXRa8TVwTICgirnJhmVJw.woff2
delete mode 100644 static/fonts/K88pR3goAWT7BTt32Z01mxJtnKITppOI_IvcXXDNrsc.woff2
delete mode 100644 static/fonts/LWCjsQkB6EMdfHrEVqA1KRJtnKITppOI_IvcXXDNrsc.woff2
delete mode 100644 static/fonts/ObQr5XYcoH0WBoUxiaYK3_Y6323mHUZFJMgTvxaG2iE.woff2
delete mode 100644 static/fonts/PLygLKRVCQnA5fhu3qk5fQ.woff2
delete mode 100644 static/fonts/PRmiXeptR36kaC0GEAetxgalQocB-__pDVGhF3uS2Ks.woff2
delete mode 100644 static/fonts/PRmiXeptR36kaC0GEAetxiFaMxiho_5XQnyRZzQsrZs.woff2
delete mode 100644 static/fonts/PRmiXeptR36kaC0GEAetxi_vZmeiCMnoWNN9rHBYaTc.woff2
delete mode 100644 static/fonts/PRmiXeptR36kaC0GEAetxmhQUTDJGru-0vvUpABgH8I.woff2
delete mode 100644 static/fonts/PRmiXeptR36kaC0GEAetxolIZu-HDpmDIZMigmsroc4.woff2
delete mode 100644 static/fonts/PRmiXeptR36kaC0GEAetxp6iIh_FvlUHQwED9Yt5Kbw.woff2
delete mode 100644 static/fonts/PRmiXeptR36kaC0GEAetxujkDdvhIIFj_YMdgqpnSB0.woff2
delete mode 100644 static/fonts/RjgO7rYTmqiVp7vzi-Q5URJtnKITppOI_IvcXXDNrsc.woff2
delete mode 100644 static/fonts/UyBMtLsHKBKXelqf4x7VRQ.woff2
delete mode 100644 static/fonts/YMOYVM-eg6Qs9YzV9OSqZfesZW2xOQ-xsNqO47m55DA.woff2
delete mode 100644 static/fonts/ZKwULyCG95tk6mOqHQfRBCEAvth_LlrfE80CYdSH47w.woff2
delete mode 100644 static/fonts/cJZKeOuBrn4kERxqtaUH3VtXRa8TVwTICgirnJhmVJw.woff2
delete mode 100644 static/fonts/k3k702ZOKiLJc3WVjuplzBWV49_lSm1NYrwo-zkhivY.woff2
delete mode 100644 static/fonts/k3k702ZOKiLJc3WVjuplzD0LW-43aMEzIO6XUTLjad8.woff2
delete mode 100644 static/fonts/k3k702ZOKiLJc3WVjuplzJX5f-9o1vgP2EXwfjgl7AY.woff2
delete mode 100644 static/fonts/k3k702ZOKiLJc3WVjuplzK-j2U0lmluP9RWlSytm3ho.woff2
delete mode 100644 static/fonts/k3k702ZOKiLJc3WVjuplzKaRobkAwv3vxw3jMhVENGA.woff2
delete mode 100644 static/fonts/k3k702ZOKiLJc3WVjuplzOgdm0LZdjqr5-oayXSOefg.woff2
delete mode 100644 static/fonts/k3k702ZOKiLJc3WVjuplzP8zf_FOSsgRmwsS7Aa9k2w.woff2
delete mode 100644 static/fonts/u-WUoqrET9fUeobQW7jkRRJtnKITppOI_IvcXXDNrsc.woff2
delete mode 100644 static/fonts/xjAJXh38I15wypJXxuGMBiYE0-AqJ3nfInTTiDXDjU4.woff2
delete mode 100644 static/fonts/xjAJXh38I15wypJXxuGMBjTOQ_MqJVwkKsUn0wKzc2I.woff2
delete mode 100644 static/fonts/xjAJXh38I15wypJXxuGMBjUj_cnvWIuuBMVgbX098Mw.woff2
delete mode 100644 static/fonts/xjAJXh38I15wypJXxuGMBkbcKLIaa1LC45dFaAfauRA.woff2
delete mode 100644 static/fonts/xjAJXh38I15wypJXxuGMBmo_sUJ8uO4YLWRInS22T3Y.woff2
delete mode 100644 static/fonts/xjAJXh38I15wypJXxuGMBo4P5ICox8Kq3LLUNMylGO4.woff2
delete mode 100644 static/fonts/xjAJXh38I15wypJXxuGMBr6up8jxqWt8HVA3mDhkV_0.woff2
delete mode 100644 static/fonts/xozscpT2726on7jbcb_pAhJtnKITppOI_IvcXXDNrsc.woff2
delete mode 100644 static/libs/Chart.js/Chart.bundle.js
delete mode 100644 static/libs/Chart.js/Chart.bundle.min.js
delete mode 100644 static/libs/Chart.js/Chart.js
delete mode 100644 static/libs/Chart.js/Chart.min.js
delete mode 100644 static/libs/KaTeX/contrib/auto-render.min.js
delete mode 100644 static/libs/KaTeX/fonts/KaTeX_AMS-Regular.eot
delete mode 100644 static/libs/KaTeX/fonts/KaTeX_AMS-Regular.ttf
delete mode 100644 static/libs/KaTeX/fonts/KaTeX_AMS-Regular.woff
delete mode 100644 static/libs/KaTeX/fonts/KaTeX_AMS-Regular.woff2
delete mode 100644 static/libs/KaTeX/fonts/KaTeX_Caligraphic-Bold.eot
delete mode 100644 static/libs/KaTeX/fonts/KaTeX_Caligraphic-Bold.ttf
delete mode 100644 static/libs/KaTeX/fonts/KaTeX_Caligraphic-Bold.woff
delete mode 100644 static/libs/KaTeX/fonts/KaTeX_Caligraphic-Bold.woff2
delete mode 100644 static/libs/KaTeX/fonts/KaTeX_Caligraphic-Regular.eot
delete mode 100644 static/libs/KaTeX/fonts/KaTeX_Caligraphic-Regular.ttf
delete mode 100644 static/libs/KaTeX/fonts/KaTeX_Caligraphic-Regular.woff
delete mode 100644 static/libs/KaTeX/fonts/KaTeX_Caligraphic-Regular.woff2
delete mode 100644 static/libs/KaTeX/fonts/KaTeX_Fraktur-Bold.eot
delete mode 100644 static/libs/KaTeX/fonts/KaTeX_Fraktur-Bold.ttf
delete mode 100644 static/libs/KaTeX/fonts/KaTeX_Fraktur-Bold.woff
delete mode 100644 static/libs/KaTeX/fonts/KaTeX_Fraktur-Bold.woff2
delete mode 100644 static/libs/KaTeX/fonts/KaTeX_Fraktur-Regular.eot
delete mode 100644 static/libs/KaTeX/fonts/KaTeX_Fraktur-Regular.ttf
delete mode 100644 static/libs/KaTeX/fonts/KaTeX_Fraktur-Regular.woff
delete mode 100644 static/libs/KaTeX/fonts/KaTeX_Fraktur-Regular.woff2
delete mode 100644 static/libs/KaTeX/fonts/KaTeX_Main-Bold.eot
delete mode 100644 static/libs/KaTeX/fonts/KaTeX_Main-Bold.ttf
delete mode 100644 static/libs/KaTeX/fonts/KaTeX_Main-Bold.woff
delete mode 100644 static/libs/KaTeX/fonts/KaTeX_Main-Bold.woff2
delete mode 100644 static/libs/KaTeX/fonts/KaTeX_Main-Italic.eot
delete mode 100644 static/libs/KaTeX/fonts/KaTeX_Main-Italic.ttf
delete mode 100644 static/libs/KaTeX/fonts/KaTeX_Main-Italic.woff
delete mode 100644 static/libs/KaTeX/fonts/KaTeX_Main-Italic.woff2
delete mode 100644 static/libs/KaTeX/fonts/KaTeX_Main-Regular.eot
delete mode 100644 static/libs/KaTeX/fonts/KaTeX_Main-Regular.ttf
delete mode 100644 static/libs/KaTeX/fonts/KaTeX_Main-Regular.woff
delete mode 100644 static/libs/KaTeX/fonts/KaTeX_Main-Regular.woff2
delete mode 100644 static/libs/KaTeX/fonts/KaTeX_Math-BoldItalic.eot
delete mode 100644 static/libs/KaTeX/fonts/KaTeX_Math-BoldItalic.ttf
delete mode 100644 static/libs/KaTeX/fonts/KaTeX_Math-BoldItalic.woff
delete mode 100644 static/libs/KaTeX/fonts/KaTeX_Math-BoldItalic.woff2
delete mode 100644 static/libs/KaTeX/fonts/KaTeX_Math-Italic.eot
delete mode 100644 static/libs/KaTeX/fonts/KaTeX_Math-Italic.ttf
delete mode 100644 static/libs/KaTeX/fonts/KaTeX_Math-Italic.woff
delete mode 100644 static/libs/KaTeX/fonts/KaTeX_Math-Italic.woff2
delete mode 100644 static/libs/KaTeX/fonts/KaTeX_Math-Regular.eot
delete mode 100644 static/libs/KaTeX/fonts/KaTeX_Math-Regular.ttf
delete mode 100644 static/libs/KaTeX/fonts/KaTeX_Math-Regular.woff
delete mode 100644 static/libs/KaTeX/fonts/KaTeX_Math-Regular.woff2
delete mode 100644 static/libs/KaTeX/fonts/KaTeX_SansSerif-Bold.eot
delete mode 100644 static/libs/KaTeX/fonts/KaTeX_SansSerif-Bold.ttf
delete mode 100644 static/libs/KaTeX/fonts/KaTeX_SansSerif-Bold.woff
delete mode 100644 static/libs/KaTeX/fonts/KaTeX_SansSerif-Bold.woff2
delete mode 100644 static/libs/KaTeX/fonts/KaTeX_SansSerif-Italic.eot
delete mode 100644 static/libs/KaTeX/fonts/KaTeX_SansSerif-Italic.ttf
delete mode 100644 static/libs/KaTeX/fonts/KaTeX_SansSerif-Italic.woff
delete mode 100644 static/libs/KaTeX/fonts/KaTeX_SansSerif-Italic.woff2
delete mode 100644 static/libs/KaTeX/fonts/KaTeX_SansSerif-Regular.eot
delete mode 100644 static/libs/KaTeX/fonts/KaTeX_SansSerif-Regular.ttf
delete mode 100644 static/libs/KaTeX/fonts/KaTeX_SansSerif-Regular.woff
delete mode 100644 static/libs/KaTeX/fonts/KaTeX_SansSerif-Regular.woff2
delete mode 100644 static/libs/KaTeX/fonts/KaTeX_Script-Regular.eot
delete mode 100644 static/libs/KaTeX/fonts/KaTeX_Script-Regular.ttf
delete mode 100644 static/libs/KaTeX/fonts/KaTeX_Script-Regular.woff
delete mode 100644 static/libs/KaTeX/fonts/KaTeX_Script-Regular.woff2
delete mode 100644 static/libs/KaTeX/fonts/KaTeX_Size1-Regular.eot
delete mode 100644 static/libs/KaTeX/fonts/KaTeX_Size1-Regular.ttf
delete mode 100644 static/libs/KaTeX/fonts/KaTeX_Size1-Regular.woff
delete mode 100644 static/libs/KaTeX/fonts/KaTeX_Size1-Regular.woff2
delete mode 100644 static/libs/KaTeX/fonts/KaTeX_Size2-Regular.eot
delete mode 100644 static/libs/KaTeX/fonts/KaTeX_Size2-Regular.ttf
delete mode 100644 static/libs/KaTeX/fonts/KaTeX_Size2-Regular.woff
delete mode 100644 static/libs/KaTeX/fonts/KaTeX_Size2-Regular.woff2
delete mode 100644 static/libs/KaTeX/fonts/KaTeX_Size3-Regular.eot
delete mode 100644 static/libs/KaTeX/fonts/KaTeX_Size3-Regular.ttf
delete mode 100644 static/libs/KaTeX/fonts/KaTeX_Size3-Regular.woff
delete mode 100644 static/libs/KaTeX/fonts/KaTeX_Size3-Regular.woff2
delete mode 100644 static/libs/KaTeX/fonts/KaTeX_Size4-Regular.eot
delete mode 100644 static/libs/KaTeX/fonts/KaTeX_Size4-Regular.ttf
delete mode 100644 static/libs/KaTeX/fonts/KaTeX_Size4-Regular.woff
delete mode 100644 static/libs/KaTeX/fonts/KaTeX_Size4-Regular.woff2
delete mode 100644 static/libs/KaTeX/fonts/KaTeX_Typewriter-Regular.eot
delete mode 100644 static/libs/KaTeX/fonts/KaTeX_Typewriter-Regular.ttf
delete mode 100644 static/libs/KaTeX/fonts/KaTeX_Typewriter-Regular.woff
delete mode 100644 static/libs/KaTeX/fonts/KaTeX_Typewriter-Regular.woff2
delete mode 100644 static/libs/KaTeX/katex.min.css
delete mode 100644 static/libs/KaTeX/katex.min.js
delete mode 100644 static/libs/ace/ace.js
delete mode 100644 static/libs/ace/ext-beautify.js
delete mode 100644 static/libs/ace/ext-chromevox.js
delete mode 100644 static/libs/ace/ext-elastic_tabstops_lite.js
delete mode 100644 static/libs/ace/ext-emmet.js
delete mode 100644 static/libs/ace/ext-error_marker.js
delete mode 100644 static/libs/ace/ext-keybinding_menu.js
delete mode 100644 static/libs/ace/ext-language_tools.js
delete mode 100644 static/libs/ace/ext-linking.js
delete mode 100644 static/libs/ace/ext-modelist.js
delete mode 100644 static/libs/ace/ext-old_ie.js
delete mode 100644 static/libs/ace/ext-searchbox.js
delete mode 100644 static/libs/ace/ext-settings_menu.js
delete mode 100644 static/libs/ace/ext-spellcheck.js
delete mode 100644 static/libs/ace/ext-split.js
delete mode 100644 static/libs/ace/ext-static_highlight.js
delete mode 100644 static/libs/ace/ext-statusbar.js
delete mode 100644 static/libs/ace/ext-textarea.js
delete mode 100644 static/libs/ace/ext-themelist.js
delete mode 100644 static/libs/ace/ext-whitespace.js
delete mode 100644 static/libs/ace/keybinding-emacs.js
delete mode 100644 static/libs/ace/keybinding-vim.js
delete mode 100644 static/libs/ace/mode-abap.js
delete mode 100644 static/libs/ace/mode-abc.js
delete mode 100644 static/libs/ace/mode-actionscript.js
delete mode 100644 static/libs/ace/mode-ada.js
delete mode 100644 static/libs/ace/mode-apache_conf.js
delete mode 100644 static/libs/ace/mode-applescript.js
delete mode 100644 static/libs/ace/mode-asciidoc.js
delete mode 100644 static/libs/ace/mode-assembly_x86.js
delete mode 100644 static/libs/ace/mode-autohotkey.js
delete mode 100644 static/libs/ace/mode-batchfile.js
delete mode 100644 static/libs/ace/mode-bro.js
delete mode 100644 static/libs/ace/mode-c9search.js
delete mode 100644 static/libs/ace/mode-c_cpp.js
delete mode 100644 static/libs/ace/mode-cirru.js
delete mode 100644 static/libs/ace/mode-clojure.js
delete mode 100644 static/libs/ace/mode-cobol.js
delete mode 100644 static/libs/ace/mode-coffee.js
delete mode 100644 static/libs/ace/mode-coldfusion.js
delete mode 100644 static/libs/ace/mode-csharp.js
delete mode 100644 static/libs/ace/mode-css.js
delete mode 100644 static/libs/ace/mode-curly.js
delete mode 100644 static/libs/ace/mode-d.js
delete mode 100644 static/libs/ace/mode-dart.js
delete mode 100644 static/libs/ace/mode-diff.js
delete mode 100644 static/libs/ace/mode-django.js
delete mode 100644 static/libs/ace/mode-dockerfile.js
delete mode 100644 static/libs/ace/mode-dot.js
delete mode 100644 static/libs/ace/mode-drools.js
delete mode 100644 static/libs/ace/mode-eiffel.js
delete mode 100644 static/libs/ace/mode-ejs.js
delete mode 100644 static/libs/ace/mode-elixir.js
delete mode 100644 static/libs/ace/mode-elm.js
delete mode 100644 static/libs/ace/mode-erlang.js
delete mode 100644 static/libs/ace/mode-forth.js
delete mode 100644 static/libs/ace/mode-fortran.js
delete mode 100644 static/libs/ace/mode-ftl.js
delete mode 100644 static/libs/ace/mode-gcode.js
delete mode 100644 static/libs/ace/mode-gherkin.js
delete mode 100644 static/libs/ace/mode-gitignore.js
delete mode 100644 static/libs/ace/mode-glsl.js
delete mode 100644 static/libs/ace/mode-gobstones.js
delete mode 100644 static/libs/ace/mode-golang.js
delete mode 100644 static/libs/ace/mode-groovy.js
delete mode 100644 static/libs/ace/mode-haml.js
delete mode 100644 static/libs/ace/mode-handlebars.js
delete mode 100644 static/libs/ace/mode-haskell.js
delete mode 100644 static/libs/ace/mode-haskell_cabal.js
delete mode 100644 static/libs/ace/mode-haxe.js
delete mode 100644 static/libs/ace/mode-hjson.js
delete mode 100644 static/libs/ace/mode-html.js
delete mode 100644 static/libs/ace/mode-html_elixir.js
delete mode 100644 static/libs/ace/mode-html_ruby.js
delete mode 100644 static/libs/ace/mode-ini.js
delete mode 100644 static/libs/ace/mode-io.js
delete mode 100644 static/libs/ace/mode-jack.js
delete mode 100644 static/libs/ace/mode-jade.js
delete mode 100644 static/libs/ace/mode-java.js
delete mode 100644 static/libs/ace/mode-javascript.js
delete mode 100644 static/libs/ace/mode-json.js
delete mode 100644 static/libs/ace/mode-jsoniq.js
delete mode 100644 static/libs/ace/mode-jsp.js
delete mode 100644 static/libs/ace/mode-jsx.js
delete mode 100644 static/libs/ace/mode-julia.js
delete mode 100644 static/libs/ace/mode-kotlin.js
delete mode 100644 static/libs/ace/mode-latex.js
delete mode 100644 static/libs/ace/mode-lean.js
delete mode 100644 static/libs/ace/mode-less.js
delete mode 100644 static/libs/ace/mode-liquid.js
delete mode 100644 static/libs/ace/mode-lisp.js
delete mode 100644 static/libs/ace/mode-live_script.js
delete mode 100644 static/libs/ace/mode-livescript.js
delete mode 100644 static/libs/ace/mode-logiql.js
delete mode 100644 static/libs/ace/mode-lsl.js
delete mode 100644 static/libs/ace/mode-lua.js
delete mode 100644 static/libs/ace/mode-luapage.js
delete mode 100644 static/libs/ace/mode-lucene.js
delete mode 100644 static/libs/ace/mode-makefile.js
delete mode 100644 static/libs/ace/mode-markdown.js
delete mode 100644 static/libs/ace/mode-mask.js
delete mode 100644 static/libs/ace/mode-matlab.js
delete mode 100644 static/libs/ace/mode-maze.js
delete mode 100644 static/libs/ace/mode-mel.js
delete mode 100644 static/libs/ace/mode-mips_assembler.js
delete mode 100644 static/libs/ace/mode-mipsassembler.js
delete mode 100644 static/libs/ace/mode-mushcode.js
delete mode 100644 static/libs/ace/mode-mysql.js
delete mode 100644 static/libs/ace/mode-nix.js
delete mode 100644 static/libs/ace/mode-nsis.js
delete mode 100644 static/libs/ace/mode-objectivec.js
delete mode 100644 static/libs/ace/mode-ocaml.js
delete mode 100644 static/libs/ace/mode-pascal.js
delete mode 100644 static/libs/ace/mode-perl.js
delete mode 100644 static/libs/ace/mode-pgsql.js
delete mode 100644 static/libs/ace/mode-php.js
delete mode 100644 static/libs/ace/mode-plain_text.js
delete mode 100644 static/libs/ace/mode-powershell.js
delete mode 100644 static/libs/ace/mode-praat.js
delete mode 100644 static/libs/ace/mode-prolog.js
delete mode 100644 static/libs/ace/mode-properties.js
delete mode 100644 static/libs/ace/mode-protobuf.js
delete mode 100644 static/libs/ace/mode-python.js
delete mode 100644 static/libs/ace/mode-r.js
delete mode 100644 static/libs/ace/mode-razor.js
delete mode 100644 static/libs/ace/mode-rdoc.js
delete mode 100644 static/libs/ace/mode-rhtml.js
delete mode 100644 static/libs/ace/mode-rst.js
delete mode 100644 static/libs/ace/mode-ruby.js
delete mode 100644 static/libs/ace/mode-rust.js
delete mode 100644 static/libs/ace/mode-sass.js
delete mode 100644 static/libs/ace/mode-scad.js
delete mode 100644 static/libs/ace/mode-scala.js
delete mode 100644 static/libs/ace/mode-scheme.js
delete mode 100644 static/libs/ace/mode-scss.js
delete mode 100644 static/libs/ace/mode-sh.js
delete mode 100644 static/libs/ace/mode-sjs.js
delete mode 100644 static/libs/ace/mode-smarty.js
delete mode 100644 static/libs/ace/mode-snippets.js
delete mode 100644 static/libs/ace/mode-soy_template.js
delete mode 100644 static/libs/ace/mode-space.js
delete mode 100644 static/libs/ace/mode-sql.js
delete mode 100644 static/libs/ace/mode-sqlserver.js
delete mode 100644 static/libs/ace/mode-stylus.js
delete mode 100644 static/libs/ace/mode-svg.js
delete mode 100644 static/libs/ace/mode-swift.js
delete mode 100644 static/libs/ace/mode-swig.js
delete mode 100644 static/libs/ace/mode-tcl.js
delete mode 100644 static/libs/ace/mode-tex.js
delete mode 100644 static/libs/ace/mode-text.js
delete mode 100644 static/libs/ace/mode-textile.js
delete mode 100644 static/libs/ace/mode-toml.js
delete mode 100644 static/libs/ace/mode-tsx.js
delete mode 100644 static/libs/ace/mode-twig.js
delete mode 100644 static/libs/ace/mode-typescript.js
delete mode 100644 static/libs/ace/mode-vala.js
delete mode 100644 static/libs/ace/mode-vbscript.js
delete mode 100644 static/libs/ace/mode-velocity.js
delete mode 100644 static/libs/ace/mode-verilog.js
delete mode 100644 static/libs/ace/mode-vhdl.js
delete mode 100644 static/libs/ace/mode-wollok.js
delete mode 100644 static/libs/ace/mode-xml.js
delete mode 100644 static/libs/ace/mode-xquery.js
delete mode 100644 static/libs/ace/mode-yaml.js
delete mode 100644 static/libs/ace/snippets/abap.js
delete mode 100644 static/libs/ace/snippets/abc.js
delete mode 100644 static/libs/ace/snippets/actionscript.js
delete mode 100644 static/libs/ace/snippets/ada.js
delete mode 100644 static/libs/ace/snippets/apache_conf.js
delete mode 100644 static/libs/ace/snippets/applescript.js
delete mode 100644 static/libs/ace/snippets/asciidoc.js
delete mode 100644 static/libs/ace/snippets/assembly_x86.js
delete mode 100644 static/libs/ace/snippets/autohotkey.js
delete mode 100644 static/libs/ace/snippets/batchfile.js
delete mode 100644 static/libs/ace/snippets/bro.js
delete mode 100644 static/libs/ace/snippets/c9search.js
delete mode 100644 static/libs/ace/snippets/c_cpp.js
delete mode 100644 static/libs/ace/snippets/cirru.js
delete mode 100644 static/libs/ace/snippets/clojure.js
delete mode 100644 static/libs/ace/snippets/cobol.js
delete mode 100644 static/libs/ace/snippets/coffee.js
delete mode 100644 static/libs/ace/snippets/coldfusion.js
delete mode 100644 static/libs/ace/snippets/csharp.js
delete mode 100644 static/libs/ace/snippets/css.js
delete mode 100644 static/libs/ace/snippets/curly.js
delete mode 100644 static/libs/ace/snippets/d.js
delete mode 100644 static/libs/ace/snippets/dart.js
delete mode 100644 static/libs/ace/snippets/diff.js
delete mode 100644 static/libs/ace/snippets/django.js
delete mode 100644 static/libs/ace/snippets/dockerfile.js
delete mode 100644 static/libs/ace/snippets/dot.js
delete mode 100644 static/libs/ace/snippets/drools.js
delete mode 100644 static/libs/ace/snippets/eiffel.js
delete mode 100644 static/libs/ace/snippets/ejs.js
delete mode 100644 static/libs/ace/snippets/elixir.js
delete mode 100644 static/libs/ace/snippets/elm.js
delete mode 100644 static/libs/ace/snippets/erlang.js
delete mode 100644 static/libs/ace/snippets/forth.js
delete mode 100644 static/libs/ace/snippets/fortran.js
delete mode 100644 static/libs/ace/snippets/ftl.js
delete mode 100644 static/libs/ace/snippets/gcode.js
delete mode 100644 static/libs/ace/snippets/gherkin.js
delete mode 100644 static/libs/ace/snippets/gitignore.js
delete mode 100644 static/libs/ace/snippets/glsl.js
delete mode 100644 static/libs/ace/snippets/gobstones.js
delete mode 100644 static/libs/ace/snippets/golang.js
delete mode 100644 static/libs/ace/snippets/groovy.js
delete mode 100644 static/libs/ace/snippets/haml.js
delete mode 100644 static/libs/ace/snippets/handlebars.js
delete mode 100644 static/libs/ace/snippets/haskell.js
delete mode 100644 static/libs/ace/snippets/haskell_cabal.js
delete mode 100644 static/libs/ace/snippets/haxe.js
delete mode 100644 static/libs/ace/snippets/hjson.js
delete mode 100644 static/libs/ace/snippets/html.js
delete mode 100644 static/libs/ace/snippets/html_elixir.js
delete mode 100644 static/libs/ace/snippets/html_ruby.js
delete mode 100644 static/libs/ace/snippets/ini.js
delete mode 100644 static/libs/ace/snippets/io.js
delete mode 100644 static/libs/ace/snippets/jack.js
delete mode 100644 static/libs/ace/snippets/jade.js
delete mode 100644 static/libs/ace/snippets/java.js
delete mode 100644 static/libs/ace/snippets/javascript.js
delete mode 100644 static/libs/ace/snippets/json.js
delete mode 100644 static/libs/ace/snippets/jsoniq.js
delete mode 100644 static/libs/ace/snippets/jsp.js
delete mode 100644 static/libs/ace/snippets/jsx.js
delete mode 100644 static/libs/ace/snippets/julia.js
delete mode 100644 static/libs/ace/snippets/kotlin.js
delete mode 100644 static/libs/ace/snippets/latex.js
delete mode 100644 static/libs/ace/snippets/lean.js
delete mode 100644 static/libs/ace/snippets/less.js
delete mode 100644 static/libs/ace/snippets/liquid.js
delete mode 100644 static/libs/ace/snippets/lisp.js
delete mode 100644 static/libs/ace/snippets/live_script.js
delete mode 100644 static/libs/ace/snippets/livescript.js
delete mode 100644 static/libs/ace/snippets/logiql.js
delete mode 100644 static/libs/ace/snippets/lsl.js
delete mode 100644 static/libs/ace/snippets/lua.js
delete mode 100644 static/libs/ace/snippets/luapage.js
delete mode 100644 static/libs/ace/snippets/lucene.js
delete mode 100644 static/libs/ace/snippets/makefile.js
delete mode 100644 static/libs/ace/snippets/markdown.js
delete mode 100644 static/libs/ace/snippets/mask.js
delete mode 100644 static/libs/ace/snippets/matlab.js
delete mode 100644 static/libs/ace/snippets/maze.js
delete mode 100644 static/libs/ace/snippets/mel.js
delete mode 100644 static/libs/ace/snippets/mips_assembler.js
delete mode 100644 static/libs/ace/snippets/mipsassembler.js
delete mode 100644 static/libs/ace/snippets/mushcode.js
delete mode 100644 static/libs/ace/snippets/mysql.js
delete mode 100644 static/libs/ace/snippets/nix.js
delete mode 100644 static/libs/ace/snippets/nsis.js
delete mode 100644 static/libs/ace/snippets/objectivec.js
delete mode 100644 static/libs/ace/snippets/ocaml.js
delete mode 100644 static/libs/ace/snippets/pascal.js
delete mode 100644 static/libs/ace/snippets/perl.js
delete mode 100644 static/libs/ace/snippets/pgsql.js
delete mode 100644 static/libs/ace/snippets/php.js
delete mode 100644 static/libs/ace/snippets/plain_text.js
delete mode 100644 static/libs/ace/snippets/powershell.js
delete mode 100644 static/libs/ace/snippets/praat.js
delete mode 100644 static/libs/ace/snippets/prolog.js
delete mode 100644 static/libs/ace/snippets/properties.js
delete mode 100644 static/libs/ace/snippets/protobuf.js
delete mode 100644 static/libs/ace/snippets/python.js
delete mode 100644 static/libs/ace/snippets/r.js
delete mode 100644 static/libs/ace/snippets/razor.js
delete mode 100644 static/libs/ace/snippets/rdoc.js
delete mode 100644 static/libs/ace/snippets/rhtml.js
delete mode 100644 static/libs/ace/snippets/rst.js
delete mode 100644 static/libs/ace/snippets/ruby.js
delete mode 100644 static/libs/ace/snippets/rust.js
delete mode 100644 static/libs/ace/snippets/sass.js
delete mode 100644 static/libs/ace/snippets/scad.js
delete mode 100644 static/libs/ace/snippets/scala.js
delete mode 100644 static/libs/ace/snippets/scheme.js
delete mode 100644 static/libs/ace/snippets/scss.js
delete mode 100644 static/libs/ace/snippets/sh.js
delete mode 100644 static/libs/ace/snippets/sjs.js
delete mode 100644 static/libs/ace/snippets/smarty.js
delete mode 100644 static/libs/ace/snippets/snippets.js
delete mode 100644 static/libs/ace/snippets/soy_template.js
delete mode 100644 static/libs/ace/snippets/space.js
delete mode 100644 static/libs/ace/snippets/sql.js
delete mode 100644 static/libs/ace/snippets/sqlserver.js
delete mode 100644 static/libs/ace/snippets/stylus.js
delete mode 100644 static/libs/ace/snippets/svg.js
delete mode 100644 static/libs/ace/snippets/swift.js
delete mode 100644 static/libs/ace/snippets/swig.js
delete mode 100644 static/libs/ace/snippets/tcl.js
delete mode 100644 static/libs/ace/snippets/tex.js
delete mode 100644 static/libs/ace/snippets/text.js
delete mode 100644 static/libs/ace/snippets/textile.js
delete mode 100644 static/libs/ace/snippets/toml.js
delete mode 100644 static/libs/ace/snippets/tsx.js
delete mode 100644 static/libs/ace/snippets/twig.js
delete mode 100644 static/libs/ace/snippets/typescript.js
delete mode 100644 static/libs/ace/snippets/vala.js
delete mode 100644 static/libs/ace/snippets/vbscript.js
delete mode 100644 static/libs/ace/snippets/velocity.js
delete mode 100644 static/libs/ace/snippets/verilog.js
delete mode 100644 static/libs/ace/snippets/vhdl.js
delete mode 100644 static/libs/ace/snippets/wollok.js
delete mode 100644 static/libs/ace/snippets/xml.js
delete mode 100644 static/libs/ace/snippets/xquery.js
delete mode 100644 static/libs/ace/snippets/yaml.js
delete mode 100644 static/libs/ace/theme-ambiance.js
delete mode 100644 static/libs/ace/theme-chaos.js
delete mode 100644 static/libs/ace/theme-chrome.js
delete mode 100644 static/libs/ace/theme-clouds.js
delete mode 100644 static/libs/ace/theme-clouds_midnight.js
delete mode 100644 static/libs/ace/theme-cobalt.js
delete mode 100644 static/libs/ace/theme-crimson_editor.js
delete mode 100644 static/libs/ace/theme-dawn.js
delete mode 100644 static/libs/ace/theme-dreamweaver.js
delete mode 100644 static/libs/ace/theme-eclipse.js
delete mode 100644 static/libs/ace/theme-github.js
delete mode 100644 static/libs/ace/theme-idle_fingers.js
delete mode 100644 static/libs/ace/theme-iplastic.js
delete mode 100644 static/libs/ace/theme-katzenmilch.js
delete mode 100644 static/libs/ace/theme-kr_theme.js
delete mode 100644 static/libs/ace/theme-kuroir.js
delete mode 100644 static/libs/ace/theme-merbivore.js
delete mode 100644 static/libs/ace/theme-merbivore_soft.js
delete mode 100644 static/libs/ace/theme-mono_industrial.js
delete mode 100644 static/libs/ace/theme-monokai.js
delete mode 100644 static/libs/ace/theme-pastel_on_dark.js
delete mode 100644 static/libs/ace/theme-solarized_dark.js
delete mode 100644 static/libs/ace/theme-solarized_light.js
delete mode 100644 static/libs/ace/theme-sqlserver.js
delete mode 100644 static/libs/ace/theme-terminal.js
delete mode 100644 static/libs/ace/theme-textmate.js
delete mode 100644 static/libs/ace/theme-tomorrow.js
delete mode 100644 static/libs/ace/theme-tomorrow_night.js
delete mode 100644 static/libs/ace/theme-tomorrow_night_blue.js
delete mode 100644 static/libs/ace/theme-tomorrow_night_bright.js
delete mode 100644 static/libs/ace/theme-tomorrow_night_eighties.js
delete mode 100644 static/libs/ace/theme-twilight.js
delete mode 100644 static/libs/ace/theme-vibrant_ink.js
delete mode 100644 static/libs/ace/theme-xcode.js
delete mode 100644 static/libs/ace/worker-coffee.js
delete mode 100644 static/libs/ace/worker-css.js
delete mode 100644 static/libs/ace/worker-html.js
delete mode 100644 static/libs/ace/worker-javascript.js
delete mode 100644 static/libs/ace/worker-json.js
delete mode 100644 static/libs/ace/worker-lua.js
delete mode 100644 static/libs/ace/worker-php.js
delete mode 100644 static/libs/ace/worker-xml.js
delete mode 100644 static/libs/ace/worker-xquery.js
delete mode 100644 static/libs/blueimp-md5/js/md5.js
delete mode 100644 static/libs/blueimp-md5/js/md5.min.js
delete mode 100644 static/libs/jquery/core.js
delete mode 100644 static/libs/jquery/jquery.js
delete mode 100644 static/libs/jquery/jquery.min.js
delete mode 100644 static/libs/jquery/jquery.min.map
delete mode 100644 static/libs/jquery/jquery.slim.js
delete mode 100644 static/libs/jquery/jquery.slim.min.js
delete mode 100644 static/libs/jquery/jquery.slim.min.map
delete mode 100644 static/libs/morris.js/morris.css
delete mode 100644 static/libs/morris.js/morris.js
delete mode 100644 static/libs/morris.js/morris.min.js
delete mode 100644 static/libs/raphael/raphael.js
delete mode 100644 static/libs/raphael/raphael.min.js
delete mode 100644 static/libs/raphael/raphael.no-deps.js
delete mode 100644 static/libs/raphael/raphael.no-deps.min.js
delete mode 100644 static/libs/semantic-ui/components/accordion.css
delete mode 100644 static/libs/semantic-ui/components/accordion.js
delete mode 100644 static/libs/semantic-ui/components/accordion.min.css
delete mode 100644 static/libs/semantic-ui/components/accordion.min.js
delete mode 100644 static/libs/semantic-ui/components/ad.css
delete mode 100644 static/libs/semantic-ui/components/ad.min.css
delete mode 100644 static/libs/semantic-ui/components/api.js
delete mode 100644 static/libs/semantic-ui/components/api.min.js
delete mode 100644 static/libs/semantic-ui/components/breadcrumb.css
delete mode 100644 static/libs/semantic-ui/components/breadcrumb.min.css
delete mode 100644 static/libs/semantic-ui/components/button.css
delete mode 100644 static/libs/semantic-ui/components/button.min.css
delete mode 100644 static/libs/semantic-ui/components/card.css
delete mode 100644 static/libs/semantic-ui/components/card.min.css
delete mode 100644 static/libs/semantic-ui/components/checkbox.css
delete mode 100644 static/libs/semantic-ui/components/checkbox.js
delete mode 100644 static/libs/semantic-ui/components/checkbox.min.css
delete mode 100644 static/libs/semantic-ui/components/checkbox.min.js
delete mode 100644 static/libs/semantic-ui/components/colorize.js
delete mode 100644 static/libs/semantic-ui/components/colorize.min.js
delete mode 100644 static/libs/semantic-ui/components/comment.css
delete mode 100644 static/libs/semantic-ui/components/comment.min.css
delete mode 100644 static/libs/semantic-ui/components/container.css
delete mode 100644 static/libs/semantic-ui/components/container.min.css
delete mode 100644 static/libs/semantic-ui/components/dimmer.css
delete mode 100644 static/libs/semantic-ui/components/dimmer.js
delete mode 100644 static/libs/semantic-ui/components/dimmer.min.css
delete mode 100644 static/libs/semantic-ui/components/dimmer.min.js
delete mode 100644 static/libs/semantic-ui/components/divider.css
delete mode 100644 static/libs/semantic-ui/components/divider.min.css
delete mode 100644 static/libs/semantic-ui/components/dropdown.css
delete mode 100644 static/libs/semantic-ui/components/dropdown.js
delete mode 100644 static/libs/semantic-ui/components/dropdown.min.css
delete mode 100644 static/libs/semantic-ui/components/dropdown.min.js
delete mode 100644 static/libs/semantic-ui/components/embed.css
delete mode 100644 static/libs/semantic-ui/components/embed.js
delete mode 100644 static/libs/semantic-ui/components/embed.min.css
delete mode 100644 static/libs/semantic-ui/components/embed.min.js
delete mode 100644 static/libs/semantic-ui/components/feed.css
delete mode 100644 static/libs/semantic-ui/components/feed.min.css
delete mode 100644 static/libs/semantic-ui/components/flag.css
delete mode 100644 static/libs/semantic-ui/components/flag.min.css
delete mode 100644 static/libs/semantic-ui/components/form.css
delete mode 100644 static/libs/semantic-ui/components/form.js
delete mode 100644 static/libs/semantic-ui/components/form.min.css
delete mode 100644 static/libs/semantic-ui/components/form.min.js
delete mode 100644 static/libs/semantic-ui/components/grid.css
delete mode 100644 static/libs/semantic-ui/components/grid.min.css
delete mode 100644 static/libs/semantic-ui/components/header.css
delete mode 100644 static/libs/semantic-ui/components/header.min.css
delete mode 100644 static/libs/semantic-ui/components/icon.css
delete mode 100644 static/libs/semantic-ui/components/icon.min.css
delete mode 100644 static/libs/semantic-ui/components/image.css
delete mode 100644 static/libs/semantic-ui/components/image.min.css
delete mode 100644 static/libs/semantic-ui/components/input.css
delete mode 100644 static/libs/semantic-ui/components/input.min.css
delete mode 100644 static/libs/semantic-ui/components/item.css
delete mode 100644 static/libs/semantic-ui/components/item.min.css
delete mode 100644 static/libs/semantic-ui/components/label.css
delete mode 100644 static/libs/semantic-ui/components/label.min.css
delete mode 100644 static/libs/semantic-ui/components/list.css
delete mode 100644 static/libs/semantic-ui/components/list.min.css
delete mode 100644 static/libs/semantic-ui/components/loader.css
delete mode 100644 static/libs/semantic-ui/components/loader.min.css
delete mode 100644 static/libs/semantic-ui/components/menu.css
delete mode 100644 static/libs/semantic-ui/components/menu.min.css
delete mode 100644 static/libs/semantic-ui/components/message.css
delete mode 100644 static/libs/semantic-ui/components/message.min.css
delete mode 100644 static/libs/semantic-ui/components/modal.css
delete mode 100644 static/libs/semantic-ui/components/modal.js
delete mode 100644 static/libs/semantic-ui/components/modal.min.css
delete mode 100644 static/libs/semantic-ui/components/modal.min.js
delete mode 100644 static/libs/semantic-ui/components/nag.css
delete mode 100644 static/libs/semantic-ui/components/nag.js
delete mode 100644 static/libs/semantic-ui/components/nag.min.css
delete mode 100644 static/libs/semantic-ui/components/nag.min.js
delete mode 100644 static/libs/semantic-ui/components/popup.css
delete mode 100644 static/libs/semantic-ui/components/popup.js
delete mode 100644 static/libs/semantic-ui/components/popup.min.css
delete mode 100644 static/libs/semantic-ui/components/popup.min.js
delete mode 100644 static/libs/semantic-ui/components/progress.css
delete mode 100644 static/libs/semantic-ui/components/progress.js
delete mode 100644 static/libs/semantic-ui/components/progress.min.css
delete mode 100644 static/libs/semantic-ui/components/progress.min.js
delete mode 100644 static/libs/semantic-ui/components/rail.css
delete mode 100644 static/libs/semantic-ui/components/rail.min.css
delete mode 100644 static/libs/semantic-ui/components/rating.css
delete mode 100644 static/libs/semantic-ui/components/rating.js
delete mode 100644 static/libs/semantic-ui/components/rating.min.css
delete mode 100644 static/libs/semantic-ui/components/rating.min.js
delete mode 100644 static/libs/semantic-ui/components/reset.css
delete mode 100644 static/libs/semantic-ui/components/reset.min.css
delete mode 100644 static/libs/semantic-ui/components/reveal.css
delete mode 100644 static/libs/semantic-ui/components/reveal.min.css
delete mode 100644 static/libs/semantic-ui/components/search.css
delete mode 100644 static/libs/semantic-ui/components/search.js
delete mode 100644 static/libs/semantic-ui/components/search.min.css
delete mode 100644 static/libs/semantic-ui/components/search.min.js
delete mode 100644 static/libs/semantic-ui/components/segment.css
delete mode 100644 static/libs/semantic-ui/components/segment.min.css
delete mode 100644 static/libs/semantic-ui/components/shape.css
delete mode 100644 static/libs/semantic-ui/components/shape.js
delete mode 100644 static/libs/semantic-ui/components/shape.min.css
delete mode 100644 static/libs/semantic-ui/components/shape.min.js
delete mode 100644 static/libs/semantic-ui/components/sidebar.css
delete mode 100644 static/libs/semantic-ui/components/sidebar.js
delete mode 100644 static/libs/semantic-ui/components/sidebar.min.css
delete mode 100644 static/libs/semantic-ui/components/sidebar.min.js
delete mode 100644 static/libs/semantic-ui/components/site.css
delete mode 100644 static/libs/semantic-ui/components/site.js
delete mode 100644 static/libs/semantic-ui/components/site.min.css
delete mode 100644 static/libs/semantic-ui/components/site.min.js
delete mode 100644 static/libs/semantic-ui/components/state.js
delete mode 100644 static/libs/semantic-ui/components/state.min.js
delete mode 100644 static/libs/semantic-ui/components/statistic.css
delete mode 100644 static/libs/semantic-ui/components/statistic.min.css
delete mode 100644 static/libs/semantic-ui/components/step.css
delete mode 100644 static/libs/semantic-ui/components/step.min.css
delete mode 100644 static/libs/semantic-ui/components/sticky.css
delete mode 100644 static/libs/semantic-ui/components/sticky.js
delete mode 100644 static/libs/semantic-ui/components/sticky.min.css
delete mode 100644 static/libs/semantic-ui/components/sticky.min.js
delete mode 100644 static/libs/semantic-ui/components/tab.css
delete mode 100644 static/libs/semantic-ui/components/tab.js
delete mode 100644 static/libs/semantic-ui/components/tab.min.css
delete mode 100644 static/libs/semantic-ui/components/tab.min.js
delete mode 100644 static/libs/semantic-ui/components/table.css
delete mode 100644 static/libs/semantic-ui/components/table.min.css
delete mode 100644 static/libs/semantic-ui/components/transition.css
delete mode 100644 static/libs/semantic-ui/components/transition.js
delete mode 100644 static/libs/semantic-ui/components/transition.min.css
delete mode 100644 static/libs/semantic-ui/components/transition.min.js
delete mode 100644 static/libs/semantic-ui/components/video.css
delete mode 100644 static/libs/semantic-ui/components/video.js
delete mode 100644 static/libs/semantic-ui/components/video.min.css
delete mode 100644 static/libs/semantic-ui/components/video.min.js
delete mode 100644 static/libs/semantic-ui/components/visibility.js
delete mode 100644 static/libs/semantic-ui/components/visibility.min.js
delete mode 100644 static/libs/semantic-ui/components/visit.js
delete mode 100644 static/libs/semantic-ui/components/visit.min.js
delete mode 100644 static/libs/semantic-ui/semantic.css
delete mode 100644 static/libs/semantic-ui/semantic.js
delete mode 100644 static/libs/semantic-ui/semantic.min.css
delete mode 100644 static/libs/semantic-ui/semantic.min.js
delete mode 100644 static/libs/semantic-ui/themes/basic/assets/fonts/icons.eot
delete mode 100644 static/libs/semantic-ui/themes/basic/assets/fonts/icons.svg
delete mode 100644 static/libs/semantic-ui/themes/basic/assets/fonts/icons.ttf
delete mode 100644 static/libs/semantic-ui/themes/basic/assets/fonts/icons.woff
delete mode 100644 static/libs/semantic-ui/themes/default/assets/fonts/icons.eot
delete mode 100644 static/libs/semantic-ui/themes/default/assets/fonts/icons.otf
delete mode 100644 static/libs/semantic-ui/themes/default/assets/fonts/icons.svg
delete mode 100644 static/libs/semantic-ui/themes/default/assets/fonts/icons.ttf
delete mode 100644 static/libs/semantic-ui/themes/default/assets/fonts/icons.woff
delete mode 100644 static/libs/semantic-ui/themes/default/assets/fonts/icons.woff2
delete mode 100644 static/libs/semantic-ui/themes/default/assets/images/flags.png
delete mode 100644 static/libs/semantic-ui/themes/github/assets/fonts/octicons-local.ttf
delete mode 100644 static/libs/semantic-ui/themes/github/assets/fonts/octicons.svg
delete mode 100644 static/libs/semantic-ui/themes/github/assets/fonts/octicons.ttf
delete mode 100644 static/libs/semantic-ui/themes/github/assets/fonts/octicons.woff
delete mode 100644 static/libs/semantic-ui/themes/material/assets/fonts/icons.eot
delete mode 100644 static/libs/semantic-ui/themes/material/assets/fonts/icons.svg
delete mode 100644 static/libs/semantic-ui/themes/material/assets/fonts/icons.ttf
delete mode 100644 static/libs/semantic-ui/themes/material/assets/fonts/icons.woff
delete mode 100644 static/textFit.js
diff --git a/app.js b/app.js
index bb263c6..e9e99fa 100644
--- a/app.js
+++ b/app.js
@@ -82,9 +82,6 @@ global.syzoj = {
return router;
})());
- let csurf = require('csurf');
- app.use(csurf({ cookie: true }));
-
await this.connectDatabase();
await this.lib('judger').connect();
this.loadModules();
diff --git a/config-example.json b/config-example.json
index e6d89cc..097cfdf 100644
--- a/config-example.json
+++ b/config-example.json
@@ -10,7 +10,7 @@
"dialect": "sqlite",
"storage": "syzoj.db"
},
- "register_mail": true,
+ "register_mail": false,
"email": {
"method": "aliyundm",
"options": {
@@ -48,7 +48,7 @@
"submit_code": 102400,
"submit_answer": 10485760,
"custom_test_input": 20971520,
- "testdata_filecount": 5
+ "testdata_filecount": 100
},
"page": {
"problem": 50,
@@ -168,5 +168,6 @@
"session_secret": "233",
"rabbitMQ": "amqp://localhost/",
"judge_token": "233",
- "email_jwt_secret": "test"
+ "email_jwt_secret": "test",
+ "google_analytics": "UA-XXXXXXXX-X"
}
diff --git a/modules/admin.js b/modules/admin.js
index 54bfaa1..1845eb3 100644
--- a/modules/admin.js
+++ b/modules/admin.js
@@ -59,10 +59,7 @@ app.get('/admin/info', async (req, res) => {
let configItems = {
'title': { name: '站点标题', type: String },
- '邮箱验证': null,
- 'register_mail.enabled': { name: '启用', type: Boolean },
- 'register_mail.address': { name: '发件人地址', type: String },
- 'register_mail.key': { name: '密钥', type: String },
+ 'google_analytics': { name: 'Google Analytics', type: String },
'默认参数': null,
'default.problem.time_limit': { name: '时间限制(单位:ms)', type: Number },
'default.problem.memory_limit': { name: '空间限制(单位:MiB)', type: Number },
diff --git a/package-lock.json b/package-lock.json
deleted file mode 100644
index 9ccd318..0000000
--- a/package-lock.json
+++ /dev/null
@@ -1,3904 +0,0 @@
-{
- "name": "syzoj",
- "version": "2.0.0",
- "lockfileVersion": 1,
- "requires": true,
- "dependencies": {
- "@types/geojson": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/@types/geojson/-/geojson-1.0.2.tgz",
- "integrity": "sha1-sC0QqwKOKSisWSoFGqpJgaGUHQM="
- },
- "@types/node": {
- "version": "6.0.83",
- "resolved": "https://registry.npmjs.org/@types/node/-/node-6.0.83.tgz",
- "integrity": "sha512-Q92+tkWnX7nmT0ZG+/wFxzJr+idr00T12MgsY3p0sZIu8nfvYF8i5pbY3BVZw6ad6yS2MLF71sfMr+ySatc2Gw=="
- },
- "abab": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/abab/-/abab-1.0.3.tgz",
- "integrity": "sha1-uB3l9ydOxOdW15fNg08wNkJyTl0="
- },
- "abbrev": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz",
- "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q=="
- },
- "accepts": {
- "version": "1.3.3",
- "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.3.tgz",
- "integrity": "sha1-w8p0NJOGSMPg2cHjKN1otiLChMo=",
- "requires": {
- "mime-types": "2.1.15",
- "negotiator": "0.6.1"
- }
- },
- "acorn": {
- "version": "4.0.13",
- "resolved": "https://registry.npmjs.org/acorn/-/acorn-4.0.13.tgz",
- "integrity": "sha1-EFSVrlNh1pe9GVyCUZLhrX8lN4c="
- },
- "acorn-globals": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-3.1.0.tgz",
- "integrity": "sha1-/YJw9x+7SZawBPqIDuXUZXOnMb8=",
- "requires": {
- "acorn": "4.0.13"
- }
- },
- "addressparser": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/addressparser/-/addressparser-1.0.1.tgz",
- "integrity": "sha1-R6++GiqSYhkdtoOOT9HTm0CCF0Y="
- },
- "after": {
- "version": "0.8.2",
- "resolved": "https://registry.npmjs.org/after/-/after-0.8.2.tgz",
- "integrity": "sha1-/ts5T58OAqqXaOcCvaI7UF+ufh8="
- },
- "ajv": {
- "version": "4.11.8",
- "resolved": "https://registry.npmjs.org/ajv/-/ajv-4.11.8.tgz",
- "integrity": "sha1-gv+wKynmYq5TvcIK8VlHcGc5xTY=",
- "requires": {
- "co": "4.6.0",
- "json-stable-stringify": "1.0.1"
- }
- },
- "amdefine": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz",
- "integrity": "sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU=",
- "optional": true
- },
- "amqplib": {
- "version": "0.5.2",
- "resolved": "https://registry.npmjs.org/amqplib/-/amqplib-0.5.2.tgz",
- "integrity": "sha512-l9mCs6LbydtHqRniRwYkKdqxVa6XMz3Vw1fh+2gJaaVgTM6Jk3o8RccAKWKtlhT1US5sWrFh+KKxsVUALURSIA==",
- "requires": {
- "bitsyntax": "0.0.4",
- "bluebird": "3.5.0",
- "buffer-more-ints": "0.0.2",
- "readable-stream": "1.1.14",
- "safe-buffer": "5.1.1"
- },
- "dependencies": {
- "isarray": {
- "version": "0.0.1",
- "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz",
- "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8="
- },
- "readable-stream": {
- "version": "1.1.14",
- "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz",
- "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=",
- "requires": {
- "core-util-is": "1.0.2",
- "inherits": "2.0.3",
- "isarray": "0.0.1",
- "string_decoder": "0.10.31"
- }
- },
- "string_decoder": {
- "version": "0.10.31",
- "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz",
- "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ="
- }
- }
- },
- "ansi-regex": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz",
- "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8="
- },
- "ansi-styles": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-1.1.0.tgz",
- "integrity": "sha1-6uy/Zs1waIJ2Cy9GkVgrj1XXp94="
- },
- "ansi-to-html": {
- "version": "0.4.2",
- "resolved": "https://registry.npmjs.org/ansi-to-html/-/ansi-to-html-0.4.2.tgz",
- "integrity": "sha1-UQLgJzpZi+L40IiWYDsXmw/fzxE=",
- "requires": {
- "entities": "1.1.1"
- }
- },
- "append-field": {
- "version": "0.1.0",
- "resolved": "https://registry.npmjs.org/append-field/-/append-field-0.1.0.tgz",
- "integrity": "sha1-bdxY+gg8e8VF08WZWygwzCNm1Eo="
- },
- "aproba": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz",
- "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw=="
- },
- "are-we-there-yet": {
- "version": "1.1.4",
- "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.4.tgz",
- "integrity": "sha1-u13KOCu5TwXhUZQ3PRb9O6HKEQ0=",
- "requires": {
- "delegates": "1.0.0",
- "readable-stream": "2.3.3"
- }
- },
- "argparse": {
- "version": "1.0.9",
- "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.9.tgz",
- "integrity": "sha1-c9g7wmP4bpf4zE9rrhsOkKfSLIY=",
- "requires": {
- "sprintf-js": "1.0.3"
- }
- },
- "array-back": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/array-back/-/array-back-2.0.0.tgz",
- "integrity": "sha512-eJv4pLLufP3g5kcZry0j6WXpIbzYw9GUB4mVJZno9wfwiBxbizTnHCw3VJb07cBihbFX48Y7oSrW9y+gt4glyw==",
- "requires": {
- "typical": "2.6.1"
- }
- },
- "array-equal": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/array-equal/-/array-equal-1.0.0.tgz",
- "integrity": "sha1-jCpe8kcv2ep0KwTHenUJO6J1fJM="
- },
- "array-flatten": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz",
- "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI="
- },
- "array-uniq": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.2.tgz",
- "integrity": "sha1-X8w3OSB3VyPP1k1lxkvvU7+eum0="
- },
- "arraybuffer.slice": {
- "version": "0.0.7",
- "resolved": "https://registry.npmjs.org/arraybuffer.slice/-/arraybuffer.slice-0.0.7.tgz",
- "integrity": "sha512-wGUIVQXuehL5TCqQun8OW81jGzAWycqzFF8lFp+GOM5BXLYj3bKNsYC4daB7n6XjCqxQA/qgTJ+8ANR3acjrog=="
- },
- "asn1": {
- "version": "0.2.3",
- "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.3.tgz",
- "integrity": "sha1-2sh4dxPJlmhJ/IGAd36+nB3fO4Y="
- },
- "assert-plus": {
- "version": "0.2.0",
- "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-0.2.0.tgz",
- "integrity": "sha1-104bh+ev/A24qttwIfP+SBAasjQ="
- },
- "async": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/async/-/async-1.0.0.tgz",
- "integrity": "sha1-+PwEyjoTeErenhZBr5hXjPvWR6k="
- },
- "async-limiter": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.0.tgz",
- "integrity": "sha512-jp/uFnooOiO+L211eZOoSyzpOITMXx1rBITauYykG3BRYPu8h0UcxsPNB04RR5vo4Tyz3+ay17tR6JVf9qzYWg=="
- },
- "async-lock": {
- "version": "0.3.10",
- "resolved": "https://registry.npmjs.org/async-lock/-/async-lock-0.3.10.tgz",
- "integrity": "sha1-XCx58EDLA/00Q+FYjTEhevoKhcw=",
- "requires": {
- "q": "1.5.0"
- }
- },
- "asynckit": {
- "version": "0.4.0",
- "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
- "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k="
- },
- "aws-sign2": {
- "version": "0.6.0",
- "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.6.0.tgz",
- "integrity": "sha1-FDQt0428yU0OW4fXY81jYSwOeU8="
- },
- "aws4": {
- "version": "1.6.0",
- "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.6.0.tgz",
- "integrity": "sha1-g+9cqGCysy5KDe7e6MdxudtXRx4="
- },
- "backo2": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/backo2/-/backo2-1.0.2.tgz",
- "integrity": "sha1-MasayLEpNjRj41s+u2n038+6eUc="
- },
- "bagpipe": {
- "version": "0.3.5",
- "resolved": "https://registry.npmjs.org/bagpipe/-/bagpipe-0.3.5.tgz",
- "integrity": "sha1-40HRZPyyTN8E6n4Ft2XsEMiupqE="
- },
- "balanced-match": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz",
- "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c="
- },
- "base64-arraybuffer": {
- "version": "0.1.5",
- "resolved": "https://registry.npmjs.org/base64-arraybuffer/-/base64-arraybuffer-0.1.5.tgz",
- "integrity": "sha1-c5JncZI7Whl0etZmqlzUv5xunOg="
- },
- "base64-js": {
- "version": "0.0.8",
- "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-0.0.8.tgz",
- "integrity": "sha1-EQHpVE9KdrG8OybUUsqW16NeeXg="
- },
- "base64id": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/base64id/-/base64id-1.0.0.tgz",
- "integrity": "sha1-R2iMuZu2gE8OBtPnY7HDLlfY5rY="
- },
- "base64url": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/base64url/-/base64url-2.0.0.tgz",
- "integrity": "sha1-6sFuA+oUOO/5Qj1puqNiYu0fcLs="
- },
- "bcrypt-pbkdf": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.1.tgz",
- "integrity": "sha1-Y7xdy2EzG5K8Bf1SiVPDNGKgb40=",
- "optional": true,
- "requires": {
- "tweetnacl": "0.14.5"
- }
- },
- "better-assert": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/better-assert/-/better-assert-1.0.2.tgz",
- "integrity": "sha1-QIZrnhueC1W0gYlDEeaPr/rrxSI=",
- "requires": {
- "callsite": "1.0.0"
- }
- },
- "bignumber.js": {
- "version": "3.1.2",
- "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-3.1.2.tgz",
- "integrity": "sha1-8725mtUmihX8HwvtL7AY4mk/4jY="
- },
- "bitsyntax": {
- "version": "0.0.4",
- "resolved": "https://registry.npmjs.org/bitsyntax/-/bitsyntax-0.0.4.tgz",
- "integrity": "sha1-6xDMb4K4xJDj6FaY8H6D1G4MuoI=",
- "requires": {
- "buffer-more-ints": "0.0.2"
- }
- },
- "bl": {
- "version": "1.2.1",
- "resolved": "https://registry.npmjs.org/bl/-/bl-1.2.1.tgz",
- "integrity": "sha1-ysMo977kVzDUBLaSID/LWQ4XLV4=",
- "requires": {
- "readable-stream": "2.3.3"
- }
- },
- "blob": {
- "version": "0.0.4",
- "resolved": "https://registry.npmjs.org/blob/-/blob-0.0.4.tgz",
- "integrity": "sha1-vPEwUspURj8w+fx+lbmkdjCpSSE="
- },
- "block-stream": {
- "version": "0.0.9",
- "resolved": "https://registry.npmjs.org/block-stream/-/block-stream-0.0.9.tgz",
- "integrity": "sha1-E+v+d4oDIFz+A3UUgeu0szAMEmo=",
- "requires": {
- "inherits": "2.0.3"
- }
- },
- "bluebird": {
- "version": "3.5.0",
- "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.0.tgz",
- "integrity": "sha1-eRQg1/VR7qKJdFOop3ZT+WYG1nw="
- },
- "blueimp-md5": {
- "version": "2.7.0",
- "resolved": "https://registry.npmjs.org/blueimp-md5/-/blueimp-md5-2.7.0.tgz",
- "integrity": "sha1-f1GODdcEZ/7+KOy6OYkWCS8qAqk="
- },
- "body-parser": {
- "version": "1.17.2",
- "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.17.2.tgz",
- "integrity": "sha1-+IkqvI+eYn1Crtr7yma/WrmRBO4=",
- "requires": {
- "bytes": "2.4.0",
- "content-type": "1.0.2",
- "debug": "2.6.7",
- "depd": "1.1.0",
- "http-errors": "1.6.1",
- "iconv-lite": "0.4.15",
- "on-finished": "2.3.0",
- "qs": "6.4.0",
- "raw-body": "2.2.0",
- "type-is": "1.6.15"
- }
- },
- "boolbase": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz",
- "integrity": "sha1-aN/1++YMUes3cl6p4+0xDcwed24="
- },
- "boom": {
- "version": "2.10.1",
- "resolved": "https://registry.npmjs.org/boom/-/boom-2.10.1.tgz",
- "integrity": "sha1-OciRjO/1eZ+D+UkqhI9iWt0Mdm8=",
- "requires": {
- "hoek": "2.16.3"
- }
- },
- "brace-expansion": {
- "version": "1.1.11",
- "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
- "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
- "requires": {
- "balanced-match": "1.0.0",
- "concat-map": "0.0.1"
- }
- },
- "buffer": {
- "version": "3.6.0",
- "resolved": "https://registry.npmjs.org/buffer/-/buffer-3.6.0.tgz",
- "integrity": "sha1-pyyTb3e5a/UvX357RnGAYoVR3vs=",
- "requires": {
- "base64-js": "0.0.8",
- "ieee754": "1.1.8",
- "isarray": "1.0.0"
- }
- },
- "buffer-crc32": {
- "version": "0.2.13",
- "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz",
- "integrity": "sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI="
- },
- "buffer-equal-constant-time": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz",
- "integrity": "sha1-+OcRMvf/5uAaXJaXpMbz5I1cyBk="
- },
- "buffer-more-ints": {
- "version": "0.0.2",
- "resolved": "https://registry.npmjs.org/buffer-more-ints/-/buffer-more-ints-0.0.2.tgz",
- "integrity": "sha1-JrOIXRD6E9t/wBquOquHAZngEkw="
- },
- "buildmail": {
- "version": "3.10.0",
- "resolved": "https://registry.npmjs.org/buildmail/-/buildmail-3.10.0.tgz",
- "integrity": "sha1-xoJtcW55RbtvaxQ0tTmF4CmgMVk=",
- "requires": {
- "addressparser": "1.0.1",
- "libbase64": "0.1.0",
- "libmime": "2.1.0",
- "libqp": "1.1.0",
- "nodemailer-fetch": "1.6.0",
- "nodemailer-shared": "1.1.0"
- },
- "dependencies": {
- "iconv-lite": {
- "version": "0.4.13",
- "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.13.tgz",
- "integrity": "sha1-H4irpKsLFQjoMSrMOTRfNumS4vI="
- },
- "libmime": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/libmime/-/libmime-2.1.0.tgz",
- "integrity": "sha1-Ubx23iKDFh65BRxLyArtcT5P0c0=",
- "requires": {
- "iconv-lite": "0.4.13",
- "libbase64": "0.1.0",
- "libqp": "1.1.0"
- }
- }
- }
- },
- "builtin-modules": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz",
- "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8="
- },
- "busboy": {
- "version": "0.2.14",
- "resolved": "https://registry.npmjs.org/busboy/-/busboy-0.2.14.tgz",
- "integrity": "sha1-bCpiLvz0fFe7vh4qnDetNseSVFM=",
- "requires": {
- "dicer": "0.2.5",
- "readable-stream": "1.1.14"
- },
- "dependencies": {
- "isarray": {
- "version": "0.0.1",
- "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz",
- "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8="
- },
- "readable-stream": {
- "version": "1.1.14",
- "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz",
- "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=",
- "requires": {
- "core-util-is": "1.0.2",
- "inherits": "2.0.3",
- "isarray": "0.0.1",
- "string_decoder": "0.10.31"
- }
- },
- "string_decoder": {
- "version": "0.10.31",
- "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz",
- "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ="
- }
- }
- },
- "bytes": {
- "version": "2.4.0",
- "resolved": "https://registry.npmjs.org/bytes/-/bytes-2.4.0.tgz",
- "integrity": "sha1-fZcZb51br39pNeJZhVSe3SpsIzk="
- },
- "callsite": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/callsite/-/callsite-1.0.0.tgz",
- "integrity": "sha1-KAOY5dZkvXQDi28JBRU+borxvCA="
- },
- "camelcase": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz",
- "integrity": "sha1-MvxLn82vhF/N9+c7uXysImHwqwo="
- },
- "capture-stack-trace": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/capture-stack-trace/-/capture-stack-trace-1.0.0.tgz",
- "integrity": "sha1-Sm+gc5nCa7pH8LJJa00PtAjFVQ0="
- },
- "caseless": {
- "version": "0.12.0",
- "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz",
- "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw="
- },
- "caw": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/caw/-/caw-2.0.0.tgz",
- "integrity": "sha1-Efi93C+AFGmVLV4yJbqYSVovoP8=",
- "requires": {
- "get-proxy": "1.1.0",
- "tunnel-agent": "0.4.3"
- }
- },
- "chalk": {
- "version": "0.5.1",
- "resolved": "https://registry.npmjs.org/chalk/-/chalk-0.5.1.tgz",
- "integrity": "sha1-Zjs6ZItotV0EaQ1JFnqoN4WPIXQ=",
- "requires": {
- "ansi-styles": "1.1.0",
- "escape-string-regexp": "1.0.5",
- "has-ansi": "0.1.0",
- "strip-ansi": "0.3.0",
- "supports-color": "0.2.0"
- },
- "dependencies": {
- "ansi-regex": {
- "version": "0.2.1",
- "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-0.2.1.tgz",
- "integrity": "sha1-DY6UaWej2BQ/k+JOKYUl/BsiNfk="
- },
- "strip-ansi": {
- "version": "0.3.0",
- "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-0.3.0.tgz",
- "integrity": "sha1-JfSOoiynkYfzF0pNuHWTR7sSYiA=",
- "requires": {
- "ansi-regex": "0.2.1"
- }
- }
- }
- },
- "cheerio": {
- "version": "1.0.0-rc.2",
- "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-1.0.0-rc.2.tgz",
- "integrity": "sha1-S59TqBsn5NXawxwP/Qz6A8xoMNs=",
- "requires": {
- "css-select": "1.2.0",
- "dom-serializer": "0.1.0",
- "entities": "1.1.1",
- "htmlparser2": "3.9.2",
- "lodash": "4.17.4",
- "parse5": "3.0.2"
- }
- },
- "cliui": {
- "version": "3.2.0",
- "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz",
- "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=",
- "requires": {
- "string-width": "1.0.2",
- "strip-ansi": "3.0.1",
- "wrap-ansi": "2.1.0"
- }
- },
- "co": {
- "version": "4.6.0",
- "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz",
- "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ="
- },
- "code-point-at": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz",
- "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c="
- },
- "colors": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/colors/-/colors-1.0.3.tgz",
- "integrity": "sha1-BDP0TYCWgP3rYO0mDxsMJi6CpAs="
- },
- "combined-stream": {
- "version": "1.0.5",
- "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.5.tgz",
- "integrity": "sha1-k4NwpXtKUd6ix3wV1cX9+JUWQAk=",
- "requires": {
- "delayed-stream": "1.0.0"
- }
- },
- "command-line-args": {
- "version": "4.0.7",
- "resolved": "https://registry.npmjs.org/command-line-args/-/command-line-args-4.0.7.tgz",
- "integrity": "sha512-aUdPvQRAyBvQd2n7jXcsMDz68ckBJELXNzBybCHOibUWEg0mWTnaYCSRU8h9R+aNRSvDihJtssSRCiDRpLaezA==",
- "requires": {
- "array-back": "2.0.0",
- "find-replace": "1.0.3",
- "typical": "2.6.1"
- }
- },
- "commander": {
- "version": "2.8.1",
- "resolved": "https://registry.npmjs.org/commander/-/commander-2.8.1.tgz",
- "integrity": "sha1-Br42f+v9oMMwqh4qBy09yXYkJdQ=",
- "requires": {
- "graceful-readlink": "1.0.1"
- }
- },
- "component-bind": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/component-bind/-/component-bind-1.0.0.tgz",
- "integrity": "sha1-AMYIq33Nk4l8AAllGx06jh5zu9E="
- },
- "component-emitter": {
- "version": "1.2.1",
- "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz",
- "integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY="
- },
- "component-inherit": {
- "version": "0.0.3",
- "resolved": "https://registry.npmjs.org/component-inherit/-/component-inherit-0.0.3.tgz",
- "integrity": "sha1-ZF/ErfWLcrZJ1crmUTVhnbJv8UM="
- },
- "concat-map": {
- "version": "0.0.1",
- "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
- "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s="
- },
- "concat-stream": {
- "version": "1.6.0",
- "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.0.tgz",
- "integrity": "sha1-CqxmL9Ur54lk1VMvaUeE5wEQrPc=",
- "requires": {
- "inherits": "2.0.3",
- "readable-stream": "2.3.3",
- "typedarray": "0.0.6"
- }
- },
- "console-control-strings": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz",
- "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4="
- },
- "content-disposition": {
- "version": "0.5.2",
- "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.2.tgz",
- "integrity": "sha1-DPaLud318r55YcOoUXjLhdunjLQ="
- },
- "content-type": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.2.tgz",
- "integrity": "sha1-t9ETrueo3Se9IRM8TcJSnfFyHu0="
- },
- "content-type-parser": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/content-type-parser/-/content-type-parser-1.0.1.tgz",
- "integrity": "sha1-w+VpiMU8ZRJ/tG1AMqOpACRv3JQ="
- },
- "cookie": {
- "version": "0.3.1",
- "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.3.1.tgz",
- "integrity": "sha1-5+Ch+e9DtMi6klxcWpboBtFoc7s="
- },
- "cookie-parser": {
- "version": "1.4.3",
- "resolved": "https://registry.npmjs.org/cookie-parser/-/cookie-parser-1.4.3.tgz",
- "integrity": "sha1-D+MfoZ0AC5X0qt8fU/3CuKIDuqU=",
- "requires": {
- "cookie": "0.3.1",
- "cookie-signature": "1.0.6"
- }
- },
- "cookie-signature": {
- "version": "1.0.6",
- "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz",
- "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw="
- },
- "core-util-is": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz",
- "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac="
- },
- "crc": {
- "version": "3.4.4",
- "resolved": "https://registry.npmjs.org/crc/-/crc-3.4.4.tgz",
- "integrity": "sha1-naHpgOO9RPxck79as9ozeNheRms="
- },
- "create-error-class": {
- "version": "3.0.2",
- "resolved": "https://registry.npmjs.org/create-error-class/-/create-error-class-3.0.2.tgz",
- "integrity": "sha1-Br56vvlHo/FKMP1hBnHUAbyot7Y=",
- "requires": {
- "capture-stack-trace": "1.0.0"
- }
- },
- "cross-env": {
- "version": "3.2.4",
- "resolved": "https://registry.npmjs.org/cross-env/-/cross-env-3.2.4.tgz",
- "integrity": "sha1-ngWF8neGTtQhznVvgamA/w1piro=",
- "requires": {
- "cross-spawn": "5.1.0",
- "is-windows": "1.0.1"
- }
- },
- "cross-spawn": {
- "version": "5.1.0",
- "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz",
- "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=",
- "requires": {
- "lru-cache": "4.1.1",
- "shebang-command": "1.2.0",
- "which": "1.2.14"
- }
- },
- "cryptiles": {
- "version": "2.0.5",
- "resolved": "https://registry.npmjs.org/cryptiles/-/cryptiles-2.0.5.tgz",
- "integrity": "sha1-O9/s3GCBR8HGcgL6KR59ylnqo7g=",
- "requires": {
- "boom": "2.10.1"
- }
- },
- "csrf": {
- "version": "3.0.6",
- "resolved": "https://registry.npmjs.org/csrf/-/csrf-3.0.6.tgz",
- "integrity": "sha1-thEg3c7q/JHnbtUxO7XAsmZ7cQo=",
- "requires": {
- "rndm": "1.2.0",
- "tsscmp": "1.0.5",
- "uid-safe": "2.1.4"
- }
- },
- "css-select": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/css-select/-/css-select-1.2.0.tgz",
- "integrity": "sha1-KzoRBTnFNV8c2NMUYj6HCxIeyFg=",
- "requires": {
- "boolbase": "1.0.0",
- "css-what": "2.1.0",
- "domutils": "1.5.1",
- "nth-check": "1.0.1"
- }
- },
- "css-what": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/css-what/-/css-what-2.1.0.tgz",
- "integrity": "sha1-lGfQMsOM+u+58teVASUwYvh/ob0="
- },
- "cssfilter": {
- "version": "0.0.10",
- "resolved": "https://registry.npmjs.org/cssfilter/-/cssfilter-0.0.10.tgz",
- "integrity": "sha1-xtJnJjKi5cg+AT5oZKQs6N79IK4="
- },
- "cssom": {
- "version": "0.3.2",
- "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.2.tgz",
- "integrity": "sha1-uANhcMefB6kP8vFuIihAJ6JDhIs="
- },
- "cssstyle": {
- "version": "0.2.37",
- "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-0.2.37.tgz",
- "integrity": "sha1-VBCXI0yyUTyDzu06zdwn/yeYfVQ=",
- "requires": {
- "cssom": "0.3.2"
- }
- },
- "csurf": {
- "version": "1.9.0",
- "resolved": "https://registry.npmjs.org/csurf/-/csurf-1.9.0.tgz",
- "integrity": "sha1-SdLGkl/87Ht95VlZfBU/pTM2QTM=",
- "requires": {
- "cookie": "0.3.1",
- "cookie-signature": "1.0.6",
- "csrf": "3.0.6",
- "http-errors": "1.5.1"
- },
- "dependencies": {
- "http-errors": {
- "version": "1.5.1",
- "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.5.1.tgz",
- "integrity": "sha1-eIwNLB3iyBuebowBhDtrl+uSB1A=",
- "requires": {
- "inherits": "2.0.3",
- "setprototypeof": "1.0.2",
- "statuses": "1.3.1"
- }
- },
- "setprototypeof": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.0.2.tgz",
- "integrity": "sha1-gaVSFB7BBLiOic44MQOtXGZWTQg="
- }
- }
- },
- "cycle": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/cycle/-/cycle-1.0.3.tgz",
- "integrity": "sha1-IegLK+hYD5i0aPN5QwZisEbDStI="
- },
- "dashdash": {
- "version": "1.14.1",
- "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz",
- "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=",
- "requires": {
- "assert-plus": "1.0.0"
- },
- "dependencies": {
- "assert-plus": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz",
- "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU="
- }
- }
- },
- "debug": {
- "version": "2.6.7",
- "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.7.tgz",
- "integrity": "sha1-krrR9tBbu2u6Isyoi80OyJTChh4=",
- "requires": {
- "ms": "2.0.0"
- }
- },
- "decamelize": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz",
- "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA="
- },
- "decompress": {
- "version": "4.2.0",
- "resolved": "https://registry.npmjs.org/decompress/-/decompress-4.2.0.tgz",
- "integrity": "sha1-eu3YVCflqS2s/lVnSnxQXpbQH50=",
- "requires": {
- "decompress-tar": "4.1.0",
- "decompress-tarbz2": "4.1.0",
- "decompress-targz": "4.1.0",
- "decompress-unzip": "4.0.1",
- "graceful-fs": "4.1.11",
- "make-dir": "1.0.0",
- "pify": "2.3.0",
- "strip-dirs": "2.0.0"
- }
- },
- "decompress-tar": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/decompress-tar/-/decompress-tar-4.1.0.tgz",
- "integrity": "sha1-HwkqtphEBVjHL8eOd9JG0+y0U7A=",
- "requires": {
- "file-type": "3.9.0",
- "is-stream": "1.1.0",
- "tar-stream": "1.5.4"
- }
- },
- "decompress-tarbz2": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/decompress-tarbz2/-/decompress-tarbz2-4.1.0.tgz",
- "integrity": "sha1-+6tY1d5z8/0hPKw68cGDNPUcuJE=",
- "requires": {
- "decompress-tar": "4.1.0",
- "file-type": "3.9.0",
- "is-stream": "1.1.0",
- "pify": "2.3.0",
- "seek-bzip": "1.0.5",
- "unbzip2-stream": "1.2.4"
- }
- },
- "decompress-targz": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/decompress-targz/-/decompress-targz-4.1.0.tgz",
- "integrity": "sha1-R1ucQGvmIa6DYnSALZsl+ZE+rVk=",
- "requires": {
- "decompress-tar": "4.1.0",
- "file-type": "4.4.0",
- "is-stream": "1.1.0"
- },
- "dependencies": {
- "file-type": {
- "version": "4.4.0",
- "resolved": "https://registry.npmjs.org/file-type/-/file-type-4.4.0.tgz",
- "integrity": "sha1-G2AOX8ofvcboDApwxxyNul95BsU="
- }
- }
- },
- "decompress-unzip": {
- "version": "4.0.1",
- "resolved": "https://registry.npmjs.org/decompress-unzip/-/decompress-unzip-4.0.1.tgz",
- "integrity": "sha1-3qrM39FK6vhVePczroIQ+bSEj2k=",
- "requires": {
- "file-type": "3.9.0",
- "get-stream": "2.3.1",
- "pify": "2.3.0",
- "yauzl": "2.8.0"
- },
- "dependencies": {
- "get-stream": {
- "version": "2.3.1",
- "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-2.3.1.tgz",
- "integrity": "sha1-Xzj5PzRgCWZu4BUKBUFn+Rvdld4=",
- "requires": {
- "object-assign": "4.1.1",
- "pinkie-promise": "2.0.1"
- }
- }
- }
- },
- "deep-extend": {
- "version": "0.4.2",
- "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.4.2.tgz",
- "integrity": "sha1-SLaZwn4zS/ifEIkr5DL25MfTSn8="
- },
- "deep-is": {
- "version": "0.1.3",
- "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz",
- "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ="
- },
- "delayed-stream": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
- "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk="
- },
- "delegates": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz",
- "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o="
- },
- "depd": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.0.tgz",
- "integrity": "sha1-4b2Cxqq2ztlluXuIsX7T5SjKGMM="
- },
- "destroy": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz",
- "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA="
- },
- "detect-libc": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz",
- "integrity": "sha1-+hN8S9aY7fVc1c0CrFWfkaTEups="
- },
- "dicer": {
- "version": "0.2.5",
- "resolved": "https://registry.npmjs.org/dicer/-/dicer-0.2.5.tgz",
- "integrity": "sha1-WZbAhrszIYyBLAkL3cCc0S+stw8=",
- "requires": {
- "readable-stream": "1.1.14",
- "streamsearch": "0.1.2"
- },
- "dependencies": {
- "isarray": {
- "version": "0.0.1",
- "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz",
- "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8="
- },
- "readable-stream": {
- "version": "1.1.14",
- "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz",
- "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=",
- "requires": {
- "core-util-is": "1.0.2",
- "inherits": "2.0.3",
- "isarray": "0.0.1",
- "string_decoder": "0.10.31"
- }
- },
- "string_decoder": {
- "version": "0.10.31",
- "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz",
- "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ="
- }
- }
- },
- "dkim-signer": {
- "version": "0.2.2",
- "resolved": "https://registry.npmjs.org/dkim-signer/-/dkim-signer-0.2.2.tgz",
- "integrity": "sha1-qoHsBx7u02IngbqpIgRNeADl8wg=",
- "requires": {
- "libmime": "2.1.3"
- }
- },
- "dom-serializer": {
- "version": "0.1.0",
- "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.1.0.tgz",
- "integrity": "sha1-BzxpdUbOB4DOI75KKOKT5AvDDII=",
- "requires": {
- "domelementtype": "1.1.3",
- "entities": "1.1.1"
- },
- "dependencies": {
- "domelementtype": {
- "version": "1.1.3",
- "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.1.3.tgz",
- "integrity": "sha1-vSh3PiZCiBrsUVRJJCmcXNgiGFs="
- }
- }
- },
- "domelementtype": {
- "version": "1.3.0",
- "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.0.tgz",
- "integrity": "sha1-sXrtguirWeUt2cGbF1bg/BhyBMI="
- },
- "domhandler": {
- "version": "2.4.1",
- "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-2.4.1.tgz",
- "integrity": "sha1-iS5HAAqZvlW783dP/qBWHYh5wlk=",
- "requires": {
- "domelementtype": "1.3.0"
- }
- },
- "domutils": {
- "version": "1.5.1",
- "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.5.1.tgz",
- "integrity": "sha1-3NhIiib1Y9YQeeSMn3t+Mjc2gs8=",
- "requires": {
- "dom-serializer": "0.1.0",
- "domelementtype": "1.3.0"
- }
- },
- "dottie": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/dottie/-/dottie-1.1.1.tgz",
- "integrity": "sha1-RcKj9IvWUo7u0memmoSOqspvqmo="
- },
- "download": {
- "version": "5.0.3",
- "resolved": "https://registry.npmjs.org/download/-/download-5.0.3.tgz",
- "integrity": "sha1-Y1N/l3+ZJmow64oqL70fILgAD3o=",
- "requires": {
- "caw": "2.0.0",
- "decompress": "4.2.0",
- "filenamify": "2.0.0",
- "get-stream": "3.0.0",
- "got": "6.7.1",
- "mkdirp": "0.5.1",
- "pify": "2.3.0"
- }
- },
- "duplexer3": {
- "version": "0.1.4",
- "resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.4.tgz",
- "integrity": "sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI="
- },
- "ecc-jsbn": {
- "version": "0.1.1",
- "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.1.tgz",
- "integrity": "sha1-D8c6ntXw1Tw4GTOYUj735UN3dQU=",
- "optional": true,
- "requires": {
- "jsbn": "0.1.1"
- }
- },
- "ecdsa-sig-formatter": {
- "version": "1.0.9",
- "resolved": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.9.tgz",
- "integrity": "sha1-S8kmJ07Dtau1AW5+HWCSGsJisqE=",
- "requires": {
- "base64url": "2.0.0",
- "safe-buffer": "5.1.1"
- }
- },
- "ee-first": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz",
- "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0="
- },
- "ejs": {
- "version": "2.5.6",
- "resolved": "https://registry.npmjs.org/ejs/-/ejs-2.5.6.tgz",
- "integrity": "sha1-R5Y2v6P+Ox3r1SCH8KyyBLTxnIg="
- },
- "email-validator": {
- "version": "1.0.7",
- "resolved": "https://registry.npmjs.org/email-validator/-/email-validator-1.0.7.tgz",
- "integrity": "sha1-RiHKMvx0HrgzrJjV+1VnC34FbJU="
- },
- "encodeurl": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.1.tgz",
- "integrity": "sha1-eePVhlU0aQn+bw9Fpd5oEDspTSA="
- },
- "end-of-stream": {
- "version": "1.4.0",
- "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.0.tgz",
- "integrity": "sha1-epDYM+/abPpurA9JSduw+tOmMgY=",
- "requires": {
- "once": "1.4.0"
- }
- },
- "engine.io": {
- "version": "3.1.4",
- "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-3.1.4.tgz",
- "integrity": "sha1-PQIRtwpVLOhB/8fahiezAamkFi4=",
- "requires": {
- "accepts": "1.3.3",
- "base64id": "1.0.0",
- "cookie": "0.3.1",
- "debug": "2.6.9",
- "engine.io-parser": "2.1.2",
- "uws": "0.14.5",
- "ws": "3.3.3"
- },
- "dependencies": {
- "debug": {
- "version": "2.6.9",
- "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
- "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
- "requires": {
- "ms": "2.0.0"
- }
- }
- }
- },
- "engine.io-client": {
- "version": "3.1.4",
- "resolved": "https://registry.npmjs.org/engine.io-client/-/engine.io-client-3.1.4.tgz",
- "integrity": "sha1-T88TcLRxY70s6b4nM5ckMDUNTqE=",
- "requires": {
- "component-emitter": "1.2.1",
- "component-inherit": "0.0.3",
- "debug": "2.6.9",
- "engine.io-parser": "2.1.2",
- "has-cors": "1.1.0",
- "indexof": "0.0.1",
- "parseqs": "0.0.5",
- "parseuri": "0.0.5",
- "ws": "3.3.3",
- "xmlhttprequest-ssl": "1.5.5",
- "yeast": "0.1.2"
- },
- "dependencies": {
- "debug": {
- "version": "2.6.9",
- "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
- "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
- "requires": {
- "ms": "2.0.0"
- }
- }
- }
- },
- "engine.io-parser": {
- "version": "2.1.2",
- "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-2.1.2.tgz",
- "integrity": "sha512-dInLFzr80RijZ1rGpx1+56/uFoH7/7InhH3kZt+Ms6hT8tNx3NGW/WNSA/f8As1WkOfkuyb3tnRyuXGxusclMw==",
- "requires": {
- "after": "0.8.2",
- "arraybuffer.slice": "0.0.7",
- "base64-arraybuffer": "0.1.5",
- "blob": "0.0.4",
- "has-binary2": "1.0.2"
- }
- },
- "entities": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.1.tgz",
- "integrity": "sha1-blwtClYhtdra7O+AuQ7ftc13cvA="
- },
- "error-ex": {
- "version": "1.3.1",
- "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.1.tgz",
- "integrity": "sha1-+FWobOYa3E6GIcPNoh56dhLDqNw=",
- "requires": {
- "is-arrayish": "0.2.1"
- }
- },
- "escape-html": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz",
- "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg="
- },
- "escape-string-regexp": {
- "version": "1.0.5",
- "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
- "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ="
- },
- "escodegen": {
- "version": "1.8.1",
- "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.8.1.tgz",
- "integrity": "sha1-WltTr0aTEQvrsIZ6o0MN07cKEBg=",
- "requires": {
- "esprima": "2.7.3",
- "estraverse": "1.9.3",
- "esutils": "2.0.2",
- "optionator": "0.8.2",
- "source-map": "0.2.0"
- }
- },
- "esprima": {
- "version": "2.7.3",
- "resolved": "https://registry.npmjs.org/esprima/-/esprima-2.7.3.tgz",
- "integrity": "sha1-luO3DVd59q1JzQMmc9HDEnZ7pYE="
- },
- "estraverse": {
- "version": "1.9.3",
- "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-1.9.3.tgz",
- "integrity": "sha1-r2fy3JIlgkFZUJJgkaQAXSnJu0Q="
- },
- "esutils": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz",
- "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs="
- },
- "etag": {
- "version": "1.8.0",
- "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.0.tgz",
- "integrity": "sha1-b2Ma7zNtbEY2K1F2QETOIWvjwFE="
- },
- "event-lite": {
- "version": "0.1.1",
- "resolved": "https://registry.npmjs.org/event-lite/-/event-lite-0.1.1.tgz",
- "integrity": "sha1-R88IqNN9C2lM23s7F7UfqsZXYIY="
- },
- "express": {
- "version": "4.15.3",
- "resolved": "https://registry.npmjs.org/express/-/express-4.15.3.tgz",
- "integrity": "sha1-urZdDwOqgMNYQIly/HAPkWlEtmI=",
- "requires": {
- "accepts": "1.3.3",
- "array-flatten": "1.1.1",
- "content-disposition": "0.5.2",
- "content-type": "1.0.2",
- "cookie": "0.3.1",
- "cookie-signature": "1.0.6",
- "debug": "2.6.7",
- "depd": "1.1.0",
- "encodeurl": "1.0.1",
- "escape-html": "1.0.3",
- "etag": "1.8.0",
- "finalhandler": "1.0.3",
- "fresh": "0.5.0",
- "merge-descriptors": "1.0.1",
- "methods": "1.1.2",
- "on-finished": "2.3.0",
- "parseurl": "1.3.1",
- "path-to-regexp": "0.1.7",
- "proxy-addr": "1.1.4",
- "qs": "6.4.0",
- "range-parser": "1.2.0",
- "send": "0.15.3",
- "serve-static": "1.12.3",
- "setprototypeof": "1.0.3",
- "statuses": "1.3.1",
- "type-is": "1.6.15",
- "utils-merge": "1.0.0",
- "vary": "1.1.1"
- }
- },
- "express-session": {
- "version": "1.15.3",
- "resolved": "https://registry.npmjs.org/express-session/-/express-session-1.15.3.tgz",
- "integrity": "sha1-21RfBDWnsbIorgLagZf2UUFzXGc=",
- "requires": {
- "cookie": "0.3.1",
- "cookie-signature": "1.0.6",
- "crc": "3.4.4",
- "debug": "2.6.7",
- "depd": "1.1.0",
- "on-headers": "1.0.1",
- "parseurl": "1.3.1",
- "uid-safe": "2.1.4",
- "utils-merge": "1.0.0"
- }
- },
- "extend": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.1.tgz",
- "integrity": "sha1-p1Xqe8Gt/MWjHOfnYtuq3F5jZEQ="
- },
- "extsprintf": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.0.2.tgz",
- "integrity": "sha1-4QgOBljjALBilJkMxw4VAiNf1VA="
- },
- "eyes": {
- "version": "0.1.8",
- "resolved": "https://registry.npmjs.org/eyes/-/eyes-0.1.8.tgz",
- "integrity": "sha1-Ys8SAjTGg3hdkCNIqADvPgzCC8A="
- },
- "fast-levenshtein": {
- "version": "2.0.6",
- "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz",
- "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc="
- },
- "fd-slicer": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.0.1.tgz",
- "integrity": "sha1-i1vL2ewyfFBBv5qwI/1nUPEXfmU=",
- "requires": {
- "pend": "1.2.0"
- }
- },
- "file-size": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/file-size/-/file-size-1.0.0.tgz",
- "integrity": "sha1-MzgmfV0ga79g9N9gwZ1+04E6Rlc="
- },
- "file-type": {
- "version": "3.9.0",
- "resolved": "https://registry.npmjs.org/file-type/-/file-type-3.9.0.tgz",
- "integrity": "sha1-JXoHg4TR24CHvESdEH1SpSZyuek="
- },
- "filename-reserved-regex": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/filename-reserved-regex/-/filename-reserved-regex-2.0.0.tgz",
- "integrity": "sha1-q/c9+rc10EVECr/qLZHzieu/oik="
- },
- "filenamify": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/filenamify/-/filenamify-2.0.0.tgz",
- "integrity": "sha1-vRYiYsC26Uv7zc8Zo7uzdk94VpU=",
- "requires": {
- "filename-reserved-regex": "2.0.0",
- "strip-outer": "1.0.0",
- "trim-repeated": "1.0.0"
- }
- },
- "finalhandler": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.0.3.tgz",
- "integrity": "sha1-70fneVDpmXgOhgIqVg4yF+DQzIk=",
- "requires": {
- "debug": "2.6.7",
- "encodeurl": "1.0.1",
- "escape-html": "1.0.3",
- "on-finished": "2.3.0",
- "parseurl": "1.3.1",
- "statuses": "1.3.1",
- "unpipe": "1.0.0"
- }
- },
- "find-replace": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/find-replace/-/find-replace-1.0.3.tgz",
- "integrity": "sha1-uI5zZNLZyVlVnziMZmcNYTBEH6A=",
- "requires": {
- "array-back": "1.0.4",
- "test-value": "2.1.0"
- },
- "dependencies": {
- "array-back": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/array-back/-/array-back-1.0.4.tgz",
- "integrity": "sha1-ZEun8JX3/898Q7Xw3DnTwfA8Bjs=",
- "requires": {
- "typical": "2.6.1"
- }
- }
- }
- },
- "find-up": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz",
- "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=",
- "requires": {
- "path-exists": "2.1.0",
- "pinkie-promise": "2.0.1"
- }
- },
- "forever-agent": {
- "version": "0.6.1",
- "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz",
- "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE="
- },
- "form-data": {
- "version": "2.1.4",
- "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.1.4.tgz",
- "integrity": "sha1-M8GDrPGTJ27KqYFDpp6Uv+4XUNE=",
- "requires": {
- "asynckit": "0.4.0",
- "combined-stream": "1.0.5",
- "mime-types": "2.1.15"
- }
- },
- "forwarded": {
- "version": "0.1.0",
- "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.0.tgz",
- "integrity": "sha1-Ge+YdMSuHCl7zweP3mOgm2aoQ2M="
- },
- "fresh": {
- "version": "0.5.0",
- "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.0.tgz",
- "integrity": "sha1-9HTKXmqSRtb9jglTz6m5yAWvp44="
- },
- "fs-extra": {
- "version": "4.0.1",
- "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-4.0.1.tgz",
- "integrity": "sha1-f8DGyJV/mD9X8waiTlud3Y0N2IA=",
- "requires": {
- "graceful-fs": "4.1.11",
- "jsonfile": "3.0.1",
- "universalify": "0.1.1"
- },
- "dependencies": {
- "jsonfile": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-3.0.1.tgz",
- "integrity": "sha1-pezG9l9T9mLEQVx2daAzHQmS7GY=",
- "requires": {
- "graceful-fs": "4.1.11"
- }
- }
- }
- },
- "fs.realpath": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
- "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8="
- },
- "fstream": {
- "version": "1.0.11",
- "resolved": "https://registry.npmjs.org/fstream/-/fstream-1.0.11.tgz",
- "integrity": "sha1-XB+x8RdHcRTwYyoOtLcbPLD9MXE=",
- "requires": {
- "graceful-fs": "4.1.11",
- "inherits": "2.0.3",
- "mkdirp": "0.5.1",
- "rimraf": "2.6.2"
- }
- },
- "fstream-ignore": {
- "version": "1.0.5",
- "resolved": "https://registry.npmjs.org/fstream-ignore/-/fstream-ignore-1.0.5.tgz",
- "integrity": "sha1-nDHa40dnAY/h0kmyTa2mfQktoQU=",
- "requires": {
- "fstream": "1.0.11",
- "inherits": "2.0.3",
- "minimatch": "3.0.4"
- }
- },
- "gauge": {
- "version": "2.7.4",
- "resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz",
- "integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=",
- "requires": {
- "aproba": "1.2.0",
- "console-control-strings": "1.1.0",
- "has-unicode": "2.0.1",
- "object-assign": "4.1.1",
- "signal-exit": "3.0.2",
- "string-width": "1.0.2",
- "strip-ansi": "3.0.1",
- "wide-align": "1.1.2"
- }
- },
- "generic-pool": {
- "version": "2.4.2",
- "resolved": "https://registry.npmjs.org/generic-pool/-/generic-pool-2.4.2.tgz",
- "integrity": "sha1-iGvFvwvrfblugby7oHiBjeWmJoM="
- },
- "get-caller-file": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.2.tgz",
- "integrity": "sha1-9wLmMSfn4jHBYKgMFVSstw1QR+U="
- },
- "get-proxy": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/get-proxy/-/get-proxy-1.1.0.tgz",
- "integrity": "sha1-iUhUSRvFkbDxR9euVw9cZ4tyVus=",
- "requires": {
- "rc": "1.2.1"
- }
- },
- "get-stream": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz",
- "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ="
- },
- "getpass": {
- "version": "0.1.7",
- "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz",
- "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=",
- "requires": {
- "assert-plus": "1.0.0"
- },
- "dependencies": {
- "assert-plus": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz",
- "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU="
- }
- }
- },
- "glob": {
- "version": "7.1.2",
- "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz",
- "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==",
- "requires": {
- "fs.realpath": "1.0.0",
- "inflight": "1.0.6",
- "inherits": "2.0.3",
- "minimatch": "3.0.4",
- "once": "1.4.0",
- "path-is-absolute": "1.0.1"
- }
- },
- "got": {
- "version": "6.7.1",
- "resolved": "https://registry.npmjs.org/got/-/got-6.7.1.tgz",
- "integrity": "sha1-JAzQV4WpoY5WHcG0S0HHY+8ejbA=",
- "requires": {
- "create-error-class": "3.0.2",
- "duplexer3": "0.1.4",
- "get-stream": "3.0.0",
- "is-redirect": "1.0.0",
- "is-retry-allowed": "1.1.0",
- "is-stream": "1.1.0",
- "lowercase-keys": "1.0.0",
- "safe-buffer": "5.1.1",
- "timed-out": "4.0.1",
- "unzip-response": "2.0.1",
- "url-parse-lax": "1.0.0"
- }
- },
- "graceful-fs": {
- "version": "4.1.11",
- "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz",
- "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg="
- },
- "graceful-readlink": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/graceful-readlink/-/graceful-readlink-1.0.1.tgz",
- "integrity": "sha1-TK+tdrxi8C+gObL5Tpo906ORpyU="
- },
- "gravatar": {
- "version": "1.6.0",
- "resolved": "https://registry.npmjs.org/gravatar/-/gravatar-1.6.0.tgz",
- "integrity": "sha1-i9ybeGynJajnB2QW0XMfjTMxyXY=",
- "requires": {
- "blueimp-md5": "2.7.0",
- "email-validator": "1.0.7",
- "querystring": "0.2.0",
- "yargs": "6.6.0"
- }
- },
- "har-schema": {
- "version": "1.0.5",
- "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-1.0.5.tgz",
- "integrity": "sha1-0mMTX0MwfALGAq/I/pWXDAFRNp4="
- },
- "har-validator": {
- "version": "4.2.1",
- "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-4.2.1.tgz",
- "integrity": "sha1-M0gdDxu/9gDdID11gSpqX7oALio=",
- "requires": {
- "ajv": "4.11.8",
- "har-schema": "1.0.5"
- }
- },
- "has-ansi": {
- "version": "0.1.0",
- "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-0.1.0.tgz",
- "integrity": "sha1-hPJlqujA5qiKEtcCKJS3VoiUxi4=",
- "requires": {
- "ansi-regex": "0.2.1"
- },
- "dependencies": {
- "ansi-regex": {
- "version": "0.2.1",
- "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-0.2.1.tgz",
- "integrity": "sha1-DY6UaWej2BQ/k+JOKYUl/BsiNfk="
- }
- }
- },
- "has-binary2": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/has-binary2/-/has-binary2-1.0.2.tgz",
- "integrity": "sha1-6D26SfC5vk0CbSc2U1DZ8D9Uvpg=",
- "requires": {
- "isarray": "2.0.1"
- },
- "dependencies": {
- "isarray": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.1.tgz",
- "integrity": "sha1-o32U7ZzaLVmGXJ92/llu4fM4dB4="
- }
- }
- },
- "has-cors": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/has-cors/-/has-cors-1.1.0.tgz",
- "integrity": "sha1-XkdHk/fqmEPRu5nCPu9J/xJv/zk="
- },
- "has-unicode": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz",
- "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk="
- },
- "hawk": {
- "version": "3.1.3",
- "resolved": "https://registry.npmjs.org/hawk/-/hawk-3.1.3.tgz",
- "integrity": "sha1-B4REvXwWQLD+VA0sm3PVlnjo4cQ=",
- "requires": {
- "boom": "2.10.1",
- "cryptiles": "2.0.5",
- "hoek": "2.16.3",
- "sntp": "1.0.9"
- }
- },
- "highlight.js": {
- "version": "9.12.0",
- "resolved": "https://registry.npmjs.org/highlight.js/-/highlight.js-9.12.0.tgz",
- "integrity": "sha1-5tnb5Xy+/mB1HwKvM2GVhwyQwB4="
- },
- "hoek": {
- "version": "2.16.3",
- "resolved": "https://registry.npmjs.org/hoek/-/hoek-2.16.3.tgz",
- "integrity": "sha1-ILt0A9POo5jpHcRxCo/xuCdKJe0="
- },
- "hosted-git-info": {
- "version": "2.5.0",
- "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.5.0.tgz",
- "integrity": "sha512-pNgbURSuab90KbTqvRPsseaTxOJCZBD0a7t+haSN33piP9cCM4l0CqdzAif2hUqm716UovKB2ROmiabGAKVXyg=="
- },
- "html-encoding-sniffer": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-1.0.1.tgz",
- "integrity": "sha1-eb96eF6klf5mFl5zQVPzY/9UN9o=",
- "requires": {
- "whatwg-encoding": "1.0.1"
- }
- },
- "htmlparser2": {
- "version": "3.9.2",
- "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.9.2.tgz",
- "integrity": "sha1-G9+HrMoPP55T+k/M6w9LTLsAszg=",
- "requires": {
- "domelementtype": "1.3.0",
- "domhandler": "2.4.1",
- "domutils": "1.5.1",
- "entities": "1.1.1",
- "inherits": "2.0.3",
- "readable-stream": "2.3.3"
- }
- },
- "http-errors": {
- "version": "1.6.1",
- "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.1.tgz",
- "integrity": "sha1-X4uO2YrKVFZWv1cplzh/kEpyIlc=",
- "requires": {
- "depd": "1.1.0",
- "inherits": "2.0.3",
- "setprototypeof": "1.0.3",
- "statuses": "1.3.1"
- }
- },
- "http-signature": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.1.1.tgz",
- "integrity": "sha1-33LiZwZs0Kxn+3at+OE0qPvPkb8=",
- "requires": {
- "assert-plus": "0.2.0",
- "jsprim": "1.4.0",
- "sshpk": "1.13.1"
- }
- },
- "iconv-lite": {
- "version": "0.4.15",
- "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.15.tgz",
- "integrity": "sha1-/iZaIYrGpXz+hUkn6dBMGYJe3es="
- },
- "ieee754": {
- "version": "1.1.8",
- "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.8.tgz",
- "integrity": "sha1-vjPUCsEO8ZJnAfbwii2G+/0a0+Q="
- },
- "imurmurhash": {
- "version": "0.1.4",
- "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz",
- "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o="
- },
- "indexof": {
- "version": "0.0.1",
- "resolved": "https://registry.npmjs.org/indexof/-/indexof-0.0.1.tgz",
- "integrity": "sha1-gtwzbSMrkGIXnQWrMpOmYFn9Q10="
- },
- "inflection": {
- "version": "1.12.0",
- "resolved": "https://registry.npmjs.org/inflection/-/inflection-1.12.0.tgz",
- "integrity": "sha1-ogCTVlbW9fa8TcdQLhrstwMihBY="
- },
- "inflight": {
- "version": "1.0.6",
- "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
- "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=",
- "requires": {
- "once": "1.4.0",
- "wrappy": "1.0.2"
- }
- },
- "inherits": {
- "version": "2.0.3",
- "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
- "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4="
- },
- "ini": {
- "version": "1.3.4",
- "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.4.tgz",
- "integrity": "sha1-BTfLedr1m1mhpRff9wbIbsA5Fi4="
- },
- "int64-buffer": {
- "version": "0.1.10",
- "resolved": "https://registry.npmjs.org/int64-buffer/-/int64-buffer-0.1.10.tgz",
- "integrity": "sha1-J3siiofZWtd30HwTgyAiQGpHNCM="
- },
- "invert-kv": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz",
- "integrity": "sha1-EEqOSqym09jNFXqO+L+rLXo//bY="
- },
- "ipaddr.js": {
- "version": "1.3.0",
- "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.3.0.tgz",
- "integrity": "sha1-HgOlL9rYOou7KyXL9JmLTP/NPew="
- },
- "is-arrayish": {
- "version": "0.2.1",
- "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz",
- "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0="
- },
- "is-builtin-module": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-1.0.0.tgz",
- "integrity": "sha1-VAVy0096wxGfj3bDDLwbHgN6/74=",
- "requires": {
- "builtin-modules": "1.1.1"
- }
- },
- "is-fullwidth-code-point": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz",
- "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=",
- "requires": {
- "number-is-nan": "1.0.1"
- }
- },
- "is-natural-number": {
- "version": "4.0.1",
- "resolved": "https://registry.npmjs.org/is-natural-number/-/is-natural-number-4.0.1.tgz",
- "integrity": "sha1-q5124dtM7VHjXeDHLr7PCfc0zeg="
- },
- "is-redirect": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/is-redirect/-/is-redirect-1.0.0.tgz",
- "integrity": "sha1-HQPd7VO9jbDzDCbk+V02/HyH3CQ="
- },
- "is-retry-allowed": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/is-retry-allowed/-/is-retry-allowed-1.1.0.tgz",
- "integrity": "sha1-EaBgVotnM5REAz0BJaYaINVk+zQ="
- },
- "is-stream": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz",
- "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ="
- },
- "is-typedarray": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz",
- "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo="
- },
- "is-utf8": {
- "version": "0.2.1",
- "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz",
- "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI="
- },
- "is-windows": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.1.tgz",
- "integrity": "sha1-MQ23D3QtJZoWo2kgK1GvhCMzENk="
- },
- "isarray": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
- "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE="
- },
- "isemail": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/isemail/-/isemail-1.2.0.tgz",
- "integrity": "sha1-vgPfjMPineTSxd9lASY/H6RZXpo="
- },
- "isexe": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
- "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA="
- },
- "isstream": {
- "version": "0.1.2",
- "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz",
- "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo="
- },
- "joi": {
- "version": "6.10.1",
- "resolved": "https://registry.npmjs.org/joi/-/joi-6.10.1.tgz",
- "integrity": "sha1-TVDDGAeRIgAP5fFq8f+OGRe3fgY=",
- "requires": {
- "hoek": "2.16.3",
- "isemail": "1.2.0",
- "moment": "2.18.1",
- "topo": "1.1.0"
- }
- },
- "js-yaml": {
- "version": "3.9.1",
- "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.9.1.tgz",
- "integrity": "sha512-CbcG379L1e+mWBnLvHWWeLs8GyV/EMw862uLI3c+GxVyDHWZcjZinwuBd3iW2pgxgIlksW/1vNJa4to+RvDOww==",
- "requires": {
- "argparse": "1.0.9",
- "esprima": "4.0.0"
- },
- "dependencies": {
- "esprima": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.0.tgz",
- "integrity": "sha512-oftTcaMu/EGrEIu904mWteKIv8vMuOgGYo7EhVJJN00R/EED9DCua/xxHRdYnKtcECzVg7xOWhflvJMnqcFZjw=="
- }
- }
- },
- "jsbn": {
- "version": "0.1.1",
- "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz",
- "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=",
- "optional": true
- },
- "jsdom": {
- "version": "9.12.0",
- "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-9.12.0.tgz",
- "integrity": "sha1-6MVG//ywbADUgzyoRBD+1/igl9Q=",
- "requires": {
- "abab": "1.0.3",
- "acorn": "4.0.13",
- "acorn-globals": "3.1.0",
- "array-equal": "1.0.0",
- "content-type-parser": "1.0.1",
- "cssom": "0.3.2",
- "cssstyle": "0.2.37",
- "escodegen": "1.8.1",
- "html-encoding-sniffer": "1.0.1",
- "nwmatcher": "1.4.1",
- "parse5": "1.5.1",
- "request": "2.81.0",
- "sax": "1.2.4",
- "symbol-tree": "3.2.2",
- "tough-cookie": "2.3.2",
- "webidl-conversions": "4.0.1",
- "whatwg-encoding": "1.0.1",
- "whatwg-url": "4.8.0",
- "xml-name-validator": "2.0.1"
- },
- "dependencies": {
- "parse5": {
- "version": "1.5.1",
- "resolved": "https://registry.npmjs.org/parse5/-/parse5-1.5.1.tgz",
- "integrity": "sha1-m387DeMr543CQBsXVzzK8Pb1nZQ="
- }
- }
- },
- "json-schema": {
- "version": "0.2.3",
- "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz",
- "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM="
- },
- "json-stable-stringify": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz",
- "integrity": "sha1-mnWdOcXy/1A/1TAGRu1EX4jE+a8=",
- "requires": {
- "jsonify": "0.0.0"
- }
- },
- "json-stringify-safe": {
- "version": "5.0.1",
- "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz",
- "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus="
- },
- "jsondiffpatch": {
- "version": "0.2.4",
- "resolved": "https://registry.npmjs.org/jsondiffpatch/-/jsondiffpatch-0.2.4.tgz",
- "integrity": "sha1-1LbFOz/H2htLkcHCrsi5MrdRHVw=",
- "requires": {
- "chalk": "0.5.1"
- }
- },
- "jsonfile": {
- "version": "2.4.0",
- "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-2.4.0.tgz",
- "integrity": "sha1-NzaitCi4e72gzIO1P6PWM6NcKug=",
- "requires": {
- "graceful-fs": "4.1.11"
- }
- },
- "jsonify": {
- "version": "0.0.0",
- "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.0.tgz",
- "integrity": "sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM="
- },
- "jsonwebtoken": {
- "version": "7.4.3",
- "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-7.4.3.tgz",
- "integrity": "sha1-d/UCHeBYtgWheD+hKD6ZgS5kVjg=",
- "requires": {
- "joi": "6.10.1",
- "jws": "3.1.4",
- "lodash.once": "4.1.1",
- "ms": "2.0.0",
- "xtend": "4.0.1"
- }
- },
- "jsprim": {
- "version": "1.4.0",
- "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.0.tgz",
- "integrity": "sha1-o7h+QCmNjDgFUtjMdiigu5WiKRg=",
- "requires": {
- "assert-plus": "1.0.0",
- "extsprintf": "1.0.2",
- "json-schema": "0.2.3",
- "verror": "1.3.6"
- },
- "dependencies": {
- "assert-plus": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz",
- "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU="
- }
- }
- },
- "jwa": {
- "version": "1.1.5",
- "resolved": "https://registry.npmjs.org/jwa/-/jwa-1.1.5.tgz",
- "integrity": "sha1-oFUs4CIHQs1S4VN3SjKQXDDnVuU=",
- "requires": {
- "base64url": "2.0.0",
- "buffer-equal-constant-time": "1.0.1",
- "ecdsa-sig-formatter": "1.0.9",
- "safe-buffer": "5.1.1"
- }
- },
- "jws": {
- "version": "3.1.4",
- "resolved": "https://registry.npmjs.org/jws/-/jws-3.1.4.tgz",
- "integrity": "sha1-+ei5M46KhHJ31kRLFGT2GIDgUKI=",
- "requires": {
- "base64url": "2.0.0",
- "jwa": "1.1.5",
- "safe-buffer": "5.1.1"
- }
- },
- "katex": {
- "version": "0.6.0",
- "resolved": "https://registry.npmjs.org/katex/-/katex-0.6.0.tgz",
- "integrity": "sha1-EkGOCRIcBckgQbazuftrqyE8tvM=",
- "requires": {
- "match-at": "0.1.0"
- }
- },
- "klaw": {
- "version": "1.3.1",
- "resolved": "https://registry.npmjs.org/klaw/-/klaw-1.3.1.tgz",
- "integrity": "sha1-QIhDO0azsbolnXh4XY6W9zugJDk=",
- "requires": {
- "graceful-fs": "4.1.11"
- }
- },
- "lcid": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz",
- "integrity": "sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=",
- "requires": {
- "invert-kv": "1.0.0"
- }
- },
- "levn": {
- "version": "0.3.0",
- "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz",
- "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=",
- "requires": {
- "prelude-ls": "1.1.2",
- "type-check": "0.3.2"
- }
- },
- "libbase64": {
- "version": "0.1.0",
- "resolved": "https://registry.npmjs.org/libbase64/-/libbase64-0.1.0.tgz",
- "integrity": "sha1-YjUag5VjrF/1vSbxL2Dpgwu3UeY="
- },
- "libmime": {
- "version": "2.1.3",
- "resolved": "https://registry.npmjs.org/libmime/-/libmime-2.1.3.tgz",
- "integrity": "sha1-JQF8pataHpiq2+JyUBfPHUikKgw=",
- "requires": {
- "iconv-lite": "0.4.15",
- "libbase64": "0.1.0",
- "libqp": "1.1.0"
- }
- },
- "libqp": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/libqp/-/libqp-1.1.0.tgz",
- "integrity": "sha1-9ebgatdLeU+1tbZpiL9yjvHe2+g="
- },
- "load-json-file": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz",
- "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=",
- "requires": {
- "graceful-fs": "4.1.11",
- "parse-json": "2.2.0",
- "pify": "2.3.0",
- "pinkie-promise": "2.0.1",
- "strip-bom": "2.0.0"
- }
- },
- "lodash": {
- "version": "4.17.4",
- "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.4.tgz",
- "integrity": "sha1-eCA6TRwyiuHYbcpkYONptX9AVa4="
- },
- "lodash.once": {
- "version": "4.1.1",
- "resolved": "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz",
- "integrity": "sha1-DdOXEhPHxW34gJd9UEyI+0cal6w="
- },
- "lowercase-keys": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.0.tgz",
- "integrity": "sha1-TjNms55/VFfjXxMkvfb4jQv8cwY="
- },
- "lru-cache": {
- "version": "4.1.1",
- "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.1.tgz",
- "integrity": "sha512-q4spe4KTfsAS1SUHLO0wz8Qiyf1+vMIAgpRYioFYDMNqKfHQbg+AVDH3i4fvpl71/P1L0dBl+fQi+P37UYf0ew==",
- "requires": {
- "pseudomap": "1.0.2",
- "yallist": "2.1.2"
- }
- },
- "mailcomposer": {
- "version": "3.12.0",
- "resolved": "https://registry.npmjs.org/mailcomposer/-/mailcomposer-3.12.0.tgz",
- "integrity": "sha1-nF4RiKqOHGLsi4a9Q0aBArY56Pk=",
- "requires": {
- "buildmail": "3.10.0",
- "libmime": "2.1.0"
- },
- "dependencies": {
- "iconv-lite": {
- "version": "0.4.13",
- "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.13.tgz",
- "integrity": "sha1-H4irpKsLFQjoMSrMOTRfNumS4vI="
- },
- "libmime": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/libmime/-/libmime-2.1.0.tgz",
- "integrity": "sha1-Ubx23iKDFh65BRxLyArtcT5P0c0=",
- "requires": {
- "iconv-lite": "0.4.13",
- "libbase64": "0.1.0",
- "libqp": "1.1.0"
- }
- }
- }
- },
- "make-dir": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-1.0.0.tgz",
- "integrity": "sha1-l6ARdR6R3YfPre9Ygy67BJNt6Xg=",
- "requires": {
- "pify": "2.3.0"
- }
- },
- "match-at": {
- "version": "0.1.0",
- "resolved": "https://registry.npmjs.org/match-at/-/match-at-0.1.0.tgz",
- "integrity": "sha1-9WHncJ/5oQW4XMYsa47nwVvyTzE="
- },
- "mathjax": {
- "version": "2.7.1",
- "resolved": "https://registry.npmjs.org/mathjax/-/mathjax-2.7.1.tgz",
- "integrity": "sha1-yC0vhTsvWPc44zVTKa3wstj4+s4="
- },
- "mathjax-node": {
- "version": "0.5.2",
- "resolved": "https://registry.npmjs.org/mathjax-node/-/mathjax-node-0.5.2.tgz",
- "integrity": "sha1-JM56nhq/aV58F8tz7nL8J1Skn48=",
- "requires": {
- "jsdom": "7.2.2",
- "mathjax": "2.7.1",
- "speech-rule-engine": "1.2.0",
- "yargs": "3.32.0"
- },
- "dependencies": {
- "acorn": {
- "version": "2.7.0",
- "resolved": "https://registry.npmjs.org/acorn/-/acorn-2.7.0.tgz",
- "integrity": "sha1-q259nYhqrKiwhbwzEreaGYQz8Oc="
- },
- "acorn-globals": {
- "version": "1.0.9",
- "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-1.0.9.tgz",
- "integrity": "sha1-VbtemGkVB7dFedBRNBMhfDgMVM8=",
- "requires": {
- "acorn": "2.7.0"
- }
- },
- "camelcase": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-2.1.1.tgz",
- "integrity": "sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8="
- },
- "jsdom": {
- "version": "7.2.2",
- "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-7.2.2.tgz",
- "integrity": "sha1-QLQCdwwr2iNGkJa+6Rq2deOx/G4=",
- "requires": {
- "abab": "1.0.3",
- "acorn": "2.7.0",
- "acorn-globals": "1.0.9",
- "cssom": "0.3.2",
- "cssstyle": "0.2.37",
- "escodegen": "1.8.1",
- "nwmatcher": "1.4.1",
- "parse5": "1.5.1",
- "request": "2.81.0",
- "sax": "1.2.4",
- "symbol-tree": "3.2.2",
- "tough-cookie": "2.3.2",
- "webidl-conversions": "2.0.1",
- "whatwg-url-compat": "0.6.5",
- "xml-name-validator": "2.0.1"
- }
- },
- "parse5": {
- "version": "1.5.1",
- "resolved": "https://registry.npmjs.org/parse5/-/parse5-1.5.1.tgz",
- "integrity": "sha1-m387DeMr543CQBsXVzzK8Pb1nZQ="
- },
- "webidl-conversions": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-2.0.1.tgz",
- "integrity": "sha1-O/glj30xjHRDw28uFpQCoaZwNQY="
- },
- "yargs": {
- "version": "3.32.0",
- "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.32.0.tgz",
- "integrity": "sha1-AwiOnr+edWtpdRYR0qXvWRSCyZU=",
- "requires": {
- "camelcase": "2.1.1",
- "cliui": "3.2.0",
- "decamelize": "1.2.0",
- "os-locale": "1.4.0",
- "string-width": "1.0.2",
- "window-size": "0.1.4",
- "y18n": "3.2.1"
- }
- }
- }
- },
- "media-typer": {
- "version": "0.3.0",
- "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz",
- "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g="
- },
- "merge-descriptors": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz",
- "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E="
- },
- "methods": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz",
- "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4="
- },
- "mime": {
- "version": "1.3.4",
- "resolved": "https://registry.npmjs.org/mime/-/mime-1.3.4.tgz",
- "integrity": "sha1-EV+eO2s9rylZmDyzjxSaLUDrXVM="
- },
- "mime-db": {
- "version": "1.27.0",
- "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.27.0.tgz",
- "integrity": "sha1-gg9XIpa70g7CXtVeW13oaeVDbrE="
- },
- "mime-types": {
- "version": "2.1.15",
- "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.15.tgz",
- "integrity": "sha1-pOv1BkCUVpI3uM9wBGd20J/JKu0=",
- "requires": {
- "mime-db": "1.27.0"
- }
- },
- "minimatch": {
- "version": "3.0.4",
- "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz",
- "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==",
- "requires": {
- "brace-expansion": "1.1.11"
- }
- },
- "minimist": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz",
- "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ="
- },
- "mkdirp": {
- "version": "0.5.1",
- "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz",
- "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=",
- "requires": {
- "minimist": "0.0.8"
- },
- "dependencies": {
- "minimist": {
- "version": "0.0.8",
- "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz",
- "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0="
- }
- }
- },
- "moemark": {
- "version": "0.3.10",
- "resolved": "https://registry.npmjs.org/moemark/-/moemark-0.3.10.tgz",
- "integrity": "sha1-TMnoDMOkKq2hZoxgNL2rDDUYhT8="
- },
- "moemark-renderer": {
- "version": "1.2.6",
- "resolved": "https://registry.npmjs.org/moemark-renderer/-/moemark-renderer-1.2.6.tgz",
- "integrity": "sha1-ntYfHjGzx52zHB+/OPVvt0mbjjI=",
- "requires": {
- "highlight.js": "9.12.0",
- "jsdom": "9.12.0",
- "katex": "0.6.0",
- "mathjax-node": "0.5.2",
- "moemark": "0.3.10"
- }
- },
- "moment": {
- "version": "2.18.1",
- "resolved": "https://registry.npmjs.org/moment/-/moment-2.18.1.tgz",
- "integrity": "sha1-w2GT3Tzhwu7SrbfIAtu8d6gbHA8="
- },
- "moment-timezone": {
- "version": "0.5.13",
- "resolved": "https://registry.npmjs.org/moment-timezone/-/moment-timezone-0.5.13.tgz",
- "integrity": "sha1-mc5cfYJyYusPH3AgRBd/YHRde5A=",
- "requires": {
- "moment": "2.18.1"
- }
- },
- "ms": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
- "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g="
- },
- "msgpack-lite": {
- "version": "0.1.26",
- "resolved": "https://registry.npmjs.org/msgpack-lite/-/msgpack-lite-0.1.26.tgz",
- "integrity": "sha1-3TxQsm8FnyXn7e42REGDWOKprYk=",
- "requires": {
- "event-lite": "0.1.1",
- "ieee754": "1.1.8",
- "int64-buffer": "0.1.10",
- "isarray": "1.0.0"
- }
- },
- "multer": {
- "version": "1.3.0",
- "resolved": "https://registry.npmjs.org/multer/-/multer-1.3.0.tgz",
- "integrity": "sha1-CSsmcPaEb6SRSWXvyM+Uwg/sbNI=",
- "requires": {
- "append-field": "0.1.0",
- "busboy": "0.2.14",
- "concat-stream": "1.6.0",
- "mkdirp": "0.5.1",
- "object-assign": "3.0.0",
- "on-finished": "2.3.0",
- "type-is": "1.6.15",
- "xtend": "4.0.1"
- },
- "dependencies": {
- "object-assign": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-3.0.0.tgz",
- "integrity": "sha1-m+3VygiXlJvKR+f/QIBi1Un1h/I="
- }
- }
- },
- "mysql": {
- "version": "2.13.0",
- "resolved": "https://registry.npmjs.org/mysql/-/mysql-2.13.0.tgz",
- "integrity": "sha1-mY8fjKRuLj3XFJzpgkE2U5hqrkc=",
- "requires": {
- "bignumber.js": "3.1.2",
- "readable-stream": "1.1.14",
- "sqlstring": "2.2.0"
- },
- "dependencies": {
- "isarray": {
- "version": "0.0.1",
- "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz",
- "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8="
- },
- "readable-stream": {
- "version": "1.1.14",
- "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz",
- "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=",
- "requires": {
- "core-util-is": "1.0.2",
- "inherits": "2.0.3",
- "isarray": "0.0.1",
- "string_decoder": "0.10.31"
- }
- },
- "string_decoder": {
- "version": "0.10.31",
- "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz",
- "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ="
- }
- }
- },
- "nan": {
- "version": "2.4.0",
- "resolved": "https://registry.npmjs.org/nan/-/nan-2.4.0.tgz",
- "integrity": "sha1-+zxZ1F/k7/4hXwuJD4rfbrMtIjI="
- },
- "negotiator": {
- "version": "0.6.1",
- "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.1.tgz",
- "integrity": "sha1-KzJxhOiZIQEXeyhWP7XnECrNDKk="
- },
- "node-7z": {
- "version": "0.4.0",
- "resolved": "https://registry.npmjs.org/node-7z/-/node-7z-0.4.0.tgz",
- "integrity": "sha1-OQEkxYAYPKvTiNE38wsjm0S9Wag=",
- "requires": {
- "when": "3.7.8",
- "win-spawn": "2.0.0"
- }
- },
- "node-pre-gyp": {
- "version": "0.6.39",
- "resolved": "https://registry.npmjs.org/node-pre-gyp/-/node-pre-gyp-0.6.39.tgz",
- "integrity": "sha512-OsJV74qxnvz/AMGgcfZoDaeDXKD3oY3QVIbBmwszTFkRisTSXbMQyn4UWzUMOtA5SVhrBZOTp0wcoSBgfMfMmQ==",
- "requires": {
- "detect-libc": "1.0.3",
- "hawk": "3.1.3",
- "mkdirp": "0.5.1",
- "nopt": "4.0.1",
- "npmlog": "4.1.2",
- "rc": "1.2.1",
- "request": "2.81.0",
- "rimraf": "2.6.2",
- "semver": "5.3.0",
- "tar": "2.2.1",
- "tar-pack": "3.4.1"
- }
- },
- "nodemailer": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/nodemailer/-/nodemailer-4.1.0.tgz",
- "integrity": "sha512-pZg74CNQgnC0gZTfH0btXCxjKj7/2v5pea6hmMJ/iKyT48Z81TXZua7c65clwqKIlWfMfYBQG3OkrKxycIdXTw=="
- },
- "nodemailer-fetch": {
- "version": "1.6.0",
- "resolved": "https://registry.npmjs.org/nodemailer-fetch/-/nodemailer-fetch-1.6.0.tgz",
- "integrity": "sha1-ecSQihwPXzdbc/6IjamCj23JY6Q="
- },
- "nodemailer-shared": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/nodemailer-shared/-/nodemailer-shared-1.1.0.tgz",
- "integrity": "sha1-z1mU4v0mjQD1zw+nZ6CBae2wfsA=",
- "requires": {
- "nodemailer-fetch": "1.6.0"
- }
- },
- "nopt": {
- "version": "4.0.1",
- "resolved": "https://registry.npmjs.org/nopt/-/nopt-4.0.1.tgz",
- "integrity": "sha1-0NRoWv1UFRk8jHUFYC0NF81kR00=",
- "requires": {
- "abbrev": "1.1.1",
- "osenv": "0.1.4"
- }
- },
- "normalize-package-data": {
- "version": "2.4.0",
- "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.4.0.tgz",
- "integrity": "sha512-9jjUFbTPfEy3R/ad/2oNbKtW9Hgovl5O1FvFWKkKblNXoN/Oou6+9+KKohPK13Yc3/TyunyWhJp6gvRNR/PPAw==",
- "requires": {
- "hosted-git-info": "2.5.0",
- "is-builtin-module": "1.0.0",
- "semver": "5.3.0",
- "validate-npm-package-license": "3.0.1"
- }
- },
- "npmlog": {
- "version": "4.1.2",
- "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz",
- "integrity": "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==",
- "requires": {
- "are-we-there-yet": "1.1.4",
- "console-control-strings": "1.1.0",
- "gauge": "2.7.4",
- "set-blocking": "2.0.0"
- }
- },
- "nth-check": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-1.0.1.tgz",
- "integrity": "sha1-mSms32KPwsQQmN6rgqxYDPFJquQ=",
- "requires": {
- "boolbase": "1.0.0"
- }
- },
- "number-is-nan": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz",
- "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0="
- },
- "nwmatcher": {
- "version": "1.4.1",
- "resolved": "https://registry.npmjs.org/nwmatcher/-/nwmatcher-1.4.1.tgz",
- "integrity": "sha1-eumwew6oBNt+JfBctf5Al9TklJ8="
- },
- "oauth-sign": {
- "version": "0.8.2",
- "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.8.2.tgz",
- "integrity": "sha1-Rqarfwrq2N6unsBWV4C31O/rnUM="
- },
- "object-assign": {
- "version": "4.1.1",
- "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
- "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM="
- },
- "object-component": {
- "version": "0.0.3",
- "resolved": "https://registry.npmjs.org/object-component/-/object-component-0.0.3.tgz",
- "integrity": "sha1-8MaapQ78lbhmwYb0AKM3acsvEpE="
- },
- "object-keys": {
- "version": "0.4.0",
- "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-0.4.0.tgz",
- "integrity": "sha1-KKaq50KN0sOpLz2V8hM13SBOAzY="
- },
- "on-finished": {
- "version": "2.3.0",
- "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz",
- "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=",
- "requires": {
- "ee-first": "1.1.1"
- }
- },
- "on-headers": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.1.tgz",
- "integrity": "sha1-ko9dD0cNSTQmUepnlLCFfBAGk/c="
- },
- "once": {
- "version": "1.4.0",
- "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
- "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=",
- "requires": {
- "wrappy": "1.0.2"
- }
- },
- "optionator": {
- "version": "0.8.2",
- "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.2.tgz",
- "integrity": "sha1-NkxeQJ0/TWMB1sC0wFu6UBgK62Q=",
- "requires": {
- "deep-is": "0.1.3",
- "fast-levenshtein": "2.0.6",
- "levn": "0.3.0",
- "prelude-ls": "1.1.2",
- "type-check": "0.3.2",
- "wordwrap": "1.0.0"
- }
- },
- "os-homedir": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz",
- "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M="
- },
- "os-locale": {
- "version": "1.4.0",
- "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz",
- "integrity": "sha1-IPnxeuKe00XoveWDsT0gCYA8FNk=",
- "requires": {
- "lcid": "1.0.0"
- }
- },
- "os-tmpdir": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz",
- "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ="
- },
- "osenv": {
- "version": "0.1.4",
- "resolved": "https://registry.npmjs.org/osenv/-/osenv-0.1.4.tgz",
- "integrity": "sha1-Qv5tWVPfBsgGS+bxdsPQWqqjRkQ=",
- "requires": {
- "os-homedir": "1.0.2",
- "os-tmpdir": "1.0.2"
- }
- },
- "parse-json": {
- "version": "2.2.0",
- "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz",
- "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=",
- "requires": {
- "error-ex": "1.3.1"
- }
- },
- "parse5": {
- "version": "3.0.2",
- "resolved": "https://registry.npmjs.org/parse5/-/parse5-3.0.2.tgz",
- "integrity": "sha1-Be/1fw70V3+xRKefi5qWemzERRA=",
- "requires": {
- "@types/node": "6.0.83"
- }
- },
- "parseqs": {
- "version": "0.0.5",
- "resolved": "https://registry.npmjs.org/parseqs/-/parseqs-0.0.5.tgz",
- "integrity": "sha1-1SCKNzjkZ2bikbouoXNoSSGouJ0=",
- "requires": {
- "better-assert": "1.0.2"
- }
- },
- "parseuri": {
- "version": "0.0.5",
- "resolved": "https://registry.npmjs.org/parseuri/-/parseuri-0.0.5.tgz",
- "integrity": "sha1-gCBKUNTbt3m/3G6+J3jZDkvOMgo=",
- "requires": {
- "better-assert": "1.0.2"
- }
- },
- "parseurl": {
- "version": "1.3.1",
- "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.1.tgz",
- "integrity": "sha1-yKuMkiO6NIiKpkopeyiFO+wY2lY="
- },
- "path-exists": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz",
- "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=",
- "requires": {
- "pinkie-promise": "2.0.1"
- }
- },
- "path-is-absolute": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
- "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18="
- },
- "path-to-regexp": {
- "version": "0.1.7",
- "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz",
- "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w="
- },
- "path-type": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz",
- "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=",
- "requires": {
- "graceful-fs": "4.1.11",
- "pify": "2.3.0",
- "pinkie-promise": "2.0.1"
- }
- },
- "pend": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz",
- "integrity": "sha1-elfrVQpng/kRUzH89GY9XI4AelA="
- },
- "performance-now": {
- "version": "0.2.0",
- "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-0.2.0.tgz",
- "integrity": "sha1-M+8wxcd9TqIcWlOGnZG1bY8lVeU="
- },
- "pify": {
- "version": "2.3.0",
- "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz",
- "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw="
- },
- "pinkie": {
- "version": "2.0.4",
- "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz",
- "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA="
- },
- "pinkie-promise": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz",
- "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=",
- "requires": {
- "pinkie": "2.0.4"
- }
- },
- "prelude-ls": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz",
- "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ="
- },
- "prepend-http": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-1.0.4.tgz",
- "integrity": "sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw="
- },
- "process-nextick-args": {
- "version": "1.0.7",
- "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz",
- "integrity": "sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M="
- },
- "proxy-addr": {
- "version": "1.1.4",
- "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-1.1.4.tgz",
- "integrity": "sha1-J+VF9pYKRKYn2bREZ+NcG2tM4vM=",
- "requires": {
- "forwarded": "0.1.0",
- "ipaddr.js": "1.3.0"
- }
- },
- "pseudomap": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz",
- "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM="
- },
- "punycode": {
- "version": "1.4.1",
- "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz",
- "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4="
- },
- "pygmentize-bundled": {
- "version": "2.3.0",
- "resolved": "https://registry.npmjs.org/pygmentize-bundled/-/pygmentize-bundled-2.3.0.tgz",
- "integrity": "sha1-1CXe2o0TaXW5M+3jYxNfYjNQgUo=",
- "requires": {
- "bl": "0.4.2",
- "through2": "0.2.3"
- },
- "dependencies": {
- "bl": {
- "version": "0.4.2",
- "resolved": "https://registry.npmjs.org/bl/-/bl-0.4.2.tgz",
- "integrity": "sha1-XbMdcvA4xU5orcOVeBJf47Ct3JY=",
- "requires": {
- "readable-stream": "1.0.34"
- }
- },
- "isarray": {
- "version": "0.0.1",
- "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz",
- "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8="
- },
- "readable-stream": {
- "version": "1.0.34",
- "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz",
- "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=",
- "requires": {
- "core-util-is": "1.0.2",
- "inherits": "2.0.3",
- "isarray": "0.0.1",
- "string_decoder": "0.10.31"
- }
- },
- "string_decoder": {
- "version": "0.10.31",
- "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz",
- "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ="
- },
- "through2": {
- "version": "0.2.3",
- "resolved": "https://registry.npmjs.org/through2/-/through2-0.2.3.tgz",
- "integrity": "sha1-6zKE2k6jEbbMis42U3SKUqvyWj8=",
- "requires": {
- "readable-stream": "1.1.14",
- "xtend": "2.1.2"
- },
- "dependencies": {
- "readable-stream": {
- "version": "1.1.14",
- "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz",
- "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=",
- "requires": {
- "core-util-is": "1.0.2",
- "inherits": "2.0.3",
- "isarray": "0.0.1",
- "string_decoder": "0.10.31"
- }
- }
- }
- },
- "xtend": {
- "version": "2.1.2",
- "resolved": "https://registry.npmjs.org/xtend/-/xtend-2.1.2.tgz",
- "integrity": "sha1-bv7MKk2tjmlixJAbM3znuoe10os=",
- "requires": {
- "object-keys": "0.4.0"
- }
- }
- }
- },
- "pygmentize-bundled-cached": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/pygmentize-bundled-cached/-/pygmentize-bundled-cached-1.1.0.tgz",
- "integrity": "sha1-vRGCI5RBQvRoJQii0cFUKlgkHfU=",
- "requires": {
- "bl": "0.9.5",
- "json-stable-stringify": "1.0.1",
- "mkdirp": "0.5.1",
- "pygmentize-bundled": "2.3.0",
- "reduplexer": "1.0.0",
- "through2": "0.6.5"
- },
- "dependencies": {
- "bl": {
- "version": "0.9.5",
- "resolved": "https://registry.npmjs.org/bl/-/bl-0.9.5.tgz",
- "integrity": "sha1-wGt5evCF6gC8Unr8jvzxHeIjIFQ=",
- "requires": {
- "readable-stream": "1.0.34"
- }
- },
- "isarray": {
- "version": "0.0.1",
- "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz",
- "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8="
- },
- "readable-stream": {
- "version": "1.0.34",
- "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz",
- "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=",
- "requires": {
- "core-util-is": "1.0.2",
- "inherits": "2.0.3",
- "isarray": "0.0.1",
- "string_decoder": "0.10.31"
- }
- },
- "string_decoder": {
- "version": "0.10.31",
- "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz",
- "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ="
- }
- }
- },
- "q": {
- "version": "1.5.0",
- "resolved": "https://registry.npmjs.org/q/-/q-1.5.0.tgz",
- "integrity": "sha1-3QG6ydBtMObyGa7LglPunr3DCPE="
- },
- "qs": {
- "version": "6.4.0",
- "resolved": "https://registry.npmjs.org/qs/-/qs-6.4.0.tgz",
- "integrity": "sha1-E+JtKK1rD/qpExLNO/cI7TUecjM="
- },
- "querystring": {
- "version": "0.2.0",
- "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz",
- "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA="
- },
- "random-bytes": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/random-bytes/-/random-bytes-1.0.0.tgz",
- "integrity": "sha1-T2ih3Arli9P7lYSMMDJNt11kNgs="
- },
- "random-js": {
- "version": "1.0.8",
- "resolved": "https://registry.npmjs.org/random-js/-/random-js-1.0.8.tgz",
- "integrity": "sha1-lo/WiabyXWwKrHZig94vaIycGQo="
- },
- "randomstring": {
- "version": "1.1.5",
- "resolved": "https://registry.npmjs.org/randomstring/-/randomstring-1.1.5.tgz",
- "integrity": "sha1-bfBij3XL1ZMpMNn+OrTpVqGFGMM=",
- "requires": {
- "array-uniq": "1.0.2"
- }
- },
- "range-parser": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.0.tgz",
- "integrity": "sha1-9JvmtIeJTdxA3MlKMi9hEJLgDV4="
- },
- "raw-body": {
- "version": "2.2.0",
- "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.2.0.tgz",
- "integrity": "sha1-mUl2z2pQlqQRYoQEkvC9xdbn+5Y=",
- "requires": {
- "bytes": "2.4.0",
- "iconv-lite": "0.4.15",
- "unpipe": "1.0.0"
- }
- },
- "rc": {
- "version": "1.2.1",
- "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.1.tgz",
- "integrity": "sha1-LgPo5C7kULjLPc5lvhv4l04d/ZU=",
- "requires": {
- "deep-extend": "0.4.2",
- "ini": "1.3.4",
- "minimist": "1.2.0",
- "strip-json-comments": "2.0.1"
- }
- },
- "read-pkg": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz",
- "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=",
- "requires": {
- "load-json-file": "1.1.0",
- "normalize-package-data": "2.4.0",
- "path-type": "1.1.0"
- }
- },
- "read-pkg-up": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz",
- "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=",
- "requires": {
- "find-up": "1.1.2",
- "read-pkg": "1.1.0"
- }
- },
- "readable-stream": {
- "version": "2.3.3",
- "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.3.tgz",
- "integrity": "sha512-m+qzzcn7KUxEmd1gMbchF+Y2eIUbieUaxkWtptyHywrX0rE8QEYqPC07Vuy4Wm32/xE16NcdBctb8S0Xe/5IeQ==",
- "requires": {
- "core-util-is": "1.0.2",
- "inherits": "2.0.3",
- "isarray": "1.0.0",
- "process-nextick-args": "1.0.7",
- "safe-buffer": "5.1.1",
- "string_decoder": "1.0.3",
- "util-deprecate": "1.0.2"
- }
- },
- "reduplexer": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/reduplexer/-/reduplexer-1.0.0.tgz",
- "integrity": "sha1-szYqeSd5gbJ2HbOvONjj4CZUrf8=",
- "requires": {
- "inherits": "2.0.3",
- "readable-stream": "1.0.34"
- },
- "dependencies": {
- "isarray": {
- "version": "0.0.1",
- "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz",
- "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8="
- },
- "readable-stream": {
- "version": "1.0.34",
- "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz",
- "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=",
- "requires": {
- "core-util-is": "1.0.2",
- "inherits": "2.0.3",
- "isarray": "0.0.1",
- "string_decoder": "0.10.31"
- }
- },
- "string_decoder": {
- "version": "0.10.31",
- "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz",
- "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ="
- }
- }
- },
- "request": {
- "version": "2.81.0",
- "resolved": "https://registry.npmjs.org/request/-/request-2.81.0.tgz",
- "integrity": "sha1-xpKJRqDgbF+Nb4qTM0af/aRimKA=",
- "requires": {
- "aws-sign2": "0.6.0",
- "aws4": "1.6.0",
- "caseless": "0.12.0",
- "combined-stream": "1.0.5",
- "extend": "3.0.1",
- "forever-agent": "0.6.1",
- "form-data": "2.1.4",
- "har-validator": "4.2.1",
- "hawk": "3.1.3",
- "http-signature": "1.1.1",
- "is-typedarray": "1.0.0",
- "isstream": "0.1.2",
- "json-stringify-safe": "5.0.1",
- "mime-types": "2.1.15",
- "oauth-sign": "0.8.2",
- "performance-now": "0.2.0",
- "qs": "6.4.0",
- "safe-buffer": "5.1.1",
- "stringstream": "0.0.5",
- "tough-cookie": "2.3.2",
- "tunnel-agent": "0.6.0",
- "uuid": "3.1.0"
- },
- "dependencies": {
- "tunnel-agent": {
- "version": "0.6.0",
- "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz",
- "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=",
- "requires": {
- "safe-buffer": "5.1.1"
- }
- }
- }
- },
- "request-promise": {
- "version": "4.2.1",
- "resolved": "https://registry.npmjs.org/request-promise/-/request-promise-4.2.1.tgz",
- "integrity": "sha1-fuxWyJMXqCLL/qmbA5zlQ8LhX2c=",
- "requires": {
- "bluebird": "3.5.0",
- "request-promise-core": "1.1.1",
- "stealthy-require": "1.1.1",
- "tough-cookie": "2.3.2"
- }
- },
- "request-promise-core": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/request-promise-core/-/request-promise-core-1.1.1.tgz",
- "integrity": "sha1-Pu4AssWqgyOc+wTFcA2jb4HNCLY=",
- "requires": {
- "lodash": "4.17.4"
- }
- },
- "require-directory": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz",
- "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I="
- },
- "require-main-filename": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz",
- "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE="
- },
- "retry": {
- "version": "0.10.1",
- "resolved": "https://registry.npmjs.org/retry/-/retry-0.10.1.tgz",
- "integrity": "sha1-52OI0heZLCUnUCQdPTlW/tmNj/Q="
- },
- "retry-as-promised": {
- "version": "2.2.0",
- "resolved": "https://registry.npmjs.org/retry-as-promised/-/retry-as-promised-2.2.0.tgz",
- "integrity": "sha1-sEY9f9PPWy/tZFAKtui4pJxbjmw=",
- "requires": {
- "bluebird": "3.5.0",
- "cross-env": "3.2.4",
- "debug": "2.6.7"
- }
- },
- "rimraf": {
- "version": "2.6.2",
- "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.2.tgz",
- "integrity": "sha512-lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w==",
- "requires": {
- "glob": "7.1.2"
- }
- },
- "rndm": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/rndm/-/rndm-1.2.0.tgz",
- "integrity": "sha1-8z/pz7Urv9UgqhgyO8ZdsRCht2w="
- },
- "safe-buffer": {
- "version": "5.1.1",
- "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz",
- "integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg=="
- },
- "sax": {
- "version": "1.2.4",
- "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz",
- "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw=="
- },
- "seek-bzip": {
- "version": "1.0.5",
- "resolved": "https://registry.npmjs.org/seek-bzip/-/seek-bzip-1.0.5.tgz",
- "integrity": "sha1-z+kXyz0nS8/6x5J1ivUxc+sfq9w=",
- "requires": {
- "commander": "2.8.1"
- }
- },
- "semver": {
- "version": "5.3.0",
- "resolved": "https://registry.npmjs.org/semver/-/semver-5.3.0.tgz",
- "integrity": "sha1-myzl094C0XxgEq0yaqa00M9U+U8="
- },
- "send": {
- "version": "0.15.3",
- "resolved": "https://registry.npmjs.org/send/-/send-0.15.3.tgz",
- "integrity": "sha1-UBP5+ZAj31DRvZiSwZ4979HVMwk=",
- "requires": {
- "debug": "2.6.7",
- "depd": "1.1.0",
- "destroy": "1.0.4",
- "encodeurl": "1.0.1",
- "escape-html": "1.0.3",
- "etag": "1.8.0",
- "fresh": "0.5.0",
- "http-errors": "1.6.1",
- "mime": "1.3.4",
- "ms": "2.0.0",
- "on-finished": "2.3.0",
- "range-parser": "1.2.0",
- "statuses": "1.3.1"
- }
- },
- "sendmail": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/sendmail/-/sendmail-1.1.1.tgz",
- "integrity": "sha1-c5qfIm+tn/Q26vqDLeYWOdlIhVw=",
- "requires": {
- "dkim-signer": "0.2.2",
- "mailcomposer": "3.12.0"
- }
- },
- "sequelize": {
- "version": "3.30.4",
- "resolved": "https://registry.npmjs.org/sequelize/-/sequelize-3.30.4.tgz",
- "integrity": "sha1-vaLfHjGFSwmeQUmhEen8Clyh0aQ=",
- "requires": {
- "bluebird": "3.5.0",
- "depd": "1.1.0",
- "dottie": "1.1.1",
- "generic-pool": "2.4.2",
- "inflection": "1.12.0",
- "lodash": "4.12.0",
- "moment": "2.18.1",
- "moment-timezone": "0.5.13",
- "retry-as-promised": "2.2.0",
- "semver": "5.3.0",
- "shimmer": "1.1.0",
- "terraformer-wkt-parser": "1.1.2",
- "toposort-class": "1.0.1",
- "uuid": "3.1.0",
- "validator": "5.7.0",
- "wkx": "0.2.0"
- },
- "dependencies": {
- "lodash": {
- "version": "4.12.0",
- "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.12.0.tgz",
- "integrity": "sha1-K9bcRqBA9Z5obJcu0h2T3FkFMlg="
- }
- }
- },
- "serve-static": {
- "version": "1.12.3",
- "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.12.3.tgz",
- "integrity": "sha1-n0uhni8wMMVH+K+ZEHg47DjVseI=",
- "requires": {
- "encodeurl": "1.0.1",
- "escape-html": "1.0.3",
- "parseurl": "1.3.1",
- "send": "0.15.3"
- }
- },
- "session-file-store": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/session-file-store/-/session-file-store-1.0.0.tgz",
- "integrity": "sha1-F9ah9LVIxM6KW4CNJoY3q+tG3PQ=",
- "requires": {
- "bagpipe": "0.3.5",
- "fs-extra": "1.0.0",
- "retry": "0.10.1",
- "write-file-atomic": "1.3.4"
- },
- "dependencies": {
- "fs-extra": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-1.0.0.tgz",
- "integrity": "sha1-zTzl9+fLYUWIP8rjGR6Yd/hYeVA=",
- "requires": {
- "graceful-fs": "4.1.11",
- "jsonfile": "2.4.0",
- "klaw": "1.3.1"
- }
- }
- }
- },
- "set-blocking": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz",
- "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc="
- },
- "setprototypeof": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.0.3.tgz",
- "integrity": "sha1-ZlZ+NwQ+608E2RvWWMDL77VbjgQ="
- },
- "shebang-command": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz",
- "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=",
- "requires": {
- "shebang-regex": "1.0.0"
- }
- },
- "shebang-regex": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz",
- "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM="
- },
- "shimmer": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/shimmer/-/shimmer-1.1.0.tgz",
- "integrity": "sha1-l9c3cTf/u6tCVSLkKf4KqJpIizU="
- },
- "signal-exit": {
- "version": "3.0.2",
- "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz",
- "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0="
- },
- "slide": {
- "version": "1.1.6",
- "resolved": "https://registry.npmjs.org/slide/-/slide-1.1.6.tgz",
- "integrity": "sha1-VusCfWW00tzmyy4tMsTUr8nh1wc="
- },
- "sntp": {
- "version": "1.0.9",
- "resolved": "https://registry.npmjs.org/sntp/-/sntp-1.0.9.tgz",
- "integrity": "sha1-ZUEYTMkK7qbG57NeJlkIJEPGYZg=",
- "requires": {
- "hoek": "2.16.3"
- }
- },
- "socket.io": {
- "version": "2.0.4",
- "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-2.0.4.tgz",
- "integrity": "sha1-waRZDO/4fs8TxyZS8Eb3FrKeYBQ=",
- "requires": {
- "debug": "2.6.7",
- "engine.io": "3.1.4",
- "socket.io-adapter": "1.1.1",
- "socket.io-client": "2.0.4",
- "socket.io-parser": "3.1.2"
- }
- },
- "socket.io-adapter": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-1.1.1.tgz",
- "integrity": "sha1-KoBeihTWNyEk3ZFZrUUC+MsH8Gs="
- },
- "socket.io-client": {
- "version": "2.0.4",
- "resolved": "https://registry.npmjs.org/socket.io-client/-/socket.io-client-2.0.4.tgz",
- "integrity": "sha1-CRilUkBtxeVAs4Dc2Xr8SmQzL44=",
- "requires": {
- "backo2": "1.0.2",
- "base64-arraybuffer": "0.1.5",
- "component-bind": "1.0.0",
- "component-emitter": "1.2.1",
- "debug": "2.6.7",
- "engine.io-client": "3.1.4",
- "has-cors": "1.1.0",
- "indexof": "0.0.1",
- "object-component": "0.0.3",
- "parseqs": "0.0.5",
- "parseuri": "0.0.5",
- "socket.io-parser": "3.1.2",
- "to-array": "0.1.4"
- }
- },
- "socket.io-parser": {
- "version": "3.1.2",
- "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-3.1.2.tgz",
- "integrity": "sha1-28IoIVH8T6675Aru3Ady66YZ9/I=",
- "requires": {
- "component-emitter": "1.2.1",
- "debug": "2.6.7",
- "has-binary2": "1.0.2",
- "isarray": "2.0.1"
- },
- "dependencies": {
- "isarray": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.1.tgz",
- "integrity": "sha1-o32U7ZzaLVmGXJ92/llu4fM4dB4="
- }
- }
- },
- "source-map": {
- "version": "0.2.0",
- "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.2.0.tgz",
- "integrity": "sha1-2rc/vPwrqBm03gO9b26qSBZLP50=",
- "optional": true,
- "requires": {
- "amdefine": "1.0.1"
- }
- },
- "spdx-correct": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-1.0.2.tgz",
- "integrity": "sha1-SzBz2TP/UfORLwOsVRlJikFQ20A=",
- "requires": {
- "spdx-license-ids": "1.2.2"
- }
- },
- "spdx-expression-parse": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-1.0.4.tgz",
- "integrity": "sha1-m98vIOH0DtRH++JzJmGR/O1RYmw="
- },
- "spdx-license-ids": {
- "version": "1.2.2",
- "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-1.2.2.tgz",
- "integrity": "sha1-yd96NCRZSt5r0RkA1ZZpbcBrrFc="
- },
- "speech-rule-engine": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/speech-rule-engine/-/speech-rule-engine-1.2.0.tgz",
- "integrity": "sha1-KTfdzz4sWHAnobGq4aWdhHUIrPo=",
- "requires": {
- "commander": "2.8.1",
- "xml-mapping": "1.7.1",
- "xmldom": "0.1.27",
- "xpath": "0.0.24"
- }
- },
- "sprintf-js": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz",
- "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw="
- },
- "sqlite3": {
- "version": "3.1.8",
- "resolved": "https://registry.npmjs.org/sqlite3/-/sqlite3-3.1.8.tgz",
- "integrity": "sha1-TLz5Zdi5AdGxAVy8f8QVquFX36o=",
- "requires": {
- "nan": "2.4.0",
- "node-pre-gyp": "0.6.39"
- }
- },
- "sqlstring": {
- "version": "2.2.0",
- "resolved": "https://registry.npmjs.org/sqlstring/-/sqlstring-2.2.0.tgz",
- "integrity": "sha1-wxNcTqirzX5+50GklmqJHYak8ZE="
- },
- "sshpk": {
- "version": "1.13.1",
- "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.13.1.tgz",
- "integrity": "sha1-US322mKHFEMW3EwY/hzx2UBzm+M=",
- "requires": {
- "asn1": "0.2.3",
- "assert-plus": "1.0.0",
- "bcrypt-pbkdf": "1.0.1",
- "dashdash": "1.14.1",
- "ecc-jsbn": "0.1.1",
- "getpass": "0.1.7",
- "jsbn": "0.1.1",
- "tweetnacl": "0.14.5"
- },
- "dependencies": {
- "assert-plus": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz",
- "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU="
- }
- }
- },
- "stack-trace": {
- "version": "0.0.10",
- "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.10.tgz",
- "integrity": "sha1-VHxws0fo0ytOEI6hoqFZ5f3eGcA="
- },
- "statuses": {
- "version": "1.3.1",
- "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.3.1.tgz",
- "integrity": "sha1-+vUbnrdKrvOzrPStX2Gr8ky3uT4="
- },
- "stealthy-require": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/stealthy-require/-/stealthy-require-1.1.1.tgz",
- "integrity": "sha1-NbCYdbT/SfJqd35QmzCQoyJr8ks="
- },
- "streamsearch": {
- "version": "0.1.2",
- "resolved": "https://registry.npmjs.org/streamsearch/-/streamsearch-0.1.2.tgz",
- "integrity": "sha1-gIudDlb8Jz2Am6VzOOkpkZoanxo="
- },
- "string-width": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz",
- "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=",
- "requires": {
- "code-point-at": "1.1.0",
- "is-fullwidth-code-point": "1.0.0",
- "strip-ansi": "3.0.1"
- }
- },
- "string_decoder": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz",
- "integrity": "sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ==",
- "requires": {
- "safe-buffer": "5.1.1"
- }
- },
- "stringstream": {
- "version": "0.0.5",
- "resolved": "https://registry.npmjs.org/stringstream/-/stringstream-0.0.5.tgz",
- "integrity": "sha1-TkhM1N5aC7vuGORjB3EKioFiGHg="
- },
- "strip-ansi": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz",
- "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=",
- "requires": {
- "ansi-regex": "2.1.1"
- }
- },
- "strip-bom": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz",
- "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=",
- "requires": {
- "is-utf8": "0.2.1"
- }
- },
- "strip-dirs": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/strip-dirs/-/strip-dirs-2.0.0.tgz",
- "integrity": "sha1-YQzbKSggDaAAT0HcuQ/JXNkZoLY=",
- "requires": {
- "is-natural-number": "4.0.1"
- }
- },
- "strip-json-comments": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz",
- "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo="
- },
- "strip-outer": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/strip-outer/-/strip-outer-1.0.0.tgz",
- "integrity": "sha1-qsC6YNLpDF1PJ1/Yhp/ZotMQ/7g=",
- "requires": {
- "escape-string-regexp": "1.0.5"
- }
- },
- "supports-color": {
- "version": "0.2.0",
- "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-0.2.0.tgz",
- "integrity": "sha1-2S3iaU6z9nMjlz1649i1W0wiGQo="
- },
- "symbol-tree": {
- "version": "3.2.2",
- "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.2.tgz",
- "integrity": "sha1-rifbOPZgp64uHDt9G8KQgZuFGeY="
- },
- "syzoj-divine": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/syzoj-divine/-/syzoj-divine-1.0.2.tgz",
- "integrity": "sha1-6AU+K1sZkVtV1LkZjJI7/Bh3eLw=",
- "requires": {
- "buffer-crc32": "0.2.13",
- "random-js": "1.0.8"
- }
- },
- "tar": {
- "version": "2.2.1",
- "resolved": "https://registry.npmjs.org/tar/-/tar-2.2.1.tgz",
- "integrity": "sha1-jk0qJWwOIYXGsYrWlK7JaLg8sdE=",
- "requires": {
- "block-stream": "0.0.9",
- "fstream": "1.0.11",
- "inherits": "2.0.3"
- }
- },
- "tar-pack": {
- "version": "3.4.1",
- "resolved": "https://registry.npmjs.org/tar-pack/-/tar-pack-3.4.1.tgz",
- "integrity": "sha512-PPRybI9+jM5tjtCbN2cxmmRU7YmqT3Zv/UDy48tAh2XRkLa9bAORtSWLkVc13+GJF+cdTh1yEnHEk3cpTaL5Kg==",
- "requires": {
- "debug": "2.6.7",
- "fstream": "1.0.11",
- "fstream-ignore": "1.0.5",
- "once": "1.4.0",
- "readable-stream": "2.3.3",
- "rimraf": "2.6.2",
- "tar": "2.2.1",
- "uid-number": "0.0.6"
- }
- },
- "tar-stream": {
- "version": "1.5.4",
- "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-1.5.4.tgz",
- "integrity": "sha1-NlSc8E7RrumyowwBQyUiONr5QBY=",
- "requires": {
- "bl": "1.2.1",
- "end-of-stream": "1.4.0",
- "readable-stream": "2.3.3",
- "xtend": "4.0.1"
- }
- },
- "terraformer": {
- "version": "1.0.8",
- "resolved": "https://registry.npmjs.org/terraformer/-/terraformer-1.0.8.tgz",
- "integrity": "sha1-UeCtiXRvzyFh3G9lqnDkI3fItZM=",
- "requires": {
- "@types/geojson": "1.0.2"
- }
- },
- "terraformer-wkt-parser": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/terraformer-wkt-parser/-/terraformer-wkt-parser-1.1.2.tgz",
- "integrity": "sha1-M2oMj8gglKWv+DKI9prt7NNpvww=",
- "requires": {
- "terraformer": "1.0.8"
- }
- },
- "test-value": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/test-value/-/test-value-2.1.0.tgz",
- "integrity": "sha1-Edpv9nDzRxpztiXKTz/c97t0gpE=",
- "requires": {
- "array-back": "1.0.4",
- "typical": "2.6.1"
- },
- "dependencies": {
- "array-back": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/array-back/-/array-back-1.0.4.tgz",
- "integrity": "sha1-ZEun8JX3/898Q7Xw3DnTwfA8Bjs=",
- "requires": {
- "typical": "2.6.1"
- }
- }
- }
- },
- "through": {
- "version": "2.3.8",
- "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz",
- "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU="
- },
- "through2": {
- "version": "0.6.5",
- "resolved": "https://registry.npmjs.org/through2/-/through2-0.6.5.tgz",
- "integrity": "sha1-QaucZ7KdVyCQcUEOHXp6lozTrUg=",
- "requires": {
- "readable-stream": "1.0.34",
- "xtend": "4.0.1"
- },
- "dependencies": {
- "isarray": {
- "version": "0.0.1",
- "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz",
- "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8="
- },
- "readable-stream": {
- "version": "1.0.34",
- "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz",
- "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=",
- "requires": {
- "core-util-is": "1.0.2",
- "inherits": "2.0.3",
- "isarray": "0.0.1",
- "string_decoder": "0.10.31"
- }
- },
- "string_decoder": {
- "version": "0.10.31",
- "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz",
- "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ="
- }
- }
- },
- "timed-out": {
- "version": "4.0.1",
- "resolved": "https://registry.npmjs.org/timed-out/-/timed-out-4.0.1.tgz",
- "integrity": "sha1-8y6srFoXW+ol1/q1Zas+2HQe9W8="
- },
- "tmp": {
- "version": "0.0.31",
- "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.31.tgz",
- "integrity": "sha1-jzirlDjhcxXl29izZX6L+yd65Kc=",
- "requires": {
- "os-tmpdir": "1.0.2"
- }
- },
- "tmp-promise": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/tmp-promise/-/tmp-promise-1.0.3.tgz",
- "integrity": "sha1-O0UJJ6t4xq7cpeYoxnf1Nsrji8U=",
- "requires": {
- "bluebird": "3.5.0",
- "tmp": "0.0.31"
- }
- },
- "to-array": {
- "version": "0.1.4",
- "resolved": "https://registry.npmjs.org/to-array/-/to-array-0.1.4.tgz",
- "integrity": "sha1-F+bBH3PdTz10zaek/zI46a2b+JA="
- },
- "topo": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/topo/-/topo-1.1.0.tgz",
- "integrity": "sha1-6ddRYV0buH3IZdsYL6HKCl71NtU=",
- "requires": {
- "hoek": "2.16.3"
- }
- },
- "toposort-class": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/toposort-class/-/toposort-class-1.0.1.tgz",
- "integrity": "sha1-f/0feMi+KMO6Rc1OGj9e4ZO9mYg="
- },
- "tough-cookie": {
- "version": "2.3.2",
- "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.3.2.tgz",
- "integrity": "sha1-8IH3bkyFcg5sN6X6ztc3FQ2EByo=",
- "requires": {
- "punycode": "1.4.1"
- }
- },
- "tr46": {
- "version": "0.0.3",
- "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz",
- "integrity": "sha1-gYT9NH2snNwYWZLzpmIuFLnZq2o="
- },
- "trim-repeated": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/trim-repeated/-/trim-repeated-1.0.0.tgz",
- "integrity": "sha1-42RqLqTokTEr9+rObPsFOAvAHCE=",
- "requires": {
- "escape-string-regexp": "1.0.5"
- }
- },
- "tsscmp": {
- "version": "1.0.5",
- "resolved": "https://registry.npmjs.org/tsscmp/-/tsscmp-1.0.5.tgz",
- "integrity": "sha1-fcSjOvcVgatDN9qR2FylQn69mpc="
- },
- "tunnel-agent": {
- "version": "0.4.3",
- "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.4.3.tgz",
- "integrity": "sha1-Y3PbdpCf5XDgjXNYM2Xtgop07us="
- },
- "tweetnacl": {
- "version": "0.14.5",
- "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz",
- "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=",
- "optional": true
- },
- "type-check": {
- "version": "0.3.2",
- "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz",
- "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=",
- "requires": {
- "prelude-ls": "1.1.2"
- }
- },
- "type-is": {
- "version": "1.6.15",
- "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.15.tgz",
- "integrity": "sha1-yrEPtJCeRByChC6v4a1kbIGARBA=",
- "requires": {
- "media-typer": "0.3.0",
- "mime-types": "2.1.15"
- }
- },
- "typedarray": {
- "version": "0.0.6",
- "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz",
- "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c="
- },
- "typical": {
- "version": "2.6.1",
- "resolved": "https://registry.npmjs.org/typical/-/typical-2.6.1.tgz",
- "integrity": "sha1-XAgOXWYcu+OCWdLnCjxyU+hziB0="
- },
- "uid-number": {
- "version": "0.0.6",
- "resolved": "https://registry.npmjs.org/uid-number/-/uid-number-0.0.6.tgz",
- "integrity": "sha1-DqEOgDXo61uOREnwbaHHMGY7qoE="
- },
- "uid-safe": {
- "version": "2.1.4",
- "resolved": "https://registry.npmjs.org/uid-safe/-/uid-safe-2.1.4.tgz",
- "integrity": "sha1-Otbzg2jG1MjHXsF2I/t5qh0HHYE=",
- "requires": {
- "random-bytes": "1.0.0"
- }
- },
- "ultron": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/ultron/-/ultron-1.1.1.tgz",
- "integrity": "sha512-UIEXBNeYmKptWH6z8ZnqTeS8fV74zG0/eRU9VGkpzz+LIJNs8W/zM/L+7ctCkRrgbNnnR0xxw4bKOr0cW0N0Og=="
- },
- "unbzip2-stream": {
- "version": "1.2.4",
- "resolved": "https://registry.npmjs.org/unbzip2-stream/-/unbzip2-stream-1.2.4.tgz",
- "integrity": "sha1-jITITVtMwo/B+fV3IDu9PLhgoWo=",
- "requires": {
- "buffer": "3.6.0",
- "through": "2.3.8"
- }
- },
- "universalify": {
- "version": "0.1.1",
- "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.1.tgz",
- "integrity": "sha1-+nG63UQ3r0wUiEHjs7Fl+enlkLc="
- },
- "unpipe": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz",
- "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw="
- },
- "unzip-response": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/unzip-response/-/unzip-response-2.0.1.tgz",
- "integrity": "sha1-0vD3N9FrBhXnKmk17QQhRXLVb5c="
- },
- "url-parse-lax": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-1.0.0.tgz",
- "integrity": "sha1-evjzA2Rem9eaJy56FKxovAYJ2nM=",
- "requires": {
- "prepend-http": "1.0.4"
- }
- },
- "util-deprecate": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
- "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8="
- },
- "utils-merge": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.0.tgz",
- "integrity": "sha1-ApT7kiu5N1FTVBxPcJYjHyh8ivg="
- },
- "uuid": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.1.0.tgz",
- "integrity": "sha512-DIWtzUkw04M4k3bf1IcpS2tngXEL26YUD2M0tMDUpnUrz2hgzUBlD55a4FjdLGPvfHxS6uluGWvaVEqgBcVa+g=="
- },
- "uws": {
- "version": "0.14.5",
- "resolved": "https://registry.npmjs.org/uws/-/uws-0.14.5.tgz",
- "integrity": "sha1-Z6rzPEaypYel9mZtAPdpEyjxSdw=",
- "optional": true
- },
- "validate-npm-package-license": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.1.tgz",
- "integrity": "sha1-KAS6vnEq0zeUWaz74kdGqywwP7w=",
- "requires": {
- "spdx-correct": "1.0.2",
- "spdx-expression-parse": "1.0.4"
- }
- },
- "validator": {
- "version": "5.7.0",
- "resolved": "https://registry.npmjs.org/validator/-/validator-5.7.0.tgz",
- "integrity": "sha1-eoelgUa2laxIYHEUHAxJ1n2gXlw="
- },
- "vary": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.1.tgz",
- "integrity": "sha1-Z1Neu2lMHVIldFeYRmUyP1h+jTc="
- },
- "verror": {
- "version": "1.3.6",
- "resolved": "https://registry.npmjs.org/verror/-/verror-1.3.6.tgz",
- "integrity": "sha1-z/XfEpRtKX0rqu+qJoniW+AcAFw=",
- "requires": {
- "extsprintf": "1.0.2"
- }
- },
- "waliyun": {
- "version": "3.1.1",
- "resolved": "https://registry.npmjs.org/waliyun/-/waliyun-3.1.1.tgz",
- "integrity": "sha1-CCl+SSNBytTbRB8ruhUBVtvob1Q=",
- "requires": {
- "debug": "2.6.7",
- "request": "2.81.0"
- }
- },
- "webidl-conversions": {
- "version": "4.0.1",
- "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-4.0.1.tgz",
- "integrity": "sha1-gBWherg+fhsxFjhIas6B2mziBqA="
- },
- "whatwg-encoding": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-1.0.1.tgz",
- "integrity": "sha1-PGxFGhmO567FWx7GHQkgxngBpfQ=",
- "requires": {
- "iconv-lite": "0.4.13"
- },
- "dependencies": {
- "iconv-lite": {
- "version": "0.4.13",
- "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.13.tgz",
- "integrity": "sha1-H4irpKsLFQjoMSrMOTRfNumS4vI="
- }
- }
- },
- "whatwg-url": {
- "version": "4.8.0",
- "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-4.8.0.tgz",
- "integrity": "sha1-0pgaqRSMHgCkHFphMRZqtGg7vMA=",
- "requires": {
- "tr46": "0.0.3",
- "webidl-conversions": "3.0.1"
- },
- "dependencies": {
- "webidl-conversions": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz",
- "integrity": "sha1-JFNCdeKnvGvnvIZhHMFq4KVlSHE="
- }
- }
- },
- "whatwg-url-compat": {
- "version": "0.6.5",
- "resolved": "https://registry.npmjs.org/whatwg-url-compat/-/whatwg-url-compat-0.6.5.tgz",
- "integrity": "sha1-AImBEa9om7CXVBzVpFymyHmERb8=",
- "requires": {
- "tr46": "0.0.3"
- }
- },
- "when": {
- "version": "3.7.8",
- "resolved": "https://registry.npmjs.org/when/-/when-3.7.8.tgz",
- "integrity": "sha1-xxMLan6gRpPoQs3J56Hyqjmjn4I="
- },
- "which": {
- "version": "1.2.14",
- "resolved": "https://registry.npmjs.org/which/-/which-1.2.14.tgz",
- "integrity": "sha1-mofEN48D6CfOyvGs31bHNsAcFOU=",
- "requires": {
- "isexe": "2.0.0"
- }
- },
- "which-module": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/which-module/-/which-module-1.0.0.tgz",
- "integrity": "sha1-u6Y8qGGUiZT/MHc2CJ47lgJsKk8="
- },
- "wide-align": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.2.tgz",
- "integrity": "sha512-ijDLlyQ7s6x1JgCLur53osjm/UXUYD9+0PbYKrBsYisYXzCxN+HC3mYDNy/dWdmf3AwqwU3CXwDCvsNgGK1S0w==",
- "requires": {
- "string-width": "1.0.2"
- }
- },
- "win-spawn": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/win-spawn/-/win-spawn-2.0.0.tgz",
- "integrity": "sha1-OXopEw7JjQqgvIa6pGITk+/9Cwc="
- },
- "window-size": {
- "version": "0.1.4",
- "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.1.4.tgz",
- "integrity": "sha1-+OGqHuWlPsW/FR/6CXQqatdpeHY="
- },
- "winston": {
- "version": "2.4.0",
- "resolved": "https://registry.npmjs.org/winston/-/winston-2.4.0.tgz",
- "integrity": "sha1-gIBQuT1SZh7Z+2wms/DIJnCLCu4=",
- "requires": {
- "async": "1.0.0",
- "colors": "1.0.3",
- "cycle": "1.0.3",
- "eyes": "0.1.8",
- "isstream": "0.1.2",
- "stack-trace": "0.0.10"
- }
- },
- "wkx": {
- "version": "0.2.0",
- "resolved": "https://registry.npmjs.org/wkx/-/wkx-0.2.0.tgz",
- "integrity": "sha1-dsJPFqzQzY+TzTSqMx4PeWElboQ="
- },
- "wordwrap": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz",
- "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus="
- },
- "wrap-ansi": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz",
- "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=",
- "requires": {
- "string-width": "1.0.2",
- "strip-ansi": "3.0.1"
- }
- },
- "wrappy": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
- "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8="
- },
- "write-file-atomic": {
- "version": "1.3.4",
- "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-1.3.4.tgz",
- "integrity": "sha1-+Aek8LHZ6ROuekgRLmzDrxmRtF8=",
- "requires": {
- "graceful-fs": "4.1.11",
- "imurmurhash": "0.1.4",
- "slide": "1.1.6"
- }
- },
- "ws": {
- "version": "3.3.3",
- "resolved": "https://registry.npmjs.org/ws/-/ws-3.3.3.tgz",
- "integrity": "sha512-nnWLa/NwZSt4KQJu51MYlCcSQ5g7INpOrOMt4XV8j4dqTXdmlUmSHQ8/oLC069ckre0fRsgfvsKwbTdtKLCDkA==",
- "requires": {
- "async-limiter": "1.0.0",
- "safe-buffer": "5.1.1",
- "ultron": "1.1.1"
- }
- },
- "xml-mapping": {
- "version": "1.7.1",
- "resolved": "https://registry.npmjs.org/xml-mapping/-/xml-mapping-1.7.1.tgz",
- "integrity": "sha1-ZWiWWeUIWDPH0r7FfawoQsy7woY=",
- "requires": {
- "sax": "0.4.2",
- "xml-writer": "1.7.0"
- },
- "dependencies": {
- "sax": {
- "version": "0.4.2",
- "resolved": "https://registry.npmjs.org/sax/-/sax-0.4.2.tgz",
- "integrity": "sha1-OfO2AXM9a+yXEFskKipA/Wl4rDw="
- }
- }
- },
- "xml-name-validator": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-2.0.1.tgz",
- "integrity": "sha1-TYuPHszTQZqjYgYb7O9RXh5VljU="
- },
- "xml-writer": {
- "version": "1.7.0",
- "resolved": "https://registry.npmjs.org/xml-writer/-/xml-writer-1.7.0.tgz",
- "integrity": "sha1-t28dWRwWomNOvbcDx729D9aBkGU="
- },
- "xmldom": {
- "version": "0.1.27",
- "resolved": "https://registry.npmjs.org/xmldom/-/xmldom-0.1.27.tgz",
- "integrity": "sha1-1QH5ezvbQDr4757MIFcxh6rawOk="
- },
- "xmlhttprequest-ssl": {
- "version": "1.5.5",
- "resolved": "https://registry.npmjs.org/xmlhttprequest-ssl/-/xmlhttprequest-ssl-1.5.5.tgz",
- "integrity": "sha1-wodrBhaKrcQOV9l+gRkayPQ5iz4="
- },
- "xpath": {
- "version": "0.0.24",
- "resolved": "https://registry.npmjs.org/xpath/-/xpath-0.0.24.tgz",
- "integrity": "sha1-Gt4WLhzFI8jTn8fQavwW6iFvKfs="
- },
- "xss": {
- "version": "0.3.3",
- "resolved": "https://registry.npmjs.org/xss/-/xss-0.3.3.tgz",
- "integrity": "sha1-oBQ2De4QMXMx+edCWBQfftA/x4Q=",
- "requires": {
- "commander": "2.11.0",
- "cssfilter": "0.0.9"
- },
- "dependencies": {
- "commander": {
- "version": "2.11.0",
- "resolved": "https://registry.npmjs.org/commander/-/commander-2.11.0.tgz",
- "integrity": "sha512-b0553uYA5YAEGgyYIGYROzKQ7X5RAqedkfjiZxwi0kL1g3bOaBNNZfYkzt/CL0umgD5wc9Jec2FbB98CjkMRvQ=="
- },
- "cssfilter": {
- "version": "0.0.9",
- "resolved": "https://registry.npmjs.org/cssfilter/-/cssfilter-0.0.9.tgz",
- "integrity": "sha1-j1zrOqvXaNtTnaRYKyFS1j73cV4="
- }
- }
- },
- "xtend": {
- "version": "4.0.1",
- "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz",
- "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68="
- },
- "y18n": {
- "version": "3.2.1",
- "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.1.tgz",
- "integrity": "sha1-bRX7qITAhnnA136I53WegR4H+kE="
- },
- "yallist": {
- "version": "2.1.2",
- "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz",
- "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI="
- },
- "yargs": {
- "version": "6.6.0",
- "resolved": "https://registry.npmjs.org/yargs/-/yargs-6.6.0.tgz",
- "integrity": "sha1-eC7CHvQDNF+DCoCMo9UTr1YGUgg=",
- "requires": {
- "camelcase": "3.0.0",
- "cliui": "3.2.0",
- "decamelize": "1.2.0",
- "get-caller-file": "1.0.2",
- "os-locale": "1.4.0",
- "read-pkg-up": "1.0.1",
- "require-directory": "2.1.1",
- "require-main-filename": "1.0.1",
- "set-blocking": "2.0.0",
- "string-width": "1.0.2",
- "which-module": "1.0.0",
- "y18n": "3.2.1",
- "yargs-parser": "4.2.1"
- }
- },
- "yargs-parser": {
- "version": "4.2.1",
- "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-4.2.1.tgz",
- "integrity": "sha1-KczqwNxPA8bIe0qfIX3RjJ90hxw=",
- "requires": {
- "camelcase": "3.0.0"
- }
- },
- "yauzl": {
- "version": "2.8.0",
- "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.8.0.tgz",
- "integrity": "sha1-eUUK/yKyqcWkHvVOAtuQfM+/nuI=",
- "requires": {
- "buffer-crc32": "0.2.13",
- "fd-slicer": "1.0.1"
- }
- },
- "yeast": {
- "version": "0.1.2",
- "resolved": "https://registry.npmjs.org/yeast/-/yeast-0.1.2.tgz",
- "integrity": "sha1-AI4G2AlDIMNy28L47XagymyKxBk="
- }
- }
-}
diff --git a/package.json b/package.json
index 67c278d..e255ac2 100644
--- a/package.json
+++ b/package.json
@@ -31,7 +31,6 @@
"command-line-args": "^4.0.7",
"cookie-parser": "^1.4.3",
"cssfilter": "0.0.10",
- "csurf": "^1.9.0",
"download": "^5.0.3",
"ejs": "^2.5.2",
"express": "^4.14.0",
@@ -42,6 +41,7 @@
"js-yaml": "^3.9.0",
"jsondiffpatch": "0.2.4",
"jsonwebtoken": "^7.4.3",
+ "katex": "^0.10.0-rc.1",
"moemark-renderer": "^1.2.6",
"moment": "^2.15.0",
"msgpack-lite": "^0.1.26",
diff --git a/static/fonts/-_Ctzj9b56b8RgXW8FArifk_vArhqVIZ0nv9q090hN8.woff2 b/static/fonts/-_Ctzj9b56b8RgXW8FArifk_vArhqVIZ0nv9q090hN8.woff2
deleted file mode 100644
index cb25b8db376f54973faa46bbd48cf742082317aa..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001
literal 20444
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
X3G*FSvru~yDj$VYHgBN%eE8hj>H#t#8
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