diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..0f15a6a --- /dev/null +++ b/.gitignore @@ -0,0 +1,3 @@ +.idea +_site +.DS_Store \ No newline at end of file diff --git a/2017/footer.html b/2017/footer.html new file mode 100644 index 0000000..814964d --- /dev/null +++ b/2017/footer.html @@ -0,0 +1,42 @@ + + diff --git a/2017/gsoc-accepted-projects.html b/2017/gsoc-accepted-projects.html new file mode 100644 index 0000000..2875c2c --- /dev/null +++ b/2017/gsoc-accepted-projects.html @@ -0,0 +1,19 @@ +
+
+
+
+

Google Summer of Code 2016 Projects

+
+ {% for project in site.gsoc_current limit:3 %} + {% include project.html %} + {% endfor %} +
+
+ {% for project in site.gsoc_current offset:3 %} + {% include project.html %} + {% endfor %} +
+
+
+
+
diff --git a/2017/gsoc-summary.html b/2017/gsoc-summary.html new file mode 100644 index 0000000..6323771 --- /dev/null +++ b/2017/gsoc-summary.html @@ -0,0 +1,68 @@ +
+
+
+
+
+
+

Successful projects

+
+
+ {% for post in site.posts reversed %} + {% if post.type == 'gsoc' %} +
+ +
+
+ +
+
+ +
+
+

{{ post.title }}

+

+
+
+ {% endif %} + {% endfor %} +
+

+ This is just a small selection of projects, you can find all of them on Google Melange. +

+
+
+
+
+
+ + +{% for post in site.posts %} + {% if post.type == 'gsoc' %} + + {% endif %} +{% endfor %} diff --git a/2017/head.html b/2017/head.html new file mode 100644 index 0000000..d52bb3b --- /dev/null +++ b/2017/head.html @@ -0,0 +1,29 @@ + + + + + + + + + {% if page.title %}{{ page.title }}{% else %}{{ site.title }}{% endif %} + + + + + + + + + + + + + + + + + diff --git a/2017/header.html b/2017/header.html new file mode 100644 index 0000000..ef068c2 --- /dev/null +++ b/2017/header.html @@ -0,0 +1,24 @@ +
+
+
+
+
+
+

{{page.title}}

+
+ +
+
+
+
+ +
+ +
diff --git a/2017/index.html b/2017/index.html new file mode 100644 index 0000000..2d4802d --- /dev/null +++ b/2017/index.html @@ -0,0 +1,113 @@ +--- +layout: default +title: CloudCV – GSoC 2017 Ideas +--- + +{% include header.html %} + +
+
+
+
+

About CloudCV

+

+ {% include teaser.md %} +

+
+
+
+
+ +
+ + +{% for post in site.posts reversed %} + {% if post.type == 'project' %} + {% capture thecycle %}{% cycle 'odd', 'even' %}{% endcapture %} + {% if thecycle == 'odd' %} +
+
+
+
+
+
+

{{ post.title }}

+

+ {% for technology in post.technologies %} + {{ technology }} + {% endfor %} +

+
{{ post.content }} +
+

Please wait for loading the projects ...

+
+ + + + + + + + + + + +
+
+ + +
+
+
+ +
+
+
+ +
+ {% else %} +
+
+
+
+
+
+

{{ post.title }}

+

+ {% for technology in post.technologies %} + {{ technology }} + {% endfor %} +

+
{{ post.content }}
+

Please wait for loading the projects ...

+
+ + + + + + + + + + + +
+
+ + +
+
+
+ +
+
+ +
+
+ {% endif %} + {% endif %} +{% endfor %} + +{% include mentor.html %} +{% include mentor_process.html %} diff --git a/2017/js.html b/2017/js.html new file mode 100644 index 0000000..ae0d663 --- /dev/null +++ b/2017/js.html @@ -0,0 +1,35 @@ + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/2017/mentor.html b/2017/mentor.html new file mode 100644 index 0000000..c74b220 --- /dev/null +++ b/2017/mentor.html @@ -0,0 +1,19 @@ +
+
+
+
+

Become a Mentor!

+

+ Mentoring is very important to the future of CloudCV. + It introduces new people to the world of open source software + who will enrich our community with their ideas and talents. +

+

+ Apart from technical skills, being a mentor requires your time, + a clear roadmap for your project and good organization skills. If you think + you would be a good fit to mentor one of our projects, do reach out to us! +

+
+
+
+
diff --git a/2017/mentor_process.html b/2017/mentor_process.html new file mode 100644 index 0000000..40cc672 --- /dev/null +++ b/2017/mentor_process.html @@ -0,0 +1,36 @@ +
+
+
+
+
+
+

Okay, let's mentor!

+

+ + + + + Browse this page for potential mentor projects. +

+

+ + + + + Contact + us if you have relevant experience and want to get involved. +

+

+ + + + + Have your own idea? Add an issue to our ideas repository. +

+
+
+ +
+
+
+
diff --git a/2017/navigation.html b/2017/navigation.html new file mode 100644 index 0000000..a5f8825 --- /dev/null +++ b/2017/navigation.html @@ -0,0 +1,34 @@ + + diff --git a/2017/project.html b/2017/project.html new file mode 100644 index 0000000..02726ed --- /dev/null +++ b/2017/project.html @@ -0,0 +1,32 @@ +
+ +
+

{{ project.title }}

+

+ {{ project.content }} +

+
+
Mentor:
+
+ {% for mentor in project.mentors %} + {% if mentor.github %} + {{mentor.name}} + {% else %} + {{mentor.name}} + {% endif %} + {% unless forloop.last %}, {% endunless %} + {% endfor %} +
+
Mentee:
+
+ {% for mentee in project.mentees %} + {% if mentee.github %} + {{ mentee.name }} + {% else %} + {{mentee.name}} + {% endif %} + {% endfor %} +
+
+
+
diff --git a/2017/teaser.md b/2017/teaser.md new file mode 100644 index 0000000..398dbc2 --- /dev/null +++ b/2017/teaser.md @@ -0,0 +1,5 @@ +CloudCV began in the summer of 2013 as a research project within the Machine Learning and Perception lab at Virginia Tech (now at Georgia Tech), with the ambitious goal of making platforms to make AI research more reproducible. We’re a young community working towards enabling developers, researchers, and fellow students to build, compare and share state-of-the-art Artificial Intelligence algorithms. We believe that one shouldn’t have to be an AI expert to have access to cutting edge vision algorithms. Likewise, researchers shouldn’t have to worry about building a service around their deep learning models to showcase and share it with others. +

+ +We have participated in the past two installments of Google Summer of Code, over the course of which our students built several excellent tools and features. If you are interested in participating as a student or mentor, scroll down to check out our projects and get involved! We are more than happy to answer any questions you may have regarding CloudCV, so feel free to reach out to us on our Gitter channel or on our mailing list. +

diff --git a/2018/footer.html b/2018/footer.html new file mode 100644 index 0000000..714ba89 --- /dev/null +++ b/2018/footer.html @@ -0,0 +1,48 @@ + + \ No newline at end of file diff --git a/2018/gsoc-accepted-projects.html b/2018/gsoc-accepted-projects.html new file mode 100644 index 0000000..3b739cb --- /dev/null +++ b/2018/gsoc-accepted-projects.html @@ -0,0 +1,19 @@ +
+
+
+
+

Google Summer of Code 2016 Projects

+
+ {% for project in site.gsoc_current limit:5 %} + {% include project.html %} + {% endfor %} +
+
+ {% for project in site.gsoc_current offset:3 %} + {% include project.html %} + {% endfor %} +
+
+
+
+
diff --git a/2018/gsoc-summary.html b/2018/gsoc-summary.html new file mode 100644 index 0000000..9748c39 --- /dev/null +++ b/2018/gsoc-summary.html @@ -0,0 +1,67 @@ +
+
+
+
+
+
+

Successful projects

+
+
+ {% for post in site.posts reversed %} + {% if post.type == 'gsoc' %} +
+ +
+
+ +
+
+ +
+
+

{{ post.title }}

+

+
+
+ {% endif %} + {% endfor %} +
+

+ This is just a small selection of projects, you can find all of them on Google Melange. +

+
+
+
+
+
+ +{% for post in site.posts %} + {% if post.type == 'gsoc' %} + + {% endif %} +{% endfor %} diff --git a/2018/head.html b/2018/head.html new file mode 100644 index 0000000..91b2416 --- /dev/null +++ b/2018/head.html @@ -0,0 +1,23 @@ + + + + + + + + + {% if page.title %}{{ page.title }}{% else %}{{ site.title }}{% endif %} + + + + + + + + + + + + + + diff --git a/2018/header.html b/2018/header.html new file mode 100644 index 0000000..ef068c2 --- /dev/null +++ b/2018/header.html @@ -0,0 +1,24 @@ +
+
+
+
+
+
+

{{page.title}}

+
+ +
+
+
+
+ +
+ +
diff --git a/2018/index.html b/2018/index.html new file mode 100644 index 0000000..8e1d003 --- /dev/null +++ b/2018/index.html @@ -0,0 +1,112 @@ +--- +layout: default +title: Google Summer of Code 2018 +redirect_from: + - /mentor/index.html +--- + +{% include header.html %} + +
+
+
+
+

About CloudCV

+

+ {% include teaser.md %} +

+
+
+
+
+ +{% for post in site.posts reversed %} + {% if post.type == 'project-2018' %} + {% capture thecycle %}{% cycle 'odd', 'even' %}{% endcapture %} + {% if thecycle == 'odd' %} +
+
+
+
+
+
+

{{ post.title }}

+

+ {% for technology in post.technologies %} + {{ technology }} + {% endfor %} +

+
{{ post.content }} +
+

Please wait for loading the projects ...

+
+ + + + + + + + + + + +
+
+ + +
+
+
+ +
+
+
+ +
+ {% else %} +
+
+
+
+
+
+

{{ post.title }}

+

+ {% for technology in post.technologies %} + {{ technology }} + {% endfor %} +

+
{{ post.content }}
+

Please wait for loading the projects ...

+
+ + + + + + + + + + + +
+
+ + +
+
+
+ +
+
+ +
+
+ {% endif %} + {% endif %} +{% endfor %} + +{% include mentor.html %} +{% include mentor_process.html %} diff --git a/2018/js.html b/2018/js.html new file mode 100644 index 0000000..b74a88a --- /dev/null +++ b/2018/js.html @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + diff --git a/2018/mentor.html b/2018/mentor.html new file mode 100644 index 0000000..c74b220 --- /dev/null +++ b/2018/mentor.html @@ -0,0 +1,19 @@ +
+
+
+
+

Become a Mentor!

+

+ Mentoring is very important to the future of CloudCV. + It introduces new people to the world of open source software + who will enrich our community with their ideas and talents. +

+

+ Apart from technical skills, being a mentor requires your time, + a clear roadmap for your project and good organization skills. If you think + you would be a good fit to mentor one of our projects, do reach out to us! +

+
+
+
+
diff --git a/2018/mentor_process.html b/2018/mentor_process.html new file mode 100644 index 0000000..d5a5db8 --- /dev/null +++ b/2018/mentor_process.html @@ -0,0 +1,36 @@ +
+
+
+
+
+
+

Okay, let's mentor!

+

+ + + + + Browse this page for potential mentor projects. +

+

+ + + + + Contact + us if you have relevant experience and want to get involved. +

+

+ + + + + Have your own idea? Add an issue to our ideas repository. +

+
+
+ +
+
+
+
diff --git a/2018/navigation.html b/2018/navigation.html new file mode 100644 index 0000000..1408e96 --- /dev/null +++ b/2018/navigation.html @@ -0,0 +1,43 @@ + + diff --git a/2018/project.html b/2018/project.html new file mode 100644 index 0000000..02726ed --- /dev/null +++ b/2018/project.html @@ -0,0 +1,32 @@ +
+ +
+

{{ project.title }}

+

+ {{ project.content }} +

+
+
Mentor:
+
+ {% for mentor in project.mentors %} + {% if mentor.github %} + {{mentor.name}} + {% else %} + {{mentor.name}} + {% endif %} + {% unless forloop.last %}, {% endunless %} + {% endfor %} +
+
Mentee:
+
+ {% for mentee in project.mentees %} + {% if mentee.github %} + {{ mentee.name }} + {% else %} + {{mentee.name}} + {% endif %} + {% endfor %} +
+
+
+
diff --git a/2018/teaser.md b/2018/teaser.md new file mode 100644 index 0000000..ace751a --- /dev/null +++ b/2018/teaser.md @@ -0,0 +1,5 @@ +CloudCV began in the summer of 2013 as a research project within the Machine Learning and Perception lab at Virginia Tech (now at Georgia Tech), with the ambitious goal of making platforms to make AI research more reproducible. We’re a young community working towards enabling developers, researchers, and fellow students to build, compare and share state-of-the-art Artificial Intelligence algorithms. We believe that one shouldn’t have to be an AI expert to have access to cutting edge vision algorithms. Likewise, researchers shouldn’t have to worry about building a service around their deep learning models to showcase and share it with others. +

+ +We have participated in the past three installments of Google Summer of Code, over the course of which our students built several excellent tools and features. If you are interested in participating as a student or mentor, scroll down to check out our projects and get involved! We are more than happy to answer any questions you may have regarding CloudCV, so feel free to reach out to us on our Gitter channel or on our mailing list. +

diff --git a/2019/footer.html b/2019/footer.html new file mode 100644 index 0000000..d426185 --- /dev/null +++ b/2019/footer.html @@ -0,0 +1,48 @@ + + \ No newline at end of file diff --git a/2019/gsoc-accepted-projects.html b/2019/gsoc-accepted-projects.html new file mode 100644 index 0000000..3b739cb --- /dev/null +++ b/2019/gsoc-accepted-projects.html @@ -0,0 +1,19 @@ +
+
+
+
+

Google Summer of Code 2016 Projects

+
+ {% for project in site.gsoc_current limit:5 %} + {% include project.html %} + {% endfor %} +
+
+ {% for project in site.gsoc_current offset:3 %} + {% include project.html %} + {% endfor %} +
+
+
+
+
diff --git a/2019/gsoc-summary.html b/2019/gsoc-summary.html new file mode 100644 index 0000000..9748c39 --- /dev/null +++ b/2019/gsoc-summary.html @@ -0,0 +1,67 @@ +
+
+
+
+
+
+

Successful projects

+
+
+ {% for post in site.posts reversed %} + {% if post.type == 'gsoc' %} +
+ +
+
+ +
+
+ +
+
+

{{ post.title }}

+

+
+
+ {% endif %} + {% endfor %} +
+

+ This is just a small selection of projects, you can find all of them on Google Melange. +

+
+
+
+
+
+ +{% for post in site.posts %} + {% if post.type == 'gsoc' %} + + {% endif %} +{% endfor %} diff --git a/2019/head.html b/2019/head.html new file mode 100644 index 0000000..91b2416 --- /dev/null +++ b/2019/head.html @@ -0,0 +1,23 @@ + + + + + + + + + {% if page.title %}{{ page.title }}{% else %}{{ site.title }}{% endif %} + + + + + + + + + + + + + + diff --git a/2019/header.html b/2019/header.html new file mode 100644 index 0000000..ef068c2 --- /dev/null +++ b/2019/header.html @@ -0,0 +1,24 @@ +
+
+
+
+
+
+

{{page.title}}

+
+ +
+
+
+
+ +
+ +
diff --git a/2019/index.html b/2019/index.html new file mode 100644 index 0000000..a7980f4 --- /dev/null +++ b/2019/index.html @@ -0,0 +1,112 @@ +--- +layout: default +title: GSoC 2019 +redirect_from: + - /mentor/index.html +--- + +{% include header.html %} + +
+
+
+
+

About CloudCV

+

+ {% include teaser.md %} +

+
+
+
+
+ +{% for post in site.posts reversed %} + {% if post.type == 'project-2019' %} + {% capture thecycle %}{% cycle 'odd', 'even' %}{% endcapture %} + {% if thecycle == 'odd' %} +
+
+
+
+
+
+

{{ post.title }}

+

+ {% for technology in post.technologies %} + {{ technology }} + {% endfor %} +

+
{{ post.content }} +
+

Please wait for loading the projects ...

+
+ + + + + + + + + + + +
+
+ + +
+
+
+ +
+
+
+ +
+ {% else %} +
+
+
+
+
+
+

{{ post.title }}

+

+ {% for technology in post.technologies %} + {{ technology }} + {% endfor %} +

+
{{ post.content }}
+

Please wait for loading the projects ...

+
+ + + + + + + + + + + +
+
+ + +
+
+
+ +
+
+ +
+
+ {% endif %} + {% endif %} +{% endfor %} + +{% include mentor.html %} +{% include mentor_process.html %} diff --git a/2019/js.html b/2019/js.html new file mode 100644 index 0000000..b74a88a --- /dev/null +++ b/2019/js.html @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + diff --git a/2019/mentor.html b/2019/mentor.html new file mode 100644 index 0000000..c74b220 --- /dev/null +++ b/2019/mentor.html @@ -0,0 +1,19 @@ +
+
+
+
+

Become a Mentor!

+

+ Mentoring is very important to the future of CloudCV. + It introduces new people to the world of open source software + who will enrich our community with their ideas and talents. +

+

+ Apart from technical skills, being a mentor requires your time, + a clear roadmap for your project and good organization skills. If you think + you would be a good fit to mentor one of our projects, do reach out to us! +

+
+
+
+
diff --git a/2019/mentor_process.html b/2019/mentor_process.html new file mode 100644 index 0000000..d5a5db8 --- /dev/null +++ b/2019/mentor_process.html @@ -0,0 +1,36 @@ +
+
+
+
+
+
+

Okay, let's mentor!

+

+ + + + + Browse this page for potential mentor projects. +

+

+ + + + + Contact + us if you have relevant experience and want to get involved. +

+

+ + + + + Have your own idea? Add an issue to our ideas repository. +

+
+
+ +
+
+
+
diff --git a/2019/navigation.html b/2019/navigation.html new file mode 100644 index 0000000..f7b2b16 --- /dev/null +++ b/2019/navigation.html @@ -0,0 +1,43 @@ + + diff --git a/2019/project.html b/2019/project.html new file mode 100644 index 0000000..02726ed --- /dev/null +++ b/2019/project.html @@ -0,0 +1,32 @@ +
+ +
+

{{ project.title }}

+

+ {{ project.content }} +

+
+
Mentor:
+
+ {% for mentor in project.mentors %} + {% if mentor.github %} + {{mentor.name}} + {% else %} + {{mentor.name}} + {% endif %} + {% unless forloop.last %}, {% endunless %} + {% endfor %} +
+
Mentee:
+
+ {% for mentee in project.mentees %} + {% if mentee.github %} + {{ mentee.name }} + {% else %} + {{mentee.name}} + {% endif %} + {% endfor %} +
+
+
+
diff --git a/2019/teaser.md b/2019/teaser.md new file mode 100644 index 0000000..ace751a --- /dev/null +++ b/2019/teaser.md @@ -0,0 +1,5 @@ +CloudCV began in the summer of 2013 as a research project within the Machine Learning and Perception lab at Virginia Tech (now at Georgia Tech), with the ambitious goal of making platforms to make AI research more reproducible. We’re a young community working towards enabling developers, researchers, and fellow students to build, compare and share state-of-the-art Artificial Intelligence algorithms. We believe that one shouldn’t have to be an AI expert to have access to cutting edge vision algorithms. Likewise, researchers shouldn’t have to worry about building a service around their deep learning models to showcase and share it with others. +

+ +We have participated in the past three installments of Google Summer of Code, over the course of which our students built several excellent tools and features. If you are interested in participating as a student or mentor, scroll down to check out our projects and get involved! We are more than happy to answer any questions you may have regarding CloudCV, so feel free to reach out to us on our Gitter channel or on our mailing list. +

diff --git a/2020/footer.html b/2020/footer.html new file mode 100644 index 0000000..d426185 --- /dev/null +++ b/2020/footer.html @@ -0,0 +1,48 @@ + + \ No newline at end of file diff --git a/2020/gsoc-accepted-projects.html b/2020/gsoc-accepted-projects.html new file mode 100644 index 0000000..3b739cb --- /dev/null +++ b/2020/gsoc-accepted-projects.html @@ -0,0 +1,19 @@ +
+
+
+
+

Google Summer of Code 2016 Projects

+
+ {% for project in site.gsoc_current limit:5 %} + {% include project.html %} + {% endfor %} +
+
+ {% for project in site.gsoc_current offset:3 %} + {% include project.html %} + {% endfor %} +
+
+
+
+
diff --git a/2020/gsoc-summary.html b/2020/gsoc-summary.html new file mode 100644 index 0000000..9748c39 --- /dev/null +++ b/2020/gsoc-summary.html @@ -0,0 +1,67 @@ +
+
+
+
+
+
+

Successful projects

+
+
+ {% for post in site.posts reversed %} + {% if post.type == 'gsoc' %} +
+ +
+
+ +
+
+ +
+
+

{{ post.title }}

+

+
+
+ {% endif %} + {% endfor %} +
+

+ This is just a small selection of projects, you can find all of them on Google Melange. +

+
+
+
+
+
+ +{% for post in site.posts %} + {% if post.type == 'gsoc' %} + + {% endif %} +{% endfor %} diff --git a/2020/head.html b/2020/head.html new file mode 100644 index 0000000..91b2416 --- /dev/null +++ b/2020/head.html @@ -0,0 +1,23 @@ + + + + + + + + + {% if page.title %}{{ page.title }}{% else %}{{ site.title }}{% endif %} + + + + + + + + + + + + + + diff --git a/2020/header.html b/2020/header.html new file mode 100644 index 0000000..ef068c2 --- /dev/null +++ b/2020/header.html @@ -0,0 +1,24 @@ +
+
+
+
+
+
+

{{page.title}}

+
+ +
+
+
+
+ +
+ +
diff --git a/2020/index.html b/2020/index.html new file mode 100644 index 0000000..2c9f441 --- /dev/null +++ b/2020/index.html @@ -0,0 +1,112 @@ +--- +layout: default +title: GSOC - 2020 +redirect_from: + - /mentor/index.html +--- + +{% include header.html %} + +
+
+
+
+

About CloudCV

+

+ {% include teaser.md %} +

+
+
+
+
+ +{% for post in site.posts reversed %} + {% if post.type == 'project-2020' %} + {% capture thecycle %}{% cycle 'odd', 'even' %}{% endcapture %} + {% if thecycle == 'odd' %} +
+
+
+
+
+
+

{{ post.title }}

+

+ {% for technology in post.technologies %} + {{ technology }} + {% endfor %} +

+
{{ post.content }} +
+

Please wait for loading the projects ...

+
+ + + + + + + + + + + +
+
+ + +
+
+
+ +
+
+
+ +
+ {% else %} +
+
+
+
+
+
+

{{ post.title }}

+

+ {% for technology in post.technologies %} + {{ technology }} + {% endfor %} +

+
{{ post.content }}
+

Please wait for loading the projects ...

+
+ + + + + + + + + + + +
+
+ + +
+
+
+ +
+
+ +
+
+ {% endif %} + {% endif %} +{% endfor %} + +{% include mentor.html %} +{% include mentor_process.html %} diff --git a/2020/js.html b/2020/js.html new file mode 100644 index 0000000..b74a88a --- /dev/null +++ b/2020/js.html @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + diff --git a/2020/mentor.html b/2020/mentor.html new file mode 100644 index 0000000..c74b220 --- /dev/null +++ b/2020/mentor.html @@ -0,0 +1,19 @@ +
+
+
+
+

Become a Mentor!

+

+ Mentoring is very important to the future of CloudCV. + It introduces new people to the world of open source software + who will enrich our community with their ideas and talents. +

+

+ Apart from technical skills, being a mentor requires your time, + a clear roadmap for your project and good organization skills. If you think + you would be a good fit to mentor one of our projects, do reach out to us! +

+
+
+
+
diff --git a/2020/mentor_process.html b/2020/mentor_process.html new file mode 100644 index 0000000..d5a5db8 --- /dev/null +++ b/2020/mentor_process.html @@ -0,0 +1,36 @@ +
+
+
+
+
+
+

Okay, let's mentor!

+

+ + + + + Browse this page for potential mentor projects. +

+

+ + + + + Contact + us if you have relevant experience and want to get involved. +

+

+ + + + + Have your own idea? Add an issue to our ideas repository. +

+
+
+ +
+
+
+
diff --git a/2020/navigation.html b/2020/navigation.html new file mode 100644 index 0000000..f7b2b16 --- /dev/null +++ b/2020/navigation.html @@ -0,0 +1,43 @@ + + diff --git a/2020/project.html b/2020/project.html new file mode 100644 index 0000000..02726ed --- /dev/null +++ b/2020/project.html @@ -0,0 +1,32 @@ +
+ +
+

{{ project.title }}

+

+ {{ project.content }} +

+
+
Mentor:
+
+ {% for mentor in project.mentors %} + {% if mentor.github %} + {{mentor.name}} + {% else %} + {{mentor.name}} + {% endif %} + {% unless forloop.last %}, {% endunless %} + {% endfor %} +
+
Mentee:
+
+ {% for mentee in project.mentees %} + {% if mentee.github %} + {{ mentee.name }} + {% else %} + {{mentee.name}} + {% endif %} + {% endfor %} +
+
+
+
diff --git a/2020/teaser.md b/2020/teaser.md new file mode 100644 index 0000000..ace751a --- /dev/null +++ b/2020/teaser.md @@ -0,0 +1,5 @@ +CloudCV began in the summer of 2013 as a research project within the Machine Learning and Perception lab at Virginia Tech (now at Georgia Tech), with the ambitious goal of making platforms to make AI research more reproducible. We’re a young community working towards enabling developers, researchers, and fellow students to build, compare and share state-of-the-art Artificial Intelligence algorithms. We believe that one shouldn’t have to be an AI expert to have access to cutting edge vision algorithms. Likewise, researchers shouldn’t have to worry about building a service around their deep learning models to showcase and share it with others. +

+ +We have participated in the past three installments of Google Summer of Code, over the course of which our students built several excellent tools and features. If you are interested in participating as a student or mentor, scroll down to check out our projects and get involved! We are more than happy to answer any questions you may have regarding CloudCV, so feel free to reach out to us on our Gitter channel or on our mailing list. +

diff --git a/2021/coming-soon.md b/2021/coming-soon.md new file mode 100644 index 0000000..016dcac --- /dev/null +++ b/2021/coming-soon.md @@ -0,0 +1 @@ +We are working on the project ideas. We will update it soon. If you have a new idea, feel free to add an issue to our GSoC Project Ideas repository \ No newline at end of file diff --git a/2021/footer.html b/2021/footer.html new file mode 100644 index 0000000..a42d316 --- /dev/null +++ b/2021/footer.html @@ -0,0 +1,48 @@ + + \ No newline at end of file diff --git a/2021/gsoc-accepted-projects.html b/2021/gsoc-accepted-projects.html new file mode 100644 index 0000000..3b739cb --- /dev/null +++ b/2021/gsoc-accepted-projects.html @@ -0,0 +1,19 @@ +
+
+
+
+

Google Summer of Code 2016 Projects

+
+ {% for project in site.gsoc_current limit:5 %} + {% include project.html %} + {% endfor %} +
+
+ {% for project in site.gsoc_current offset:3 %} + {% include project.html %} + {% endfor %} +
+
+
+
+
diff --git a/2021/gsoc-summary.html b/2021/gsoc-summary.html new file mode 100644 index 0000000..9748c39 --- /dev/null +++ b/2021/gsoc-summary.html @@ -0,0 +1,67 @@ +
+
+
+
+
+
+

Successful projects

+
+
+ {% for post in site.posts reversed %} + {% if post.type == 'gsoc' %} +
+ +
+
+ +
+
+ +
+
+

{{ post.title }}

+

+
+
+ {% endif %} + {% endfor %} +
+

+ This is just a small selection of projects, you can find all of them on Google Melange. +

+
+
+
+
+
+ +{% for post in site.posts %} + {% if post.type == 'gsoc' %} + + {% endif %} +{% endfor %} diff --git a/2021/head.html b/2021/head.html new file mode 100644 index 0000000..f938c1d --- /dev/null +++ b/2021/head.html @@ -0,0 +1,38 @@ + + + + + + + + + {% if page.title %}{{ page.title }}{% else %}{{ site.title }}{% endif %} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/2021/header.html b/2021/header.html new file mode 100644 index 0000000..8a41650 --- /dev/null +++ b/2021/header.html @@ -0,0 +1,24 @@ +
+
+
+
+
+
+

{{page.title}}

+
+ +
+
+
+
+ +
+ +
diff --git a/2021/index.html b/2021/index.html new file mode 100644 index 0000000..07ec6bc --- /dev/null +++ b/2021/index.html @@ -0,0 +1,112 @@ +--- +layout: default +title: GSOC - 2021 +redirect_from: + - /mentor/index.html +--- + +{% include header.html %} + +
+
+
+
+

About CloudCV

+

+ {% include teaser.md %} +

+
+
+
+
+ +{% for post in site.posts reversed %} + {% if post.type == 'project-2021' %} + {% capture thecycle %}{% cycle 'odd', 'even' %}{% endcapture %} + {% if thecycle == 'odd' %} +
+
+
+
+
+
+

{{ post.title }}

+

+ {% for technology in post.technologies %} + {{ technology }} + {% endfor %} +

+
{{ post.content }} +
+

Please wait for loading the projects ...

+
+ + + + + + + + + + + +
+
+ + +
+
+
+ +
+
+
+ +
+ {% else %} +
+
+
+
+
+
+

{{ post.title }}

+

+ {% for technology in post.technologies %} + {{ technology }} + {% endfor %} +

+
{{ post.content }}
+

Please wait for loading the projects ...

+
+ + + + + + + + + + + +
+
+ + +
+
+
+ +
+
+ +
+
+ {% endif %} + {% endif %} +{% endfor %} + +{% include mentor.html %} +{% include mentor_process.html %} diff --git a/2021/js.html b/2021/js.html new file mode 100644 index 0000000..b74a88a --- /dev/null +++ b/2021/js.html @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + diff --git a/2021/mentor.html b/2021/mentor.html new file mode 100644 index 0000000..ff9973f --- /dev/null +++ b/2021/mentor.html @@ -0,0 +1,23 @@ +
+
+
+
+

Become a Mentor!

+

+ Mentoring is very important to the future of CloudCV. + It introduces new people to the world of open source software + who will enrich our community with their ideas and talents. +

+

+ Apart from technical skills, being a mentor requires your time, + a clear roadmap for your project and good organization skills. If you think + you would be a good fit to mentor one of our projects, do reach out to us! +

+

+ Fill this form if you have relevant + experience & want to mentor. +

+
+
+
+
\ No newline at end of file diff --git a/2021/mentor_process.html b/2021/mentor_process.html new file mode 100644 index 0000000..b9980d0 --- /dev/null +++ b/2021/mentor_process.html @@ -0,0 +1,36 @@ +
+
+
+
+
+
+

Okay, let's mentor!

+

+ + + + + Have your own idea? Add an issue to our GSoC-Ideas repository. +

+

+ + + + + In case of queries, you can contact us. +

+

+ + + + + Email: team@cloudcv.org +

+
+
+ +
+
+
+
\ No newline at end of file diff --git a/2021/navigation.html b/2021/navigation.html new file mode 100644 index 0000000..6cdf461 --- /dev/null +++ b/2021/navigation.html @@ -0,0 +1,55 @@ + + diff --git a/2021/project.html b/2021/project.html new file mode 100644 index 0000000..02726ed --- /dev/null +++ b/2021/project.html @@ -0,0 +1,32 @@ +
+ +
+

{{ project.title }}

+

+ {{ project.content }} +

+
+
Mentor:
+
+ {% for mentor in project.mentors %} + {% if mentor.github %} + {{mentor.name}} + {% else %} + {{mentor.name}} + {% endif %} + {% unless forloop.last %}, {% endunless %} + {% endfor %} +
+
Mentee:
+
+ {% for mentee in project.mentees %} + {% if mentee.github %} + {{ mentee.name }} + {% else %} + {{mentee.name}} + {% endif %} + {% endfor %} +
+
+
+
diff --git a/2021/teaser.md b/2021/teaser.md new file mode 100644 index 0000000..6f354f6 --- /dev/null +++ b/2021/teaser.md @@ -0,0 +1,5 @@ +CloudCV began in the summer of 2013 as a research project within the Machine Learning and Perception lab at Virginia Tech (now at Georgia Tech), with the ambitious goal of making platforms to make AI research more reproducible. We’re a young community working towards enabling developers, researchers, and fellow students to build, compare and share state-of-the-art Artificial Intelligence algorithms. We believe that one shouldn’t have to be an AI expert to have access to cutting edge vision algorithms. Likewise, researchers shouldn’t have to worry about building a service around their deep learning models to showcase and share it with others. +

+ +We have participated in the past five installments of Google Summer of Code, over the course of which our students built several excellent tools and features. If you are interested in participating as a student or mentor, scroll down to check out our projects and get involved! We are more than happy to answer any questions you may have regarding CloudCV, so feel free to reach out to us on our Gitter channel or on our mailing list. +

diff --git a/2022/coming-soon.md b/2022/coming-soon.md new file mode 100644 index 0000000..016dcac --- /dev/null +++ b/2022/coming-soon.md @@ -0,0 +1 @@ +We are working on the project ideas. We will update it soon. If you have a new idea, feel free to add an issue to our GSoC Project Ideas repository \ No newline at end of file diff --git a/2022/footer.html b/2022/footer.html new file mode 100644 index 0000000..48cd04e --- /dev/null +++ b/2022/footer.html @@ -0,0 +1,48 @@ + + \ No newline at end of file diff --git a/2022/gsoc-accepted-projects.html b/2022/gsoc-accepted-projects.html new file mode 100644 index 0000000..3b739cb --- /dev/null +++ b/2022/gsoc-accepted-projects.html @@ -0,0 +1,19 @@ +
+
+
+
+

Google Summer of Code 2016 Projects

+
+ {% for project in site.gsoc_current limit:5 %} + {% include project.html %} + {% endfor %} +
+
+ {% for project in site.gsoc_current offset:3 %} + {% include project.html %} + {% endfor %} +
+
+
+
+
diff --git a/2022/gsoc-summary.html b/2022/gsoc-summary.html new file mode 100644 index 0000000..9748c39 --- /dev/null +++ b/2022/gsoc-summary.html @@ -0,0 +1,67 @@ +
+
+
+
+
+
+

Successful projects

+
+
+ {% for post in site.posts reversed %} + {% if post.type == 'gsoc' %} +
+ +
+
+ +
+
+ +
+
+

{{ post.title }}

+

+
+
+ {% endif %} + {% endfor %} +
+

+ This is just a small selection of projects, you can find all of them on Google Melange. +

+
+
+
+
+
+ +{% for post in site.posts %} + {% if post.type == 'gsoc' %} + + {% endif %} +{% endfor %} diff --git a/2022/head.html b/2022/head.html new file mode 100644 index 0000000..71f3976 --- /dev/null +++ b/2022/head.html @@ -0,0 +1,38 @@ + + + + + + + + + {% if page.title %}{{ page.title }}{% else %}{{ site.title }}{% endif %} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/2022/header.html b/2022/header.html new file mode 100644 index 0000000..8a41650 --- /dev/null +++ b/2022/header.html @@ -0,0 +1,24 @@ +
+
+
+
+
+
+

{{page.title}}

+
+ +
+
+
+
+ +
+ +
diff --git a/2022/index.html b/2022/index.html new file mode 100644 index 0000000..a9a1bc5 --- /dev/null +++ b/2022/index.html @@ -0,0 +1,112 @@ +--- +layout: default +title: GSOC - 2022 +redirect_from: + - /mentor/index.html +--- + +{% include header.html %} + +
+
+
+
+

About CloudCV

+

+ {% include teaser.md %} +

+
+
+
+
+ +{% for post in site.posts reversed %} + {% if post.type == 'project-2022' %} + {% capture thecycle %}{% cycle 'odd', 'even' %}{% endcapture %} + {% if thecycle == 'odd' %} +
+
+
+
+
+
+

{{ post.title }}

+

+ {% for technology in post.technologies %} + {{ technology }} + {% endfor %} +

+
{{ post.content }} +
+

Please wait for loading the projects ...

+
+ + + + + + + + + + + +
+
+ + +
+
+
+ +
+
+
+ +
+ {% else %} +
+
+
+
+
+
+

{{ post.title }}

+

+ {% for technology in post.technologies %} + {{ technology }} + {% endfor %} +

+
{{ post.content }}
+

Please wait for loading the projects ...

+
+ + + + + + + + + + + +
+
+ + +
+
+
+ +
+
+ +
+
+ {% endif %} + {% endif %} +{% endfor %} + +{% include mentor.html %} +{% include mentor_process.html %} diff --git a/2022/js.html b/2022/js.html new file mode 100644 index 0000000..b74a88a --- /dev/null +++ b/2022/js.html @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + diff --git a/2022/mentor.html b/2022/mentor.html new file mode 100644 index 0000000..d0bbb3b --- /dev/null +++ b/2022/mentor.html @@ -0,0 +1,23 @@ +
+
+
+
+

Become a Mentor!

+

+ Mentoring is very important to the future of CloudCV. + It introduces new people to the world of open source software + who will enrich our community with their ideas and talents. +

+

+ Apart from technical skills, being a mentor requires your time, + a clear roadmap for your project and good organization skills. If you think + you would be a good fit to mentor one of our projects, do reach out to us! +

+

+ Fill this form if you have relevant + experience & want to mentor. +

+
+
+
+
\ No newline at end of file diff --git a/2022/mentor_process.html b/2022/mentor_process.html new file mode 100644 index 0000000..b9980d0 --- /dev/null +++ b/2022/mentor_process.html @@ -0,0 +1,36 @@ +
+
+
+
+
+
+

Okay, let's mentor!

+

+ + + + + Have your own idea? Add an issue to our GSoC-Ideas repository. +

+

+ + + + + In case of queries, you can contact us. +

+

+ + + + + Email: team@cloudcv.org +

+
+
+ +
+
+
+
\ No newline at end of file diff --git a/2022/navigation.html b/2022/navigation.html new file mode 100644 index 0000000..04bde50 --- /dev/null +++ b/2022/navigation.html @@ -0,0 +1,55 @@ + + diff --git a/2022/project.html b/2022/project.html new file mode 100644 index 0000000..02726ed --- /dev/null +++ b/2022/project.html @@ -0,0 +1,32 @@ +
+ +
+

{{ project.title }}

+

+ {{ project.content }} +

+
+
Mentor:
+
+ {% for mentor in project.mentors %} + {% if mentor.github %} + {{mentor.name}} + {% else %} + {{mentor.name}} + {% endif %} + {% unless forloop.last %}, {% endunless %} + {% endfor %} +
+
Mentee:
+
+ {% for mentee in project.mentees %} + {% if mentee.github %} + {{ mentee.name }} + {% else %} + {{mentee.name}} + {% endif %} + {% endfor %} +
+
+
+
diff --git a/2022/teaser.md b/2022/teaser.md new file mode 100644 index 0000000..abad6e5 --- /dev/null +++ b/2022/teaser.md @@ -0,0 +1,5 @@ +CloudCV began in the summer of 2013 as a research project within the Machine Learning and Perception lab at Virginia Tech (now at Georgia Tech), with the ambitious goal of making platforms to make AI research more reproducible. We’re a young community working towards enabling developers, researchers, and fellow students to build, compare and share state-of-the-art Artificial Intelligence algorithms. We believe that one shouldn’t have to be an AI expert to have access to cutting edge vision algorithms. Likewise, researchers shouldn’t have to worry about building a service around their deep learning models to showcase and share it with others. +

+ +We have participated in the past seven installments of Google Summer of Code, over the course of which our students built several excellent tools and features. If you are interested in participating as a student or mentor, scroll down to check out our projects and get involved! We are more than happy to answer any questions you may have regarding CloudCV, so feel free to reach out to us on our Gitter channel or on our mailing list. +

diff --git a/2023/coming-soon.md b/2023/coming-soon.md new file mode 100644 index 0000000..016dcac --- /dev/null +++ b/2023/coming-soon.md @@ -0,0 +1 @@ +We are working on the project ideas. We will update it soon. If you have a new idea, feel free to add an issue to our GSoC Project Ideas repository \ No newline at end of file diff --git a/2023/footer.html b/2023/footer.html new file mode 100644 index 0000000..48cd04e --- /dev/null +++ b/2023/footer.html @@ -0,0 +1,48 @@ + + \ No newline at end of file diff --git a/2023/gsoc-accepted-projects.html b/2023/gsoc-accepted-projects.html new file mode 100644 index 0000000..3b739cb --- /dev/null +++ b/2023/gsoc-accepted-projects.html @@ -0,0 +1,19 @@ +
+
+
+
+

Google Summer of Code 2016 Projects

+
+ {% for project in site.gsoc_current limit:5 %} + {% include project.html %} + {% endfor %} +
+
+ {% for project in site.gsoc_current offset:3 %} + {% include project.html %} + {% endfor %} +
+
+
+
+
diff --git a/2023/gsoc-summary.html b/2023/gsoc-summary.html new file mode 100644 index 0000000..9748c39 --- /dev/null +++ b/2023/gsoc-summary.html @@ -0,0 +1,67 @@ +
+
+
+
+
+
+

Successful projects

+
+
+ {% for post in site.posts reversed %} + {% if post.type == 'gsoc' %} +
+ +
+
+ +
+
+ +
+
+

{{ post.title }}

+

+
+
+ {% endif %} + {% endfor %} +
+

+ This is just a small selection of projects, you can find all of them on Google Melange. +

+
+
+
+
+
+ +{% for post in site.posts %} + {% if post.type == 'gsoc' %} + + {% endif %} +{% endfor %} diff --git a/2023/head.html b/2023/head.html new file mode 100644 index 0000000..6d8c895 --- /dev/null +++ b/2023/head.html @@ -0,0 +1,38 @@ + + + + + + + + + {% if page.title %}{{ page.title }}{% else %}{{ site.title }}{% endif %} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/2023/header.html b/2023/header.html new file mode 100644 index 0000000..8a41650 --- /dev/null +++ b/2023/header.html @@ -0,0 +1,24 @@ +
+
+
+
+
+
+

{{page.title}}

+
+ +
+
+
+
+ +
+ +
diff --git a/2023/index.html b/2023/index.html new file mode 100644 index 0000000..3a4bfb0 --- /dev/null +++ b/2023/index.html @@ -0,0 +1,112 @@ +--- +layout: default +title: GSOC - 2023 +redirect_from: + - /mentor/index.html +--- + +{% include header.html %} + +
+
+
+
+

About CloudCV

+

+ {% include teaser.md %} +

+
+
+
+
+ +{% for post in site.posts reversed %} + {% if post.type == 'project-2023' %} + {% capture thecycle %}{% cycle 'odd', 'even' %}{% endcapture %} + {% if thecycle == 'odd' %} +
+
+
+
+
+
+

{{ post.title }}

+

+ {% for technology in post.technologies %} + {{ technology }} + {% endfor %} +

+
{{ post.content }} +
+

Please wait for loading the projects ...

+
+ + + + + + + + + + + +
+
+ + +
+
+
+ +
+
+
+ +
+ {% else %} +
+
+
+
+
+
+

{{ post.title }}

+

+ {% for technology in post.technologies %} + {{ technology }} + {% endfor %} +

+
{{ post.content }}
+

Please wait for loading the projects ...

+
+ + + + + + + + + + + +
+
+ + +
+
+
+ +
+
+ +
+
+ {% endif %} + {% endif %} +{% endfor %} + +{% include mentor.html %} +{% include mentor_process.html %} diff --git a/2023/js.html b/2023/js.html new file mode 100644 index 0000000..b74a88a --- /dev/null +++ b/2023/js.html @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + diff --git a/2023/mentor.html b/2023/mentor.html new file mode 100644 index 0000000..1db0bc7 --- /dev/null +++ b/2023/mentor.html @@ -0,0 +1,23 @@ +
+
+
+
+

Become a Mentor!

+

+ Mentoring is very important to the future of CloudCV. + It introduces new people to the world of open source software + who will enrich our community with their ideas and talents. +

+

+ Apart from technical skills, being a mentor requires your time, + a clear roadmap for your project and good organization skills. If you think + you would be a good fit to mentor one of our projects, do reach out to us! +

+ +
+
+
+
\ No newline at end of file diff --git a/2023/mentor_process.html b/2023/mentor_process.html new file mode 100644 index 0000000..344a992 --- /dev/null +++ b/2023/mentor_process.html @@ -0,0 +1,36 @@ +
+
+
+
+
+
+

Okay, let's mentor!

+

+ + + + + Have your own idea? Add an issue to our GSoC-Ideas repository. +

+

+ + + + + In case of queries, you can contact us. +

+

+ + + + + Email: team@cloudcv.org +

+
+
+ +
+
+
+
\ No newline at end of file diff --git a/2023/navigation.html b/2023/navigation.html new file mode 100644 index 0000000..53b7c4a --- /dev/null +++ b/2023/navigation.html @@ -0,0 +1,58 @@ + + diff --git a/2023/project.html b/2023/project.html new file mode 100644 index 0000000..02726ed --- /dev/null +++ b/2023/project.html @@ -0,0 +1,32 @@ +
+ +
+

{{ project.title }}

+

+ {{ project.content }} +

+
+
Mentor:
+
+ {% for mentor in project.mentors %} + {% if mentor.github %} + {{mentor.name}} + {% else %} + {{mentor.name}} + {% endif %} + {% unless forloop.last %}, {% endunless %} + {% endfor %} +
+
Mentee:
+
+ {% for mentee in project.mentees %} + {% if mentee.github %} + {{ mentee.name }} + {% else %} + {{mentee.name}} + {% endif %} + {% endfor %} +
+
+
+
diff --git a/2023/teaser.md b/2023/teaser.md new file mode 100644 index 0000000..5fb57b8 --- /dev/null +++ b/2023/teaser.md @@ -0,0 +1,5 @@ +CloudCV began in the summer of 2013 as a research project within the Machine Learning and Perception lab at Virginia Tech (now at Georgia Tech), with the ambitious goal of making platforms to make AI research more reproducible. We’re a young community working towards enabling developers, researchers, and fellow students to build, compare and share state-of-the-art Artificial Intelligence algorithms. We believe that one shouldn’t have to be an AI expert to have access to cutting edge vision algorithms. Likewise, researchers shouldn’t have to worry about building a service around their deep learning models to showcase and share it with others. +

+ +We have participated in the past seven installments of Google Summer of Code, over the course of which our students built several excellent tools and features. If you are interested in participating as a student or mentor, scroll down to check out our projects and get involved! We are more than happy to answer any questions you may have regarding CloudCV, so feel free to reach out to us on our Slack workspace or on our mailing list. +

diff --git a/CNAME b/CNAME new file mode 100644 index 0000000..c72c87b --- /dev/null +++ b/CNAME @@ -0,0 +1 @@ +gsoc.cloudcv.org \ No newline at end of file diff --git a/Gemfile b/Gemfile new file mode 100644 index 0000000..6202e7e --- /dev/null +++ b/Gemfile @@ -0,0 +1,4 @@ +source 'https://rubygems.org' + +gem 'jekyll' +gem 'jekyll-redirect-from' diff --git a/Gemfile.lock b/Gemfile.lock new file mode 100644 index 0000000..3ab700c --- /dev/null +++ b/Gemfile.lock @@ -0,0 +1,66 @@ +GEM + remote: https://rubygems.org/ + specs: + addressable (2.6.0) + public_suffix (>= 2.0.2, < 4.0) + colorator (1.1.0) + concurrent-ruby (1.1.4) + em-websocket (0.5.1) + eventmachine (>= 0.12.9) + http_parser.rb (~> 0.6.0) + eventmachine (1.2.7) + ffi (1.10.0) + forwardable-extended (2.6.0) + http_parser.rb (0.6.0) + i18n (0.9.5) + concurrent-ruby (~> 1.0) + jekyll (3.8.5) + addressable (~> 2.4) + colorator (~> 1.0) + em-websocket (~> 0.5) + i18n (~> 0.7) + jekyll-sass-converter (~> 1.0) + jekyll-watch (~> 2.0) + kramdown (~> 1.14) + liquid (~> 4.0) + mercenary (~> 0.3.3) + pathutil (~> 0.9) + rouge (>= 1.7, < 4) + safe_yaml (~> 1.0) + jekyll-redirect-from (0.10.0) + jekyll (>= 2.0) + jekyll-sass-converter (1.5.2) + sass (~> 3.4) + jekyll-watch (2.1.2) + listen (~> 3.0) + kramdown (1.17.0) + liquid (4.0.1) + listen (3.1.5) + rb-fsevent (~> 0.9, >= 0.9.4) + rb-inotify (~> 0.9, >= 0.9.7) + ruby_dep (~> 1.2) + mercenary (0.3.6) + pathutil (0.16.2) + forwardable-extended (~> 2.6) + public_suffix (3.0.3) + rb-fsevent (0.10.3) + rb-inotify (0.10.0) + ffi (~> 1.0) + rouge (3.3.0) + ruby_dep (1.5.0) + safe_yaml (1.0.5) + sass (3.7.3) + sass-listen (~> 4.0.0) + sass-listen (4.0.0) + rb-fsevent (~> 0.9, >= 0.9.4) + rb-inotify (~> 0.9, >= 0.9.7) + +PLATFORMS + ruby + +DEPENDENCIES + jekyll + jekyll-redirect-from + +BUNDLED WITH + 1.17.1 diff --git a/ISSUE_TEMPLATE.md b/ISSUE_TEMPLATE.md new file mode 100644 index 0000000..d8374a2 --- /dev/null +++ b/ISSUE_TEMPLATE.md @@ -0,0 +1,13 @@ +**Project Title:** Project title, short enough to catch attention + +**Description:** General information about the project, avoid one Liners, the description should be as detailed as possible. + +**Deliverable:** Expectations from the student at the end of the project + +**Mentor:** Who is the mentor? Who is the Co-Mentor? Also please assign the issue to the mentor! + +**Skills:** Which skills are needed? Programming languages, frameworks, concepts etc. + +**Skill Level:** Easy, Medium, Hard + +**Get started:** Tasks that mentors may want to suggest students so that they can start contributing to the code base (e.g. junior jobs, low hanging fruits, discussion on the mailing list) diff --git a/README.md b/README.md index 1f5cf85..764936c 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,13 @@ -# GSoC-Ideas -Testing. -To discuss ideas and potential projects for Google Summer of Code +# CloudCV GSoC Ideas + +## Development +This site is built with [Jekyll](https://github.com/jekyll/jekyll) and [Bootstrap](https://github.com/twbs/bootstrap). + +### Adding new project +1. Copy a file project file from the ``_posts`` folder and rename it to ``{date}-project-{project-name}`` +2. Fill the fields in the copied file accordingly +3. Run ``jekyll serve`` and check in the browser on ``0.0.0.0:4000`` if the site looks like expected +4. Send a Pull Request + +### Acknowledgements +Based on the OpenSUSE's excellent mentoring project. \ No newline at end of file diff --git a/_config.yml b/_config.yml new file mode 100644 index 0000000..c5b7b5d --- /dev/null +++ b/_config.yml @@ -0,0 +1,28 @@ +# ----------------------- # +# Main Configs # +# ----------------------- # + +title: CloudCV +subTitle: +email: rishabhjain@gatech.edu +author: Rishabh Jain +description: The CloudCV mentoring project collects ideas for Google Summer of Code. +copyright: 'Copyright © 2020 CloudCV. All Rights Reserved.' + +baseurl: "" +url: "http://gsoc.cloudcv.org" + +github_organization: Cloud-CV +github_repository: GSoC-Ideas +gems: + - jekyll-redirect-from +# ----------------------- # +# Jekyll & Plugins # +# ----------------------- # + +# Build settings +markdown: kramdown +permalink: pretty + +collections: +- gsoc_current diff --git a/_includes/coming-soon.md b/_includes/coming-soon.md new file mode 100644 index 0000000..016dcac --- /dev/null +++ b/_includes/coming-soon.md @@ -0,0 +1 @@ +We are working on the project ideas. We will update it soon. If you have a new idea, feel free to add an issue to our GSoC Project Ideas repository \ No newline at end of file diff --git a/_includes/footer.html b/_includes/footer.html new file mode 100644 index 0000000..48cd04e --- /dev/null +++ b/_includes/footer.html @@ -0,0 +1,48 @@ + + \ No newline at end of file diff --git a/_includes/gsoc-accepted-projects.html b/_includes/gsoc-accepted-projects.html new file mode 100644 index 0000000..3b739cb --- /dev/null +++ b/_includes/gsoc-accepted-projects.html @@ -0,0 +1,19 @@ +
+
+
+
+

Google Summer of Code 2016 Projects

+
+ {% for project in site.gsoc_current limit:5 %} + {% include project.html %} + {% endfor %} +
+
+ {% for project in site.gsoc_current offset:3 %} + {% include project.html %} + {% endfor %} +
+
+
+
+
diff --git a/_includes/gsoc-summary.html b/_includes/gsoc-summary.html new file mode 100644 index 0000000..9748c39 --- /dev/null +++ b/_includes/gsoc-summary.html @@ -0,0 +1,67 @@ +
+
+
+
+
+
+

Successful projects

+
+
+ {% for post in site.posts reversed %} + {% if post.type == 'gsoc' %} +
+ +
+
+ +
+
+ +
+
+

{{ post.title }}

+

+
+
+ {% endif %} + {% endfor %} +
+

+ This is just a small selection of projects, you can find all of them on Google Melange. +

+
+
+
+
+
+ +{% for post in site.posts %} + {% if post.type == 'gsoc' %} + + {% endif %} +{% endfor %} diff --git a/_includes/head.html b/_includes/head.html new file mode 100644 index 0000000..c19b66f --- /dev/null +++ b/_includes/head.html @@ -0,0 +1,38 @@ + + + + + + + + + {% if page.title %}{{ page.title }}{% else %}{{ site.title }}{% endif %} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/_includes/header.html b/_includes/header.html new file mode 100644 index 0000000..8a41650 --- /dev/null +++ b/_includes/header.html @@ -0,0 +1,24 @@ +
+
+
+
+
+
+

{{page.title}}

+
+ +
+
+
+
+ +
+ +
diff --git a/_includes/js.html b/_includes/js.html new file mode 100644 index 0000000..b74a88a --- /dev/null +++ b/_includes/js.html @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + diff --git a/_includes/mentor.html b/_includes/mentor.html new file mode 100644 index 0000000..1db0bc7 --- /dev/null +++ b/_includes/mentor.html @@ -0,0 +1,23 @@ +
+
+
+
+

Become a Mentor!

+

+ Mentoring is very important to the future of CloudCV. + It introduces new people to the world of open source software + who will enrich our community with their ideas and talents. +

+

+ Apart from technical skills, being a mentor requires your time, + a clear roadmap for your project and good organization skills. If you think + you would be a good fit to mentor one of our projects, do reach out to us! +

+ +
+
+
+
\ No newline at end of file diff --git a/_includes/mentor_process.html b/_includes/mentor_process.html new file mode 100644 index 0000000..344a992 --- /dev/null +++ b/_includes/mentor_process.html @@ -0,0 +1,36 @@ +
+
+
+
+
+
+

Okay, let's mentor!

+

+ + + + + Have your own idea? Add an issue to our GSoC-Ideas repository. +

+

+ + + + + In case of queries, you can contact us. +

+

+ + + + + Email: team@cloudcv.org +

+
+
+ +
+
+
+
\ No newline at end of file diff --git a/_includes/navigation.html b/_includes/navigation.html new file mode 100644 index 0000000..74a2544 --- /dev/null +++ b/_includes/navigation.html @@ -0,0 +1,61 @@ + + diff --git a/_includes/project.html b/_includes/project.html new file mode 100644 index 0000000..02726ed --- /dev/null +++ b/_includes/project.html @@ -0,0 +1,32 @@ +
+ +
+

{{ project.title }}

+

+ {{ project.content }} +

+
+
Mentor:
+
+ {% for mentor in project.mentors %} + {% if mentor.github %} + {{mentor.name}} + {% else %} + {{mentor.name}} + {% endif %} + {% unless forloop.last %}, {% endunless %} + {% endfor %} +
+
Mentee:
+
+ {% for mentee in project.mentees %} + {% if mentee.github %} + {{ mentee.name }} + {% else %} + {{mentee.name}} + {% endif %} + {% endfor %} +
+
+
+
diff --git a/_includes/teaser.md b/_includes/teaser.md new file mode 100644 index 0000000..4d9fffc --- /dev/null +++ b/_includes/teaser.md @@ -0,0 +1,5 @@ +CloudCV began in the summer of 2013 as a research project within the Machine Learning and Perception lab at Virginia Tech (now at Georgia Tech), with the ambitious goal of making platforms to make AI research more reproducible. We’re a young community working towards enabling developers, researchers, and fellow students to build, compare and share state-of-the-art Artificial Intelligence algorithms. We believe that one shouldn’t have to be an AI expert to have access to cutting edge vision algorithms. Likewise, researchers shouldn’t have to worry about building a service around their deep learning models to showcase and share it with others. +

+ +We have participated in the past eight installments of Google Summer of Code, over the course of which our students built several excellent tools and features. If you are interested in participating as a student or mentor, scroll down to check out our projects and get involved! We are more than happy to answer any questions you may have regarding CloudCV, so feel free to reach out to us on our Slack workspace or on our mailing list. +

diff --git a/_layouts/default.html b/_layouts/default.html new file mode 100644 index 0000000..5bcb885 --- /dev/null +++ b/_layouts/default.html @@ -0,0 +1,12 @@ + + + {% include head.html %} + + {% include navigation.html %} + + {{ content }} + + {% include footer.html %} + {% include js.html %} + + diff --git a/_posts/2017-01-01-project-2017-evalai.markdown b/_posts/2017-01-01-project-2017-evalai.markdown new file mode 100644 index 0000000..0970da1 --- /dev/null +++ b/_posts/2017-01-01-project-2017-evalai.markdown @@ -0,0 +1,11 @@ +--- +layout: default +img: evalai.png +title: EvalAI +type: project +technologies: [Python, Django, AngularJS, RabbitMQ, Docker, AWS] +website: http://evalai.cloudcv.org +github: https://github.com/Cloud-CV/EvalAI +description: | +--- +**EvalAI** is an evaluation server that will host AI challenges like Visual Question Answering, Image Captioning. In recent years, it has become increasingly difficult to compare an algorithm solving a given task with other existing approaches. These comparisons suffer from minor differences in algorithm implementation, use of non-standard dataset splits and different evaluation metrics. By providing a central leaderboard and submission interface, we make it easier for researchers to reproduce the results mentioned in the paper and perform reliable & accurate quantitative analysis. \ No newline at end of file diff --git a/_posts/2017-01-02-project-2017-cvfy-.markdown b/_posts/2017-01-02-project-2017-cvfy-.markdown new file mode 100644 index 0000000..8bbf233 --- /dev/null +++ b/_posts/2017-01-02-project-2017-cvfy-.markdown @@ -0,0 +1,12 @@ +--- +layout: default +img: cvfy.png +title: Origami +type: project +technologies: [ReactJS, Python, Flask, Docker] +website: http://cvfy.cloudcv.org +github: https://github.com/Cloud-CV/cvfy-frontend +description: | +--- + +**Origami** (previously called CloudCV-fy your code) is a AI-as-a-service solution that allows researchers to easily convert their deep learning models into an online service that is widely accessible to everyone without the need to setup the infrastructure, resolve the dependencies, and build a web service around the deep learning model. By lowering the barrier to entry to latest AI algorithms, we provide developers, researchers and students the ability to access any model using a simple REST API call. \ No newline at end of file diff --git a/_posts/2017-01-03-project-2017-ide.markdown b/_posts/2017-01-03-project-2017-ide.markdown new file mode 100644 index 0000000..f1d40b4 --- /dev/null +++ b/_posts/2017-01-03-project-2017-ide.markdown @@ -0,0 +1,11 @@ +--- +layout: default +img: ide.png +title: Fabrik +type: project +technologies: [ReactJS, Python, Django] +website: http://ide.cloudcv.org +github: https://github.com/Cloud-CV/IDE +description: | +--- +**Fabrik** (previously called IDE) is an online collaborative platform to build, visualize and train deep learning models by a simple drag-and-drop approach. It allow researchers to collaboratively develop and debug models using a web GUI that allows importing, editing and exporting networks from widely popular frameworks like Caffe and Keras. \ No newline at end of file diff --git a/_posts/2017-01-04-project-2017-cloudcv.markdown b/_posts/2017-01-04-project-2017-cloudcv.markdown new file mode 100644 index 0000000..2e2a526 --- /dev/null +++ b/_posts/2017-01-04-project-2017-cloudcv.markdown @@ -0,0 +1,11 @@ +--- +layout: default +img: cloudcv.png +title: CloudCV +type: project +technologies: [ReactJS, Python, Django] +website: http://cloudcv.org +github: https://github.com/Cloud-CV/CloudCV +description: | +--- +**CloudCV** main website has a lot of legacy code that needs to be cleaned and needs a complete revamp. The goal of this project is to use best practices for deployment + operations and support all the other infrastructural needs for other projects like EvalAI, IDE, CV-fy etc. diff --git a/_posts/2018-01-29-project-2018-evalai.markdown b/_posts/2018-01-29-project-2018-evalai.markdown new file mode 100644 index 0000000..5d2d338 --- /dev/null +++ b/_posts/2018-01-29-project-2018-evalai.markdown @@ -0,0 +1,11 @@ +--- +layout: default +img: evalai_new.png +title: EvalAI +type: project-2018 +technologies: [Python, Django, AngularJS, RabbitMQ, Docker, AWS] +website: https://evalai.cloudcv.org +github: https://github.com/Cloud-CV/EvalAI +description: | +--- +**EvalAI** is an open source web platform that aims to help researchers, students and data scientists create, collaborate, and participate in Artificial Intelligence (AI) challenges. By simplifying and standardizing the process of benchmarking AI, we want to circumvent many of the factors impeding the rate of progress in AI. diff --git a/_posts/2018-01-29-project-2018-fabrik.markdown b/_posts/2018-01-29-project-2018-fabrik.markdown new file mode 100644 index 0000000..4dafc24 --- /dev/null +++ b/_posts/2018-01-29-project-2018-fabrik.markdown @@ -0,0 +1,11 @@ +--- +layout: default +img: fabrik.png +title: Fabrik +type: project-2018 +technologies: [ReactJS, Python, Django, Tensorflow, PyTorch, Keras, Docker] +website: http://fabrik.cloudcv.org +github: https://github.com/Cloud-CV/Fabrik +description: | +--- +**Fabrik** is an online collaborative platform to build, visualize and share deep learning models by a simple drag-and-drop approach. It allow researchers to collaboratively develop and debug models using a web GUI that allows importing, editing and exporting networks from widely popular frameworks like Caffe and Keras. diff --git a/_posts/2018-01-29-project-2018-origami-.markdown b/_posts/2018-01-29-project-2018-origami-.markdown new file mode 100644 index 0000000..53d4724 --- /dev/null +++ b/_posts/2018-01-29-project-2018-origami-.markdown @@ -0,0 +1,12 @@ +--- +layout: default +img: cvfy.png +title: Origami +type: project-2018 +technologies: [ReactJS, Python, Flask, Docker, AWS] +website: http://origami.cloudcv.org +github: https://github.com/Cloud-CV/Origami +description: | +--- + +**Origami** is a AI-as-a-service that allows researchers to easily convert their deep learning models into an online service that is widely accessible to everyone without the need to setup the infrastructure, resolve the dependencies, and build a web service around the deep learning model. By lowering the barrier to entry to latest AI algorithms, we provide developers, researchers and students the ability to access any model using a simple REST API call. \ No newline at end of file diff --git a/_posts/2019-02-05-project-2019-code-upload.markdown b/_posts/2019-02-05-project-2019-code-upload.markdown new file mode 100644 index 0000000..37de223 --- /dev/null +++ b/_posts/2019-02-05-project-2019-code-upload.markdown @@ -0,0 +1,11 @@ +--- +layout: default +img: code_upload.png +title: Evaluating submission code in Docker +type: project-2019 +technologies: [Python, Django, DRF, Docker, AWS] +website: https://evalai.cloudcv.org +github: https://github.com/Cloud-CV/EvalAI +description: | +--- +The rise of reinforcement learning based problems or any problem which requires that an agent must interact with an environment introduces additional challenges for benchmarking. In contrast to the supervised learning setting where performance is measured by evaluating on a static test set, it is less straightforward to measure generalization performance of these agents in the context of the interactions with the environment. Evaluating these agents involves running the associated code on a collection of unseen environments that constitutes a hidden test set for such a scenario. The goal of this project is to set up a robust pipeline for uploading prediction code in the form of Docker containers (as opposed to test prediction file) that will be evaluated on remote machines and the results will be displayed on the leaderboard. diff --git a/_posts/2019-02-05-project-2019-enhance-ui.markdown b/_posts/2019-02-05-project-2019-enhance-ui.markdown new file mode 100644 index 0000000..5a601dc --- /dev/null +++ b/_posts/2019-02-05-project-2019-enhance-ui.markdown @@ -0,0 +1,11 @@ +--- +layout: default +img: enhance-ui.png +title: Enhance UI/UX of EvalAI +type: project-2019 +technologies: [AngularJS, HTML, CSS, Javascript] +website: https://evalai.cloudcv.org +github: https://github.com/Cloud-CV/EvalAI +description: | +--- +This will focus on improving the existing UI of EvalAI to improve the experience of both challenge organizers and participants. We also want to improve the discoverability of all the features that are supported on EvalAI. With the increase in the number of users of on EvalAI, it is critical to have a frictionless and intuitive user experience. The goal of this project is to ease the pipeline for challenge creation, enhancing the user experience of the platform, adding plots for displaying the progress of state-of-the-art algorithms, for displaying the progress of participant team in a challenge over the years and several other features. diff --git a/_posts/2019-02-05-project-2019-eval-worker.markdown b/_posts/2019-02-05-project-2019-eval-worker.markdown new file mode 100644 index 0000000..aab9d0d --- /dev/null +++ b/_posts/2019-02-05-project-2019-eval-worker.markdown @@ -0,0 +1,11 @@ +--- +layout: default +img: robust-worker.png +title: Robust Evaluation Pipeline +type: project-2019 +technologies: [Python, Django, DRF, Docker, AWS] +website: https://evalai.cloudcv.org +github: https://github.com/Cloud-CV/EvalAI +description: | +--- +Currently, the submission worker that evaluates the challenge requires manual scaling. Moreover, logging & metrics-monitoring isn’t available to the challenge hosts for the submission worker in real-time. Also, an often requested feature by the challenge organizers has been the ability to test their competition package (evaluation scripts, etc) locally before uploading it to EvalAI. This capability will also reduce assistance required by the platform maintainers. The goal of this project is to write a robust test suite for submission worker, port it to AWS Fargate to setup auto-scaling and logging. The tasks will also include giving control to challenge hosts over the submission worker from the UI in terms of starting, stopping and restarting it. diff --git a/_posts/2019-02-05-project-2019-new-ui.markdown b/_posts/2019-02-05-project-2019-new-ui.markdown new file mode 100644 index 0000000..b11e4ce --- /dev/null +++ b/_posts/2019-02-05-project-2019-new-ui.markdown @@ -0,0 +1,11 @@ +--- +layout: default +img: new-ui.png +title: New Frontend for EvalAI using Angular 5 +type: project-2019 +technologies: [Angular, Typescript, HTML, CSS] +website: https://evalai.cloudcv.org +github: https://github.com/Cloud-CV/EvalAI +description: | +--- +EvalAI’s current frontend is setup using Angular 1 which is not maintained by the community actively. Angular in the later versions support really nice features like better SEO, client-side rendering, etc. We want to migrate the current codebase in Angular 5 with a new design and achieve feature-parity. The first half of the summer will focus on adding the existing features from the older version with a new UI, while the latter half will focus on building an exhaustive analytics platform for challenge host and participants. The tasks will also include adding the UI for hosts and participants for reinforcement learning based challenges. diff --git a/_posts/2020-02-05-project-2020-1-enhancing-code-upload-pipeline.markdown b/_posts/2020-02-05-project-2020-1-enhancing-code-upload-pipeline.markdown new file mode 100644 index 0000000..13e5550 --- /dev/null +++ b/_posts/2020-02-05-project-2020-1-enhancing-code-upload-pipeline.markdown @@ -0,0 +1,11 @@ +--- +layout: default +img: enhance-code-upload.png +title: Enhancements in Code Upload Pipeline +type: project-2020 +technologies: [Docker, Kubernetes, AWS, Django, DRF] +website: https://evalai.cloudcv.org +github: https://github.com/Cloud-CV/EvalAI +description: | +--- +As EvalAI hosts more code-upload challenges and researchers utilizes our modular kubernetes based infrastructure for hosting these challenges, we would like to automate this pipeline as much as possible to enhance user experience. During GSoC 2019, we built this pipeline for evaluating AI model’s code by running it against unseen test environments in real time and this year the plan is to add features like start, stop, restart, delete cluster, etc. so as to give challenge hosts more control over their challenge evaluation cluster. This will not only involve control over the nodes running evaluation but also viewing logs which are being updated in real-time. Finally, the plan is to give challenge hosts the capability to run the evaluation cluster in their cloud by simply plugging in their keys and rest all will be taken care by EvalAI. diff --git a/_posts/2020-02-05-project-2020-2-analytics-dashboard.markdown b/_posts/2020-02-05-project-2020-2-analytics-dashboard.markdown new file mode 100644 index 0000000..8824b1f --- /dev/null +++ b/_posts/2020-02-05-project-2020-2-analytics-dashboard.markdown @@ -0,0 +1,11 @@ +--- +layout: default +img: analytics-dashboard.jpg +title: Analytics Dashboard for EvalAI Users +type: project-2020 +technologies: [Angular 7, Django, Django Rest Framework, D3.js] +website: https://evalai.cloudcv.org +github: https://github.com/Cloud-CV/EvalAI +description: | +--- +As the number of compute-intensive challenges on EvalAI are increasing, we want to focus on improving the performance of our services. As a first step, we will focus on monitoring and measuring all key metrics of our services. Insights from these will allow us to efficiently utilize our infrastructure, improve uptime and reduce costs. The project will concentrate on writing REST API’s, plotting pretty graphs and building analytics dashboards to cater for all three types of users on EvalAI i.e. admin, challenge hosts and participants. The analytics will help challenge hosts to view the progress of participants in their challenge for instance, comparing the trends of the accuracy from participant submissions over the period of time, etc. The final goal is to provide users with several analytics so as to display their progress on the platform and utilize the resources efficiently to reduce costs. diff --git a/_posts/2020-02-05-project-2020-3-streamlining-challenge-creation.markdown b/_posts/2020-02-05-project-2020-3-streamlining-challenge-creation.markdown new file mode 100644 index 0000000..3d0a96d --- /dev/null +++ b/_posts/2020-02-05-project-2020-3-streamlining-challenge-creation.markdown @@ -0,0 +1,11 @@ +--- +layout: default +img: streamlining-challenge-creation.jpg +title: Streamlining Challenge Creation on EvalAI +type: project-2020 +technologies: [Python, Django, Django Rest Framework, CI/CD tool] +website: https://evalai.cloudcv.org +github: https://github.com/Cloud-CV/EvalAI +description: | +--- +EvalAI is a platform to host and participate in AI challenges around the globe. To host a challenge, challenge creation is one of the core features which is utilized by challenge hosts to create AI challenges. The idea is to use private GitHub repositories to host the challenge files instead of the zip file. The next step is to build and integrate a continuous deployment pipeline with GitHub so that for every new commit in the challenge repository, the changes are automatically reflected on the UI. We will also build support for tests so that new commits are fully tested before they are pushed to the live challenge hosted on EvalAI. The goal is to enhance the challenge creation experience for challenge hosts and set up a challenge on EvalAI by the challenge hosts involving minimal human effort from the EvalAI team. diff --git a/_posts/2020-02-05-project-2020-4-improving-evalai-frontend.markdown b/_posts/2020-02-05-project-2020-4-improving-evalai-frontend.markdown new file mode 100644 index 0000000..38398cd --- /dev/null +++ b/_posts/2020-02-05-project-2020-4-improving-evalai-frontend.markdown @@ -0,0 +1,11 @@ +--- +layout: default +img: enhance-ui.png +title: Improvement in EvalAI Frontend +type: project-2020 +technologies: [Angular 7, HTML, CSS, Typescript] +website: https://evalai.cloudcv.org +github: https://github.com/Cloud-CV/EvalAI-ngx +description: | +--- +As a part of last year’s GSOC, we took the first step towards modernizing our UI which involved shifting the current codebase from Angular 1 to Angular 7. As we’ve reached the feature parity with the existing UI, this project will involve fixing the last remaining kinks in the UI and incorporating latest UI feedback which we have received from the challenge hosts and participants for the AI challenges organized this year. The goal of this project would be to successfully replace the existing UI with the new UI after GSOC. diff --git a/_posts/2021-02-19-project-2021-analytics-dashboard-for-hosts-and-participants.markdown b/_posts/2021-02-19-project-2021-analytics-dashboard-for-hosts-and-participants.markdown new file mode 100644 index 0000000..c9ba559 --- /dev/null +++ b/_posts/2021-02-19-project-2021-analytics-dashboard-for-hosts-and-participants.markdown @@ -0,0 +1,11 @@ +--- +layout: default +img: analytics-dashboard.jpg +title: Analytics dashboards for challenge hosts and participants +type: project-2021 +technologies: [Angular 7, Django, Django Rest Framework, D3.js] +website: https://evalai.cloudcv.org +github: https://github.com/Cloud-CV/EvalAI +description: | +--- +This project will involve writing REST API’s, plotting relevant graphs and building analytics dashboards for challenge hosts and participants. The analytics will help challenge hosts view the progress of participants in their challenge -- for instance, comparing the trends of the accuracy from participant submissions over the period of time. Participants will be able to visualize the performance of all of their submissions with time and their corresponding rank on the leaderboard. The final goal is to provide users with several analytics to track their progress on the platform. diff --git a/_posts/2021-02-19-project-2021-improvements-in-evalai-frontend.markdown b/_posts/2021-02-19-project-2021-improvements-in-evalai-frontend.markdown new file mode 100644 index 0000000..ec7bcf5 --- /dev/null +++ b/_posts/2021-02-19-project-2021-improvements-in-evalai-frontend.markdown @@ -0,0 +1,11 @@ +--- +layout: default +img: enhance-ui.png +title: Improvements in EvalAI frontend +type: project-2021 +technologies: [Angular 7, HTML, CSS, Typescript] +website: https://evalai.cloudcv.org +github: https://github.com/Cloud-CV/EvalAI +description: | +--- +After last year’s GSOC, we’ve reached feature parity on EvalAI-ngx with the existing UI, this project will involve fixing the last remaining kinks in the UI. The goal of this project would be to improve the new UI as we replace the existing UI with the new UI before GSOC. We will be improving on the new UI and incorporating the feedback we will receive from the challenge hosts and participants for the AI challenges organized this year. diff --git a/_posts/2021-02-19-project-2021-monitoring-setup-for-evalai-admins.markdown b/_posts/2021-02-19-project-2021-monitoring-setup-for-evalai-admins.markdown new file mode 100644 index 0000000..d67c373 --- /dev/null +++ b/_posts/2021-02-19-project-2021-monitoring-setup-for-evalai-admins.markdown @@ -0,0 +1,11 @@ +--- +layout: default +img: monitoring-setup-for-evalai-admins.png +title: Monitoring setup for EvalAI admins +type: project-2021 +technologies: [Python, Django, Django rest framework, Docker] +website: https://evalai.cloudcv.org +github: https://github.com/Cloud-CV/EvalAI +description: | +--- +As the number of challenges on EvalAI are increasing, we want to focus on improving the performance of our services. As a first step, we will focus on monitoring and measuring all the key metrics of our services. Insights from these will allow us to efficiently utilize our infrastructure, improve uptime and reduce costs. The project will concentrate on setting up metric reporting and alerts infrastructure, writing REST API’s, plotting relevant graphs and building analytics dashboards to help EvalAI admins maintain and monitor the services. diff --git a/_posts/2021-02-19-project-2021-static-code-upload-challenge-evaluation.markdown b/_posts/2021-02-19-project-2021-static-code-upload-challenge-evaluation.markdown new file mode 100644 index 0000000..d3eb37d --- /dev/null +++ b/_posts/2021-02-19-project-2021-static-code-upload-challenge-evaluation.markdown @@ -0,0 +1,11 @@ +--- +layout: default +img: code-upload-pipeline-for-static-datasets.png +title: Static code upload challenge evaluation +type: project-2021 +technologies: [Python, Django, Kubernetes, Docker] +website: https://evalai.cloudcv.org +github: https://github.com/Cloud-CV/EvalAI +description: | +--- +EvalAI is a platform to host and participate in AI challenges around the globe. To a challenge host, reproducibility of submission results and privacy of the test data are the main concerns. Towards this, the idea is to allow users to submit a docker image for their models and evaluate them on static datasets. In order to achieve this we want to build a pipeline which will use the dockerized models and run it on kubernetes based infrastructure with stored test annotations and report the results on the EvalAI leaderboard. Another part of the project is to streamline our challenge creation pipeline. Last year we added support for github based challenge creation which allows challenge hosts to use a private github repository to create and manage updates in a challenge. The goal for this year is to support bi-directional updates for challenges created using github. This feature will allow hosts to sync changes from EvalAI UI to their challenge github repository. The goal is to enhance the challenge creation experience for challenge hosts involving minimal support from the EvalAI team. diff --git a/_posts/2022-02-21-project-2022-analytics-dashboard-for-hosts-and-participants.markdown b/_posts/2022-02-21-project-2022-analytics-dashboard-for-hosts-and-participants.markdown new file mode 100644 index 0000000..40e2c01 --- /dev/null +++ b/_posts/2022-02-21-project-2022-analytics-dashboard-for-hosts-and-participants.markdown @@ -0,0 +1,11 @@ +--- +layout: default +img: analytics-dashboard.jpg +title: Analytics dashboards for challenge hosts and participants +type: project-2022 +technologies: [Angular 7, Django, Django Rest Framework, D3.js] +website: https://eval.ai +github: https://github.com/Cloud-CV/EvalAI +description: | +--- +This project will involve writing REST API’s, plotting relevant graphs and building analytics dashboards for challenge hosts and participants. The analytics will help challenge hosts view the progress of participants in their challenge -- for instance, comparing the trends of the accuracy from participant submissions over the period of time. Participants will be able to visualize the performance of all of their submissions with time and their corresponding rank on the leaderboard. The final goal is to provide users with several analytics to track their progress on the platform. diff --git a/_posts/2022-02-21-project-2022-easy-challenge-management-on-evalai.markdown b/_posts/2022-02-21-project-2022-easy-challenge-management-on-evalai.markdown new file mode 100644 index 0000000..690f4ed --- /dev/null +++ b/_posts/2022-02-21-project-2022-easy-challenge-management-on-evalai.markdown @@ -0,0 +1,11 @@ +--- +layout: default +img: streamlining-challenge-creation.jpg +title: Easy challenge management on EvalAI +type: project-2022 +technologies: [Angular, Django, AWS] +website: https://eval.ai +github: https://github.com/Cloud-CV/EvalAI +description: | +--- +This project will focus on streamlining the newly adopted GitHub challenge creation pipeline, building API’s for fully automating challenge creation on EvalAI, adding new capabilities in EvalAI’s latest frontend for a seamless user experience, and making our backend robust and less error-prone by adding test cases for different frontend and backend components. As of now, EvalAI admin has to be in the loop for the challenge creation process with respect to scaling worker resources for prediction-based AI challenges, setting up remote evaluation for AI challenges, and most importantly setting up code-upload AI challenges on EvalAI, the goal of this project is to remove EvalAI admin out of the loop by fully automating the process. diff --git a/_posts/2022-02-26-project-2022-adversarial-data-collection-with-gradio.markdown b/_posts/2022-02-26-project-2022-adversarial-data-collection-with-gradio.markdown new file mode 100644 index 0000000..12991ad --- /dev/null +++ b/_posts/2022-02-26-project-2022-adversarial-data-collection-with-gradio.markdown @@ -0,0 +1,11 @@ +--- +layout: default +img: evalai_gradio.png +title: Adversarial data collection with Gradio +type: project-2022 +technologies: [Django, AWS, DevOps] +website: https://eval.ai +github: https://github.com/Cloud-CV/EvalAI +description: | +--- +This project will focus on building an infrastructure to allow exposing models submitted to EvalAI as demos in order to collect adversarial data for the model. As part of the project, we will integrate Gradio with our code upload challenge pipeline to allow deploying the models as web services. Additionally, this web service will record all interactions to curate a "in-the-wild" dataset for each submission. \ No newline at end of file diff --git a/_posts/2022-02-26-project-2022-robust-test-suite-and-infra-optimization-setup.markdown b/_posts/2022-02-26-project-2022-robust-test-suite-and-infra-optimization-setup.markdown new file mode 100644 index 0000000..e460aa6 --- /dev/null +++ b/_posts/2022-02-26-project-2022-robust-test-suite-and-infra-optimization-setup.markdown @@ -0,0 +1,11 @@ +--- +layout: default +img: monitoring-setup-for-evalai-admins.png +title: Robust test suite and infra optimization setup +type: project-2022 +technologies: [Django, AWS] +website: https://eval.ai +github: https://github.com/Cloud-CV/EvalAI +description: | +--- +This project will focus on building a robust test suite for EvalAI's functionalities and optimizing infrastructure cost. As part of the project we will focus on making EvalAI robust and less error-prone by adding test cases for different frontend and backend component. It will involve adding unit tests for the API suite, prediction upload evaluation workers, code upload evaluation workers (on EKS) and integration tests for the end to end testing of all the components. Additionally, we will also focus on using the EvalAI monitoring setup to identify and deploy infra cost optimization features. diff --git a/_posts/2023-02-06-project-2023-adversarial-data-using-gradio-and-evalai.markdown b/_posts/2023-02-06-project-2023-adversarial-data-using-gradio-and-evalai.markdown new file mode 100644 index 0000000..02440a1 --- /dev/null +++ b/_posts/2023-02-06-project-2023-adversarial-data-using-gradio-and-evalai.markdown @@ -0,0 +1,11 @@ +--- +layout: default +img: evalai_gradio.png +title: Adversarial Data using Gradio and EvalAI +type: project-2023 +technologies: [Django, AWS, DevOps] +website: https://eval.ai +github: https://github.com/Cloud-CV/EvalAI +description: | +--- +The aim of this project is to develop an infrastructure that enables the collection of adversarial data for models submitted to EvalAI. This will be achieved by integrating Gradio with EvalAI's code upload challenge pipeline and deploying the models as web services. The web services will record all user interactions, providing a dataset for each submission that can be used to evaluate the robustness of the model. diff --git a/_posts/2023-02-06-project-2023-analytics-dashboard-for-evalai-users.markdown b/_posts/2023-02-06-project-2023-analytics-dashboard-for-evalai-users.markdown new file mode 100644 index 0000000..17386c9 --- /dev/null +++ b/_posts/2023-02-06-project-2023-analytics-dashboard-for-evalai-users.markdown @@ -0,0 +1,11 @@ +--- +layout: default +img: analytics-dashboard.jpg +title: Analytics Dashboards for EvalAI Users +type: project-2023 +technologies: [Angular 7, Django, Django Rest Framework, D3.js] +website: https://eval.ai +github: https://github.com/Cloud-CV/EvalAI +description: | +--- +The goal of this project is to provide challenge hosts and participants with insightful analytics to track their progress on the platform. This project will involve writing REST APIs, plotting relevant graphs, and building analytics dashboards for both challenge hosts and participants. The analytics will help challenge hosts view the progress of participants in their challenge (changes in performance and ranking over time), and participants will be able to visualize the performance of all their submissions over time and their corresponding rank on the leaderboard. diff --git a/_posts/2023-02-07-project-2023-evaluation-infrastructure-optimization.markdown b/_posts/2023-02-07-project-2023-evaluation-infrastructure-optimization.markdown new file mode 100644 index 0000000..3fba967 --- /dev/null +++ b/_posts/2023-02-07-project-2023-evaluation-infrastructure-optimization.markdown @@ -0,0 +1,15 @@ +--- +layout: default +img: ec2-auto-scaling.png +title: Evaluation Infrastructure Optimization +type: project-2023 +technologies: [Angular, Django, AWS] +website: https://eval.ai +github: https://github.com/Cloud-CV/EvalAI +description: | +--- +This project aims to enhance EvalAI's functionalities through automating large worker deployments in AWS, adding relevant features for efficient challenge management and also writing a robust and efficient test suite. The focus of the project is two-fold: + +- To automate large worker deployment processes on EvalAI using AWS EC2 instances or spot instances, make challenge management seamless and less reliant on the admins. We want to reduce the dependency of challenge hosts on EvalAI admins. + +- To make EvalAI more reliable and error-free by incorporating tests for different frontend and backend components. Having robust tests prevents making code-breaking changes to the codebase. This task will include adding unit tests for the API suite, prediction upload evaluation workers, code upload evaluation workers (on EKS), and integration tests for end-to-end testing of all components. diff --git a/_posts/2023-02-07-project-2023-improvements-in-evalai-user-interface.markdown b/_posts/2023-02-07-project-2023-improvements-in-evalai-user-interface.markdown new file mode 100644 index 0000000..bdc056f --- /dev/null +++ b/_posts/2023-02-07-project-2023-improvements-in-evalai-user-interface.markdown @@ -0,0 +1,11 @@ +--- +layout: default +img: search-tag-filter.png +title: Improvements in EvalAI User Interface +type: project-2023 +technologies: [Angular, Django] +website: https://eval.ai +github: https://github.com/Cloud-CV/EvalAI +description: | +--- +The goal of this project is to improve the overall user experience for challenge hosts and participants on EvalAI by allowing them to tag and filter challenges and creating an intuitive and informative leaderboard. This project will involve creating - a comprehensive search feature to find challenges, a tagging system for different challenge types (ex: Computer Vision, NLP, etc) for categorization. This will help participants and challenge hosts find challenges and search for related ones based on tags. An improved leaderboard, along with the search feature, will help in streamlining the process of organizing challenges, participating in challenges, and ranking participants. In addition, we will also work on adding support for relevant metadata for each challenge such as prize money, sponsors, etc. diff --git a/_posts/2024-02-06-project-2024-admin-tools-enhancement-and-cost-optimization.markdown b/_posts/2024-02-06-project-2024-admin-tools-enhancement-and-cost-optimization.markdown new file mode 100644 index 0000000..7e555d7 --- /dev/null +++ b/_posts/2024-02-06-project-2024-admin-tools-enhancement-and-cost-optimization.markdown @@ -0,0 +1,18 @@ +--- +layout: default +img: admin-tools-integration-optimization.png +title: Admin Tools Enhancement and Cost Optimization +type: project-2024 +technologies: [Angular, Django, AWS, Python] +website: https://eval.ai +github: https://github.com/Cloud-CV/EvalAI +description: | +--- +This project aims to elevate the admin experience on EvalAI while implementing cost-effective measures for platform maintenance. +Key focuses include enhancing automation for managing expired submissions on SQS queues, identifying and optimizing ECS instances based on AWS health metrics, and providing convenient admin actions through Django administration. +Cost optimization measures involve using custom SQS queue retention times, refining auto-cancel scripts, and identifying/removing unnecessary AWS instances and repositories. +Additionally, the project aims to automate infrastructure monitoring for improved efficiency, making EvalAI administration seamless and cost-efficient. + +**Project Size**: Medium (175 hours) + +**Difficulty Rating**: Medium \ No newline at end of file diff --git a/_posts/2024-02-06-project-2024-challenge-synchronization-with-github-repositories.markdown b/_posts/2024-02-06-project-2024-challenge-synchronization-with-github-repositories.markdown new file mode 100644 index 0000000..f5b7f7b --- /dev/null +++ b/_posts/2024-02-06-project-2024-challenge-synchronization-with-github-repositories.markdown @@ -0,0 +1,17 @@ +--- +layout: default +img: github-sync.png +title: Challenge Synchronization with GitHub Repositories +type: project-2024 +technologies: [Django, Python, GitHub API] +website: https://eval.ai +github: https://github.com/Cloud-CV/EvalAI +description: | +--- +This project focuses on streamlining the migration of legacy challenges on EvalAI by transitioning from challenge zip files to GitHub repositories. It involves creating GitHub repositories for hosts, copying over relevant files, and ensuring compatibility for various challenge types. + +Additionally, the bidirectional sync functionality aims to seamlessly update information between EvalAI and GitHub, enabling hosts to make edits on EvalAI that reflect on GitHub repositories and vice versa. By achieving enhanced compatibility and synchronization, the project aims to provide a more efficient experience for hosts managing challenges on EvalAI. + +**Project Size**: Large (350 hours) + +**Difficulty Rating**: Hard diff --git a/_posts/2024-02-06-project-2024-testing-docs-errors.markdown b/_posts/2024-02-06-project-2024-testing-docs-errors.markdown new file mode 100644 index 0000000..787776d --- /dev/null +++ b/_posts/2024-02-06-project-2024-testing-docs-errors.markdown @@ -0,0 +1,17 @@ +--- +layout: default +img: test-exception-docs.png +title: Enhanced Exception Handling Testing Documentation +type: project-2024 +technologies: [Django, Markdown, Python] +website: https://eval.ai +github: https://github.com/Cloud-CV/EvalAI +description: | +--- +This project aims to enhance EvalAI's overall user experience by implementing robust exception handling, improving test coverage, and enhancing documentation. + +Key deliverables include increased test coverage for critical components, especially API-related ones, and integration of Postman API testing. Documentation improvements encompass detailed API summaries, AWS setup tutorials for organizers, and FAQs. Additionally, the project focuses on thorough error analysis, enhancing error messages for quicker issue resolution, and ensuring proper exception handling in AWS utilities to contribute to EvalAI's reliability and user-centricity. + +**Project Size**: Medium (175 hours) + +**Difficulty Rating**: Easy diff --git a/_posts/2024-02-06-project-2024-user-experience-enhancement.markdown b/_posts/2024-02-06-project-2024-user-experience-enhancement.markdown new file mode 100644 index 0000000..0a1df41 --- /dev/null +++ b/_posts/2024-02-06-project-2024-user-experience-enhancement.markdown @@ -0,0 +1,20 @@ +--- +layout: default +img: user-experience-leaderboard-integrations.png +title: Seamless User Experience & Leaderboard Porting +type: project-2024 +technologies: [Angular, Django, SQL, AWS] +website: https://eval.ai +github: https://github.com/Cloud-CV/EvalAI +description: | +--- +This project focuses on elevating the host experience on EvalAI through the introduction of user-centric features and optimizations. Key features include enabling custom requests for code-upload challenges on the EKS platform and streamlining the migration of leaderboards from external sources to EvalAI. + +The project also aims to enhance user-centric aspects by implementing customizable participant details download, improving error handling for email verification, and embedding forums on challenge pages for seamless communication. + +Additionally, it addresses technical improvements like fixing search and filter features, automating challenge category/forum creation, and resolving issues with pod log population on AWS. +Overall, these deliverables aim to provide users with a more efficient and enriched participation experience on EvalAI. + +**Project Size**: Medium (175 hours) + +**Difficulty Rating**: Medium diff --git a/css/landing-page.css b/css/landing-page.css new file mode 100644 index 0000000..0bd3b63 --- /dev/null +++ b/css/landing-page.css @@ -0,0 +1,364 @@ +/*! + * Start Bootstrap - Landing Page Bootstrap Theme (http://startbootstrap.com) + * Code licensed under the Apache License v2.0. + * For details, see http://www.apache.org/licenses/LICENSE-2.0. + */ + +body, +html { + width: 100%; + height: 100%; +} + +body, +h1, +h2, +h3, +h4, +h5, +h6 { + font-family: 'Roboto', sans-serif; +} + +a { + font-weight: 300; +} + +.btn-success { + background-color: #309630; +} + +.btn { + font-weight: 300; +} + +.label-info { + font-weight: 300; + background-color: #428bca; +} + +.fw-300 { + font-weight: 300; +} + +.fw-400 { + font-weight: 400; +} + +.valign-center { + display: flex; + align-items: center; +} + +.lead { + font-size: 18px; + font-weight: 300; +} + +.intro-header { + padding-top: 50px; /* If you're making other pages, make sure there is 50px of padding to make sure the navbar doesn't overlap content! */ + padding-bottom: 50px; + text-align: center; + color: #f8f8f8; + background: url('../img/bg.jpg') no-repeat center center; + background-size: cover; +} + +.intro-header-gsoc { + background: url(../img/gsoc/intro-bg.jpg) no-repeat center center; + background-size: cover; + color: #73ba25; +} + +.intro-header-mentor { + background: url(../img/mentor-intro-bg.jpg) no-repeat center center; + background-size: cover; + color: #73ba25; +} + +.intro-message { + position: relative; + padding-top: 20%; + padding-bottom: 20%; +} + +.intro-message > h1 { + margin: 0; + text-shadow: 2px 2px 3px rgba(0,0,0,0.6); + font-size: 5em; +} + +.intro-divider { + width: 400px; + border-top: 1px solid #f8f8f8; + border-bottom: 1px solid rgba(0,0,0,0.2); +} + +.intro-message > h3 { + text-shadow: 2px 2px 3px rgba(0,0,0,0.6); +} + +@media(max-width:767px) { + .intro-message { + padding-bottom: 15%; + } + + .intro-message > h1 { + font-size: 3em; + } + + ul.intro-social-buttons > li { + display: block; + margin-bottom: 20px; + padding: 0; + } + + ul.intro-social-buttons > li:last-child { + margin-bottom: 0; + } + + .intro-divider { + width: 100%; + } +} + +.network-name { + text-transform: uppercase; + font-size: 14px; + letter-spacing: 2px; +} + +#about, #mentor { + padding: 40px 0 20px; +} + +section { + padding: 20px 0 20px; +} +section:nth-of-type(odd) { + background: white; + border-top: 1px solid #e7e7e7; + border-bottom: 1px solid #e7e7e7; +} +section:first-of-type { + padding: 20px 0 0; +} + +.section-heading { + margin-bottom: 30px; +} + +.section-heading-spacer { + float: left; + width: 200px; + border-top: 3px solid #e7e7e7; +} + +.banner { + padding: 100px 0; + color: #f8f8f8; + background: url(../img/banner-bg.jpg) no-repeat center center; + background-size: cover; +} + +.banner h2 { + margin: 0; + text-shadow: 2px 2px 3px rgba(0,0,0,0.6); + font-size: 3em; +} + +.banner ul { + margin-bottom: 0; +} + +.banner-social-buttons { + float: right; + margin-top: 0; +} + +@media(max-width:1199px) { + ul.banner-social-buttons { + float: left; + margin-top: 15px; + } +} + +@media(max-width:767px) { + .banner h2 { + margin: 0; + text-shadow: 2px 2px 3px rgba(0,0,0,0.6); + font-size: 3em; + } + + ul.banner-social-buttons > li { + display: block; + margin-bottom: 20px; + padding: 0; + } + + ul.banner-social-buttons > li:last-child { + margin-bottom: 0; + } +} + +footer { + padding: 50px 0; + background-color: #222; +} + +p.copyright { + margin: 15px 0 0; +} + + +.portfolio-modal .modal-content { + padding: 100px 0; + min-height: 100%; + border: 0; + border-radius: 0; + background-clip: border-box; + -webkit-box-shadow: none; + box-shadow: none; +} + +.portfolio-modal .modal-content h2 { + margin-bottom: 15px; + font-size: 3em; +} + +.portfolio-modal .modal-content p { + margin-bottom: 30px; +} + +.portfolio-modal .modal-content p.item-intro { + margin: 20px 0 30px; + font-family: "Droid Serif","Helvetica Neue",Helvetica,Arial,sans-serif; + font-size: 16px; + font-style: italic; +} + +.portfolio-modal .modal-content ul.list-inline { + margin-top: 0; + margin-bottom: 30px; +} + +.portfolio-modal .modal-content img { + margin-bottom: 30px; +} + +.portfolio-modal .close-modal { + position: absolute; + top: 25px; + right: 25px; + width: 75px; + height: 75px; + background-color: transparent; + cursor: pointer; +} + +.portfolio-modal .close-modal:hover { + opacity: .3; +} + +.portfolio-modal .close-modal .lr { + z-index: 1051; + width: 1px; + height: 75px; + margin-left: 35px; + background-color: #222; + -webkit-transform: rotate(45deg); + -ms-transform: rotate(45deg); + transform: rotate(45deg); +} + +.portfolio-modal .close-modal .lr .rl { + z-index: 1052; + width: 1px; + height: 75px; + background-color: #222; + -webkit-transform: rotate(90deg); + -ms-transform: rotate(90deg); + transform: rotate(90deg); +} + +.icon-mentoring { + color: #333; + vertical-align: middle; +} + +#portfolio .portfolio-item { + right: 0; + margin: 0 0 15px; +} + +#portfolio .portfolio-item .portfolio-link { + display: block; + position: relative; + margin: 0 auto; + max-width: 400px; +} + +#portfolio .portfolio-item .portfolio-link .portfolio-hover { + position: absolute; + width: 100%; + height: 100%; + opacity: 0; + -webkit-transition: all ease .5s; + -moz-transition: all ease .5s; + transition: all ease .5s; + background: rgba(254, 209, 54, .9); +} + +#portfolio .portfolio-item .portfolio-link .portfolio-hover:hover { + opacity: 1; +} + +#portfolio .portfolio-item .portfolio-link .portfolio-hover .portfolio-hover-content { + position: absolute; + top: 50%; + width: 100%; + height: 20px; + margin-top: -12px; + text-align: center; + font-size: 20px; + color: #fff; +} + +#portfolio .portfolio-item .portfolio-link .portfolio-hover .portfolio-hover-content i { + margin-top: -12px; +} + +#portfolio .portfolio-item .portfolio-link .portfolio-hover .portfolio-hover-content h3, +#portfolio .portfolio-item .portfolio-link .portfolio-hover .portfolio-hover-content h4 { + margin: 0; +} + +#portfolio .portfolio-item .portfolio-caption { + margin: 0 auto; + padding: 25px; + max-width: 400px; + text-align: center; + background-color: #fff; +} + +#portfolio .portfolio-item .portfolio-caption h4 { + margin: 0; + text-transform: none; +} + +#portfolio .portfolio-item .portfolio-caption p { + margin: 0; + font-family: "Droid Serif","Helvetica Neue",Helvetica,Arial,sans-serif; + font-size: 16px; + font-style: italic; +} + +#portfolio * { + z-index: 2; +} + +@media(min-width:767px) { + #portfolio .portfolio-item { + margin: 0 0 30px; + } +} diff --git a/img/bg.jpg b/img/bg.jpg new file mode 100644 index 0000000..40c15ac Binary files /dev/null and b/img/bg.jpg differ diff --git a/img/favicon.png b/img/favicon.png new file mode 100644 index 0000000..8ddbbe8 Binary files /dev/null and b/img/favicon.png differ diff --git a/img/geek.jpg b/img/geek.jpg new file mode 100644 index 0000000..4c97c68 Binary files /dev/null and b/img/geek.jpg differ diff --git a/img/intro-bg.jpg b/img/intro-bg.jpg new file mode 100644 index 0000000..f81a649 Binary files /dev/null and b/img/intro-bg.jpg differ diff --git a/img/mentor_summit.jpg b/img/mentor_summit.jpg new file mode 100644 index 0000000..51c52c0 Binary files /dev/null and b/img/mentor_summit.jpg differ diff --git a/img/projects/admin-tools-integration-optimization.png b/img/projects/admin-tools-integration-optimization.png new file mode 100644 index 0000000..eea4542 Binary files /dev/null and b/img/projects/admin-tools-integration-optimization.png differ diff --git a/img/projects/analytics-dashboard.jpg b/img/projects/analytics-dashboard.jpg new file mode 100644 index 0000000..7151df5 Binary files /dev/null and b/img/projects/analytics-dashboard.jpg differ diff --git a/img/projects/cloudcv.png b/img/projects/cloudcv.png new file mode 100644 index 0000000..df9a690 Binary files /dev/null and b/img/projects/cloudcv.png differ diff --git a/img/projects/code-upload-pipeline-for-static-datasets.png b/img/projects/code-upload-pipeline-for-static-datasets.png new file mode 100644 index 0000000..71e99d5 Binary files /dev/null and b/img/projects/code-upload-pipeline-for-static-datasets.png differ diff --git a/img/projects/code_upload.png b/img/projects/code_upload.png new file mode 100644 index 0000000..fe24126 Binary files /dev/null and b/img/projects/code_upload.png differ diff --git a/img/projects/cvfy.png b/img/projects/cvfy.png new file mode 100644 index 0000000..0289001 Binary files /dev/null and b/img/projects/cvfy.png differ diff --git a/img/projects/ec2-auto-scaling.png b/img/projects/ec2-auto-scaling.png new file mode 100644 index 0000000..bd142a7 Binary files /dev/null and b/img/projects/ec2-auto-scaling.png differ diff --git a/img/projects/enhance-code-upload.png b/img/projects/enhance-code-upload.png new file mode 100644 index 0000000..3df0349 Binary files /dev/null and b/img/projects/enhance-code-upload.png differ diff --git a/img/projects/enhance-ui.png b/img/projects/enhance-ui.png new file mode 100644 index 0000000..8c26d4b Binary files /dev/null and b/img/projects/enhance-ui.png differ diff --git a/img/projects/evalai.png b/img/projects/evalai.png new file mode 100644 index 0000000..2f2d2bc Binary files /dev/null and b/img/projects/evalai.png differ diff --git a/img/projects/evalai_gradio.png b/img/projects/evalai_gradio.png new file mode 100644 index 0000000..1622def Binary files /dev/null and b/img/projects/evalai_gradio.png differ diff --git a/img/projects/evalai_new.png b/img/projects/evalai_new.png new file mode 100644 index 0000000..fd7d589 Binary files /dev/null and b/img/projects/evalai_new.png differ diff --git a/img/projects/fabrik.png b/img/projects/fabrik.png new file mode 100644 index 0000000..824cbab Binary files /dev/null and b/img/projects/fabrik.png differ diff --git a/img/projects/github-sync.png b/img/projects/github-sync.png new file mode 100644 index 0000000..0be696b Binary files /dev/null and b/img/projects/github-sync.png differ diff --git a/img/projects/ide.png b/img/projects/ide.png new file mode 100644 index 0000000..3ae9c6b Binary files /dev/null and b/img/projects/ide.png differ diff --git a/img/projects/monitoring-setup-for-evalai-admins.png b/img/projects/monitoring-setup-for-evalai-admins.png new file mode 100644 index 0000000..d864c9f Binary files /dev/null and b/img/projects/monitoring-setup-for-evalai-admins.png differ diff --git a/img/projects/new-ui.png b/img/projects/new-ui.png new file mode 100644 index 0000000..f1c77b6 Binary files /dev/null and b/img/projects/new-ui.png differ diff --git a/img/projects/robust-worker.png b/img/projects/robust-worker.png new file mode 100644 index 0000000..1b25b3d Binary files /dev/null and b/img/projects/robust-worker.png differ diff --git a/img/projects/search-tag-filter.png b/img/projects/search-tag-filter.png new file mode 100644 index 0000000..d989390 Binary files /dev/null and b/img/projects/search-tag-filter.png differ diff --git a/img/projects/streamlining-challenge-creation.jpg b/img/projects/streamlining-challenge-creation.jpg new file mode 100644 index 0000000..6d9b4cb Binary files /dev/null and b/img/projects/streamlining-challenge-creation.jpg differ diff --git a/img/projects/test-exception-docs.png b/img/projects/test-exception-docs.png new file mode 100644 index 0000000..84c1237 Binary files /dev/null and b/img/projects/test-exception-docs.png differ diff --git a/img/projects/user-experience-leaderboard-integrations.png b/img/projects/user-experience-leaderboard-integrations.png new file mode 100644 index 0000000..26c74e9 Binary files /dev/null and b/img/projects/user-experience-leaderboard-integrations.png differ diff --git a/img/starbucks.jpg b/img/starbucks.jpg new file mode 100644 index 0000000..a8aec47 Binary files /dev/null and b/img/starbucks.jpg differ diff --git a/index.html b/index.html new file mode 100644 index 0000000..d150250 --- /dev/null +++ b/index.html @@ -0,0 +1,112 @@ +--- +layout: default +title: GSOC - 2024 +redirect_from: + - /mentor/index.html +--- + +{% include header.html %} + +
+
+
+
+

About CloudCV

+

+ {% include teaser.md %} +

+
+
+
+
+ +{% for post in site.posts reversed %} + {% if post.type == 'project-2024' %} + {% capture thecycle %}{% cycle 'odd', 'even' %}{% endcapture %} + {% if thecycle == 'odd' %} +
+
+
+
+
+
+

{{ post.title }}

+

+ {% for technology in post.technologies %} + {{ technology }} + {% endfor %} +

+
{{ post.content }} +
+

Please wait for loading the projects ...

+
+ + + + + + + + + + + +
+
+ + +
+
+
+ +
+
+
+ +
+ {% else %} +
+
+
+
+
+
+

{{ post.title }}

+

+ {% for technology in post.technologies %} + {{ technology }} + {% endfor %} +

+
{{ post.content }}
+

Please wait for loading the projects ...

+
+ + + + + + + + + + + +
+
+ + +
+
+
+ +
+
+ +
+
+ {% endif %} + {% endif %} +{% endfor %} + +{% include mentor.html %} +{% include mentor_process.html %} diff --git a/js/github.js b/js/github.js new file mode 100644 index 0000000..43ab318 --- /dev/null +++ b/js/github.js @@ -0,0 +1,88 @@ +$(document).ready(function () { + var url = $('table').first().data('url'); + + // GitHub allows only 60 API calls per hour from the same IP address, + // therefore we check first if we have API calls left. + // If not we display a proper error message! + var remaining; + $.getJSON('https://api.github.com/rate_limit', function (data) { + remaining = data.rate.remaining; + console.log(remaining) + if(remaining > 0) { + console.log(url) + $.getJSON(url, function (data) { + $.each(data, function (index) { + + // Assignee can be nil + var mentor = this.assignee ? this.assignee.login : this.user.login; + var mentor_url = this.assignee ? this.assignee.html_url : this.user.html_url; + + // Add the rows to the tables + var row = "" + this.title + "" + + " together with " + mentor + "" + + "Yes, let's do it"; + + var title = this.title; + console.log("TITLE IS", title); + console.log("Assingme: " + this.mentor); + console.log(row) + + $.each(this.labels, function () { + var name = this.name.split(' '); + name = name[name.length -1]; + $('.' + name + '-table tbody').append(row); + $('.' + name + '-table').show(); + $('.' + name + '-placeholder').remove(); + }); + + gsoc_hint = get_gsoc_hint(this.labels); + console.log(gsoc_hint); + + // Add the modal for the project + var modal = ""; + $('footer').after(modal); + $('.project-placeholder').html("Sorry but currently we don't have any mentoring project ...") + }); + }); + } + else{ + $('.project-placeholder').html("Sorry but it seems like you exceeded the allowed number of requests. Please have a look at our issues!") + } + }); +}); + +function get_gsoc_hint(labels){ + result = ""; + current_url = window.location.href; + for(var i = 0; i < labels.length; i++) { + if (labels[i].name == 'GSoC-2024') { + if(current_url.indexOf('gsoc') > -1) { + url = current_url; + } + else{ + url = current_url + "/gsoc"; + } + result = "

You can do this project as part of the Google Summer of Code program.

" + break; + } + } + return result; +} diff --git a/js/landing-page.js b/js/landing-page.js new file mode 100644 index 0000000..47caa0f --- /dev/null +++ b/js/landing-page.js @@ -0,0 +1,33 @@ +// jQuery for page scrolling feature - requires jQuery Easing plugin +$(function() { + $('a.page-scroll').bind('click', function(event) { + var $anchor = $(this); + // this is monkey patched... + nav_link = $anchor.attr('href').split('#'); + $('html, body').stop().animate({ + scrollTop: $('#' + nav_link[1]).offset().top + }, 1500, 'easeInOutExpo'); + event.preventDefault(); + }); +}); + +// Highlight the top nav as scrolling occurs +$('body').scrollspy({ + target: '.navbar-fixed-top' +}) + +// Closes the Responsive Menu on Menu Item Click +$('.navbar-collapse ul li a').click(function() { + $('.navbar-toggle:visible').click(); +}); + +$('div.modal').on('show.bs.modal', function() { + var modal = this; + var hash = modal.id; + window.location.hash = hash; + window.onhashchange = function() { + if (!location.hash){ + $(modal).modal('hide'); + } + } +}); \ No newline at end of file diff --git a/js/markdown.js b/js/markdown.js new file mode 100644 index 0000000..d6faac6 --- /dev/null +++ b/js/markdown.js @@ -0,0 +1,1725 @@ +// Released under MIT license +// Copyright (c) 2009-2010 Dominic Baggott +// Copyright (c) 2009-2010 Ash Berlin +// Copyright (c) 2011 Christoph Dorn (http://www.christophdorn.com) + +/*jshint browser:true, devel:true */ + +(function( expose ) { + + /** + * class Markdown + * + * Markdown processing in Javascript done right. We have very particular views + * on what constitutes 'right' which include: + * + * - produces well-formed HTML (this means that em and strong nesting is + * important) + * + * - has an intermediate representation to allow processing of parsed data (We + * in fact have two, both as [JsonML]: a markdown tree and an HTML tree). + * + * - is easily extensible to add new dialects without having to rewrite the + * entire parsing mechanics + * + * - has a good test suite + * + * This implementation fulfills all of these (except that the test suite could + * do with expanding to automatically run all the fixtures from other Markdown + * implementations.) + * + * ##### Intermediate Representation + * + * *TODO* Talk about this :) Its JsonML, but document the node names we use. + * + * [JsonML]: http://jsonml.org/ "JSON Markup Language" + **/ + var Markdown = expose.Markdown = function(dialect) { + switch (typeof dialect) { + case "undefined": + this.dialect = Markdown.dialects.Gruber; + break; + case "object": + this.dialect = dialect; + break; + default: + if ( dialect in Markdown.dialects ) { + this.dialect = Markdown.dialects[dialect]; + } + else { + throw new Error("Unknown Markdown dialect '" + String(dialect) + "'"); + } + break; + } + this.em_state = []; + this.strong_state = []; + this.debug_indent = ""; + }; + + /** + * parse( markdown, [dialect] ) -> JsonML + * - markdown (String): markdown string to parse + * - dialect (String | Dialect): the dialect to use, defaults to gruber + * + * Parse `markdown` and return a markdown document as a Markdown.JsonML tree. + **/ + expose.parse = function( source, dialect ) { + // dialect will default if undefined + var md = new Markdown( dialect ); + return md.toTree( source ); + }; + + /** + * toHTML( markdown, [dialect] ) -> String + * toHTML( md_tree ) -> String + * - markdown (String): markdown string to parse + * - md_tree (Markdown.JsonML): parsed markdown tree + * + * Take markdown (either as a string or as a JsonML tree) and run it through + * [[toHTMLTree]] then turn it into a well-formated HTML fragment. + **/ + expose.toHTML = function toHTML( source , dialect , options ) { + var input = expose.toHTMLTree( source , dialect , options ); + + return expose.renderJsonML( input ); + }; + + /** + * toHTMLTree( markdown, [dialect] ) -> JsonML + * toHTMLTree( md_tree ) -> JsonML + * - markdown (String): markdown string to parse + * - dialect (String | Dialect): the dialect to use, defaults to gruber + * - md_tree (Markdown.JsonML): parsed markdown tree + * + * Turn markdown into HTML, represented as a JsonML tree. If a string is given + * to this function, it is first parsed into a markdown tree by calling + * [[parse]]. + **/ + expose.toHTMLTree = function toHTMLTree( input, dialect , options ) { + // convert string input to an MD tree + if ( typeof input ==="string" ) input = this.parse( input, dialect ); + + // Now convert the MD tree to an HTML tree + + // remove references from the tree + var attrs = extract_attr( input ), + refs = {}; + + if ( attrs && attrs.references ) { + refs = attrs.references; + } + + var html = convert_tree_to_html( input, refs , options ); + merge_text_nodes( html ); + return html; + }; + +// For Spidermonkey based engines + function mk_block_toSource() { + return "Markdown.mk_block( " + + uneval(this.toString()) + + ", " + + uneval(this.trailing) + + ", " + + uneval(this.lineNumber) + + " )"; + } + +// node + function mk_block_inspect() { + var util = require("util"); + return "Markdown.mk_block( " + + util.inspect(this.toString()) + + ", " + + util.inspect(this.trailing) + + ", " + + util.inspect(this.lineNumber) + + " )"; + + } + + var mk_block = Markdown.mk_block = function(block, trail, line) { + // Be helpful for default case in tests. + if ( arguments.length == 1 ) trail = "\n\n"; + + var s = new String(block); + s.trailing = trail; + // To make it clear its not just a string + s.inspect = mk_block_inspect; + s.toSource = mk_block_toSource; + + if ( line != undefined ) + s.lineNumber = line; + + return s; + }; + + function count_lines( str ) { + var n = 0, i = -1; + while ( ( i = str.indexOf("\n", i + 1) ) !== -1 ) n++; + return n; + } + +// Internal - split source into rough blocks + Markdown.prototype.split_blocks = function splitBlocks( input, startLine ) { + input = input.replace(/(\r\n|\n|\r)/g, "\n"); + // [\s\S] matches _anything_ (newline or space) + // [^] is equivalent but doesn't work in IEs. + var re = /([\s\S]+?)($|\n#|\n(?:\s*\n|$)+)/g, + blocks = [], + m; + + var line_no = 1; + + if ( ( m = /^(\s*\n)/.exec(input) ) != null ) { + // skip (but count) leading blank lines + line_no += count_lines( m[0] ); + re.lastIndex = m[0].length; + } + + while ( ( m = re.exec(input) ) !== null ) { + if (m[2] == "\n#") { + m[2] = "\n"; + re.lastIndex--; + } + blocks.push( mk_block( m[1], m[2], line_no ) ); + line_no += count_lines( m[0] ); + } + + return blocks; + }; + + /** + * Markdown#processBlock( block, next ) -> undefined | [ JsonML, ... ] + * - block (String): the block to process + * - next (Array): the following blocks + * + * Process `block` and return an array of JsonML nodes representing `block`. + * + * It does this by asking each block level function in the dialect to process + * the block until one can. Succesful handling is indicated by returning an + * array (with zero or more JsonML nodes), failure by a false value. + * + * Blocks handlers are responsible for calling [[Markdown#processInline]] + * themselves as appropriate. + * + * If the blocks were split incorrectly or adjacent blocks need collapsing you + * can adjust `next` in place using shift/splice etc. + * + * If any of this default behaviour is not right for the dialect, you can + * define a `__call__` method on the dialect that will get invoked to handle + * the block processing. + */ + Markdown.prototype.processBlock = function processBlock( block, next ) { + var cbs = this.dialect.block, + ord = cbs.__order__; + + if ( "__call__" in cbs ) { + return cbs.__call__.call(this, block, next); + } + + for ( var i = 0; i < ord.length; i++ ) { + //D:this.debug( "Testing", ord[i] ); + var res = cbs[ ord[i] ].call( this, block, next ); + if ( res ) { + //D:this.debug(" matched"); + if ( !isArray(res) || ( res.length > 0 && !( isArray(res[0]) ) ) ) + this.debug(ord[i], "didn't return a proper array"); + //D:this.debug( "" ); + return res; + } + } + + // Uhoh! no match! Should we throw an error? + return []; + }; + + Markdown.prototype.processInline = function processInline( block ) { + return this.dialect.inline.__call__.call( this, String( block ) ); + }; + + /** + * Markdown#toTree( source ) -> JsonML + * - source (String): markdown source to parse + * + * Parse `source` into a JsonML tree representing the markdown document. + **/ +// custom_tree means set this.tree to `custom_tree` and restore old value on return + Markdown.prototype.toTree = function toTree( source, custom_root ) { + var blocks = source instanceof Array ? source : this.split_blocks( source ); + + // Make tree a member variable so its easier to mess with in extensions + var old_tree = this.tree; + try { + this.tree = custom_root || this.tree || [ "markdown" ]; + + blocks: + while ( blocks.length ) { + var b = this.processBlock( blocks.shift(), blocks ); + + // Reference blocks and the like won't return any content + if ( !b.length ) continue blocks; + + this.tree.push.apply( this.tree, b ); + } + return this.tree; + } + finally { + if ( custom_root ) { + this.tree = old_tree; + } + } + }; + +// Noop by default + Markdown.prototype.debug = function () { + var args = Array.prototype.slice.call( arguments); + args.unshift(this.debug_indent); + if ( typeof print !== "undefined" ) + print.apply( print, args ); + if ( typeof console !== "undefined" && typeof console.log !== "undefined" ) + console.log.apply( null, args ); + } + + Markdown.prototype.loop_re_over_block = function( re, block, cb ) { + // Dont use /g regexps with this + var m, + b = block.valueOf(); + + while ( b.length && (m = re.exec(b) ) != null ) { + b = b.substr( m[0].length ); + cb.call(this, m); + } + return b; + }; + + /** + * Markdown.dialects + * + * Namespace of built-in dialects. + **/ + Markdown.dialects = {}; + + /** + * Markdown.dialects.Gruber + * + * The default dialect that follows the rules set out by John Gruber's + * markdown.pl as closely as possible. Well actually we follow the behaviour of + * that script which in some places is not exactly what the syntax web page + * says. + **/ + Markdown.dialects.Gruber = { + block: { + atxHeader: function atxHeader( block, next ) { + var m = block.match( /^(#{1,6})\s*(.*?)\s*#*\s*(?:\n|$)/ ); + + if ( !m ) return undefined; + + var header = [ "header", { level: m[ 1 ].length } ]; + Array.prototype.push.apply(header, this.processInline(m[ 2 ])); + + if ( m[0].length < block.length ) + next.unshift( mk_block( block.substr( m[0].length ), block.trailing, block.lineNumber + 2 ) ); + + return [ header ]; + }, + + setextHeader: function setextHeader( block, next ) { + var m = block.match( /^(.*)\n([-=])\2\2+(?:\n|$)/ ); + + if ( !m ) return undefined; + + var level = ( m[ 2 ] === "=" ) ? 1 : 2; + var header = [ "header", { level : level }, m[ 1 ] ]; + + if ( m[0].length < block.length ) + next.unshift( mk_block( block.substr( m[0].length ), block.trailing, block.lineNumber + 2 ) ); + + return [ header ]; + }, + + code: function code( block, next ) { + // | Foo + // |bar + // should be a code block followed by a paragraph. Fun + // + // There might also be adjacent code block to merge. + + var ret = [], + re = /^(?: {0,3}\t| {4})(.*)\n?/, + lines; + + // 4 spaces + content + if ( !block.match( re ) ) return undefined; + + block_search: + do { + // Now pull out the rest of the lines + var b = this.loop_re_over_block( + re, block.valueOf(), function( m ) { ret.push( m[1] ); } ); + + if ( b.length ) { + // Case alluded to in first comment. push it back on as a new block + next.unshift( mk_block(b, block.trailing) ); + break block_search; + } + else if ( next.length ) { + // Check the next block - it might be code too + if ( !next[0].match( re ) ) break block_search; + + // Pull how how many blanks lines follow - minus two to account for .join + ret.push ( block.trailing.replace(/[^\n]/g, "").substring(2) ); + + block = next.shift(); + } + else { + break block_search; + } + } while ( true ); + + return [ [ "code_block", ret.join("\n") ] ]; + }, + + horizRule: function horizRule( block, next ) { + // this needs to find any hr in the block to handle abutting blocks + var m = block.match( /^(?:([\s\S]*?)\n)?[ \t]*([-_*])(?:[ \t]*\2){2,}[ \t]*(?:\n([\s\S]*))?$/ ); + + if ( !m ) { + return undefined; + } + + var jsonml = [ [ "hr" ] ]; + + // if there's a leading abutting block, process it + if ( m[ 1 ] ) { + jsonml.unshift.apply( jsonml, this.processBlock( m[ 1 ], [] ) ); + } + + // if there's a trailing abutting block, stick it into next + if ( m[ 3 ] ) { + next.unshift( mk_block( m[ 3 ] ) ); + } + + return jsonml; + }, + + // There are two types of lists. Tight and loose. Tight lists have no whitespace + // between the items (and result in text just in the
  • ) and loose lists, + // which have an empty line between list items, resulting in (one or more) + // paragraphs inside the
  • . + // + // There are all sorts weird edge cases about the original markdown.pl's + // handling of lists: + // + // * Nested lists are supposed to be indented by four chars per level. But + // if they aren't, you can get a nested list by indenting by less than + // four so long as the indent doesn't match an indent of an existing list + // item in the 'nest stack'. + // + // * The type of the list (bullet or number) is controlled just by the + // first item at the indent. Subsequent changes are ignored unless they + // are for nested lists + // + lists: (function( ) { + // Use a closure to hide a few variables. + var any_list = "[*+-]|\\d+\\.", + bullet_list = /[*+-]/, + number_list = /\d+\./, + // Capture leading indent as it matters for determining nested lists. + is_list_re = new RegExp( "^( {0,3})(" + any_list + ")[ \t]+" ), + indent_re = "(?: {0,3}\\t| {4})"; + + // TODO: Cache this regexp for certain depths. + // Create a regexp suitable for matching an li for a given stack depth + function regex_for_depth( depth ) { + + return new RegExp( + // m[1] = indent, m[2] = list_type + "(?:^(" + indent_re + "{0," + depth + "} {0,3})(" + any_list + ")\\s+)|" + + // m[3] = cont + "(^" + indent_re + "{0," + (depth-1) + "}[ ]{0,4})" + ); + } + function expand_tab( input ) { + return input.replace( / {0,3}\t/g, " " ); + } + + // Add inline content `inline` to `li`. inline comes from processInline + // so is an array of content + function add(li, loose, inline, nl) { + if ( loose ) { + li.push( [ "para" ].concat(inline) ); + return; + } + // Hmmm, should this be any block level element or just paras? + var add_to = li[li.length -1] instanceof Array && li[li.length - 1][0] == "para" + ? li[li.length -1] + : li; + + // If there is already some content in this list, add the new line in + if ( nl && li.length > 1 ) inline.unshift(nl); + + for ( var i = 0; i < inline.length; i++ ) { + var what = inline[i], + is_str = typeof what == "string"; + if ( is_str && add_to.length > 1 && typeof add_to[add_to.length-1] == "string" ) { + add_to[ add_to.length-1 ] += what; + } + else { + add_to.push( what ); + } + } + } + + // contained means have an indent greater than the current one. On + // *every* line in the block + function get_contained_blocks( depth, blocks ) { + + var re = new RegExp( "^(" + indent_re + "{" + depth + "}.*?\\n?)*$" ), + replace = new RegExp("^" + indent_re + "{" + depth + "}", "gm"), + ret = []; + + while ( blocks.length > 0 ) { + if ( re.exec( blocks[0] ) ) { + var b = blocks.shift(), + // Now remove that indent + x = b.replace( replace, ""); + + ret.push( mk_block( x, b.trailing, b.lineNumber ) ); + } + else { + break; + } + } + return ret; + } + + // passed to stack.forEach to turn list items up the stack into paras + function paragraphify(s, i, stack) { + var list = s.list; + var last_li = list[list.length-1]; + + if ( last_li[1] instanceof Array && last_li[1][0] == "para" ) { + return; + } + if ( i + 1 == stack.length ) { + // Last stack frame + // Keep the same array, but replace the contents + last_li.push( ["para"].concat( last_li.splice(1, last_li.length - 1) ) ); + } + else { + var sublist = last_li.pop(); + last_li.push( ["para"].concat( last_li.splice(1, last_li.length - 1) ), sublist ); + } + } + + // The matcher function + return function( block, next ) { + var m = block.match( is_list_re ); + if ( !m ) return undefined; + + function make_list( m ) { + var list = bullet_list.exec( m[2] ) + ? ["bulletlist"] + : ["numberlist"]; + + stack.push( { list: list, indent: m[1] } ); + return list; + } + + + var stack = [], // Stack of lists for nesting. + list = make_list( m ), + last_li, + loose = false, + ret = [ stack[0].list ], + i; + + // Loop to search over block looking for inner block elements and loose lists + loose_search: + while ( true ) { + // Split into lines preserving new lines at end of line + var lines = block.split( /(?=\n)/ ); + + // We have to grab all lines for a li and call processInline on them + // once as there are some inline things that can span lines. + var li_accumulate = ""; + + // Loop over the lines in this block looking for tight lists. + tight_search: + for ( var line_no = 0; line_no < lines.length; line_no++ ) { + var nl = "", + l = lines[line_no].replace(/^\n/, function(n) { nl = n; return ""; }); + + // TODO: really should cache this + var line_re = regex_for_depth( stack.length ); + + m = l.match( line_re ); + //print( "line:", uneval(l), "\nline match:", uneval(m) ); + + // We have a list item + if ( m[1] !== undefined ) { + // Process the previous list item, if any + if ( li_accumulate.length ) { + add( last_li, loose, this.processInline( li_accumulate ), nl ); + // Loose mode will have been dealt with. Reset it + loose = false; + li_accumulate = ""; + } + + m[1] = expand_tab( m[1] ); + var wanted_depth = Math.floor(m[1].length/4)+1; + //print( "want:", wanted_depth, "stack:", stack.length); + if ( wanted_depth > stack.length ) { + // Deep enough for a nested list outright + //print ( "new nested list" ); + list = make_list( m ); + last_li.push( list ); + last_li = list[1] = [ "listitem" ]; + } + else { + // We aren't deep enough to be strictly a new level. This is + // where Md.pl goes nuts. If the indent matches a level in the + // stack, put it there, else put it one deeper then the + // wanted_depth deserves. + var found = false; + for ( i = 0; i < stack.length; i++ ) { + if ( stack[ i ].indent != m[1] ) continue; + list = stack[ i ].list; + stack.splice( i+1, stack.length - (i+1) ); + found = true; + break; + } + + if (!found) { + //print("not found. l:", uneval(l)); + wanted_depth++; + if ( wanted_depth <= stack.length ) { + stack.splice(wanted_depth, stack.length - wanted_depth); + //print("Desired depth now", wanted_depth, "stack:", stack.length); + list = stack[wanted_depth-1].list; + //print("list:", uneval(list) ); + } + else { + //print ("made new stack for messy indent"); + list = make_list(m); + last_li.push(list); + } + } + + //print( uneval(list), "last", list === stack[stack.length-1].list ); + last_li = [ "listitem" ]; + list.push(last_li); + } // end depth of shenegains + nl = ""; + } + + // Add content + if ( l.length > m[0].length ) { + li_accumulate += nl + l.substr( m[0].length ); + } + } // tight_search + + if ( li_accumulate.length ) { + add( last_li, loose, this.processInline( li_accumulate ), nl ); + // Loose mode will have been dealt with. Reset it + loose = false; + li_accumulate = ""; + } + + // Look at the next block - we might have a loose list. Or an extra + // paragraph for the current li + var contained = get_contained_blocks( stack.length, next ); + + // Deal with code blocks or properly nested lists + if ( contained.length > 0 ) { + // Make sure all listitems up the stack are paragraphs + forEach( stack, paragraphify, this); + + last_li.push.apply( last_li, this.toTree( contained, [] ) ); + } + + var next_block = next[0] && next[0].valueOf() || ""; + + if ( next_block.match(is_list_re) || next_block.match( /^ / ) ) { + block = next.shift(); + + // Check for an HR following a list: features/lists/hr_abutting + var hr = this.dialect.block.horizRule( block, next ); + + if ( hr ) { + ret.push.apply(ret, hr); + break; + } + + // Make sure all listitems up the stack are paragraphs + forEach( stack, paragraphify, this); + + loose = true; + continue loose_search; + } + break; + } // loose_search + + return ret; + }; + })(), + + blockquote: function blockquote( block, next ) { + if ( !block.match( /^>/m ) ) + return undefined; + + var jsonml = []; + + // separate out the leading abutting block, if any. I.e. in this case: + // + // a + // > b + // + if ( block[ 0 ] != ">" ) { + var lines = block.split( /\n/ ), + prev = [], + line_no = block.lineNumber; + + // keep shifting lines until you find a crotchet + while ( lines.length && lines[ 0 ][ 0 ] != ">" ) { + prev.push( lines.shift() ); + line_no++; + } + + var abutting = mk_block( prev.join( "\n" ), "\n", block.lineNumber ); + jsonml.push.apply( jsonml, this.processBlock( abutting, [] ) ); + // reassemble new block of just block quotes! + block = mk_block( lines.join( "\n" ), block.trailing, line_no ); + } + + + // if the next block is also a blockquote merge it in + while ( next.length && next[ 0 ][ 0 ] == ">" ) { + var b = next.shift(); + block = mk_block( block + block.trailing + b, b.trailing, block.lineNumber ); + } + + // Strip off the leading "> " and re-process as a block. + var input = block.replace( /^> ?/gm, "" ), + old_tree = this.tree, + processedBlock = this.toTree( input, [ "blockquote" ] ), + attr = extract_attr( processedBlock ); + + // If any link references were found get rid of them + if ( attr && attr.references ) { + delete attr.references; + // And then remove the attribute object if it's empty + if ( isEmpty( attr ) ) { + processedBlock.splice( 1, 1 ); + } + } + + jsonml.push( processedBlock ); + return jsonml; + }, + + referenceDefn: function referenceDefn( block, next) { + var re = /^\s*\[(.*?)\]:\s*(\S+)(?:\s+(?:(['"])(.*?)\3|\((.*?)\)))?\n?/; + // interesting matches are [ , ref_id, url, , title, title ] + + if ( !block.match(re) ) + return undefined; + + // make an attribute node if it doesn't exist + if ( !extract_attr( this.tree ) ) { + this.tree.splice( 1, 0, {} ); + } + + var attrs = extract_attr( this.tree ); + + // make a references hash if it doesn't exist + if ( attrs.references === undefined ) { + attrs.references = {}; + } + + var b = this.loop_re_over_block(re, block, function( m ) { + + if ( m[2] && m[2][0] == "<" && m[2][m[2].length-1] == ">" ) + m[2] = m[2].substring( 1, m[2].length - 1 ); + + var ref = attrs.references[ m[1].toLowerCase() ] = { + href: m[2] + }; + + if ( m[4] !== undefined ) + ref.title = m[4]; + else if ( m[5] !== undefined ) + ref.title = m[5]; + + } ); + + if ( b.length ) + next.unshift( mk_block( b, block.trailing ) ); + + return []; + }, + + para: function para( block, next ) { + // everything's a para! + return [ ["para"].concat( this.processInline( block ) ) ]; + } + } + }; + + Markdown.dialects.Gruber.inline = { + + __oneElement__: function oneElement( text, patterns_or_re, previous_nodes ) { + var m, + res, + lastIndex = 0; + + patterns_or_re = patterns_or_re || this.dialect.inline.__patterns__; + var re = new RegExp( "([\\s\\S]*?)(" + (patterns_or_re.source || patterns_or_re) + ")" ); + + m = re.exec( text ); + if (!m) { + // Just boring text + return [ text.length, text ]; + } + else if ( m[1] ) { + // Some un-interesting text matched. Return that first + return [ m[1].length, m[1] ]; + } + + var res; + if ( m[2] in this.dialect.inline ) { + res = this.dialect.inline[ m[2] ].call( + this, + text.substr( m.index ), m, previous_nodes || [] ); + } + // Default for now to make dev easier. just slurp special and output it. + res = res || [ m[2].length, m[2] ]; + return res; + }, + + __call__: function inline( text, patterns ) { + + var out = [], + res; + + function add(x) { + //D:self.debug(" adding output", uneval(x)); + if ( typeof x == "string" && typeof out[out.length-1] == "string" ) + out[ out.length-1 ] += x; + else + out.push(x); + } + + while ( text.length > 0 ) { + res = this.dialect.inline.__oneElement__.call(this, text, patterns, out ); + text = text.substr( res.shift() ); + forEach(res, add ) + } + + return out; + }, + + // These characters are intersting elsewhere, so have rules for them so that + // chunks of plain text blocks don't include them + "]": function () {}, + "}": function () {}, + + __escape__ : /^\\[\\`\*_{}\[\]()#\+.!\-]/, + + "\\": function escaped( text ) { + // [ length of input processed, node/children to add... ] + // Only esacape: \ ` * _ { } [ ] ( ) # * + - . ! + if ( this.dialect.inline.__escape__.exec( text ) ) + return [ 2, text.charAt( 1 ) ]; + else + // Not an esacpe + return [ 1, "\\" ]; + }, + + "![": function image( text ) { + + // Unlike images, alt text is plain text only. no other elements are + // allowed in there + + // ![Alt text](/path/to/img.jpg "Optional title") + // 1 2 3 4 <--- captures + var m = text.match( /^!\[(.*?)\][ \t]*\([ \t]*([^")]*?)(?:[ \t]+(["'])(.*?)\3)?[ \t]*\)/ ); + + if ( m ) { + if ( m[2] && m[2][0] == "<" && m[2][m[2].length-1] == ">" ) + m[2] = m[2].substring( 1, m[2].length - 1 ); + + m[2] = this.dialect.inline.__call__.call( this, m[2], /\\/ )[0]; + + var attrs = { alt: m[1], href: m[2] || "" }; + if ( m[4] !== undefined) + attrs.title = m[4]; + + return [ m[0].length, [ "img", attrs ] ]; + } + + // ![Alt text][id] + m = text.match( /^!\[(.*?)\][ \t]*\[(.*?)\]/ ); + + if ( m ) { + // We can't check if the reference is known here as it likely wont be + // found till after. Check it in md tree->hmtl tree conversion + return [ m[0].length, [ "img_ref", { alt: m[1], ref: m[2].toLowerCase(), original: m[0] } ] ]; + } + + // Just consume the '![' + return [ 2, "![" ]; + }, + + "[": function link( text ) { + + var orig = String(text); + // Inline content is possible inside `link text` + var res = Markdown.DialectHelpers.inline_until_char.call( this, text.substr(1), "]" ); + + // No closing ']' found. Just consume the [ + if ( !res ) return [ 1, "[" ]; + + var consumed = 1 + res[ 0 ], + children = res[ 1 ], + link, + attrs; + + // At this point the first [...] has been parsed. See what follows to find + // out which kind of link we are (reference or direct url) + text = text.substr( consumed ); + + // [link text](/path/to/img.jpg "Optional title") + // 1 2 3 <--- captures + // This will capture up to the last paren in the block. We then pull + // back based on if there a matching ones in the url + // ([here](/url/(test)) + // The parens have to be balanced + var m = text.match( /^\s*\([ \t]*([^"']*)(?:[ \t]+(["'])(.*?)\2)?[ \t]*\)/ ); + if ( m ) { + var url = m[1]; + consumed += m[0].length; + + if ( url && url[0] == "<" && url[url.length-1] == ">" ) + url = url.substring( 1, url.length - 1 ); + + // If there is a title we don't have to worry about parens in the url + if ( !m[3] ) { + var open_parens = 1; // One open that isn't in the capture + for ( var len = 0; len < url.length; len++ ) { + switch ( url[len] ) { + case "(": + open_parens++; + break; + case ")": + if ( --open_parens == 0) { + consumed -= url.length - len; + url = url.substring(0, len); + } + break; + } + } + } + + // Process escapes only + url = this.dialect.inline.__call__.call( this, url, /\\/ )[0]; + + attrs = { href: url || "" }; + if ( m[3] !== undefined) + attrs.title = m[3]; + + link = [ "link", attrs ].concat( children ); + return [ consumed, link ]; + } + + // [Alt text][id] + // [Alt text] [id] + m = text.match( /^\s*\[(.*?)\]/ ); + + if ( m ) { + + consumed += m[ 0 ].length; + + // [links][] uses links as its reference + attrs = { ref: ( m[ 1 ] || String(children) ).toLowerCase(), original: orig.substr( 0, consumed ) }; + + link = [ "link_ref", attrs ].concat( children ); + + // We can't check if the reference is known here as it likely wont be + // found till after. Check it in md tree->hmtl tree conversion. + // Store the original so that conversion can revert if the ref isn't found. + return [ consumed, link ]; + } + + // [id] + // Only if id is plain (no formatting.) + if ( children.length == 1 && typeof children[0] == "string" ) { + + attrs = { ref: children[0].toLowerCase(), original: orig.substr( 0, consumed ) }; + link = [ "link_ref", attrs, children[0] ]; + return [ consumed, link ]; + } + + // Just consume the "[" + return [ 1, "[" ]; + }, + + + "<": function autoLink( text ) { + var m; + + if ( ( m = text.match( /^<(?:((https?|ftp|mailto):[^>]+)|(.*?@.*?\.[a-zA-Z]+))>/ ) ) != null ) { + if ( m[3] ) { + return [ m[0].length, [ "link", { href: "mailto:" + m[3] }, m[3] ] ]; + + } + else if ( m[2] == "mailto" ) { + return [ m[0].length, [ "link", { href: m[1] }, m[1].substr("mailto:".length ) ] ]; + } + else + return [ m[0].length, [ "link", { href: m[1] }, m[1] ] ]; + } + + return [ 1, "<" ]; + }, + + "`": function inlineCode( text ) { + // Inline code block. as many backticks as you like to start it + // Always skip over the opening ticks. + var m = text.match( /(`+)(([\s\S]*?)\1)/ ); + + if ( m && m[2] ) + return [ m[1].length + m[2].length, [ "inlinecode", m[3] ] ]; + else { + // TODO: No matching end code found - warn! + return [ 1, "`" ]; + } + }, + + " \n": function lineBreak( text ) { + return [ 3, [ "linebreak" ] ]; + } + + }; + +// Meta Helper/generator method for em and strong handling + function strong_em( tag, md ) { + + var state_slot = tag + "_state", + other_slot = tag == "strong" ? "em_state" : "strong_state"; + + function CloseTag(len) { + this.len_after = len; + this.name = "close_" + md; + } + + return function ( text, orig_match ) { + + if ( this[state_slot][0] == md ) { + // Most recent em is of this type + //D:this.debug("closing", md); + this[state_slot].shift(); + + // "Consume" everything to go back to the recrusion in the else-block below + return[ text.length, new CloseTag(text.length-md.length) ]; + } + else { + // Store a clone of the em/strong states + var other = this[other_slot].slice(), + state = this[state_slot].slice(); + + this[state_slot].unshift(md); + + //D:this.debug_indent += " "; + + // Recurse + var res = this.processInline( text.substr( md.length ) ); + //D:this.debug_indent = this.debug_indent.substr(2); + + var last = res[res.length - 1]; + + //D:this.debug("processInline from", tag + ": ", uneval( res ) ); + + var check = this[state_slot].shift(); + if ( last instanceof CloseTag ) { + res.pop(); + // We matched! Huzzah. + var consumed = text.length - last.len_after; + return [ consumed, [ tag ].concat(res) ]; + } + else { + // Restore the state of the other kind. We might have mistakenly closed it. + this[other_slot] = other; + this[state_slot] = state; + + // We can't reuse the processed result as it could have wrong parsing contexts in it. + return [ md.length, md ]; + } + } + }; // End returned function + } + + Markdown.dialects.Gruber.inline["**"] = strong_em("strong", "**"); + Markdown.dialects.Gruber.inline["__"] = strong_em("strong", "__"); + Markdown.dialects.Gruber.inline["*"] = strong_em("em", "*"); + Markdown.dialects.Gruber.inline["_"] = strong_em("em", "_"); + + +// Build default order from insertion order. + Markdown.buildBlockOrder = function(d) { + var ord = []; + for ( var i in d ) { + if ( i == "__order__" || i == "__call__" ) continue; + ord.push( i ); + } + d.__order__ = ord; + }; + +// Build patterns for inline matcher + Markdown.buildInlinePatterns = function(d) { + var patterns = []; + + for ( var i in d ) { + // __foo__ is reserved and not a pattern + if ( i.match( /^__.*__$/) ) continue; + var l = i.replace( /([\\.*+?|()\[\]{}])/g, "\\$1" ) + .replace( /\n/, "\\n" ); + patterns.push( i.length == 1 ? l : "(?:" + l + ")" ); + } + + patterns = patterns.join("|"); + d.__patterns__ = patterns; + //print("patterns:", uneval( patterns ) ); + + var fn = d.__call__; + d.__call__ = function(text, pattern) { + if ( pattern != undefined ) { + return fn.call(this, text, pattern); + } + else + { + return fn.call(this, text, patterns); + } + }; + }; + + Markdown.DialectHelpers = {}; + Markdown.DialectHelpers.inline_until_char = function( text, want ) { + var consumed = 0, + nodes = []; + + while ( true ) { + if ( text.charAt( consumed ) == want ) { + // Found the character we were looking for + consumed++; + return [ consumed, nodes ]; + } + + if ( consumed >= text.length ) { + // No closing char found. Abort. + return null; + } + + var res = this.dialect.inline.__oneElement__.call(this, text.substr( consumed ) ); + consumed += res[ 0 ]; + // Add any returned nodes. + nodes.push.apply( nodes, res.slice( 1 ) ); + } + } + +// Helper function to make sub-classing a dialect easier + Markdown.subclassDialect = function( d ) { + function Block() {} + Block.prototype = d.block; + function Inline() {} + Inline.prototype = d.inline; + + return { block: new Block(), inline: new Inline() }; + }; + + Markdown.buildBlockOrder ( Markdown.dialects.Gruber.block ); + Markdown.buildInlinePatterns( Markdown.dialects.Gruber.inline ); + + Markdown.dialects.Maruku = Markdown.subclassDialect( Markdown.dialects.Gruber ); + + Markdown.dialects.Maruku.processMetaHash = function processMetaHash( meta_string ) { + var meta = split_meta_hash( meta_string ), + attr = {}; + + for ( var i = 0; i < meta.length; ++i ) { + // id: #foo + if ( /^#/.test( meta[ i ] ) ) { + attr.id = meta[ i ].substring( 1 ); + } + // class: .foo + else if ( /^\./.test( meta[ i ] ) ) { + // if class already exists, append the new one + if ( attr["class"] ) { + attr["class"] = attr["class"] + meta[ i ].replace( /./, " " ); + } + else { + attr["class"] = meta[ i ].substring( 1 ); + } + } + // attribute: foo=bar + else if ( /\=/.test( meta[ i ] ) ) { + var s = meta[ i ].split( /\=/ ); + attr[ s[ 0 ] ] = s[ 1 ]; + } + } + + return attr; + } + + function split_meta_hash( meta_string ) { + var meta = meta_string.split( "" ), + parts = [ "" ], + in_quotes = false; + + while ( meta.length ) { + var letter = meta.shift(); + switch ( letter ) { + case " " : + // if we're in a quoted section, keep it + if ( in_quotes ) { + parts[ parts.length - 1 ] += letter; + } + // otherwise make a new part + else { + parts.push( "" ); + } + break; + case "'" : + case '"' : + // reverse the quotes and move straight on + in_quotes = !in_quotes; + break; + case "\\" : + // shift off the next letter to be used straight away. + // it was escaped so we'll keep it whatever it is + letter = meta.shift(); + default : + parts[ parts.length - 1 ] += letter; + break; + } + } + + return parts; + } + + Markdown.dialects.Maruku.block.document_meta = function document_meta( block, next ) { + // we're only interested in the first block + if ( block.lineNumber > 1 ) return undefined; + + // document_meta blocks consist of one or more lines of `Key: Value\n` + if ( ! block.match( /^(?:\w+:.*\n)*\w+:.*$/ ) ) return undefined; + + // make an attribute node if it doesn't exist + if ( !extract_attr( this.tree ) ) { + this.tree.splice( 1, 0, {} ); + } + + var pairs = block.split( /\n/ ); + for ( p in pairs ) { + var m = pairs[ p ].match( /(\w+):\s*(.*)$/ ), + key = m[ 1 ].toLowerCase(), + value = m[ 2 ]; + + this.tree[ 1 ][ key ] = value; + } + + // document_meta produces no content! + return []; + }; + + Markdown.dialects.Maruku.block.block_meta = function block_meta( block, next ) { + // check if the last line of the block is an meta hash + var m = block.match( /(^|\n) {0,3}\{:\s*((?:\\\}|[^\}])*)\s*\}$/ ); + if ( !m ) return undefined; + + // process the meta hash + var attr = this.dialect.processMetaHash( m[ 2 ] ); + + var hash; + + // if we matched ^ then we need to apply meta to the previous block + if ( m[ 1 ] === "" ) { + var node = this.tree[ this.tree.length - 1 ]; + hash = extract_attr( node ); + + // if the node is a string (rather than JsonML), bail + if ( typeof node === "string" ) return undefined; + + // create the attribute hash if it doesn't exist + if ( !hash ) { + hash = {}; + node.splice( 1, 0, hash ); + } + + // add the attributes in + for ( a in attr ) { + hash[ a ] = attr[ a ]; + } + + // return nothing so the meta hash is removed + return []; + } + + // pull the meta hash off the block and process what's left + var b = block.replace( /\n.*$/, "" ), + result = this.processBlock( b, [] ); + + // get or make the attributes hash + hash = extract_attr( result[ 0 ] ); + if ( !hash ) { + hash = {}; + result[ 0 ].splice( 1, 0, hash ); + } + + // attach the attributes to the block + for ( a in attr ) { + hash[ a ] = attr[ a ]; + } + + return result; + }; + + Markdown.dialects.Maruku.block.definition_list = function definition_list( block, next ) { + // one or more terms followed by one or more definitions, in a single block + var tight = /^((?:[^\s:].*\n)+):\s+([\s\S]+)$/, + list = [ "dl" ], + i, m; + + // see if we're dealing with a tight or loose block + if ( ( m = block.match( tight ) ) ) { + // pull subsequent tight DL blocks out of `next` + var blocks = [ block ]; + while ( next.length && tight.exec( next[ 0 ] ) ) { + blocks.push( next.shift() ); + } + + for ( var b = 0; b < blocks.length; ++b ) { + var m = blocks[ b ].match( tight ), + terms = m[ 1 ].replace( /\n$/, "" ).split( /\n/ ), + defns = m[ 2 ].split( /\n:\s+/ ); + + // print( uneval( m ) ); + + for ( i = 0; i < terms.length; ++i ) { + list.push( [ "dt", terms[ i ] ] ); + } + + for ( i = 0; i < defns.length; ++i ) { + // run inline processing over the definition + list.push( [ "dd" ].concat( this.processInline( defns[ i ].replace( /(\n)\s+/, "$1" ) ) ) ); + } + } + } + else { + return undefined; + } + + return [ list ]; + }; + +// splits on unescaped instances of @ch. If @ch is not a character the result +// can be unpredictable + + Markdown.dialects.Maruku.block.table = function table (block, next) { + + var _split_on_unescaped = function(s, ch) { + ch = ch || '\\s'; + if (ch.match(/^[\\|\[\]{}?*.+^$]$/)) { ch = '\\' + ch; } + var res = [ ], + r = new RegExp('^((?:\\\\.|[^\\\\' + ch + '])*)' + ch + '(.*)'), + m; + while(m = s.match(r)) { + res.push(m[1]); + s = m[2]; + } + res.push(s); + return res; + } + + var leading_pipe = /^ {0,3}\|(.+)\n {0,3}\|\s*([\-:]+[\-| :]*)\n((?:\s*\|.*(?:\n|$))*)(?=\n|$)/, + // find at least an unescaped pipe in each line + no_leading_pipe = /^ {0,3}(\S(?:\\.|[^\\|])*\|.*)\n {0,3}([\-:]+\s*\|[\-| :]*)\n((?:(?:\\.|[^\\|])*\|.*(?:\n|$))*)(?=\n|$)/, + i, m; + if (m = block.match(leading_pipe)) { + // remove leading pipes in contents + // (header and horizontal rule already have the leading pipe left out) + m[3] = m[3].replace(/^\s*\|/gm, ''); + } else if (! ( m = block.match(no_leading_pipe))) { + return undefined; + } + + var table = [ "table", [ "thead", [ "tr" ] ], [ "tbody" ] ]; + + // remove trailing pipes, then split on pipes + // (no escaped pipes are allowed in horizontal rule) + m[2] = m[2].replace(/\|\s*$/, '').split('|'); + + // process alignment + var html_attrs = [ ]; + forEach (m[2], function (s) { + if (s.match(/^\s*-+:\s*$/)) html_attrs.push({align: "right"}); + else if (s.match(/^\s*:-+\s*$/)) html_attrs.push({align: "left"}); + else if (s.match(/^\s*:-+:\s*$/)) html_attrs.push({align: "center"}); + else html_attrs.push({}); + }); + + // now for the header, avoid escaped pipes + m[1] = _split_on_unescaped(m[1].replace(/\|\s*$/, ''), '|'); + for (i = 0; i < m[1].length; i++) { + table[1][1].push(['th', html_attrs[i] || {}].concat( + this.processInline(m[1][i].trim()))); + } + + // now for body contents + forEach (m[3].replace(/\|\s*$/mg, '').split('\n'), function (row) { + var html_row = ['tr']; + row = _split_on_unescaped(row, '|'); + for (i = 0; i < row.length; i++) { + html_row.push(['td', html_attrs[i] || {}].concat(this.processInline(row[i].trim()))); + } + table[2].push(html_row); + }, this); + + return [table]; + } + + Markdown.dialects.Maruku.inline[ "{:" ] = function inline_meta( text, matches, out ) { + if ( !out.length ) { + return [ 2, "{:" ]; + } + + // get the preceeding element + var before = out[ out.length - 1 ]; + + if ( typeof before === "string" ) { + return [ 2, "{:" ]; + } + + // match a meta hash + var m = text.match( /^\{:\s*((?:\\\}|[^\}])*)\s*\}/ ); + + // no match, false alarm + if ( !m ) { + return [ 2, "{:" ]; + } + + // attach the attributes to the preceeding element + var meta = this.dialect.processMetaHash( m[ 1 ] ), + attr = extract_attr( before ); + + if ( !attr ) { + attr = {}; + before.splice( 1, 0, attr ); + } + + for ( var k in meta ) { + attr[ k ] = meta[ k ]; + } + + // cut out the string and replace it with nothing + return [ m[ 0 ].length, "" ]; + }; + + Markdown.dialects.Maruku.inline.__escape__ = /^\\[\\`\*_{}\[\]()#\+.!\-|:]/; + + Markdown.buildBlockOrder ( Markdown.dialects.Maruku.block ); + Markdown.buildInlinePatterns( Markdown.dialects.Maruku.inline ); + + var isArray = Array.isArray || function(obj) { + return Object.prototype.toString.call(obj) == "[object Array]"; + }; + + var forEach; +// Don't mess with Array.prototype. Its not friendly + if ( Array.prototype.forEach ) { + forEach = function( arr, cb, thisp ) { + return arr.forEach( cb, thisp ); + }; + } + else { + forEach = function(arr, cb, thisp) { + for (var i = 0; i < arr.length; i++) { + cb.call(thisp || arr, arr[i], i, arr); + } + } + } + + var isEmpty = function( obj ) { + for ( var key in obj ) { + if ( hasOwnProperty.call( obj, key ) ) { + return false; + } + } + + return true; + } + + function extract_attr( jsonml ) { + return isArray(jsonml) + && jsonml.length > 1 + && typeof jsonml[ 1 ] === "object" + && !( isArray(jsonml[ 1 ]) ) + ? jsonml[ 1 ] + : undefined; + } + + + + /** + * renderJsonML( jsonml[, options] ) -> String + * - jsonml (Array): JsonML array to render to XML + * - options (Object): options + * + * Converts the given JsonML into well-formed XML. + * + * The options currently understood are: + * + * - root (Boolean): wether or not the root node should be included in the + * output, or just its children. The default `false` is to not include the + * root itself. + */ + expose.renderJsonML = function( jsonml, options ) { + options = options || {}; + // include the root element in the rendered output? + options.root = options.root || false; + + var content = []; + + if ( options.root ) { + content.push( render_tree( jsonml ) ); + } + else { + jsonml.shift(); // get rid of the tag + if ( jsonml.length && typeof jsonml[ 0 ] === "object" && !( jsonml[ 0 ] instanceof Array ) ) { + jsonml.shift(); // get rid of the attributes + } + + while ( jsonml.length ) { + content.push( render_tree( jsonml.shift() ) ); + } + } + + return content.join( "\n\n" ); + }; + + function escapeHTML( text ) { + return text.replace( /&/g, "&" ) + .replace( //g, ">" ) + .replace( /"/g, """ ) + .replace( /'/g, "'" ); + } + + function render_tree( jsonml ) { + // basic case + if ( typeof jsonml === "string" ) { + return escapeHTML( jsonml ); + } + + var tag = jsonml.shift(), + attributes = {}, + content = []; + + if ( jsonml.length && typeof jsonml[ 0 ] === "object" && !( jsonml[ 0 ] instanceof Array ) ) { + attributes = jsonml.shift(); + } + + while ( jsonml.length ) { + content.push( render_tree( jsonml.shift() ) ); + } + + var tag_attrs = ""; + for ( var a in attributes ) { + tag_attrs += " " + a + '="' + escapeHTML( attributes[ a ] ) + '"'; + } + + // be careful about adding whitespace here for inline elements + if ( tag == "img" || tag == "br" || tag == "hr" ) { + return "<"+ tag + tag_attrs + "/>"; + } + else { + return "<"+ tag + tag_attrs + ">" + content.join( "" ) + ""; + } + } + + function convert_tree_to_html( tree, references, options ) { + var i; + options = options || {}; + + // shallow clone + var jsonml = tree.slice( 0 ); + + if ( typeof options.preprocessTreeNode === "function" ) { + jsonml = options.preprocessTreeNode(jsonml, references); + } + + // Clone attributes if they exist + var attrs = extract_attr( jsonml ); + if ( attrs ) { + jsonml[ 1 ] = {}; + for ( i in attrs ) { + jsonml[ 1 ][ i ] = attrs[ i ]; + } + attrs = jsonml[ 1 ]; + } + + // basic case + if ( typeof jsonml === "string" ) { + return jsonml; + } + + // convert this node + switch ( jsonml[ 0 ] ) { + case "header": + jsonml[ 0 ] = "h" + jsonml[ 1 ].level; + delete jsonml[ 1 ].level; + break; + case "bulletlist": + jsonml[ 0 ] = "ul"; + break; + case "numberlist": + jsonml[ 0 ] = "ol"; + break; + case "listitem": + jsonml[ 0 ] = "li"; + break; + case "para": + jsonml[ 0 ] = "p"; + break; + case "markdown": + jsonml[ 0 ] = "html"; + if ( attrs ) delete attrs.references; + break; + case "code_block": + jsonml[ 0 ] = "pre"; + i = attrs ? 2 : 1; + var code = [ "code" ]; + code.push.apply( code, jsonml.splice( i, jsonml.length - i ) ); + jsonml[ i ] = code; + break; + case "inlinecode": + jsonml[ 0 ] = "code"; + break; + case "img": + jsonml[ 1 ].src = jsonml[ 1 ].href; + delete jsonml[ 1 ].href; + break; + case "linebreak": + jsonml[ 0 ] = "br"; + break; + case "link": + jsonml[ 0 ] = "a"; + break; + case "link_ref": + jsonml[ 0 ] = "a"; + + // grab this ref and clean up the attribute node + var ref = references[ attrs.ref ]; + + // if the reference exists, make the link + if ( ref ) { + delete attrs.ref; + + // add in the href and title, if present + attrs.href = ref.href; + if ( ref.title ) { + attrs.title = ref.title; + } + + // get rid of the unneeded original text + delete attrs.original; + } + // the reference doesn't exist, so revert to plain text + else { + return attrs.original; + } + break; + case "img_ref": + jsonml[ 0 ] = "img"; + + // grab this ref and clean up the attribute node + var ref = references[ attrs.ref ]; + + // if the reference exists, make the link + if ( ref ) { + delete attrs.ref; + + // add in the href and title, if present + attrs.src = ref.href; + if ( ref.title ) { + attrs.title = ref.title; + } + + // get rid of the unneeded original text + delete attrs.original; + } + // the reference doesn't exist, so revert to plain text + else { + return attrs.original; + } + break; + } + + // convert all the children + i = 1; + + // deal with the attribute node, if it exists + if ( attrs ) { + // if there are keys, skip over it + for ( var key in jsonml[ 1 ] ) { + i = 2; + break; + } + // if there aren't, remove it + if ( i === 1 ) { + jsonml.splice( i, 1 ); + } + } + + for ( ; i < jsonml.length; ++i ) { + jsonml[ i ] = convert_tree_to_html( jsonml[ i ], references, options ); + } + + return jsonml; + } + + +// merges adjacent text nodes into a single node + function merge_text_nodes( jsonml ) { + // skip the tag name and attribute hash + var i = extract_attr( jsonml ) ? 2 : 1; + + while ( i < jsonml.length ) { + // if it's a string check the next item too + if ( typeof jsonml[ i ] === "string" ) { + if ( i + 1 < jsonml.length && typeof jsonml[ i + 1 ] === "string" ) { + // merge the second string into the first and remove it + jsonml[ i ] += jsonml.splice( i + 1, 1 )[ 0 ]; + } + else { + ++i; + } + } + // if it's not a string recurse + else { + merge_text_nodes( jsonml[ i ] ); + ++i; + } + } + } + +} )( (function() { + if ( typeof exports === "undefined" ) { + window.markdown = {}; + return window.markdown; + } + else { + return exports; + } +} )() ); diff --git a/js/redirect.js b/js/redirect.js new file mode 100644 index 0000000..e69de29 diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..452e09f --- /dev/null +++ b/package-lock.json @@ -0,0 +1,2003 @@ +{ + "requires": true, + "lockfileVersion": 1, + "dependencies": { + "accepts": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.5.tgz", + "integrity": "sha1-63d99gEXI6OxTopywIBcjoZ0a9I=", + "requires": { + "mime-types": "~2.1.18", + "negotiator": "0.6.1" + } + }, + "anymatch": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", + "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", + "requires": { + "micromatch": "^3.1.4", + "normalize-path": "^2.1.1" + }, + "dependencies": { + "normalize-path": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", + "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", + "requires": { + "remove-trailing-separator": "^1.0.1" + } + } + } + }, + "apache-crypt": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/apache-crypt/-/apache-crypt-1.2.1.tgz", + "integrity": "sha1-1vxyqm0n2ZyVqU/RiNcx7v/6Zjw=", + "requires": { + "unix-crypt-td-js": "^1.0.0" + } + }, + "apache-md5": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/apache-md5/-/apache-md5-1.1.2.tgz", + "integrity": "sha1-7klza2ObTxCLbp5ibG2pkwa0FpI=" + }, + "arr-diff": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", + "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=" + }, + "arr-flatten": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", + "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==" + }, + "arr-union": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", + "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=" + }, + "array-unique": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", + "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=" + }, + "assign-symbols": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", + "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=" + }, + "async-each": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.1.tgz", + "integrity": "sha1-GdOGodntxufByF04iu28xW0zYC0=" + }, + "atob": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", + "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==" + }, + "base": { + "version": "0.11.2", + "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", + "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", + "requires": { + "cache-base": "^1.0.1", + "class-utils": "^0.3.5", + "component-emitter": "^1.2.1", + "define-property": "^1.0.0", + "isobject": "^3.0.1", + "mixin-deep": "^1.2.0", + "pascalcase": "^0.1.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + } + } + }, + "basic-auth": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/basic-auth/-/basic-auth-2.0.1.tgz", + "integrity": "sha512-NF+epuEdnUYVlGuhaxbbq+dvJttwLnGY+YixlXlME5KpQ5W3CnXA5cVTneY3SPbPDRkcjMbifrwmFYcClgOZeg==", + "requires": { + "safe-buffer": "5.1.2" + } + }, + "batch": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz", + "integrity": "sha1-3DQxT05nkxgJP8dgJyUl+UvyXBY=" + }, + "bcryptjs": { + "version": "2.4.3", + "resolved": "https://registry.npmjs.org/bcryptjs/-/bcryptjs-2.4.3.tgz", + "integrity": "sha1-mrVie5PmBiH/fNrF2pczAn3x0Ms=" + }, + "binary-extensions": { + "version": "1.13.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.0.tgz", + "integrity": "sha512-EgmjVLMn22z7eGGv3kcnHwSnJXmFHjISTY9E/S5lIcTD3Oxw05QTcBLNkJFzcb3cNueUdF/IN4U+d78V0zO8Hw==" + }, + "braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "requires": { + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "cache-base": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", + "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", + "requires": { + "collection-visit": "^1.0.0", + "component-emitter": "^1.2.1", + "get-value": "^2.0.6", + "has-value": "^1.0.0", + "isobject": "^3.0.1", + "set-value": "^2.0.0", + "to-object-path": "^0.3.0", + "union-value": "^1.0.0", + "unset-value": "^1.0.0" + } + }, + "chokidar": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.0.tgz", + "integrity": "sha512-5t6G2SH8eO6lCvYOoUpaRnF5Qfd//gd7qJAkwRUw9qlGVkiQ13uwQngqbWWaurOsaAm9+kUGbITADxt6H0XFNQ==", + "requires": { + "anymatch": "^2.0.0", + "async-each": "^1.0.1", + "braces": "^2.3.2", + "fsevents": "^1.2.7", + "glob-parent": "^3.1.0", + "inherits": "^2.0.3", + "is-binary-path": "^1.0.0", + "is-glob": "^4.0.0", + "normalize-path": "^3.0.0", + "path-is-absolute": "^1.0.0", + "readdirp": "^2.2.1", + "upath": "^1.1.0" + } + }, + "class-utils": { + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz", + "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==", + "requires": { + "arr-union": "^3.1.0", + "define-property": "^0.2.5", + "isobject": "^3.0.0", + "static-extend": "^0.1.1" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "requires": { + "is-descriptor": "^0.1.0" + } + } + } + }, + "collection-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", + "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=", + "requires": { + "map-visit": "^1.0.0", + "object-visit": "^1.0.0" + } + }, + "colors": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/colors/-/colors-1.3.3.tgz", + "integrity": "sha512-mmGt/1pZqYRjMxB1axhTo16/snVZ5krrKkcmMeVKxzECMMXoCgnvTPp10QgHfcbQZw8Dq2jMNG6je4JlWU0gWg==" + }, + "component-emitter": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz", + "integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY=" + }, + "connect": { + "version": "3.6.6", + "resolved": "https://registry.npmjs.org/connect/-/connect-3.6.6.tgz", + "integrity": "sha1-Ce/2xVr3I24TcTWnJXSFi2eG9SQ=", + "requires": { + "debug": "2.6.9", + "finalhandler": "1.1.0", + "parseurl": "~1.3.2", + "utils-merge": "1.0.1" + } + }, + "copy-descriptor": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", + "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=" + }, + "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=" + }, + "cors": { + "version": "2.8.5", + "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", + "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", + "requires": { + "object-assign": "^4", + "vary": "^1" + } + }, + "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" + } + }, + "decode-uri-component": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", + "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=" + }, + "define-property": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", + "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", + "requires": { + "is-descriptor": "^1.0.2", + "isobject": "^3.0.1" + }, + "dependencies": { + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + } + } + }, + "depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=" + }, + "destroy": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", + "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=" + }, + "duplexer": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.1.tgz", + "integrity": "sha1-rOb/gIwc5mtX0ev5eXessCM0z8E=" + }, + "ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" + }, + "encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=" + }, + "escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=" + }, + "etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=" + }, + "event-stream": { + "version": "3.3.4", + "resolved": "https://registry.npmjs.org/event-stream/-/event-stream-3.3.4.tgz", + "integrity": "sha1-SrTJoPWlTbkzi0w02Gv86PSzVXE=", + "requires": { + "duplexer": "~0.1.1", + "from": "~0", + "map-stream": "~0.1.0", + "pause-stream": "0.0.11", + "split": "0.3", + "stream-combiner": "~0.0.4", + "through": "~2.3.1" + } + }, + "expand-brackets": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", + "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", + "requires": { + "debug": "^2.3.3", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "posix-character-classes": "^0.1.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", + "requires": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + }, + "dependencies": { + "is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "requires": { + "is-plain-object": "^2.0.4" + } + } + } + }, + "extglob": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", + "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", + "requires": { + "array-unique": "^0.3.2", + "define-property": "^1.0.0", + "expand-brackets": "^2.1.4", + "extend-shallow": "^2.0.1", + "fragment-cache": "^0.2.1", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "requires": { + "is-extendable": "^0.1.0" + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + } + } + }, + "faye-websocket": { + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.1.tgz", + "integrity": "sha1-8O/hjE9W5PQK/H4Gxxn9XuYYjzg=", + "requires": { + "websocket-driver": ">=0.5.1" + } + }, + "fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "requires": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "finalhandler": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.0.tgz", + "integrity": "sha1-zgtoVbRYU+eRsvzGgARtiCU91/U=", + "requires": { + "debug": "2.6.9", + "encodeurl": "~1.0.1", + "escape-html": "~1.0.3", + "on-finished": "~2.3.0", + "parseurl": "~1.3.2", + "statuses": "~1.3.1", + "unpipe": "~1.0.0" + } + }, + "for-in": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", + "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=" + }, + "fragment-cache": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", + "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=", + "requires": { + "map-cache": "^0.2.2" + } + }, + "fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=" + }, + "from": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/from/-/from-0.1.7.tgz", + "integrity": "sha1-g8YK/Fi5xWmXAH7Rp2izqzA6RP4=" + }, + "fsevents": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.7.tgz", + "integrity": "sha512-Pxm6sI2MeBD7RdD12RYsqaP0nMiwx8eZBXCa6z2L+mRHm2DYrOYwihmhjpkdjUHwQhslWQjRpEgNq4XvBmaAuw==", + "optional": true, + "requires": { + "nan": "^2.9.2", + "node-pre-gyp": "^0.10.0" + }, + "dependencies": { + "abbrev": { + "version": "1.1.1", + "bundled": true, + "optional": true + }, + "ansi-regex": { + "version": "2.1.1", + "bundled": true + }, + "aproba": { + "version": "1.2.0", + "bundled": true, + "optional": true + }, + "are-we-there-yet": { + "version": "1.1.5", + "bundled": true, + "optional": true, + "requires": { + "delegates": "^1.0.0", + "readable-stream": "^2.0.6" + } + }, + "balanced-match": { + "version": "1.0.0", + "bundled": true + }, + "brace-expansion": { + "version": "1.1.11", + "bundled": true, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "chownr": { + "version": "1.1.1", + "bundled": true, + "optional": true + }, + "code-point-at": { + "version": "1.1.0", + "bundled": true + }, + "concat-map": { + "version": "0.0.1", + "bundled": true + }, + "console-control-strings": { + "version": "1.1.0", + "bundled": true + }, + "core-util-is": { + "version": "1.0.2", + "bundled": true, + "optional": true + }, + "debug": { + "version": "2.6.9", + "bundled": true, + "optional": true, + "requires": { + "ms": "2.0.0" + } + }, + "deep-extend": { + "version": "0.6.0", + "bundled": true, + "optional": true + }, + "delegates": { + "version": "1.0.0", + "bundled": true, + "optional": true + }, + "detect-libc": { + "version": "1.0.3", + "bundled": true, + "optional": true + }, + "fs-minipass": { + "version": "1.2.5", + "bundled": true, + "optional": true, + "requires": { + "minipass": "^2.2.1" + } + }, + "fs.realpath": { + "version": "1.0.0", + "bundled": true, + "optional": true + }, + "gauge": { + "version": "2.7.4", + "bundled": true, + "optional": true, + "requires": { + "aproba": "^1.0.3", + "console-control-strings": "^1.0.0", + "has-unicode": "^2.0.0", + "object-assign": "^4.1.0", + "signal-exit": "^3.0.0", + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1", + "wide-align": "^1.1.0" + } + }, + "glob": { + "version": "7.1.3", + "bundled": true, + "optional": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "has-unicode": { + "version": "2.0.1", + "bundled": true, + "optional": true + }, + "iconv-lite": { + "version": "0.4.24", + "bundled": true, + "optional": true, + "requires": { + "safer-buffer": ">= 2.1.2 < 3" + } + }, + "ignore-walk": { + "version": "3.0.1", + "bundled": true, + "optional": true, + "requires": { + "minimatch": "^3.0.4" + } + }, + "inflight": { + "version": "1.0.6", + "bundled": true, + "optional": true, + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.3", + "bundled": true + }, + "ini": { + "version": "1.3.5", + "bundled": true, + "optional": true + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "bundled": true, + "requires": { + "number-is-nan": "^1.0.0" + } + }, + "isarray": { + "version": "1.0.0", + "bundled": true, + "optional": true + }, + "minimatch": { + "version": "3.0.4", + "bundled": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "minimist": { + "version": "0.0.8", + "bundled": true + }, + "minipass": { + "version": "2.3.5", + "bundled": true, + "requires": { + "safe-buffer": "^5.1.2", + "yallist": "^3.0.0" + } + }, + "minizlib": { + "version": "1.2.1", + "bundled": true, + "optional": true, + "requires": { + "minipass": "^2.2.1" + } + }, + "mkdirp": { + "version": "0.5.1", + "bundled": true, + "requires": { + "minimist": "0.0.8" + } + }, + "ms": { + "version": "2.0.0", + "bundled": true, + "optional": true + }, + "needle": { + "version": "2.2.4", + "bundled": true, + "optional": true, + "requires": { + "debug": "^2.1.2", + "iconv-lite": "^0.4.4", + "sax": "^1.2.4" + } + }, + "node-pre-gyp": { + "version": "0.10.3", + "bundled": true, + "optional": true, + "requires": { + "detect-libc": "^1.0.2", + "mkdirp": "^0.5.1", + "needle": "^2.2.1", + "nopt": "^4.0.1", + "npm-packlist": "^1.1.6", + "npmlog": "^4.0.2", + "rc": "^1.2.7", + "rimraf": "^2.6.1", + "semver": "^5.3.0", + "tar": "^4" + } + }, + "nopt": { + "version": "4.0.1", + "bundled": true, + "optional": true, + "requires": { + "abbrev": "1", + "osenv": "^0.1.4" + } + }, + "npm-bundled": { + "version": "1.0.5", + "bundled": true, + "optional": true + }, + "npm-packlist": { + "version": "1.2.0", + "bundled": true, + "optional": true, + "requires": { + "ignore-walk": "^3.0.1", + "npm-bundled": "^1.0.1" + } + }, + "npmlog": { + "version": "4.1.2", + "bundled": true, + "optional": true, + "requires": { + "are-we-there-yet": "~1.1.2", + "console-control-strings": "~1.1.0", + "gauge": "~2.7.3", + "set-blocking": "~2.0.0" + } + }, + "number-is-nan": { + "version": "1.0.1", + "bundled": true + }, + "object-assign": { + "version": "4.1.1", + "bundled": true, + "optional": true + }, + "once": { + "version": "1.4.0", + "bundled": true, + "requires": { + "wrappy": "1" + } + }, + "os-homedir": { + "version": "1.0.2", + "bundled": true, + "optional": true + }, + "os-tmpdir": { + "version": "1.0.2", + "bundled": true, + "optional": true + }, + "osenv": { + "version": "0.1.5", + "bundled": true, + "optional": true, + "requires": { + "os-homedir": "^1.0.0", + "os-tmpdir": "^1.0.0" + } + }, + "path-is-absolute": { + "version": "1.0.1", + "bundled": true, + "optional": true + }, + "process-nextick-args": { + "version": "2.0.0", + "bundled": true, + "optional": true + }, + "rc": { + "version": "1.2.8", + "bundled": true, + "optional": true, + "requires": { + "deep-extend": "^0.6.0", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" + }, + "dependencies": { + "minimist": { + "version": "1.2.0", + "bundled": true, + "optional": true + } + } + }, + "readable-stream": { + "version": "2.3.6", + "bundled": true, + "optional": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "rimraf": { + "version": "2.6.3", + "bundled": true, + "optional": true, + "requires": { + "glob": "^7.1.3" + } + }, + "safe-buffer": { + "version": "5.1.2", + "bundled": true + }, + "safer-buffer": { + "version": "2.1.2", + "bundled": true, + "optional": true + }, + "sax": { + "version": "1.2.4", + "bundled": true, + "optional": true + }, + "semver": { + "version": "5.6.0", + "bundled": true, + "optional": true + }, + "set-blocking": { + "version": "2.0.0", + "bundled": true, + "optional": true + }, + "signal-exit": { + "version": "3.0.2", + "bundled": true, + "optional": true + }, + "string-width": { + "version": "1.0.2", + "bundled": true, + "requires": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + } + }, + "string_decoder": { + "version": "1.1.1", + "bundled": true, + "optional": true, + "requires": { + "safe-buffer": "~5.1.0" + } + }, + "strip-ansi": { + "version": "3.0.1", + "bundled": true, + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "strip-json-comments": { + "version": "2.0.1", + "bundled": true, + "optional": true + }, + "tar": { + "version": "4.4.8", + "bundled": true, + "optional": true, + "requires": { + "chownr": "^1.1.1", + "fs-minipass": "^1.2.5", + "minipass": "^2.3.4", + "minizlib": "^1.1.1", + "mkdirp": "^0.5.0", + "safe-buffer": "^5.1.2", + "yallist": "^3.0.2" + } + }, + "util-deprecate": { + "version": "1.0.2", + "bundled": true, + "optional": true + }, + "wide-align": { + "version": "1.1.3", + "bundled": true, + "optional": true, + "requires": { + "string-width": "^1.0.2 || 2" + } + }, + "wrappy": { + "version": "1.0.2", + "bundled": true + }, + "yallist": { + "version": "3.0.3", + "bundled": true + } + } + }, + "get-value": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", + "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=" + }, + "glob-parent": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", + "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", + "requires": { + "is-glob": "^3.1.0", + "path-dirname": "^1.0.0" + }, + "dependencies": { + "is-glob": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", + "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", + "requires": { + "is-extglob": "^2.1.0" + } + } + } + }, + "graceful-fs": { + "version": "4.1.15", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.15.tgz", + "integrity": "sha512-6uHUhOPEBgQ24HM+r6b/QwWfZq+yiFcipKFrOFiBEnWdy5sdzYoi+pJeQaPI5qOLRFqWmAXUPQNsielzdLoecA==" + }, + "has-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", + "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=", + "requires": { + "get-value": "^2.0.6", + "has-values": "^1.0.0", + "isobject": "^3.0.0" + } + }, + "has-values": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz", + "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=", + "requires": { + "is-number": "^3.0.0", + "kind-of": "^4.0.0" + }, + "dependencies": { + "kind-of": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", + "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "http-auth": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/http-auth/-/http-auth-3.1.3.tgz", + "integrity": "sha1-lFz63WZSHq+PfISRPTd9exXyTjE=", + "requires": { + "apache-crypt": "^1.1.2", + "apache-md5": "^1.0.6", + "bcryptjs": "^2.3.0", + "uuid": "^3.0.0" + } + }, + "http-errors": { + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", + "integrity": "sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0=", + "requires": { + "depd": "~1.1.2", + "inherits": "2.0.3", + "setprototypeof": "1.1.0", + "statuses": ">= 1.4.0 < 2" + }, + "dependencies": { + "statuses": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", + "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=" + } + } + }, + "http-parser-js": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.0.tgz", + "integrity": "sha512-cZdEF7r4gfRIq7ezX9J0T+kQmJNOub71dWbgAXVHDct80TKP4MCETtZQ31xyv38UwgzkWPYF/Xc0ge55dW9Z9w==" + }, + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" + }, + "is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-binary-path": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz", + "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=", + "requires": { + "binary-extensions": "^1.0.0" + } + }, + "is-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==" + }, + "is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "requires": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + }, + "dependencies": { + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==" + } + } + }, + "is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=" + }, + "is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=" + }, + "is-glob": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.0.tgz", + "integrity": "sha1-lSHHaEXMJhCoUgPd8ICpWML/q8A=", + "requires": { + "is-extglob": "^2.1.1" + } + }, + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "requires": { + "isobject": "^3.0.1" + } + }, + "is-windows": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", + "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==" + }, + "is-wsl": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz", + "integrity": "sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0=" + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=" + }, + "kind-of": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", + "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==" + }, + "live-server": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/live-server/-/live-server-1.2.1.tgz", + "integrity": "sha512-Yn2XCVjErTkqnM3FfTmM7/kWy3zP7+cEtC7x6u+wUzlQ+1UW3zEYbbyJrc0jNDwiMDZI0m4a0i3dxlGHVyXczw==", + "requires": { + "chokidar": "^2.0.4", + "colors": "^1.3.3", + "connect": "^3.6.6", + "cors": "^2.8.5", + "event-stream": "3.3.4", + "faye-websocket": "0.11.x", + "http-auth": "3.1.x", + "morgan": "^1.9.1", + "object-assign": "^4.1.1", + "opn": "^5.4.0", + "proxy-middleware": "^0.15.0", + "send": "^0.16.2", + "serve-index": "^1.9.1" + } + }, + "map-cache": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", + "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=" + }, + "map-stream": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/map-stream/-/map-stream-0.1.0.tgz", + "integrity": "sha1-5WqpTEyAVaFkBKBnS3jyFffI4ZQ=" + }, + "map-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", + "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=", + "requires": { + "object-visit": "^1.0.0" + } + }, + "micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "requires": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "braces": "^2.3.1", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "extglob": "^2.0.4", + "fragment-cache": "^0.2.1", + "kind-of": "^6.0.2", + "nanomatch": "^1.2.9", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.2" + } + }, + "mime": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.4.1.tgz", + "integrity": "sha512-KI1+qOZu5DcW6wayYHSzR/tXKCDC5Om4s1z2QJjDULzLcmf3DvzS7oluY4HCTrc+9FiKmWUgeNLg7W3uIQvxtQ==" + }, + "mime-db": { + "version": "1.37.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.37.0.tgz", + "integrity": "sha512-R3C4db6bgQhlIhPU48fUtdVmKnflq+hRdad7IyKhtFj06VPNVdk2RhiYL3UjQIlso8L+YxAtFkobT0VK+S/ybg==" + }, + "mime-types": { + "version": "2.1.21", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.21.tgz", + "integrity": "sha512-3iL6DbwpyLzjR3xHSFNFeb9Nz/M8WDkX33t1GFQnFOllWk8pOrh/LSrB5OXlnlW5P9LH73X6loW/eogc+F5lJg==", + "requires": { + "mime-db": "~1.37.0" + } + }, + "mixin-deep": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.1.tgz", + "integrity": "sha512-8ZItLHeEgaqEvd5lYBXfm4EZSFCX29Jb9K+lAHhDKzReKBQKj3R+7NOF6tjqYi9t4oI8VUfaWITJQm86wnXGNQ==", + "requires": { + "for-in": "^1.0.2", + "is-extendable": "^1.0.1" + }, + "dependencies": { + "is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "requires": { + "is-plain-object": "^2.0.4" + } + } + } + }, + "morgan": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/morgan/-/morgan-1.9.1.tgz", + "integrity": "sha512-HQStPIV4y3afTiCYVxirakhlCfGkI161c76kKFca7Fk1JusM//Qeo1ej2XaMniiNeaZklMVrh3vTtIzpzwbpmA==", + "requires": { + "basic-auth": "~2.0.0", + "debug": "2.6.9", + "depd": "~1.1.2", + "on-finished": "~2.3.0", + "on-headers": "~1.0.1" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + }, + "nan": { + "version": "2.12.1", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.12.1.tgz", + "integrity": "sha512-JY7V6lRkStKcKTvHO5NVSQRv+RV+FIL5pvDoLiAtSL9pKlC5x9PKQcZDsq7m4FO4d57mkhC6Z+QhAh3Jdk5JFw==", + "optional": true + }, + "nanomatch": { + "version": "1.2.13", + "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", + "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==", + "requires": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "fragment-cache": "^0.2.1", + "is-windows": "^1.0.2", + "kind-of": "^6.0.2", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + } + }, + "negotiator": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.1.tgz", + "integrity": "sha1-KzJxhOiZIQEXeyhWP7XnECrNDKk=" + }, + "normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==" + }, + "object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" + }, + "object-copy": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", + "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=", + "requires": { + "copy-descriptor": "^0.1.0", + "define-property": "^0.2.5", + "kind-of": "^3.0.3" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "object-visit": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", + "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=", + "requires": { + "isobject": "^3.0.0" + } + }, + "object.pick": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", + "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=", + "requires": { + "isobject": "^3.0.1" + } + }, + "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=" + }, + "opn": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/opn/-/opn-5.4.0.tgz", + "integrity": "sha512-YF9MNdVy/0qvJvDtunAOzFw9iasOQHpVthTCvGzxt61Il64AYSGdK+rYwld7NAfk9qJ7dt+hymBNSc9LNYS+Sw==", + "requires": { + "is-wsl": "^1.1.0" + } + }, + "parseurl": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.2.tgz", + "integrity": "sha1-/CidTtiZMRlGDBViUyYs3I3mW/M=" + }, + "pascalcase": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", + "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=" + }, + "path-dirname": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz", + "integrity": "sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=" + }, + "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=" + }, + "pause-stream": { + "version": "0.0.11", + "resolved": "https://registry.npmjs.org/pause-stream/-/pause-stream-0.0.11.tgz", + "integrity": "sha1-/lo0sMvOErWqaitAPuLnO2AvFEU=", + "requires": { + "through": "~2.3" + } + }, + "posix-character-classes": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", + "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=" + }, + "process-nextick-args": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz", + "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==" + }, + "proxy-middleware": { + "version": "0.15.0", + "resolved": "https://registry.npmjs.org/proxy-middleware/-/proxy-middleware-0.15.0.tgz", + "integrity": "sha1-o/3xvvtzD5UZZYcqwvYHTGFHelY=" + }, + "range-parser": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.0.tgz", + "integrity": "sha1-9JvmtIeJTdxA3MlKMi9hEJLgDV4=" + }, + "readable-stream": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "readdirp": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.2.1.tgz", + "integrity": "sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==", + "requires": { + "graceful-fs": "^4.1.11", + "micromatch": "^3.1.10", + "readable-stream": "^2.0.2" + } + }, + "regex-not": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", + "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==", + "requires": { + "extend-shallow": "^3.0.2", + "safe-regex": "^1.1.0" + } + }, + "remove-trailing-separator": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", + "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=" + }, + "repeat-element": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.3.tgz", + "integrity": "sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g==" + }, + "repeat-string": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", + "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=" + }, + "resolve-url": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", + "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=" + }, + "ret": { + "version": "0.1.15", + "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", + "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==" + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "safe-regex": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", + "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", + "requires": { + "ret": "~0.1.10" + } + }, + "send": { + "version": "0.16.2", + "resolved": "https://registry.npmjs.org/send/-/send-0.16.2.tgz", + "integrity": "sha512-E64YFPUssFHEFBvpbbjr44NCLtI1AohxQ8ZSiJjQLskAdKuriYEP6VyGEsRDH8ScozGpkaX1BGvhanqCwkcEZw==", + "requires": { + "debug": "2.6.9", + "depd": "~1.1.2", + "destroy": "~1.0.4", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "~1.6.2", + "mime": "1.4.1", + "ms": "2.0.0", + "on-finished": "~2.3.0", + "range-parser": "~1.2.0", + "statuses": "~1.4.0" + }, + "dependencies": { + "statuses": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.4.0.tgz", + "integrity": "sha512-zhSCtt8v2NDrRlPQpCNtw/heZLtfUDqxBM1udqikb/Hbk52LK4nQSwr10u77iopCW5LsyHpuXS0GnEc48mLeew==" + } + } + }, + "serve-index": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.9.1.tgz", + "integrity": "sha1-03aNabHn2C5c4FD/9bRTvqEqkjk=", + "requires": { + "accepts": "~1.3.4", + "batch": "0.6.1", + "debug": "2.6.9", + "escape-html": "~1.0.3", + "http-errors": "~1.6.2", + "mime-types": "~2.1.17", + "parseurl": "~1.3.2" + } + }, + "set-value": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.0.tgz", + "integrity": "sha512-hw0yxk9GT/Hr5yJEYnHNKYXkIA8mVJgd9ditYZCe16ZczcaELYYcfvaXesNACk2O8O0nTiPQcQhGUQj8JLzeeg==", + "requires": { + "extend-shallow": "^2.0.1", + "is-extendable": "^0.1.1", + "is-plain-object": "^2.0.3", + "split-string": "^3.0.1" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "setprototypeof": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", + "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==" + }, + "snapdragon": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", + "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==", + "requires": { + "base": "^0.11.1", + "debug": "^2.2.0", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "map-cache": "^0.2.2", + "source-map": "^0.5.6", + "source-map-resolve": "^0.5.0", + "use": "^3.1.0" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "snapdragon-node": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz", + "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==", + "requires": { + "define-property": "^1.0.0", + "isobject": "^3.0.0", + "snapdragon-util": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + } + } + }, + "snapdragon-util": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz", + "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==", + "requires": { + "kind-of": "^3.2.0" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" + }, + "source-map-resolve": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.2.tgz", + "integrity": "sha512-MjqsvNwyz1s0k81Goz/9vRBe9SZdB09Bdw+/zYyO+3CuPk6fouTaxscHkgtE8jKvf01kVfl8riHzERQ/kefaSA==", + "requires": { + "atob": "^2.1.1", + "decode-uri-component": "^0.2.0", + "resolve-url": "^0.2.1", + "source-map-url": "^0.4.0", + "urix": "^0.1.0" + } + }, + "source-map-url": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.0.tgz", + "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=" + }, + "split": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/split/-/split-0.3.3.tgz", + "integrity": "sha1-zQ7qXmOiEd//frDwkcQTPi0N0o8=", + "requires": { + "through": "2" + } + }, + "split-string": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", + "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==", + "requires": { + "extend-shallow": "^3.0.0" + } + }, + "static-extend": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", + "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=", + "requires": { + "define-property": "^0.2.5", + "object-copy": "^0.1.0" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "requires": { + "is-descriptor": "^0.1.0" + } + } + } + }, + "statuses": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.3.1.tgz", + "integrity": "sha1-+vUbnrdKrvOzrPStX2Gr8ky3uT4=" + }, + "stream-combiner": { + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/stream-combiner/-/stream-combiner-0.0.4.tgz", + "integrity": "sha1-TV5DPBhSYd3mI8o/RMWGvPXErRQ=", + "requires": { + "duplexer": "~0.1.1" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "requires": { + "safe-buffer": "~5.1.0" + } + }, + "through": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", + "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=" + }, + "to-object-path": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", + "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=", + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "to-regex": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz", + "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==", + "requires": { + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "regex-not": "^1.0.2", + "safe-regex": "^1.1.0" + } + }, + "to-regex-range": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", + "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", + "requires": { + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" + } + }, + "union-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.0.tgz", + "integrity": "sha1-XHHDTLW61dzr4+oM0IIHulqhrqQ=", + "requires": { + "arr-union": "^3.1.0", + "get-value": "^2.0.6", + "is-extendable": "^0.1.1", + "set-value": "^0.4.3" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "requires": { + "is-extendable": "^0.1.0" + } + }, + "set-value": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/set-value/-/set-value-0.4.3.tgz", + "integrity": "sha1-fbCPnT0i3H945Trzw79GZuzfzPE=", + "requires": { + "extend-shallow": "^2.0.1", + "is-extendable": "^0.1.1", + "is-plain-object": "^2.0.1", + "to-object-path": "^0.3.0" + } + } + } + }, + "unix-crypt-td-js": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unix-crypt-td-js/-/unix-crypt-td-js-1.0.0.tgz", + "integrity": "sha1-HAgkFQSBvHoB1J6Y8exmjYJBLzs=" + }, + "unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=" + }, + "unset-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", + "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=", + "requires": { + "has-value": "^0.3.1", + "isobject": "^3.0.0" + }, + "dependencies": { + "has-value": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz", + "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=", + "requires": { + "get-value": "^2.0.3", + "has-values": "^0.1.4", + "isobject": "^2.0.0" + }, + "dependencies": { + "isobject": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", + "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", + "requires": { + "isarray": "1.0.0" + } + } + } + }, + "has-values": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", + "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=" + } + } + }, + "upath": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/upath/-/upath-1.1.0.tgz", + "integrity": "sha512-bzpH/oBhoS/QI/YtbkqCg6VEiPYjSZtrHQM6/QnJS6OL9pKUFLqb3aFh4Scvwm45+7iAgiMkLhSbaZxUqmrprw==" + }, + "urix": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", + "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=" + }, + "use": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz", + "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==" + }, + "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.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=" + }, + "uuid": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz", + "integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==" + }, + "vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=" + }, + "websocket-driver": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.0.tgz", + "integrity": "sha1-DK+dLXVdk67gSdS90NP+LMoqJOs=", + "requires": { + "http-parser-js": ">=0.4.0", + "websocket-extensions": ">=0.1.1" + } + }, + "websocket-extensions": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.3.tgz", + "integrity": "sha512-nqHUnMXmBzT0w570r2JpJxfiSD1IzoI+HGVdd3aZ0yNi3ngvQ4jv1dtHt5VGxfI2yj5yqImPhOK4vmIh2xMbGg==" + } + } +} diff --git a/templates/gsoc.md b/templates/gsoc.md new file mode 100644 index 0000000..469c629 --- /dev/null +++ b/templates/gsoc.md @@ -0,0 +1,30 @@ +For Google Summer of Code it's necessary to write a project proposal and put it on Google Melange. +To get started, you can use this template to structure your proposal, but don't worry, you don't have to stick to this template one by one: + + **Introduction:** Your software project should solve a clearly defined problem. + Before offering the solution (your Google Summer of Code project), you should first define the problem. + What’s the current state of things? What’s the issue you wish to solve and why? + Then you should conclude with a sentence or two about your solution. This is somewhat like an elevator pitch. + + **Project goals:** This section should again be short and to the point, and it might be a good idea to format it like a list. + You should propose a clear list of deliverables, explaining exactly what you promise to do and what you do not plan to do. + “Future developments” can be mentioned, but your promise for the three months of the Google Summer of Code season is what counts. + At this point you are making a commitment. + + **Implementation:** This section can be longer and more detailed. + You should describe what you plan to do as a solution for the problem you defined earlier. + You don’t need to provide a lot of technical details, but you do need to show that you understand the technology and illustrate key technical elements of your proposed solution in reasonable detail. + + **Timeline:** This section is easily overlooked, yet it’s arguably more important than the previous section. + With the timeline you show that you understand the problem, that you have thought hard about a solution, and that you have also broken the solution down into manageable bits. + If your timeline is reasonable and its deadlines achievable, you show that you have an actual plan on how to go from idea to delivery. + With this section you set expectations, so do not make promises you can’t keep. + A modest, realistic and detailed timeline is much better than a timeline that promises to move mountains. + Mentors are often among the top professionals in their field, and they can easily spot unrealistic timelines. + + **About me:** Write a few lines about you and provide contact information. + + (Thanks to Teo Mrnjavac for the awesome [blog article](http://teom.org/blog/kde/how-to-write-a-kick-ass-proposal-for-google-summer-of-code/)) + +There are plenty of blog articles out there how to write a good GSoC proposal. +Contact your mentor early and to get to know his expectations. Just copy and paste the description from the mentoring project issue won't work! \ No newline at end of file