You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@community.apache.org by se...@apache.org on 2023/04/22 12:11:28 UTC

[comdev-site] branch preview/test2 updated: Merge main

This is an automated email from the ASF dual-hosted git repository.

sebb pushed a commit to branch preview/test2
in repository https://gitbox.apache.org/repos/asf/comdev-site.git


The following commit(s) were added to refs/heads/preview/test2 by this push:
     new 90b42ff  Merge main
90b42ff is described below

commit 90b42ffcd4a90b0df96cefbc96366c473a79a7c9
Author: Sebb <se...@apache.org>
AuthorDate: Sat Apr 22 13:10:49 2023 +0100

    Merge main
---
 Jenkinsfile                                        |  73 ++++++++++--
 README.md                                          |  27 +++--
 config.toml => hugo.toml                           |   2 +-
 layouts/_default/baseof.html                       |  16 ++-
 layouts/_default/list.html                         |   8 +-
 layouts/_default/single.html                       |   4 +
 layouts/partials/page-summary.html                 |   9 ++
 layouts/partials/pagination.html                   |  15 +++
 layouts/partials/published-date.html               |   1 +
 source/about/_index.md                             |   2 +-
 source/apache-way/apache-project-maturity-model.md |   2 +-
 source/blog/2023-preparing-the-move.md             |  10 ++
 source/blog/_index.md                              |  14 +++
 source/calendars/_index.md                         |   4 +-
 source/committers/_index.md                        |   2 +-
 source/contributor-ladder.md                       | 125 +++++++++++++++++++++
 source/contributors/_index.md                      |  14 ++-
 source/contributors/mailing-lists.md               |  55 +++++++++
 source/gsoc/_index.md                              |   2 +-
 source/gsoc/gsoc-admin-tasks.md                    |   2 +-
 source/gsoc/guide-to-being-a-mentor.md             |   2 +-
 source/newbiefaq.md                                |   2 +-
 source/pmc/_index.md                               |  71 ++++++++++++
 source/pmc/adding-committers.md                    |  13 +++
 source/pmc/adding-pmc-members.md                   |  14 +++
 source/pmc/chair.md                                |  14 +++
 source/pmc/new-member.md                           |  12 ++
 source/pmc/reporting.md                            |  11 ++
 source/pmc/responsibilities.md                     |  87 ++++++++++++++
 static/css/bootstrap.min.css                       |   8 +-
 static/css/main.css                                |  17 +++
 static/js/bootstrap.min.js                         |   6 +-
 static/js/jquery-1.9.1.min.js                      |   5 -
 static/js/jquery.min.js                            |   2 +
 34 files changed, 600 insertions(+), 51 deletions(-)

diff --git a/Jenkinsfile b/Jenkinsfile
index 4aada26..582128d 100644
--- a/Jenkinsfile
+++ b/Jenkinsfile
@@ -23,7 +23,10 @@ pipeline {
     }
    
     environment {
-        DEPLOY_BRANCH = 'preview/test2-staging'
+        DEPLOY_BRANCH = 'asf-site'
+        STAGING_BRANCH = "${env.BRANCH_NAME}-staging"
+        HUGO_VERSION = '0.111.3'
+        HUGO_HASH = 'b382aacb522a470455ab771d0e8296e42488d3ea4e61fe49c11c32ec7fb6ee8b'
         PAGEFIND_VERSION = '0.12.0'
         PAGEFIND_HASH = '3e450176562b65359f855c04894ec2c07ffd30a8d08ef4d5812f8d3469d7a58f'
     }
@@ -35,14 +38,24 @@ pipeline {
                     // Capture last commit hash for final commit message
                     env.LAST_SHA = sh(script:'git log -n 1 --pretty=format:\'%H\'', returnStdout: true).trim()
 
+                    // Download Hugo
+                    env.HUGO_DIR = sh(script:'mktemp -d', returnStdout: true).trim()
+                    sh "mkdir -p ${env.HUGO_DIR}/bin"
+                    sh "wget --no-verbose -O ${env.HUGO_DIR}/hugo.tar.gz https://github.com/gohugoio/hugo/releases/download/v${HUGO_VERSION}/hugo_extended_${HUGO_VERSION}_Linux-64bit.tar.gz"
+                    // Verify the checksum
+                    def hugo_hash = sha256 file: "${env.HUGO_DIR}/hugo.tar.gz"
+                    assert hugo_hash == "${HUGO_HASH}"
+                    // Unpack Hugo
+                    sh "tar -C ${env.HUGO_DIR}/bin -xkf ${env.HUGO_DIR}/hugo.tar.gz"
+
                     // Download Pagefind
                     env.PAGEFIND_DIR = sh(script:'mktemp -d', returnStdout: true).trim()
                     sh "mkdir -p ${env.PAGEFIND_DIR}/bin"
                     sh "wget --no-verbose -O ${env.PAGEFIND_DIR}/pagefind.tar.gz https://github.com/CloudCannon/pagefind/releases/download/v${PAGEFIND_VERSION}/pagefind-v${PAGEFIND_VERSION}-x86_64-unknown-linux-musl.tar.gz"
-                    // Check the hash
-                    def hash = sha256 file: "${env.PAGEFIND_DIR}/pagefind.tar.gz"
-                    assert hash == "${PAGEFIND_HASH}"
-                    // Unpack
+                    // Verify the checksum
+                    def pagefind_hash = sha256 file: "${env.PAGEFIND_DIR}/pagefind.tar.gz"
+                    assert pagefind_hash == "${PAGEFIND_HASH}"
+                    // Unpack Pagefind
                     sh "tar -C ${env.PAGEFIND_DIR}/bin -xkf ${env.PAGEFIND_DIR}/pagefind.tar.gz"
 
                     // Setup directory structure for generated content
@@ -56,17 +69,15 @@ pipeline {
         stage('Build') {
             steps {
                 script {
-                    sh 'for i in $(which -a hugo) ; do echo $i; $i version; done'
-                    sh 'hugo version'
-                    sh "hugo --destination ${env.OUT_DIR}"
-                    sh "${env.PAGEFIND_DIR}/bin/pagefind --source ${env.OUT_DIR}"
+                    sh "${HUGO_DIR}/bin/hugo --destination ${env.OUT_DIR}"
+                    sh "${PAGEFIND_DIR}/bin/pagefind --source ${env.OUT_DIR}"
                 }
             }
         }
         stage('Deploy') {
             when {
                 anyOf {
-                    branch 'preview/test2'
+                    branch 'main'
                 }
             }
             steps {
@@ -80,7 +91,7 @@ pipeline {
                     // Remove the content of the target branch and replace it with the content of the temp folder
                     sh """
                         rm -rf ${WORKSPACE}/content
-                        git rm -r --cached content/*
+                        git rm -r --ignore-unmatch --cached content/*
                         mkdir -p ${WORKSPACE}/content
                         cp -rT ${env.TMP_DIR}/* ${WORKSPACE}/content
                     """
@@ -98,12 +109,51 @@ pipeline {
                 }
             }
         }
+        stage('Staging') {
+            // Mostly duplicated from the Deploy branch, there must be a better way...
+            when {
+                allOf {
+                    // ignore branches named preview/*-staging to avoid infinite loop..
+                    // WARNING: do not allow '-' in preview source branch names or the loop will return...
+                    expression { env.BRANCH_NAME ==~ /preview\/[a-zA-Z0-9_]+$/ }
+                }
+            }
+            steps {
+                script {
+                    // Checkout or create branch with generated content
+                    sh """
+                        git checkout ${STAGING_BRANCH} || git checkout -b ${STAGING_BRANCH}
+                        git pull origin ${STAGING_BRANCH} || echo "branch ${STAGING_BRANCH} is new"
+                    """
+
+                    // Remove the content of the target branch and replace it with the content of the temp folder
+                    sh """
+                        rm -rf ${WORKSPACE}/content
+                        git rm -r --ignore-unmatch --cached content/*
+                        mkdir -p ${WORKSPACE}/content
+                        cp -rT ${env.TMP_DIR}/* ${WORKSPACE}/content
+                    """
+
+                    // Commit the changes to the target branch
+                    env.COMMIT_MESSAGE1 = "Updated ${STAGING_BRANCH} from ${BRANCH_NAME} at ${env.LAST_SHA}"
+                    env.COMMIT_MESSAGE2 = "Built from ${BUILD_URL}"
+                    sh """
+                        git add -A
+                        git commit -m "${env.COMMIT_MESSAGE1}" -m "${env.COMMIT_MESSAGE2}" | true
+                    """
+
+                    // Push the generated content for deployment
+                    sh "git push -u origin ${STAGING_BRANCH}"
+                }
+            }
+        }
     }
     
     post {
         always {
             script {
                 sh """
+                    rm -rf ${env.HUGO_DIR}
                     rm -rf ${env.PAGEFIND_DIR}
                     rm -rf ${env.TMP_DIR}
                 """
@@ -112,4 +162,3 @@ pipeline {
         }
     }
 }
-
diff --git a/README.md b/README.md
index 74e5b46..30c9345 100644
--- a/README.md
+++ b/README.md
@@ -16,29 +16,40 @@ limitations under the License.
 -->
 # Apache Community Development website
 
-This is the source code for the website of the [Apache Community Development PMC website](https://community.apache.org/), hosted at:
+This is the source code for the ASF Community Development PMC website, hosted at
+[community.apache.org](https://community.apache.org)
 
-    https://community.apache.org/
-    
 To get in touch with that PMC please use the [dev@community.apache.org](https://lists.apache.org/list.html?dev@community.apache.org) mailing list.
 
-The repository for the [events.apache.org](https://events.apache.org/) website, which is also managed by the Community Development PMC, is at https://github.com/apache/comdev-events-site
+The [events.apache.org](https://events.apache.org/) website is also managed by the Community Development PMC
+but managed in the [comdev-events-site](https://github.com/apache/comdev-events-site) repository.
 
-## How to publish the website
+## Automated website publishing and staging
 
-Changes to the `master` branch of this repository trigger the [comdev-site Jenkins Job](https://ci-builds.apache.org/job/Community%20Development/job/site/job/master/), which generates the website content and commits it to the `asf-site` branch of this repository. There's currently (April 2020) a lag of about ten minutes for the Jenkins job to start, if you commit directly to the GitHub repository.
+Changes to the `main` or `preview/*` branches of this repository trigger the [comdev-site Jenkins Job](https://ci-builds.apache.org/job/Community%20Development/job/site/job/main/), which generates and pushes the website content.
 
-The [ASF's gitpubsub mechanism](https://blogs.apache.org/infra/entry/git_based_websites_available) then synchronizes that content to [https://community.apache.org/](https://community.apache.org/), usually within a few seconds. More details about the publication process can be found in the [ASF Documentation about Project sites](https://infra.apache.org/project-site.html). If for some reason this process fails, you can use [the self-service page from ASF Infra](https://selfserve.apache.or [...]
+There's currently (April 2020) a lag of about ten minutes for the corresponding Jenkins job to start, if you commit directly to the GitHub repository, but you can also start the job manually if you have the required Jenkins access rights.
+
+For the `main` branch, the generated content is pushed to the `asf-site` branch, and 
+the [ASF's gitpubsub mechanism](https://blogs.apache.org/infra/entry/git_based_websites_available) then synchronizes that content to the live [community.apache.org](https://community.apache.org/) website, usually within a few seconds.
+
+Branches named `preview/<name>` are staged automatically, a branch named `preview/0421b` for example
+is staged at https://community-0421b.staged.apache.org/ . The `<name>` must only use the characters `a-z`, `A-Z`, `0-9` and `_` (underscore).
+
+More details about the publication process can be found in the [ASF Documentation about Project sites](https://infra.apache.org/project-site.html). If for some reason this process fails, you can use [the self-service page from ASF Infra](https://selfserve.apache.org/) to trigger a resync of the git repo.
 
 ## Powered by Hugo!
 
-The website uses Hugo as static website generator, see [their website](https://gohugo.io/) for more information
+The website uses Hugo as static website generator, see the [Hugo website](https://gohugo.io/) for more information
 and for how to install and run it if needed.
 
 Other Apache websites that are built with Hugo should be listed by [this GitHub query for the 'hugo' tag](https://github.com/search?q=topic%3Ahugo+org%3Aapache&type=Repositories).
 
 ## How to test the website and changes on your own computer
 
+You need a recent version of `hugo`, to find out which one is used to deploy this site
+look at the Jenkins build output, linked above.
+
 To generate the static website, execute `hugo` to generate the website under `target/content` and execute
 `npx -y pagefind --source target/content` to index the content for Pagefind (the search bar on the website).
 
diff --git a/config.toml b/hugo.toml
similarity index 97%
rename from config.toml
rename to hugo.toml
index 3cacbfa..0fe5949 100644
--- a/config.toml
+++ b/hugo.toml
@@ -35,7 +35,7 @@ date = ["date", ":filename", "publishDate", "lastmod"]
 [params]
 # Source Code repository section
 repositoryUrl = "https://github.com/apache/comdev-site"
-repositorySourceBranch = "master"
+repositorySourceBranch = "main"
 
 # Open Graph section
 title = "Apache Community Development"
diff --git a/layouts/_default/baseof.html b/layouts/_default/baseof.html
index 798bd34..ba06e68 100644
--- a/layouts/_default/baseof.html
+++ b/layouts/_default/baseof.html
@@ -24,7 +24,7 @@
   {{ template "_internal/opengraph.html" . }}
 
   <title>Apache Community Development - {{ .Title }}</title>
-  <link rel="shortcut icon" href="images/favicon.ico">
+  <link rel="shortcut icon" href="/images/favicon.ico">
 
   <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
   <link href="/css/main.css" rel="stylesheet" media="screen">
@@ -72,7 +72,6 @@
                 <a class="dropdown-item" href="https://whimsy.apache.org/board/minutes/Community_Development.html#2009-11-01">ComDev Original Board Resolution</a>
                 <a class="dropdown-item" href="https://whimsy.apache.org/board/minutes/Community_Development.html">ComDev Board Reports</a>
                 <a class="dropdown-item" href="https://issues.apache.org/jira/projects/COMDEV">Community Development Jira</a>
-                <a class="dropdown-item" href="https://issues.apache.org/jira/projects/GSOC">GSoC Jira</a>
                 <div class="dropdown-divider"></div>
                 <a class="dropdown-item text-uppercase disabled" href="#">About Apache</a>
                 <a class="dropdown-item" href="https://www.apache.org/">The Apache Software Foundation</a>
@@ -91,14 +90,18 @@
                 <a class="dropdown-item" href="/gettingStarted/101.html">Getting Started</a>
                 <a class="dropdown-item" href="/contributors/">Finding Your Way Around The Apache Software Foundation</a>
                 <a class="dropdown-item" href="https://www.apache.org/dev/">Technical Developer FAQs</a>
-                <div class="dropdown-divider"></div>
-                <a class="dropdown-item text-uppercase disabled" href="#">Google Summer of Code</a>
+              </div>
+            </li>
+            <li class="nav-item dropdown">
+              <a class="nav-link dropdown-toggle" href="#" id="commitDropdown" role="button" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">GSoC</a>
+              <div class="dropdown-menu" aria-labelledby="gsocDropdown">
                 <a class="dropdown-item" href="/gsoc/">Google Summer Of Code Information</a>
                 <a class="dropdown-item" href="/gsoc/mentee-ranking-process.html">Mentee Ranking Process</a>
                 <a class="dropdown-item" href="/gsoc/experiences.html">Past GSoC Experiences</a>
                 <a class="dropdown-item" href="/gsoc/guide-to-being-a-mentor.html">Guide to being a Mentor</a>
-                <a class="dropdown-item" href="/gsoc/use-the-comdev-issue-tracker-for-gsoc-tasks.html">Using ComDev's Jira for GSoC Ideas</a>
+                <a class="dropdown-item" href="/gsoc/use-the-comdev-gsoc-issue-tracker-for-gsoc-tasks.html">Using ComDev's Jira for GSoC Ideas</a>
                 <a class="dropdown-item" href="/gsoc/gsoc-admin-tasks.html">Tasks of a GSoC Admin at the ASF</a>
+                <a class="dropdown-item" href="https://issues.apache.org/jira/projects/GSOC">GSoC Jira</a>
               </div>
             </li>
             <li class="nav-item dropdown">
@@ -133,6 +136,7 @@
                 Join the Conversation
               </a>
               <div class="dropdown-menu" aria-labelledby="conversDropdown">
+                <a class="dropdown-item" href="/blog/">Blog</a>
                 <a class="dropdown-item" href="https://www.facebook.com/ApacheSoftwareFoundation">Facebook</a>
                 <a class="dropdown-item" href="https://twitter.com/ApacheCommunity">Twitter</a>
                 <a class="dropdown-item" href="/lists.html">Mailing List</a>
@@ -189,7 +193,7 @@
     </div>
   </footer>
 
-  <script src="/js/jquery-1.9.1.min.js"></script>
+  <script src="/js/jquery.min.js"></script>
   <script src="/js/bootstrap.min.js"></script>
 </body>
 </html>
diff --git a/layouts/_default/list.html b/layouts/_default/list.html
index c1339be..5e47456 100644
--- a/layouts/_default/list.html
+++ b/layouts/_default/list.html
@@ -1,3 +1,9 @@
 {{ define "main" }}
-	{{ .Content }}
+    {{ .Content }}
+    {{ if .Params.list_pages }}
+        <ul class="child-pages">
+            {{ range .Paginator.Pages.ByWeight }} {{ partial "page-summary" . }} {{ end }}
+            <section>{{ partial "pagination" .}}</section>
+        </ul>
+    {{ end }}
 {{ end }}
diff --git a/layouts/_default/single.html b/layouts/_default/single.html
index c1339be..78f64cf 100644
--- a/layouts/_default/single.html
+++ b/layouts/_default/single.html
@@ -1,3 +1,7 @@
 {{ define "main" }}
+	{{ if .Params.blog_post }}
+		<h2>{{ .Title }}</h2>
+		{{ partial "published-date" .}}
+	{{ end }}
 	{{ .Content }}
 {{ end }}
diff --git a/layouts/partials/page-summary.html b/layouts/partials/page-summary.html
new file mode 100644
index 0000000..a49ed07
--- /dev/null
+++ b/layouts/partials/page-summary.html
@@ -0,0 +1,9 @@
+<li class="page-summary" itemscope itemtype="http://schema.org/CreativeWork">
+    <h2 class="title">
+        <a href="{{ .Permalink }}" itemprop="headline">{{ .Title }}</a>
+        <p>{{ partial "published-date" .}}</p>
+    </h2>
+    {{ if .Description }}
+    <p class="summary" itemprop="about">{{ .Description }}</p>
+    {{ end }}
+</li>
diff --git a/layouts/partials/pagination.html b/layouts/partials/pagination.html
new file mode 100644
index 0000000..95353e5
--- /dev/null
+++ b/layouts/partials/pagination.html
@@ -0,0 +1,15 @@
+<nav class="pagination pager align-center">
+            <hr>
+    <ul>
+           {{if .Paginator.HasPrev }}
+        <li class="prev"><a href="{{ .Paginator.Prev.URL }}">Previous</a></li>
+        {{ end }}
+        <li>
+
+        <a href="" class="button round small outline">Page {{ .Paginator.PageNumber }} of {{ .Paginator.TotalPages }}</a>
+        </li>
+            {{ if .Paginator.HasNext }}</a>
+        <li class="next"><a href="{{ .Paginator.Next.URL }}">Next</a></li>
+           {{ end }}
+    </ul>
+</nav>
\ No newline at end of file
diff --git a/layouts/partials/published-date.html b/layouts/partials/published-date.html
new file mode 100644
index 0000000..084dd32
--- /dev/null
+++ b/layouts/partials/published-date.html
@@ -0,0 +1 @@
+<span class="published-date">{{ time.Format "Monday, Jan 2, 2006" .Date }}</span>
\ No newline at end of file
diff --git a/source/about/_index.md b/source/about/_index.md
index 5e8aed8..42fc175 100755
--- a/source/about/_index.md
+++ b/source/about/_index.md
@@ -60,4 +60,4 @@ See our [Newcomer FAQ](/newbiefaq.html#websitecms) for how to suggest changes to
 The content is written in Markdown and published automatically via a Jenkins job.
 Source code is hosted in a [Git repository](https://github.com/apache/comdev-site).
 
-See the [README.md](https://github.com/apache/comdev-site/blob/master/README.md) for more info.
+See the [README.md](https://github.com/apache/comdev-site/blob/main/README.md) for more info.
diff --git a/source/apache-way/apache-project-maturity-model.md b/source/apache-way/apache-project-maturity-model.md
index bb700d9..c8e76e6 100755
--- a/source/apache-way/apache-project-maturity-model.md
+++ b/source/apache-way/apache-project-maturity-model.md
@@ -294,7 +294,7 @@ v 1.2, February 2018, reworked the "how to use" section with more links to self-
 v 1.3, June 2021, improve readability and simplify the language where possible.
 
 See the <a href="https://svn.apache.org/viewvc/comdev/site/trunk/content/apache-way/apache-project-maturity-model.mdtext?view=log" target="_blank">svn revision history</a> (for older
-versions) and <a href="https://github.com/apache/comdev-site/commits/master/source/apache-way/apache-project-maturity-model.md">GitHub history</a> (since March 2020) of this document for more details and other minor changes.
+versions) and <a href="https://github.com/apache/comdev-site/commits/main/source/apache-way/apache-project-maturity-model.md">GitHub history</a> (since March 2020) of this document for more details and other minor changes.
 
 ### Footnotes
 
diff --git a/source/blog/2023-preparing-the-move.md b/source/blog/2023-preparing-the-move.md
new file mode 100644
index 0000000..f4de61e
--- /dev/null
+++ b/source/blog/2023-preparing-the-move.md
@@ -0,0 +1,10 @@
+---
+title: Preparing the Community Development blog move
+url: /blog/preparing-the-move/
+description: We're about to move our blog here
+date: 2023-04-20
+blog_post: true
+---
+
+We're in the process of moving our content here from the 
+existing [blogs.apache.org](https://blogs.apache.org/) location.
diff --git a/source/blog/_index.md b/source/blog/_index.md
new file mode 100644
index 0000000..9c3666f
--- /dev/null
+++ b/source/blog/_index.md
@@ -0,0 +1,14 @@
+---
+title: Community Development Blog
+url: /blog/
+list_pages: true
+---
+
+## Community Development Blog
+
+Contributions to this blog are welcome!
+
+We are looking for posts related community building, community-related success or failure stories
+and related topics.
+
+### Posts
\ No newline at end of file
diff --git a/source/calendars/_index.md b/source/calendars/_index.md
index 84484b1..09d4446 100644
--- a/source/calendars/_index.md
+++ b/source/calendars/_index.md
@@ -28,7 +28,7 @@ style="border: 0" width="800" height="600" frameborder="0" scrolling="no"></ifra
 
 This Calendar is also available as an [iCal feed][3]
 
-<script src="/js/jquery-1.9.1.min.js"></script>
+<script src="/js/jquery.min.js"></script>
 <script src="https://events.apache.org/js/events-calendar.js"></script>
 <script src="https://apis.google.com/js/client.js"></script>
 
@@ -45,5 +45,5 @@ Apache project related events there.
   [2]: https://www.apache.org/foundation/marks/events.html
   [3]: https://www.google.com/calendar/ical/nerseigospses068jd57bk5ar8%40group.calendar.google.com/public/basic.ics
   [4]: http://lanyrd.com/guides/apache-software-and-technologies/
-  [5]: https://www.apache.org/events/meetups.html
+  [5]: https://events.apache.org/event/index.html
   [6]: https://svn.apache.org/repos/asf/comdev/tools/get_meetups
diff --git a/source/committers/_index.md b/source/committers/_index.md
index 3505a2b..01aa25e 100755
--- a/source/committers/_index.md
+++ b/source/committers/_index.md
@@ -8,7 +8,7 @@ There are a number of useful Apache tools and services available for Apache proj
 
 ## Apache Infrastructure Information
 
-The primary portals for Apache Infra questions - how Subversion/Git/Websites, etc. work at the ASF - are pages at <a href="https://www.apache.org/dev/" target="_blank">apache.org/dev</a> and <a href="https://www.infra.apache.org" target="_blank">infra.apache.org</a>.
+The primary portals for Apache Infra questions - how Subversion/Git/Websites, etc. work at the ASF - are pages at <a href="https://www.apache.org/dev/" target="_blank">apache.org/dev</a> and <a href="https://infra.apache.org" target="_blank">infra.apache.org</a>.
 
 If you're a committer, you can [patch this very website yourself][2]!
 
diff --git a/source/contributor-ladder.md b/source/contributor-ladder.md
new file mode 100644
index 0000000..9abeaaa
--- /dev/null
+++ b/source/contributor-ladder.md
@@ -0,0 +1,125 @@
+---
+title: ASF Contributor Ladder
+---
+
+Projects at the ASF offer a way to grow in your responsibilities in the
+project, from being a user, all the way up to being a maintainer of the
+project. While the specific details may look different from one project
+to another, the rungs of the ladder look mostly the same.
+
+* [User](#user)
+* [Contributor](#contributor)
+* [Committer](#committer)
+* [PMC Member](#pmc-member)
+* [ASF Member](#asf-member)
+* [Officers of the Foundation](#officers-of-the-foundation)
+* [Board of Directors](#board-of-directors)
+
+## User
+
+Everything that we do in an ASF project is for the user. As a user of an
+Apache project, your responsibilities are just to enjoy the software.
+
+We encourage you to join the user mailing list to ask questions, and
+make suggestions. Members of the project are there to help out when you
+run into problems. You can find this list (or lists) by looking under the
+project name on [lists.apache.org](https://lists.apache.org).
+
+As a user, you're expected to abide by the project's [code of
+conduct](https://www.apache.org/foundation/policies/conduct), so that
+interactions are polite, friendly, and helpful.
+
+As you become a power user of the project, you may consider becoming a
+contributor.
+
+## Contributor
+
+While most people think of open source contributors as being coders,
+there are a wider variety of ways that you can contribute to a project.
+
+Most users' first contribution will be to open a ticket on the project's
+issue tracker, or to answer a less experienced user's questions. These
+actions help shape the future direction of the project, and are
+important contributions.
+
+We encourage you to join the project's developer mailing list at this
+time, to engage with the discussions about the direction that the project
+is taking. You can find this list (or lists) by looking under the
+project name on [lists.apache.org](https://lists.apache.org).
+
+Other contributions may include design, promotion, documentation
+improvements, events, and many other things.
+
+[See more about being a contributor](/contributors/).
+
+As you become more involved with contributing to the project, you may
+want to work towards [becoming a
+committer](/contributors/becomingacommitter.html).
+
+## Committer
+
+After making a number of contributions to a project, its PMC may invite you
+to become a committer. Note that the criteria for inviting a contributor
+to become a committer will vary greatly from one project to another.
+
+Once you have been invited to become a committer, and have accepted this
+invitation, you are authorized to commit changes directly to the
+project's source code repository. Note, however, that different projects
+may have different social norms around committing changes.
+
+Broadly referred to as CTR (Commit Then Review) and RTC (Review Then
+Commit), the exact mechanisms may vary. For example, you may be
+authorized to commit documentation changes without approval, while code
+changes may be submitted as a pull request, for other committers to
+review and approve before they are merged.
+
+[See more information about being a committer](/committers/).
+
+## PMC Member
+
+After being a committer for some time, the project's PMC may invite you to become a member
+of the project's Project Management Committee. This group acts as the
+steering committee for the project, making decisions about the project's
+road map, what features will be added, and other decisions around the
+project.
+
+The PMC *should* be conducting all of these conversations on the public
+developer mailing list(s), in the view of the entire community. A PMC
+also has a private mailing list, which is for discussion of topics such
+as the addition of new committers and PMC members, and any other
+sensitive topics.
+
+[See more information about being a PMC member](/pmc/).
+
+## Foundation Member
+
+When someone has been involved at the ASF for a while, they may be
+invited, by the membership, to become a member of the Foundation. This entitles them to vote
+for the Board of Directors, to participate in the members' mailing list,
+and to invite others to become Foundation members.
+
+[See more about being a Foundation 
+member](https://apache.org/foundation/governance/members.html)
+
+## Officers of the Foundation
+
+Officers of the Foundation are responsible for various aspects of the
+day-to-day operation of the Foundation. You can see how these roles are
+broken down in the [Foundation organization
+chart](https://whimsy.apache.org/foundation/orgchart/board).
+
+## Board of Directors
+
+The members of the ASF elect the members of the Board annually for 
+one-year terms.
+
+The Board of Directors is responsible for the governance of the
+Foundation. This includes overseeing projects, to ensure they are
+behaving in accordance with ASF policies and norms.
+
+The Board also delegates much of the day-to-day operation of the
+Foundation to the President, and various officers and committees.
+
+You can see the current composition of the Board on the [Board
+website](https://apache.org/foundation/board/).
+
diff --git a/source/contributors/_index.md b/source/contributors/_index.md
index cbc6a86..3e77077 100755
--- a/source/contributors/_index.md
+++ b/source/contributors/_index.md
@@ -9,7 +9,7 @@ their way around the Apache Software Foundation and our way of developing softwa
 (commonly called "The Apache Way"). For those wishing to start from
 the very beginning, we have a [newcomers page][1].
 
-# Project Independence And Policies
+## Project Independence And Policies
 
 While not all ASF projects practice all aspects of the Apache Way in the same way, there are a number of rules that Apache 
 projects must follow – things like complying with PMC 
@@ -23,7 +23,17 @@ opportunity to contribute to and benefit from our software, regardless
 of motivation or financial objectives. This is discussed in more detail
 in our document [Project Independence][7].
 
-# Moving From Contributor to Committer
+## Communication on mailing lists
+
+Development at the ASF has traditionally been done on mailing lists.
+This is not merely because we've always done it this way, but is an
+intentional decision, in order to include a wider community than who
+happens to be on your Slack channel at a particular moment.
+
+This is why we say, at the ASF, [**If it didn't happen on the mailing
+list, it didn't happen**](/contributors/mailing-lists).
+
+## Moving From Contributor to Committer
 
 Anyone can be a contributor to an Apache project. Being a contributor simply means
 that you take an interest in the project and contribute in some way, ranging from asking
diff --git a/source/contributors/mailing-lists.md b/source/contributors/mailing-lists.md
new file mode 100644
index 0000000..95bdfd4
--- /dev/null
+++ b/source/contributors/mailing-lists.md
@@ -0,0 +1,55 @@
+---
+title: Mailing lists
+---
+
+The ASF has a long tradition of using mailing lists as the primary
+communication format in projects. This is not merely because we've
+always done it that way, but is an intentional decision for the health
+and sustainability of our communities.
+
+## Inclusion and transparency
+
+Mailing lists ensure that all members of the community can participate
+on a level field, regardless of time zone or availability, whereas
+synchronous communication platforms (IRC, Slack, Discord, etc.) benefit
+only those who are online, and in the channel, at the time of the 
+conversation.
+
+Mailing lists also allow archiving, so that decisions can be understood
+by people who were not there at the time - what was decided, why, and by
+whom - even years after the fact.
+
+Synchronous communication platforms are great for end-user support,
+where an answer is needed quickly, and asking for clarification can be
+done real-time. It's also good for social interactions, and for quick
+brainstorming.
+
+But decisions, and important technical discussions, should be taken back
+to the mailing list so that the whole community can participate.
+
+This is why we say, at the ASF, **If it didn't happen on the mailing
+list, it didn't happen.**
+
+## Mailing list etiquette
+
+*To Be Written*
+
+* Meaningful subject lines
+* Inline vs top-posting
+* HTML and "rich text" messages
+* Clear language, use of colloquialisms and metaphor, etc. (writing for a
+  diverse audience)
+
+## Mailing list configuration
+
+Modern software development tools, including GitHub, your various ticket
+trackers, and CI tools, generate a lot of email. This can make your
+development mailing list difficult to approach for new contributors, as
+they appear as a wall of identical subject lines. This makes it hard for
+beginners to break into your project, and find out what's going on.
+
+Here's some configuration tips for your mailing lists to cut through the
+noise and make your project's lists more approachable and welcoming.
+
+*To Be Written*
+
diff --git a/source/gsoc/_index.md b/source/gsoc/_index.md
index 2746562..1d7813f 100644
--- a/source/gsoc/_index.md
+++ b/source/gsoc/_index.md
@@ -8,7 +8,7 @@ url: /gsoc/
     Currently happening
   </div>
   <div class="card-body">
-    <h5 class="card-title text-info">ASF is accepted as mentoring organisation! collect your ideas, answer participant's emails :)</h5>
+    <h5 class="card-title text-info">Proposal ranking phase 1</h5>
   </div>
 </div>
 
diff --git a/source/gsoc/gsoc-admin-tasks.md b/source/gsoc/gsoc-admin-tasks.md
index 729c61e..8d01686 100644
--- a/source/gsoc/gsoc-admin-tasks.md
+++ b/source/gsoc/gsoc-admin-tasks.md
@@ -51,7 +51,7 @@ current year's timeline and at [https://community.apache.org/gsoc/guide-to-being
 1. Apply for the ASF to be a mentoring organization for Google Summer of Code.
 I faintly remember that they wanted to know some stats like how often we have
 already participated and what the number of students was last year. I believe
-the ASF has participated since GSoC's inception in 2005. Consult [participation statistics](http://community.apache.org/gsoc/experiences.html), although the page may not be up to date.
+the ASF has participated since GSoC's inception in 2005. Consult [participation statistics](/gsoc/experiences.html), although the page may not be up to date.
 
 1. Once our application is accepted, write a press release and
 request press@ to send it out. We don't have a template yet, so work
diff --git a/source/gsoc/guide-to-being-a-mentor.md b/source/gsoc/guide-to-being-a-mentor.md
index 1abe6db..72d013a 100644
--- a/source/gsoc/guide-to-being-a-mentor.md
+++ b/source/gsoc/guide-to-being-a-mentor.md
@@ -11,7 +11,7 @@ Note: This document is bout GSoC, not about a generic Mentoring Program.
 
 We invite all ASF projects to submit their ideas for consideration in the
 ASF mentoring programme. Any Apache member and experienced committers can
-submit ideas via Jira (if your project does not use Jira you can [use the Comdev Issue Tracker For GSoC Tasks](use-the-comdev-issue-tracker-for-gsoc-tasks.html). We are looking for as many interesting projects as we can come up with. 
+submit ideas via Jira (if your project does not use Jira you can [use the Comdev GSoC Issue Tracker For GSoC Tasks](use-the-comdev-gsoc-issue-tracker-for-gsoc-tasks.html). We are looking for as many interesting projects as we can come up with.
 
 <a name="guidetobeingamentor-Summary"></a>
 ## Important Steps
diff --git a/source/newbiefaq.md b/source/newbiefaq.md
index e9533fa..c98d852 100644
--- a/source/newbiefaq.md
+++ b/source/newbiefaq.md
@@ -175,7 +175,7 @@ projects. This section includes such gems as:
 # How do I suggest changes to this website? # {#websitecms}
 
 The content for the `community.apache.org` website is written in Markdown
-and published automatically using a [Jenkins job](https://builds.apache.org/job/comdev-site/).
+and published automatically using a [Jenkins job](https://ci-builds.apache.org/job/Community%20Development/job/site/).
 Any contributor is able to submit changes via pull requests. Comdev committers are able to merge
 proposed changes.
 
diff --git a/source/pmc/_index.md b/source/pmc/_index.md
new file mode 100644
index 0000000..f272834
--- /dev/null
+++ b/source/pmc/_index.md
@@ -0,0 +1,71 @@
+---
+title: Project Management Committees
+url: /pmc/
+---
+
+The Project Management Committee, or PMC, is the technical steering
+committee for a project. This group determines the roadmap for the
+project, decides who will be added as committers and PMC members, and
+reports quarterly to the Board of Directors.
+
+* [PMC Responsibilities](#pmc-responsibilities)
+* [Chair](#chair)
+* [Voting](#voting)
+* [Reporting](#reporting)
+* [Adding committers](#adding-committers)
+* [Adding PMC members](#adding-pmc-members)
+* [What to do as a new member](#what-to-do-as-a-new-member)
+
+## PMC Responsibilities
+
+The PMC is responsible for the management of the project. This includes
+both the technical decisions, and ensuring that the project is operating
+in community-friendly ways.
+
+The PMC is also responsibile for voting on releases of their project, to
+ensure that each release is tested, and is an official ASF release
+artifact.
+
+[Read more about PMC responsibilities](/pmc/responsibilities.html)
+
+
+## Chair
+
+The PMC Chair acts as the voice of the project to the board, and is
+responsibile for filing a quarterly report. They are not the project
+leader, but are a peer of the other PMC members, who has been selected,
+for a time, to take the role of secretary and spokesperson.
+
+[Read more about the PMC Chair](/pmc/chair.html)
+
+## Voting
+
+While most actions of a project are decided by discussion and consensus,
+there are a number of situations in which a vote is necessary. You can
+read more about voting on the [ASF main
+website](https://apache.org/foundation/voting.html).
+
+## Reporting
+
+A PMC is required to file a report to the Board of Directors every
+quarter, on a schedule determined by the Board. [Read more about what
+goes into a PMC report](/pmc/reporting.html).
+
+## Adding committers
+
+The addition of committers is essential to the long-term 
+sustainability of an open source project. The PMC is responsible for
+determining who will be added as a committer. [Read more about how new
+committers are added to a project](/pmc/adding-committers.html).
+
+## Adding PMC members
+
+The PMC members identify project participants who they want to be
+members of the PMC. [Read more about the process of adding new PMC
+members](/pmc/adding-pmc-members.html).
+
+## What to do as a new member
+
+If you've just been added as a new PMC member, there's a number of
+things that you'll need to do to be an effective part of the PMC. [Read
+more about getting started as a new PMC member](/pmc/new-member.html).
diff --git a/source/pmc/adding-committers.md b/source/pmc/adding-committers.md
new file mode 100644
index 0000000..43f5504
--- /dev/null
+++ b/source/pmc/adding-committers.md
@@ -0,0 +1,13 @@
+---
+title: Adding Committers
+---
+
+The addition of new committers is essential to the long-term 
+sustainability of an open source project. The PMC is responsible for
+determining who will be added as a committer.
+
+* Who should be a committer?
+* Vote process
+* What to do when a committer is elected
+
+
diff --git a/source/pmc/adding-pmc-members.md b/source/pmc/adding-pmc-members.md
new file mode 100644
index 0000000..ef681ee
--- /dev/null
+++ b/source/pmc/adding-pmc-members.md
@@ -0,0 +1,14 @@
+---
+title: Adding PMC members
+---
+
+The PMC is responsible for identifying individuals who should be added
+to the PMC. This is a critical part of the long-term health and
+sustainability of a project, and ensures that contributors to the
+project have a voice in the project's roadmap.
+
+* Who should be a PMC member?
+* Nominating, discussion, and voting
+* What to do when a new PMC member is elected
+
+
diff --git a/source/pmc/chair.md b/source/pmc/chair.md
new file mode 100644
index 0000000..938c1cd
--- /dev/null
+++ b/source/pmc/chair.md
@@ -0,0 +1,14 @@
+---
+title: PMC Chair
+---
+
+The PMC Chair acts as the voice of the project to the board, and is
+responsible for filing a quarterly report. They are not the project
+leader, but are a peer of the other PMC members, who has been selected,
+for a time, to take the role of secretary and spokesperson.
+
+* Reporting
+* Selecting a new chair
+    * When
+    * Who
+
diff --git a/source/pmc/new-member.md b/source/pmc/new-member.md
new file mode 100644
index 0000000..fba9c62
--- /dev/null
+++ b/source/pmc/new-member.md
@@ -0,0 +1,12 @@
+---
+title: New PMC Members
+---
+
+You've been invited to join a project PMC? Congratulations! What should
+you do now?
+
+(There's some info here:
+https://svn.apache.org/repos/private/foundation/officers/advice-for-new-pmc-chairs.txt
+- but it's plain text, fairly terse, and behind a password.)
+
+
diff --git a/source/pmc/reporting.md b/source/pmc/reporting.md
new file mode 100644
index 0000000..6c80e6c
--- /dev/null
+++ b/source/pmc/reporting.md
@@ -0,0 +1,11 @@
+---
+title: PMC Reporting
+---
+
+A PMC is required to file a report to the Board of Directors every
+quarter, on a schedule determined by the Board.
+
+* Reporting schedule
+* What goes into a report
+* Tools to help generation of reports
+
diff --git a/source/pmc/responsibilities.md b/source/pmc/responsibilities.md
new file mode 100644
index 0000000..28289e7
--- /dev/null
+++ b/source/pmc/responsibilities.md
@@ -0,0 +1,87 @@
+---
+title: PMC Responsibilities
+---
+
+The Project Management Committee (PMC) is responsible for the oversight
+of the project, including technical decisions, ensuring that the project
+is operating in accordance with ASF norms, adding new members to the
+project, and voting on releases.
+
+* [Conducting business](#conducting-business)
+* [Ensuring project health](#ensuring-project-health)
+* [Adding community members](#adding-community-members)
+* [Reporting](/pmc/reporting.html)
+
+## Conducting Business
+
+The PMC is expected to conduct all of its business on the public
+developers mailing list, in the full view of the community.
+
+The private@ list is for communication about private matters, such as
+discussion of proposed committers, proposed new PMC members, and
+communication from the Board of Directors. Do not use it for discussion
+of features, roadmap, or other technical decisions.
+
+The Board of Directors will occasionally send you comments or queries,
+often related to your quarterly board report. Any PMC member can, and
+should, respond to these. You should not wait for the Chair to respond
+to these queries.
+
+The PMC is tasked with making decisions on the direction of the project,
+They can, and should, also incorporate the voice of the larger community
+in these decisions. However, if a vote is taken, only the votes of the
+PMC are binding on the outcome. Other community members may vote as
+well, but those votes are advisory only, and not binding.
+
+A PMC member may veto a technical decision, such as a proposed patch.
+However, they must be able to back this veto up with a technical reason,
+and be willing to discuss possible resolutions to their objection.
+
+Further discussion of voting may be found on the [Foundation
+website](https://www.apache.org/foundation/voting.html).
+
+## Making a release
+
+The process for releasing a official Apache software artifact may be
+found on the [Infra
+website](https://infra.apache.org/release-publishing.html). As a PMC
+member, you are expected to read and understand that process.
+
+When you vote on a release, it should be an indication that you have
+actually tested that release. In your vote email, rather than merely
+voting +1 or -1, also indicate what you tested, and on what
+platform(s).
+
+## Ensuring Project Health
+
+The PMC is tasked individually and collectively with ensuring that the
+project is behaving according to ASF policies and norms. In this
+responsibility, PMC members act as individuals, not as representatives
+of their employer, or other third-party interests. The reputation of the
+project, and the ASF in general, is delegated to PMC members in this
+respect.
+
+Projects should operate in a vendor neutral fashion. That is to say, any
+project participant has an equal voice, unrelated to the employer or
+lack thereof. Evidence that a project is favoring one company or
+organization over another is a serious offense. For example, if members
+of a particular organization are favored over another, for either
+addition to the committer roll, the PMC, or for acceptance of their
+patches, this is an indication that the employer is exerting undue
+influence over the direction of the project.
+
+The PMC is also expected to set the tone for conduct and interactions in
+the project. They can, and should, call out behavior that is in conflict
+with ASF norms, such as bullying, racist or sexist discussions, or other
+abusive behavior.
+
+## Adding Community Members
+
+The PMC is also tasked with the sustainability of the project. An
+important part of this is regularly [adding new
+committers](/pmc/adding-committers.html) and [new PMC
+members](/pmc/adding-pmc-members.html). This is not the sole role of the
+chair. Rather, every PMC member can, and should, regularly look at who
+is participating in the project, and evaluate whether they should be
+invited to the next [rung of the contributor
+ladder](/contributor-ladder.html).
diff --git a/static/css/bootstrap.min.css b/static/css/bootstrap.min.css
index 21d10ba..83a71b1 100644
--- a/static/css/bootstrap.min.css
+++ b/static/css/bootstrap.min.css
@@ -1,7 +1,7 @@
 /*!
- * Bootstrap v4.5.2 (https://getbootstrap.com/)
- * Copyright 2011-2020 The Bootstrap Authors
- * Copyright 2011-2020 Twitter, Inc.
+ * Bootstrap v4.6.2 (https://getbootstrap.com/)
+ * Copyright 2011-2022 The Bootstrap Authors
+ * Copyright 2011-2022 Twitter, Inc.
  * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
- */:root{--blue:#007bff;--indigo:#6610f2;--purple:#6f42c1;--pink:#e83e8c;--red:#dc3545;--orange:#fd7e14;--yellow:#ffc107;--green:#28a745;--teal:#20c997;--cyan:#17a2b8;--white:#fff;--gray:#6c757d;--gray-dark:#343a40;--primary:#007bff;--secondary:#6c757d;--success:#28a745;--info:#17a2b8;--warning:#ffc107;--danger:#dc3545;--light:#f8f9fa;--dark:#343a40;--breakpoint-xs:0;--breakpoint-sm:576px;--breakpoint-md:768px;--breakpoint-lg:992px;--breakpoint-xl:1200px;--font-family-sans-serif:-apple-s [...]
+ */:root{--blue:#007bff;--indigo:#6610f2;--purple:#6f42c1;--pink:#e83e8c;--red:#dc3545;--orange:#fd7e14;--yellow:#ffc107;--green:#28a745;--teal:#20c997;--cyan:#17a2b8;--white:#fff;--gray:#6c757d;--gray-dark:#343a40;--primary:#007bff;--secondary:#6c757d;--success:#28a745;--info:#17a2b8;--warning:#ffc107;--danger:#dc3545;--light:#f8f9fa;--dark:#343a40;--breakpoint-xs:0;--breakpoint-sm:576px;--breakpoint-md:768px;--breakpoint-lg:992px;--breakpoint-xl:1200px;--font-family-sans-serif:-apple-s [...]
 /*# sourceMappingURL=bootstrap.min.css.map */
\ No newline at end of file
diff --git a/static/css/main.css b/static/css/main.css
index b7ccc4a..87b221d 100644
--- a/static/css/main.css
+++ b/static/css/main.css
@@ -27,3 +27,20 @@ footer.page-footer .footer-copyright {
 dt:hover > .headerlink, p:hover > .headerlink, td:hover > .headerlink, h1:hover > .headerlink, h2:hover > .headerlink, h3:hover > .headerlink, h4:hover > .headerlink, h5:hover > .headerlink, h6:hover > .headerlink {
   visibility: visible
 }
+
+.child-pages {
+  list-style-type: none;  
+}
+.page-summary .title {
+  font-size:100%;
+}
+
+.page-summary .summary {
+  margin-left: 1em;
+  font-style: italic;
+}
+
+.published-date {
+  font-size: 80%;
+  font-style: italic;
+}
\ No newline at end of file
diff --git a/static/js/bootstrap.min.js b/static/js/bootstrap.min.js
index ef4d9cb..97206dc 100644
--- a/static/js/bootstrap.min.js
+++ b/static/js/bootstrap.min.js
@@ -1,7 +1,7 @@
 /*!
-  * Bootstrap v4.5.2 (https://getbootstrap.com/)
-  * Copyright 2011-2020 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors)
+  * Bootstrap v4.6.2 (https://getbootstrap.com/)
+  * Copyright 2011-2022 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors)
   * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
   */
-!function(t,e){"object"==typeof exports&&"undefined"!=typeof module?e(exports,require("jquery"),require("popper.js")):"function"==typeof define&&define.amd?define(["exports","jquery","popper.js"],e):e((t="undefined"!=typeof globalThis?globalThis:t||self).bootstrap={},t.jQuery,t.Popper)}(this,(function(t,e,n){"use strict";function i(t,e){for(var n=0;n<e.length;n++){var i=e[n];i.enumerable=i.enumerable||!1,i.configurable=!0,"value"in i&&(i.writable=!0),Object.defineProperty(t,i.key,i)}}fun [...]
+!function(t,e){"object"==typeof exports&&"undefined"!=typeof module?e(exports,require("jquery"),require("popper.js")):"function"==typeof define&&define.amd?define(["exports","jquery","popper.js"],e):e((t="undefined"!=typeof globalThis?globalThis:t||self).bootstrap={},t.jQuery,t.Popper)}(this,(function(t,e,n){"use strict";function i(t){return t&&"object"==typeof t&&"default"in t?t:{default:t}}var o=i(e),a=i(n);function s(t,e){for(var n=0;n<e.length;n++){var i=e[n];i.enumerable=i.enumerabl [...]
 //# sourceMappingURL=bootstrap.min.js.map
\ No newline at end of file
diff --git a/static/js/jquery-1.9.1.min.js b/static/js/jquery-1.9.1.min.js
deleted file mode 100644
index 006e953..0000000
--- a/static/js/jquery-1.9.1.min.js
+++ /dev/null
@@ -1,5 +0,0 @@
-/*! jQuery v1.9.1 | (c) 2005, 2012 jQuery Foundation, Inc. | jquery.org/license
-//@ sourceMappingURL=jquery.min.map
-*/(function(e,t){var n,r,i=typeof t,o=e.document,a=e.location,s=e.jQuery,u=e.$,l={},c=[],p="1.9.1",f=c.concat,d=c.push,h=c.slice,g=c.indexOf,m=l.toString,y=l.hasOwnProperty,v=p.trim,b=function(e,t){return new b.fn.init(e,t,r)},x=/[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/.source,w=/\S+/g,T=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,N=/^(?:(<[\w\W]+>)[^>]*|#([\w-]*))$/,C=/^<(\w+)\s*\/?>(?:<\/\1>|)$/,k=/^[\],:{}\s]*$/,E=/(?:^|:|,)(?:\s*\[)+/g,S=/\\(?:["\\\/bfnrt]|u[\da-fA-F]{4})/g,A=/"[^"\\\r\n]*"|tru [...]
-return(!i||i!==r&&!b.contains(r,i))&&(e.type=o.origType,n=o.handler.apply(this,arguments),e.type=t),n}}}),b.support.submitBubbles||(b.event.special.submit={setup:function(){return b.nodeName(this,"form")?!1:(b.event.add(this,"click._submit keypress._submit",function(e){var n=e.target,r=b.nodeName(n,"input")||b.nodeName(n,"button")?n.form:t;r&&!b._data(r,"submitBubbles")&&(b.event.add(r,"submit._submit",function(e){e._submit_bubble=!0}),b._data(r,"submitBubbles",!0))}),t)},postDispatch:fu [...]
-}b.merge(d,s.childNodes),s.textContent="";while(s.firstChild)s.removeChild(s.firstChild);s=f.lastChild}else d.push(t.createTextNode(o));s&&f.removeChild(s),b.support.appendChecked||b.grep(Ot(d,"input"),Bt),h=0;while(o=d[h++])if((!r||-1===b.inArray(o,r))&&(a=b.contains(o.ownerDocument,o),s=Ot(f.appendChild(o),"script"),a&&Mt(s),n)){i=0;while(o=s[i++])kt.test(o.type||"")&&n.push(o)}return s=null,f},cleanData:function(e,t){var n,r,o,a,s=0,u=b.expando,l=b.cache,p=b.support.deleteExpando,f=b. [...]
\ No newline at end of file
diff --git a/static/js/jquery.min.js b/static/js/jquery.min.js
new file mode 100644
index 0000000..0de648e
--- /dev/null
+++ b/static/js/jquery.min.js
@@ -0,0 +1,2 @@
+/*! jQuery v3.6.4 | (c) OpenJS Foundation and other contributors | jquery.org/license */
+!function(e,t){"use strict";"object"==typeof module&&"object"==typeof module.exports?module.exports=e.document?t(e,!0):function(e){if(!e.document)throw new Error("jQuery requires a window with a document");return t(e)}:t(e)}("undefined"!=typeof window?window:this,function(C,e){"use strict";var t=[],r=Object.getPrototypeOf,s=t.slice,g=t.flat?function(e){return t.flat.call(e)}:function(e){return t.concat.apply([],e)},u=t.push,i=t.indexOf,n={},o=n.toString,y=n.hasOwnProperty,a=y.toString,l= [...]