diff --git a/composer.json b/composer.json
index 59e986324b7344ee1f59ea69a1f76293046b271b..77f2b2f5f040fe8198a560faadf1e15e29ea9383 100644
--- a/composer.json
+++ b/composer.json
@@ -19,6 +19,10 @@
       "type": "composer",
       "url": "https://packages.drupal.org/8"
     },
+    {
+        "type": "composer",
+        "url": "https://asset-packagist.org"
+    },
     {
       "type": "vcs",
       "url": "https://gitlab.cern.ch/web-team/drupal/public/d9/modules/cern-components.git"
@@ -98,10 +102,15 @@
   ],
   "require": {
     "php": ">=7.4",
+    "bower-asset/bootstrap": "~5.1.0",
+    "bower-asset/jquery-cycle": "~3.0.0",
+    "bower-asset/jquery-hoverintent": "~1.10.0",
+    "bower-asset/json2": "dev-master",
+    "bower-asset/ckeditor": "dev-full/4.18.x",
     "ckeditor/ckeditor": "dev-full/4.18.x",
     "composer/installers": "~2.0.0",
     "cweagans/composer-patches": "~1.7.0",
-    "dompdf/dompdf": "^1.0",
+    "dompdf/dompdf": "~1.2.1",
     "drupal/admin_toolbar": "~3.1.0",
     "drupal/adminimal_theme": "~1.6.0",
     "drupal/allowed_formats": "~1.4.0",
@@ -217,6 +226,7 @@
     "drupal/workbench_access": "~1.0@beta",
     "drupal/workbench_moderation": "~1.6.0",
     "drush/drush": "~10.6.2",
+    "npm-asset/jquery": "~3.6.0",
     "vlucas/phpdotenv": "~5.4.0",
     "webflo/drupal-finder": "~1.2.0",
     "wikimedia/composer-merge-plugin": "~2.0.1"
@@ -257,12 +267,14 @@
       "DrupalProject\\composer\\ScriptHandler::checkComposerVersion"
     ],
     "post-install-cmd": [
+      "@putenv CKEDITOR_PLUGIN_VERSION=4.18.0",
       "DrupalProject\\composer\\ScriptHandler::createRequiredFiles",
-      "echo \"Crawl-Delay: 10\" >> web/robots.txt"
+      "scripts/post-setup-actions.sh"
     ],
     "post-update-cmd": [
+      "@putenv CKEDITOR_PLUGIN_VERSION=4.18.0",
       "DrupalProject\\composer\\ScriptHandler::createRequiredFiles",
-      "echo \"Crawl-Delay: 10\" >> web/robots.txt"
+      "scripts/post-setup-actions.sh"
     ]
   },
   "extra": {
diff --git a/scripts/post-setup-actions.sh b/scripts/post-setup-actions.sh
new file mode 100755
index 0000000000000000000000000000000000000000..c334b2b3dab991e13cb695c3941824a1b424e346
--- /dev/null
+++ b/scripts/post-setup-actions.sh
@@ -0,0 +1,36 @@
+#!/bin/sh
+
+# Slow down robots to preserve bandwidth
+echo "Crawl-Delay: 20" >> web/robots.txt
+
+# Install JS libraries needed by module views_slideshow , ckeditor and maybe others
+# Ref: https://www.drupal.org/project/views_slideshow/issues/2673910#comment-13385016
+
+# Move libraries that are installed by composer in the wrong place
+mv vendor/bower-asset/jquery-cycle web/libraries/jquery.cycle
+mv vendor/bower-asset/jquery-hoverintent web/libraries/jquery.hoverintent
+mv vendor/bower-asset/json2 web/libraries/json2
+mv vendor/bower-asset/ckeditor web/libraries/ckeditor
+
+# Download JS libs that aren't part of any identifiable package
+# The env vars like
+#      CKEDITOR_PLUGIN_CODESNIPPET_VERSION
+# are set based on the env vars defined in composer.json in the "scripts" section
+CKEDITOR_PLUGIN_CODESNIPPET_VERSION="$CKEDITOR_PLUGIN_VERSION"
+CKEDITOR_PLUGIN_COLORBUTTON_VERSION="$CKEDITOR_PLUGIN_VERSION"
+CKEDITOR_PLUGIN_PANELBUTTON_VERSION="$CKEDITOR_PLUGIN_VERSION"
+
+get_ckeditor_library(){
+  lib_name="$1"
+  lib_version="$2"
+  (
+    cd /tmp
+    wget "https://download.ckeditor.com/${lib_name}/releases/${lib_name}_${lib_version}.zip" -O "${lib_name}.zip"
+    unzip "${lib_name}.zip"; rm "${lib_name}.zip"
+  )
+  mv "/tmp/${lib_name}" "web/libraries/${lib_name}"
+}
+
+get_ckeditor_library codesnippet "$CKEDITOR_PLUGIN_CODESNIPPET_VERSION"
+get_ckeditor_library colorbutton "$CKEDITOR_PLUGIN_COLORBUTTON_VERSION"
+get_ckeditor_library panelbutton "$CKEDITOR_PLUGIN_PANELBUTTON_VERSION"
diff --git a/web/libraries/codesnippet/composer.json b/web/libraries/codesnippet/composer.json
deleted file mode 100644
index 0091b70c8b06ef0dbdeb67621809e3e5a357b816..0000000000000000000000000000000000000000
--- a/web/libraries/codesnippet/composer.json
+++ /dev/null
@@ -1,16 +0,0 @@
-{
-  "name": "drupal-ckeditor-libraries-group/codesnippet",
-  "description": "CKEditor 4 codesnippet plugin",
-  "type": "drupal-library",
-  "keywords": ["ckeditor", "plugin", "codesnippet"],
-  "homepage": "https://ckeditor.com/cke4/addon/codesnippet",
-  "license": [
-    "GPL-2.0-or-later",
-    "LGPL-2.1-or-later",
-    "MPL-1.1"
-  ],
-  "support": {
-    "issues": "https://github.com/ckeditor/ckeditor4/issues",
-    "source": "https://github.com/ckeditor/ckeditor4/tree/master/plugins/codesnippet"
-  }
-}
diff --git a/web/libraries/codesnippet/dialogs/codesnippet.js b/web/libraries/codesnippet/dialogs/codesnippet.js
deleted file mode 100644
index 88a5560227a1f399d25c9b5465a9d9b015fd4b92..0000000000000000000000000000000000000000
--- a/web/libraries/codesnippet/dialogs/codesnippet.js
+++ /dev/null
@@ -1,83 +0,0 @@
-/**
- * @license Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved.
- * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license
- */
-
-'use strict';
-
-( function() {
-	CKEDITOR.dialog.add( 'codeSnippet', function( editor ) {
-		var snippetLangs = editor._.codesnippet.langs,
-			lang = editor.lang.codesnippet,
-			clientHeight = document.documentElement.clientHeight,
-			langSelectItems = [],
-			snippetLangId;
-
-		langSelectItems.push( [ editor.lang.common.notSet, '' ] );
-
-		for ( snippetLangId in snippetLangs )
-			langSelectItems.push( [ snippetLangs[ snippetLangId ], snippetLangId ] );
-
-		// Size adjustments.
-		var size = CKEDITOR.document.getWindow().getViewPaneSize(),
-			// Make it maximum 800px wide, but still fully visible in the viewport.
-			width = Math.min( size.width - 70, 800 ),
-			// Make it use 2/3 of the viewport height.
-			height = size.height / 1.5;
-
-		// Low resolution settings.
-		if ( clientHeight < 650 ) {
-			height = clientHeight - 220;
-		}
-
-		return {
-			title: lang.title,
-			minHeight: 200,
-			resizable: CKEDITOR.DIALOG_RESIZE_NONE,
-			contents: [
-				{
-					id: 'info',
-					elements: [
-						{
-							id: 'lang',
-							type: 'select',
-							label: lang.language,
-							items: langSelectItems,
-							setup: function( widget ) {
-								if ( widget.ready && widget.data.lang )
-									this.setValue( widget.data.lang );
-
-								// The only way to have an empty select value in Firefox is
-								// to set a negative selectedIndex.
-								if ( CKEDITOR.env.gecko && ( !widget.data.lang || !widget.ready ) )
-									this.getInputElement().$.selectedIndex = -1;
-							},
-							commit: function( widget ) {
-								widget.setData( 'lang', this.getValue() );
-							}
-						},
-						{
-							id: 'code',
-							type: 'textarea',
-							label: lang.codeContents,
-							setup: function( widget ) {
-								this.setValue( widget.data.code );
-							},
-							commit: function( widget ) {
-								widget.setData( 'code', this.getValue() );
-							},
-							required: true,
-							validate: CKEDITOR.dialog.validate.notEmpty( lang.emptySnippetError ),
-							inputStyle: 'cursor:auto;' +
-								'width:' + width + 'px;' +
-								'height:' + height + 'px;' +
-								'tab-size:4;' +
-								'text-align:left;',
-							'class': 'cke_source'
-						}
-					]
-				}
-			]
-		};
-	} );
-}() );
diff --git a/web/libraries/codesnippet/icons/codesnippet.png b/web/libraries/codesnippet/icons/codesnippet.png
deleted file mode 100644
index c71851067105640817b7a7360126b1127c60683e..0000000000000000000000000000000000000000
--- a/web/libraries/codesnippet/icons/codesnippet.png
+++ /dev/null
@@ -1,5 +0,0 @@
-�PNG
-
-���
IHDR�����������a���gAMA�����a��� cHRM��z%��������������u0���`��:���o�_�F���bKGD�������������	pHYs����������tIME�
*->���IDAT8˥S1j�@�ٳN!���*]'�0������W�N�I�B>�I#)‰e�Xv�ݛ��cYU��1~��������=��Y0�"�-k�
-��{ �\�`b�j1�j���9���IN~V`]���|>#I��^�@f��
-$�{���ܨ�{�T 	f&�h���P�e&	Y���krm��Uһ$���v�������.H:�|!�4M`�\œs� �c��m�͊��໮�$	[��ipm���~� �������τt�A��$���%tEXtdate:create�2016-07-19T13:30:42+02:00�wx���%tEXtdate:modify�2016-07-19T13:30:42+02:00i�������IEND�B`�
\ No newline at end of file
diff --git a/web/libraries/codesnippet/icons/hidpi/codesnippet.png b/web/libraries/codesnippet/icons/hidpi/codesnippet.png
deleted file mode 100644
index 2de477f6b1345fd235c347deff599628924022d4..0000000000000000000000000000000000000000
--- a/web/libraries/codesnippet/icons/hidpi/codesnippet.png
+++ /dev/null
@@ -1,10 +0,0 @@
-�PNG
-
-���
IHDR��� ��� ���szz����gAMA�����a��� cHRM��z&��������������u0���`��:���p��Q<���bKGD�������������tIME�
!�����IDATX��W=hA�ޛe�\.�zB���2X�R
-���+A+EAA,,DRZ(ho�2XY
-�L!�{r���<�������IЁ����7�~��f�666�MD��D���֝�����L{�౒R���y��,tG캔˚��-�2�-�,!G�
-�Jp�gMD "�p/�Lb��m�<5��2+@ADTz#��^w`�r)|�z�@%���n���o"{�"dM.����dqL�������Y,
->������J����C��M㜃1FR��
-$/��%f}R��'�Or@q��R��7"�1&�h�J��;>�.�����@#�Z�%
-\��{����\�����.4�O�Tk	��˜�v:��p8��R;VWW�uFq��VkW�������(�0��������̗C��4&�ؐ�."ɱ�8����ß1	u�9�kyy�jl��J8���17���v��\���p8�n��>Ái�hs я7`~0�L��o��x]]<�{DT褵��1fS�/�ݦck-�y�9����3��Xk�Z%��j�Z�0P�d2y��o�ә�O<Ӊ�vww᜻S��AD/TA�}��1Ƙ7����F�Q�M[�b���~EQT�k�����U�l`���'�'�b4���R���y�����jl
�y��]��� �?�s�v�]��2`�K"�L=
-��˷��}cLɷ�$8��LD��ιkD��A�����,�*�?�Š�e��6�<KԖ-�7�Ù�\�(]�1s�x�p�=f�IP	?��f�1�+~����S��s�K+�2�y�?�|�l�'5���%tEXtdate:create�2016-11-02T13:33:00+01:00������%tEXtdate:modify�2016-11-02T13:33:00+01:00�\Q����IEND�B`�
\ No newline at end of file
diff --git a/web/libraries/codesnippet/lang/ar.js b/web/libraries/codesnippet/lang/ar.js
deleted file mode 100644
index bb5b490bf36ee5e0e8143e50c89e48727a294f8f..0000000000000000000000000000000000000000
--- a/web/libraries/codesnippet/lang/ar.js
+++ /dev/null
@@ -1,13 +0,0 @@
-/**
- * @license Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved.
- * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license
- */
-
-CKEDITOR.plugins.setLang( 'codesnippet', 'ar', {
-	button: 'أدمج قصاصة الشيفرة',
-	codeContents: 'محتوى الشيفرة',
-	emptySnippetError: 'قصاصة الشيفرة لايمكن أن تكون فارغة.',
-	language: 'لغة',
-	title: 'قصاصة الشيفرة',
-	pathName: 'قصاصة الشيفرة'
-} );
diff --git a/web/libraries/codesnippet/lang/az.js b/web/libraries/codesnippet/lang/az.js
deleted file mode 100644
index 58c702cc290fdc006b62cc6d3dbe3bca93167f37..0000000000000000000000000000000000000000
--- a/web/libraries/codesnippet/lang/az.js
+++ /dev/null
@@ -1,13 +0,0 @@
-/**
- * @license Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved.
- * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license
- */
-
-CKEDITOR.plugins.setLang( 'codesnippet', 'az', {
-	button: 'Kodun parçasını əlavə et',
-	codeContents: 'Kod',
-	emptySnippetError: 'Kodun parçasını boş ola bilməz',
-	language: 'Programlaşdırma dili',
-	title: 'Kodun parçasını',
-	pathName: 'kodun parçasını'
-} );
diff --git a/web/libraries/codesnippet/lang/bg.js b/web/libraries/codesnippet/lang/bg.js
deleted file mode 100644
index 7655acf236d24aeee1519a0dc916a13c5f8327b3..0000000000000000000000000000000000000000
--- a/web/libraries/codesnippet/lang/bg.js
+++ /dev/null
@@ -1,13 +0,0 @@
-/**
- * @license Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved.
- * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license
- */
-
-CKEDITOR.plugins.setLang( 'codesnippet', 'bg', {
-	button: 'Въвеждане на блок с код',
-	codeContents: 'Съдържание на кода',
-	emptySnippetError: 'Блока с код не може да бъде празен.',
-	language: 'Език',
-	title: 'Блок с код',
-	pathName: 'блок с код'
-} );
diff --git a/web/libraries/codesnippet/lang/ca.js b/web/libraries/codesnippet/lang/ca.js
deleted file mode 100644
index 53e4f2fb4d8c0ec0d9e114b6fb43dadbc8ed45bd..0000000000000000000000000000000000000000
--- a/web/libraries/codesnippet/lang/ca.js
+++ /dev/null
@@ -1,13 +0,0 @@
-/**
- * @license Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved.
- * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license
- */
-
-CKEDITOR.plugins.setLang( 'codesnippet', 'ca', {
-	button: 'Insereix el fragment de codi',
-	codeContents: 'Contingut del codi',
-	emptySnippetError: 'El fragment de codi no pot estar buit.',
-	language: 'Idioma',
-	title: 'Fragment de codi',
-	pathName: 'fragment de codi'
-} );
diff --git a/web/libraries/codesnippet/lang/cs.js b/web/libraries/codesnippet/lang/cs.js
deleted file mode 100644
index dc800961db3b475ca15d363c71a23b868a943273..0000000000000000000000000000000000000000
--- a/web/libraries/codesnippet/lang/cs.js
+++ /dev/null
@@ -1,13 +0,0 @@
-/**
- * @license Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved.
- * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license
- */
-
-CKEDITOR.plugins.setLang( 'codesnippet', 'cs', {
-	button: 'Vložit úryvek kódu',
-	codeContents: 'Obsah kódu',
-	emptySnippetError: 'Úryvek kódu nemůže být prázdný.',
-	language: 'Jazyk',
-	title: 'Úryvek kódu',
-	pathName: 'úryvek kódu'
-} );
diff --git a/web/libraries/codesnippet/lang/da.js b/web/libraries/codesnippet/lang/da.js
deleted file mode 100644
index 3fac8542adab6b51a8d8d5972ac9fc780ba00075..0000000000000000000000000000000000000000
--- a/web/libraries/codesnippet/lang/da.js
+++ /dev/null
@@ -1,13 +0,0 @@
-/**
- * @license Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved.
- * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license
- */
-
-CKEDITOR.plugins.setLang( 'codesnippet', 'da', {
-	button: 'Indsæt kodestykket her',
-	codeContents: 'Koden',
-	emptySnippetError: 'Kodestykket kan ikke være tomt.',
-	language: 'Sprog',
-	title: 'Kodestykke',
-	pathName: 'kodestykke'
-} );
diff --git a/web/libraries/codesnippet/lang/de-ch.js b/web/libraries/codesnippet/lang/de-ch.js
deleted file mode 100644
index 0da590d84b1aee85001cc30d46588efc626126d7..0000000000000000000000000000000000000000
--- a/web/libraries/codesnippet/lang/de-ch.js
+++ /dev/null
@@ -1,13 +0,0 @@
-/**
- * @license Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved.
- * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license
- */
-
-CKEDITOR.plugins.setLang( 'codesnippet', 'de-ch', {
-	button: 'Codeschnipsel einfügen',
-	codeContents: 'Codeinhalt',
-	emptySnippetError: 'Ein Codeschnipsel darf nicht leer sein.',
-	language: 'Sprache',
-	title: 'Codeschnipsel',
-	pathName: 'Codeschnipsel'
-} );
diff --git a/web/libraries/codesnippet/lang/de.js b/web/libraries/codesnippet/lang/de.js
deleted file mode 100644
index d5c5e18b5304e8129f95e3dab54fa700c25444ec..0000000000000000000000000000000000000000
--- a/web/libraries/codesnippet/lang/de.js
+++ /dev/null
@@ -1,13 +0,0 @@
-/**
- * @license Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved.
- * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license
- */
-
-CKEDITOR.plugins.setLang( 'codesnippet', 'de', {
-	button: 'Codeschnipsel einfügen',
-	codeContents: 'Codeinhalt',
-	emptySnippetError: 'Ein Codeschnipsel darf nicht leer sein.',
-	language: 'Sprache',
-	title: 'Codeschnipsel',
-	pathName: 'Codeschnipsel'
-} );
diff --git a/web/libraries/codesnippet/lang/el.js b/web/libraries/codesnippet/lang/el.js
deleted file mode 100644
index a7542ce52f789e8c9049fa5dbb823f3d6c2cc0f4..0000000000000000000000000000000000000000
--- a/web/libraries/codesnippet/lang/el.js
+++ /dev/null
@@ -1,13 +0,0 @@
-/**
- * @license Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved.
- * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license
- */
-
-CKEDITOR.plugins.setLang( 'codesnippet', 'el', {
-	button: 'Εισαγωγή Αποσπάσματος Κώδικα',
-	codeContents: 'Περιεχόμενο κώδικα',
-	emptySnippetError: 'Δεν γίνεται να είναι κενά τα αποσπάσματα κώδικα.',
-	language: 'Γλώσσα',
-	title: 'Απόσπασμα κώδικα',
-	pathName: 'απόσπασμα κώδικα'
-} );
diff --git a/web/libraries/codesnippet/lang/en-au.js b/web/libraries/codesnippet/lang/en-au.js
deleted file mode 100644
index ad1d5d355fab60dca340c0224b6bf11b2cf82b44..0000000000000000000000000000000000000000
--- a/web/libraries/codesnippet/lang/en-au.js
+++ /dev/null
@@ -1,13 +0,0 @@
-/**
- * @license Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved.
- * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license
- */
-
-CKEDITOR.plugins.setLang( 'codesnippet', 'en-au', {
-	button: 'Insert Code Snippet',
-	codeContents: 'Code content',
-	emptySnippetError: 'A code snippet cannot be empty.',
-	language: 'Language',
-	title: 'Code snippet',
-	pathName: 'code snippet'
-} );
diff --git a/web/libraries/codesnippet/lang/en-gb.js b/web/libraries/codesnippet/lang/en-gb.js
deleted file mode 100644
index 99271ce3efc214da4a70a77492e6b5733c4a6203..0000000000000000000000000000000000000000
--- a/web/libraries/codesnippet/lang/en-gb.js
+++ /dev/null
@@ -1,13 +0,0 @@
-/**
- * @license Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved.
- * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license
- */
-
-CKEDITOR.plugins.setLang( 'codesnippet', 'en-gb', {
-	button: 'Insert Code Snippet',
-	codeContents: 'Code content',
-	emptySnippetError: 'A code snippet cannot be empty.',
-	language: 'Language',
-	title: 'Code snippet',
-	pathName: 'code snippet'
-} );
diff --git a/web/libraries/codesnippet/lang/en.js b/web/libraries/codesnippet/lang/en.js
deleted file mode 100644
index f48f7dea78bb768493aad4641ca900b1e0e46576..0000000000000000000000000000000000000000
--- a/web/libraries/codesnippet/lang/en.js
+++ /dev/null
@@ -1,13 +0,0 @@
-/**
- * @license Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved.
- * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license
- */
-
-CKEDITOR.plugins.setLang( 'codesnippet', 'en', {
-	button: 'Insert Code Snippet',
-	codeContents: 'Code content',
-	emptySnippetError: 'A code snippet cannot be empty.',
-	language: 'Language',
-	title: 'Code snippet',
-	pathName: 'code snippet'
-} );
diff --git a/web/libraries/codesnippet/lang/eo.js b/web/libraries/codesnippet/lang/eo.js
deleted file mode 100644
index 047964a40eb399630abf3a6413dc94d2ccf2052c..0000000000000000000000000000000000000000
--- a/web/libraries/codesnippet/lang/eo.js
+++ /dev/null
@@ -1,13 +0,0 @@
-/**
- * @license Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved.
- * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license
- */
-
-CKEDITOR.plugins.setLang( 'codesnippet', 'eo', {
-	button: 'Enmeti kodaĵeron',
-	codeContents: 'Kodenhavo',
-	emptySnippetError: 'Kodaĵero ne povas esti malplena.',
-	language: 'Lingvo',
-	title: 'Kodaĵero',
-	pathName: 'kodaĵero'
-} );
diff --git a/web/libraries/codesnippet/lang/es-mx.js b/web/libraries/codesnippet/lang/es-mx.js
deleted file mode 100644
index abe20624e543ce38cf20bc286c21c1583f0238dd..0000000000000000000000000000000000000000
--- a/web/libraries/codesnippet/lang/es-mx.js
+++ /dev/null
@@ -1,13 +0,0 @@
-/**
- * @license Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved.
- * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license
- */
-
-CKEDITOR.plugins.setLang( 'codesnippet', 'es-mx', {
-	button: 'Insertar fragmento de código',
-	codeContents: 'Contenido del código',
-	emptySnippetError: 'Un fragmento de código no puede estar vacio.',
-	language: 'Idioma',
-	title: 'Fragmento de código',
-	pathName: 'fragmento de código'
-} );
diff --git a/web/libraries/codesnippet/lang/es.js b/web/libraries/codesnippet/lang/es.js
deleted file mode 100644
index eb613a6ff795e6c93d50d19c851d30f77b8dff25..0000000000000000000000000000000000000000
--- a/web/libraries/codesnippet/lang/es.js
+++ /dev/null
@@ -1,13 +0,0 @@
-/**
- * @license Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved.
- * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license
- */
-
-CKEDITOR.plugins.setLang( 'codesnippet', 'es', {
-	button: 'Insertar fragmento de código',
-	codeContents: 'Contenido del código',
-	emptySnippetError: 'Un fragmento de código no puede estar vacío.',
-	language: 'Lenguaje',
-	title: 'Fragmento de código',
-	pathName: 'fragmento de código'
-} );
diff --git a/web/libraries/codesnippet/lang/et.js b/web/libraries/codesnippet/lang/et.js
deleted file mode 100644
index da384fd7e481bd37b5dae4bd5be04e5df9bc3ccc..0000000000000000000000000000000000000000
--- a/web/libraries/codesnippet/lang/et.js
+++ /dev/null
@@ -1,13 +0,0 @@
-/**
- * @license Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved.
- * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license
- */
-
-CKEDITOR.plugins.setLang( 'codesnippet', 'et', {
-	button: 'Koodijupi sisestamine',
-	codeContents: 'Koodi sisu',
-	emptySnippetError: 'Koodijupp ei saa olla tühi.',
-	language: 'Keel',
-	title: 'Koodijupp',
-	pathName: 'koodijupp'
-} );
diff --git a/web/libraries/codesnippet/lang/eu.js b/web/libraries/codesnippet/lang/eu.js
deleted file mode 100644
index 62314e514e4b9dc871f3755e7879d2a52f1e1ef1..0000000000000000000000000000000000000000
--- a/web/libraries/codesnippet/lang/eu.js
+++ /dev/null
@@ -1,13 +0,0 @@
-/**
- * @license Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved.
- * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license
- */
-
-CKEDITOR.plugins.setLang( 'codesnippet', 'eu', {
-	button: 'Txertatu kode zatia',
-	codeContents: 'Kode edukia',
-	emptySnippetError: 'Kode zatiak ezin du hutsik egon.',
-	language: 'Lengoaia',
-	title: 'Kode zatia',
-	pathName: 'kode zatia'
-} );
diff --git a/web/libraries/codesnippet/lang/fa.js b/web/libraries/codesnippet/lang/fa.js
deleted file mode 100644
index fecc12ca461d98a6cd4592d431675f789b0fc77a..0000000000000000000000000000000000000000
--- a/web/libraries/codesnippet/lang/fa.js
+++ /dev/null
@@ -1,13 +0,0 @@
-/**
- * @license Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved.
- * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license
- */
-
-CKEDITOR.plugins.setLang( 'codesnippet', 'fa', {
-	button: 'قرار دادن کد قطعه',
-	codeContents: 'محتوای کد',
-	emptySnippetError: 'کد نمی تواند خالی باشد.',
-	language: 'زبان',
-	title: 'کد قطعه',
-	pathName: 'کد قطعه'
-} );
diff --git a/web/libraries/codesnippet/lang/fi.js b/web/libraries/codesnippet/lang/fi.js
deleted file mode 100644
index db5dcd6ed4ea0abdeda724aacfa54cbaf30bdbad..0000000000000000000000000000000000000000
--- a/web/libraries/codesnippet/lang/fi.js
+++ /dev/null
@@ -1,13 +0,0 @@
-/**
- * @license Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved.
- * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license
- */
-
-CKEDITOR.plugins.setLang( 'codesnippet', 'fi', {
-	button: 'Lisää koodileike',
-	codeContents: 'Koodisisältö',
-	emptySnippetError: 'Koodileike ei voi olla tyhjä.',
-	language: 'Kieli',
-	title: 'Koodileike',
-	pathName: 'koodileike'
-} );
diff --git a/web/libraries/codesnippet/lang/fr-ca.js b/web/libraries/codesnippet/lang/fr-ca.js
deleted file mode 100644
index d5eacf9ed454d8795821bcabc4e307ebc1d6e55b..0000000000000000000000000000000000000000
--- a/web/libraries/codesnippet/lang/fr-ca.js
+++ /dev/null
@@ -1,13 +0,0 @@
-/**
- * @license Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved.
- * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license
- */
-
-CKEDITOR.plugins.setLang( 'codesnippet', 'fr-ca', {
-	button: 'Insérer du code',
-	codeContents: 'Code content', // MISSING
-	emptySnippetError: 'A code snippet cannot be empty.', // MISSING
-	language: 'Language', // MISSING
-	title: 'Code snippet', // MISSING
-	pathName: 'code snippet' // MISSING
-} );
diff --git a/web/libraries/codesnippet/lang/fr.js b/web/libraries/codesnippet/lang/fr.js
deleted file mode 100644
index c1bd504864de4b51ac8f9471a8050212a9484ffc..0000000000000000000000000000000000000000
--- a/web/libraries/codesnippet/lang/fr.js
+++ /dev/null
@@ -1,13 +0,0 @@
-/**
- * @license Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved.
- * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license
- */
-
-CKEDITOR.plugins.setLang( 'codesnippet', 'fr', {
-	button: 'Insérer un extrait de code',
-	codeContents: 'Code',
-	emptySnippetError: 'Un extrait de code ne peut pas être vide.',
-	language: 'Langue',
-	title: 'Extrait de code',
-	pathName: 'extrait de code'
-} );
diff --git a/web/libraries/codesnippet/lang/gl.js b/web/libraries/codesnippet/lang/gl.js
deleted file mode 100644
index 669c16b2346283c1f1200b17ce7de9abf78dcf94..0000000000000000000000000000000000000000
--- a/web/libraries/codesnippet/lang/gl.js
+++ /dev/null
@@ -1,13 +0,0 @@
-/**
- * @license Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved.
- * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license
- */
-
-CKEDITOR.plugins.setLang( 'codesnippet', 'gl', {
-	button: 'Inserir fragmento de código',
-	codeContents: 'Contido do código',
-	emptySnippetError: 'Un fragmento de código non pode estar baleiro.',
-	language: 'Linguaxe',
-	title: 'Fragmento de código',
-	pathName: 'fragmento de código'
-} );
diff --git a/web/libraries/codesnippet/lang/he.js b/web/libraries/codesnippet/lang/he.js
deleted file mode 100644
index 7e07fcdfee4ebed92da83ab8d9da15d54126193c..0000000000000000000000000000000000000000
--- a/web/libraries/codesnippet/lang/he.js
+++ /dev/null
@@ -1,13 +0,0 @@
-/**
- * @license Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved.
- * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license
- */
-
-CKEDITOR.plugins.setLang( 'codesnippet', 'he', {
-	button: 'הכנס קטע קוד',
-	codeContents: 'תוכן קוד',
-	emptySnippetError: 'קטע קוד לא יכול להיות ריק.',
-	language: 'שפה',
-	title: 'קטע קוד',
-	pathName: 'code snippet' // MISSING
-} );
diff --git a/web/libraries/codesnippet/lang/hr.js b/web/libraries/codesnippet/lang/hr.js
deleted file mode 100644
index 658257ec29b2b899d82a13f11fcd632c04bf9bb1..0000000000000000000000000000000000000000
--- a/web/libraries/codesnippet/lang/hr.js
+++ /dev/null
@@ -1,13 +0,0 @@
-/**
- * @license Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved.
- * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license
- */
-
-CKEDITOR.plugins.setLang( 'codesnippet', 'hr', {
-	button: 'Ubaci isječak kôda',
-	codeContents: 'Sadržaj kôda',
-	emptySnippetError: 'Isječak kôda ne može biti prazan.',
-	language: 'Jezik',
-	title: 'Isječak kôda',
-	pathName: 'isječak kôda'
-} );
diff --git a/web/libraries/codesnippet/lang/hu.js b/web/libraries/codesnippet/lang/hu.js
deleted file mode 100644
index e4c3a061e5881f952f628f3bcb9ccba34fb84a55..0000000000000000000000000000000000000000
--- a/web/libraries/codesnippet/lang/hu.js
+++ /dev/null
@@ -1,13 +0,0 @@
-/**
- * @license Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved.
- * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license
- */
-
-CKEDITOR.plugins.setLang( 'codesnippet', 'hu', {
-	button: 'Illeszd be a kódtöredéket',
-	codeContents: 'Kód tartalom',
-	emptySnippetError: 'A kódtöredék nem lehet üres.',
-	language: 'Nyelv',
-	title: 'Kódtöredék',
-	pathName: 'kódtöredék'
-} );
diff --git a/web/libraries/codesnippet/lang/id.js b/web/libraries/codesnippet/lang/id.js
deleted file mode 100644
index 009bf1f284d69f2fd71aa56e4b7991ec50faef0d..0000000000000000000000000000000000000000
--- a/web/libraries/codesnippet/lang/id.js
+++ /dev/null
@@ -1,13 +0,0 @@
-/**
- * @license Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved.
- * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license
- */
-
-CKEDITOR.plugins.setLang( 'codesnippet', 'id', {
-	button: 'Masukkan potongan kode',
-	codeContents: 'Konten kode',
-	emptySnippetError: 'Potongan kode tidak boleh kosong',
-	language: 'Bahasa',
-	title: 'Potongan kode',
-	pathName: 'potongan kode'
-} );
diff --git a/web/libraries/codesnippet/lang/it.js b/web/libraries/codesnippet/lang/it.js
deleted file mode 100644
index 13655d98c1203a2676373979ed742ae850d4f54d..0000000000000000000000000000000000000000
--- a/web/libraries/codesnippet/lang/it.js
+++ /dev/null
@@ -1,13 +0,0 @@
-/**
- * @license Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved.
- * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license
- */
-
-CKEDITOR.plugins.setLang( 'codesnippet', 'it', {
-	button: 'Inserisci frammento di codice',
-	codeContents: 'Contenuto del codice',
-	emptySnippetError: 'Un frammento di codice non può essere vuoto.',
-	language: 'Lingua',
-	title: 'Frammento di codice',
-	pathName: 'frammento di codice'
-} );
diff --git a/web/libraries/codesnippet/lang/ja.js b/web/libraries/codesnippet/lang/ja.js
deleted file mode 100644
index 69dae33d13e7cb3b2c5433f3ba7f967e37825e75..0000000000000000000000000000000000000000
--- a/web/libraries/codesnippet/lang/ja.js
+++ /dev/null
@@ -1,13 +0,0 @@
-/**
- * @license Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved.
- * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license
- */
-
-CKEDITOR.plugins.setLang( 'codesnippet', 'ja', {
-	button: 'コードスニペットを挿入',
-	codeContents: 'コード内容',
-	emptySnippetError: 'コードスニペットを入力してください。',
-	language: '言語',
-	title: 'コードスニペット',
-	pathName: 'コードスニペット'
-} );
diff --git a/web/libraries/codesnippet/lang/km.js b/web/libraries/codesnippet/lang/km.js
deleted file mode 100644
index cee9e66f6d7e02a954096b50d7492e14a43fec41..0000000000000000000000000000000000000000
--- a/web/libraries/codesnippet/lang/km.js
+++ /dev/null
@@ -1,13 +0,0 @@
-/**
- * @license Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved.
- * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license
- */
-
-CKEDITOR.plugins.setLang( 'codesnippet', 'km', {
-	button: 'Insert Code Snippet', // MISSING
-	codeContents: 'មាតិកាកូដ',
-	emptySnippetError: 'A code snippet cannot be empty.', // MISSING
-	language: 'ភាសា',
-	title: 'Code snippet', // MISSING
-	pathName: 'code snippet' // MISSING
-} );
diff --git a/web/libraries/codesnippet/lang/ko.js b/web/libraries/codesnippet/lang/ko.js
deleted file mode 100644
index cf81caeb7c692461df46c6188b824595130aaca3..0000000000000000000000000000000000000000
--- a/web/libraries/codesnippet/lang/ko.js
+++ /dev/null
@@ -1,13 +0,0 @@
-/**
- * @license Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved.
- * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license
- */
-
-CKEDITOR.plugins.setLang( 'codesnippet', 'ko', {
-	button: '코드 스니펫 삽입',
-	codeContents: '코드 본문',
-	emptySnippetError: '코드 스니펫은 빈칸일 수 없습니다.',
-	language: '언어',
-	title: '코드 스니펫',
-	pathName: '코드 스니펫'
-} );
diff --git a/web/libraries/codesnippet/lang/ku.js b/web/libraries/codesnippet/lang/ku.js
deleted file mode 100644
index eefdc5366222aefcc5bf84f9f01386bbfb4cc89b..0000000000000000000000000000000000000000
--- a/web/libraries/codesnippet/lang/ku.js
+++ /dev/null
@@ -1,13 +0,0 @@
-/**
- * @license Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved.
- * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license
- */
-
-CKEDITOR.plugins.setLang( 'codesnippet', 'ku', {
-	button: 'تێخستنی تیتکی کۆد',
-	codeContents: 'ناوەڕۆکی کۆد',
-	emptySnippetError: 'تیتکی کۆد نابێت بەتاڵ بێت.',
-	language: 'زمان',
-	title: 'تیتکی کۆد',
-	pathName: 'تیتکی کۆد'
-} );
diff --git a/web/libraries/codesnippet/lang/lt.js b/web/libraries/codesnippet/lang/lt.js
deleted file mode 100644
index 5af0d7bb3640f6500232543f30dc26b3bad7523e..0000000000000000000000000000000000000000
--- a/web/libraries/codesnippet/lang/lt.js
+++ /dev/null
@@ -1,13 +0,0 @@
-/**
- * @license Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved.
- * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license
- */
-
-CKEDITOR.plugins.setLang( 'codesnippet', 'lt', {
-	button: 'Įterpkite kodo gabaliuką',
-	codeContents: 'Kodo turinys',
-	emptySnippetError: 'Kodo fragmentas negali būti tusčias.',
-	language: 'Kalba',
-	title: 'Kodo fragmentas',
-	pathName: 'kodo fragmentas'
-} );
diff --git a/web/libraries/codesnippet/lang/lv.js b/web/libraries/codesnippet/lang/lv.js
deleted file mode 100644
index 2971f07236860068bf24b5ae7c01ed76e056679f..0000000000000000000000000000000000000000
--- a/web/libraries/codesnippet/lang/lv.js
+++ /dev/null
@@ -1,13 +0,0 @@
-/**
- * @license Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved.
- * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license
- */
-
-CKEDITOR.plugins.setLang( 'codesnippet', 'lv', {
-	button: 'Ievietot koda fragmentu',
-	codeContents: 'Koda saturs',
-	emptySnippetError: 'Koda fragments nevar būt tukšs.',
-	language: 'Valoda',
-	title: 'Koda fragments',
-	pathName: 'koda fragments'
-} );
diff --git a/web/libraries/codesnippet/lang/nb.js b/web/libraries/codesnippet/lang/nb.js
deleted file mode 100644
index d736dd892afe2b75b28f9a312ea2f83abee815e5..0000000000000000000000000000000000000000
--- a/web/libraries/codesnippet/lang/nb.js
+++ /dev/null
@@ -1,13 +0,0 @@
-/**
- * @license Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved.
- * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license
- */
-
-CKEDITOR.plugins.setLang( 'codesnippet', 'nb', {
-	button: 'Sett inn kodesnutt',
-	codeContents: 'Kodeinnhold',
-	emptySnippetError: 'En kodesnutt kan ikke være tom.',
-	language: 'Språk',
-	title: 'Kodesnutt',
-	pathName: 'kodesnutt'
-} );
diff --git a/web/libraries/codesnippet/lang/nl.js b/web/libraries/codesnippet/lang/nl.js
deleted file mode 100644
index b7abd9424494052f2dc86d66ff23701e720208fc..0000000000000000000000000000000000000000
--- a/web/libraries/codesnippet/lang/nl.js
+++ /dev/null
@@ -1,13 +0,0 @@
-/**
- * @license Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved.
- * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license
- */
-
-CKEDITOR.plugins.setLang( 'codesnippet', 'nl', {
-	button: 'Stuk code invoegen',
-	codeContents: 'Code',
-	emptySnippetError: 'Een stuk code kan niet leeg zijn.',
-	language: 'Taal',
-	title: 'Stuk code',
-	pathName: 'stuk code'
-} );
diff --git a/web/libraries/codesnippet/lang/no.js b/web/libraries/codesnippet/lang/no.js
deleted file mode 100644
index eebc9075d7656dcb3b62e518551d785190058cad..0000000000000000000000000000000000000000
--- a/web/libraries/codesnippet/lang/no.js
+++ /dev/null
@@ -1,13 +0,0 @@
-/**
- * @license Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved.
- * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license
- */
-
-CKEDITOR.plugins.setLang( 'codesnippet', 'no', {
-	button: 'Sett inn kodesnutt',
-	codeContents: 'Kode',
-	emptySnippetError: 'En kodesnutt kan ikke være tom.',
-	language: 'Språk',
-	title: 'Kodesnutt',
-	pathName: 'kodesnutt'
-} );
diff --git a/web/libraries/codesnippet/lang/oc.js b/web/libraries/codesnippet/lang/oc.js
deleted file mode 100644
index 860bf51ae93017ae29cf96136281796b4d8fcc34..0000000000000000000000000000000000000000
--- a/web/libraries/codesnippet/lang/oc.js
+++ /dev/null
@@ -1,13 +0,0 @@
-/**
- * @license Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved.
- * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license
- */
-
-CKEDITOR.plugins.setLang( 'codesnippet', 'oc', {
-	button: 'Inserir un extrait de còdi',
-	codeContents: 'Còdi',
-	emptySnippetError: 'Un extrait de còdi pòt pas èsser void.',
-	language: 'Lenga',
-	title: 'Extrait de còdi',
-	pathName: 'extrait de còdi'
-} );
diff --git a/web/libraries/codesnippet/lang/pl.js b/web/libraries/codesnippet/lang/pl.js
deleted file mode 100644
index 9f443826d6956a5474f0d3aa711e702e4f797a35..0000000000000000000000000000000000000000
--- a/web/libraries/codesnippet/lang/pl.js
+++ /dev/null
@@ -1,13 +0,0 @@
-/**
- * @license Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved.
- * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license
- */
-
-CKEDITOR.plugins.setLang( 'codesnippet', 'pl', {
-	button: 'Wstaw fragment kodu',
-	codeContents: 'Treść kodu',
-	emptySnippetError: 'Kod nie może być pusty.',
-	language: 'Język',
-	title: 'Fragment kodu',
-	pathName: 'fragment kodu'
-} );
diff --git a/web/libraries/codesnippet/lang/pt-br.js b/web/libraries/codesnippet/lang/pt-br.js
deleted file mode 100644
index 886c60753605e6b07d339251876fe4e399360461..0000000000000000000000000000000000000000
--- a/web/libraries/codesnippet/lang/pt-br.js
+++ /dev/null
@@ -1,13 +0,0 @@
-/**
- * @license Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved.
- * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license
- */
-
-CKEDITOR.plugins.setLang( 'codesnippet', 'pt-br', {
-	button: 'Inserir fragmento de código',
-	codeContents: 'Conteúdo do código',
-	emptySnippetError: 'Um fragmento de código não pode ser vazio',
-	language: 'Idioma',
-	title: 'Fragmento de código',
-	pathName: 'fragmento de código'
-} );
diff --git a/web/libraries/codesnippet/lang/pt.js b/web/libraries/codesnippet/lang/pt.js
deleted file mode 100644
index aa0b526ecd6d27f45d2d6ee3928d935de17165fb..0000000000000000000000000000000000000000
--- a/web/libraries/codesnippet/lang/pt.js
+++ /dev/null
@@ -1,13 +0,0 @@
-/**
- * @license Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved.
- * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license
- */
-
-CKEDITOR.plugins.setLang( 'codesnippet', 'pt', {
-	button: 'Inserir fragmento de código',
-	codeContents: 'Conteúdo do código',
-	emptySnippetError: 'A code snippet cannot be empty.', // MISSING
-	language: 'Idioma',
-	title: 'Segmento de código',
-	pathName: 'Fragmento de código'
-} );
diff --git a/web/libraries/codesnippet/lang/ro.js b/web/libraries/codesnippet/lang/ro.js
deleted file mode 100644
index 7f550da94f3094aa3117c015361caf3e43a613b6..0000000000000000000000000000000000000000
--- a/web/libraries/codesnippet/lang/ro.js
+++ /dev/null
@@ -1,13 +0,0 @@
-/**
- * @license Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved.
- * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license
- */
-
-CKEDITOR.plugins.setLang( 'codesnippet', 'ro', {
-	button: 'Adaugă segment de cod',
-	codeContents: 'Conținutul codului',
-	emptySnippetError: 'Un segment de cod nu poate fi gol.',
-	language: 'Limba',
-	title: 'Segment de cod',
-	pathName: 'segment de cod'
-} );
diff --git a/web/libraries/codesnippet/lang/ru.js b/web/libraries/codesnippet/lang/ru.js
deleted file mode 100644
index 4016e881f3b90d74c22fcd04a223ee2461374c8d..0000000000000000000000000000000000000000
--- a/web/libraries/codesnippet/lang/ru.js
+++ /dev/null
@@ -1,13 +0,0 @@
-/**
- * @license Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved.
- * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license
- */
-
-CKEDITOR.plugins.setLang( 'codesnippet', 'ru', {
-	button: 'Вставить сниппет',
-	codeContents: 'Содержимое кода',
-	emptySnippetError: 'Сниппет не может быть пустым',
-	language: 'Язык',
-	title: 'Сниппет',
-	pathName: 'сниппет'
-} );
diff --git a/web/libraries/codesnippet/lang/sk.js b/web/libraries/codesnippet/lang/sk.js
deleted file mode 100644
index 8699acf66d7690dce28fb1ce1efda291ad4365a6..0000000000000000000000000000000000000000
--- a/web/libraries/codesnippet/lang/sk.js
+++ /dev/null
@@ -1,13 +0,0 @@
-/**
- * @license Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved.
- * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license
- */
-
-CKEDITOR.plugins.setLang( 'codesnippet', 'sk', {
-	button: 'Vložte ukážku programového kódu',
-	codeContents: 'Obsah kódu',
-	emptySnippetError: 'Ukážka kódu nesmie byť prázdna.',
-	language: 'Jazyk',
-	title: 'Ukážka programového kódu',
-	pathName: 'ukážka programového kódu'
-} );
diff --git a/web/libraries/codesnippet/lang/sl.js b/web/libraries/codesnippet/lang/sl.js
deleted file mode 100644
index 27c2cc65356c17b89f4087566c9ab26e0a5f8fc3..0000000000000000000000000000000000000000
--- a/web/libraries/codesnippet/lang/sl.js
+++ /dev/null
@@ -1,13 +0,0 @@
-/**
- * @license Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved.
- * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license
- */
-
-CKEDITOR.plugins.setLang( 'codesnippet', 'sl', {
-	button: 'Vstavi odsek kode',
-	codeContents: 'Vsebina kode',
-	emptySnippetError: 'Odsek kode ne more biti prazen.',
-	language: 'Jezik',
-	title: 'Odsek kode',
-	pathName: 'odsek kode'
-} );
diff --git a/web/libraries/codesnippet/lang/sq.js b/web/libraries/codesnippet/lang/sq.js
deleted file mode 100644
index 31990f09b485f1795cad72c8fc0c5f6d9650bb0f..0000000000000000000000000000000000000000
--- a/web/libraries/codesnippet/lang/sq.js
+++ /dev/null
@@ -1,13 +0,0 @@
-/**
- * @license Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved.
- * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license
- */
-
-CKEDITOR.plugins.setLang( 'codesnippet', 'sq', {
-	button: 'Shto kod copëze',
-	codeContents: 'Përmbajtja e kodit',
-	emptySnippetError: 'Copëza e kodit nuk mund të jetë e zbrazët.',
-	language: 'Gjuha',
-	title: 'Copëza e kodit',
-	pathName: 'copëza e kodit'
-} );
diff --git a/web/libraries/codesnippet/lang/sr-latn.js b/web/libraries/codesnippet/lang/sr-latn.js
deleted file mode 100644
index 7c3ae386033ff2c8d29526304416a04d2e8b32e6..0000000000000000000000000000000000000000
--- a/web/libraries/codesnippet/lang/sr-latn.js
+++ /dev/null
@@ -1,13 +0,0 @@
-/**
- * @license Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved.
- * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license
- */
-
-CKEDITOR.plugins.setLang( 'codesnippet', 'sr-latn', {
-	button: 'Nalepi delić koda',
-	codeContents: 'Sadržaj koda',
-	emptySnippetError: 'Delić koda ne može biti prazan',
-	language: 'Jezik',
-	title: 'Delić koda',
-	pathName: 'Delić koda'
-} );
diff --git a/web/libraries/codesnippet/lang/sr.js b/web/libraries/codesnippet/lang/sr.js
deleted file mode 100644
index d76eb8ca6b72731391e3163d834cec1220fd5def..0000000000000000000000000000000000000000
--- a/web/libraries/codesnippet/lang/sr.js
+++ /dev/null
@@ -1,13 +0,0 @@
-/**
- * @license Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved.
- * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license
- */
-
-CKEDITOR.plugins.setLang( 'codesnippet', 'sr', {
-	button: 'Налепи делић кода',
-	codeContents: 'Садржај кода',
-	emptySnippetError: 'Делић кода не може бити празан',
-	language: 'Језик',
-	title: 'Делић кода',
-	pathName: 'Делић кода'
-} );
diff --git a/web/libraries/codesnippet/lang/sv.js b/web/libraries/codesnippet/lang/sv.js
deleted file mode 100644
index a525a107b2c7502f209515b785b78938be41f8dd..0000000000000000000000000000000000000000
--- a/web/libraries/codesnippet/lang/sv.js
+++ /dev/null
@@ -1,13 +0,0 @@
-/**
- * @license Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved.
- * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license
- */
-
-CKEDITOR.plugins.setLang( 'codesnippet', 'sv', {
-	button: 'Infoga kodsnutt',
-	codeContents: 'Kodinnehålll',
-	emptySnippetError: 'Innehåll krävs för kodsnutt',
-	language: 'Språk',
-	title: 'Kodsnutt',
-	pathName: 'kodsnutt'
-} );
diff --git a/web/libraries/codesnippet/lang/th.js b/web/libraries/codesnippet/lang/th.js
deleted file mode 100644
index 8dda1721bc039df99ed47519a7842f2f5e761492..0000000000000000000000000000000000000000
--- a/web/libraries/codesnippet/lang/th.js
+++ /dev/null
@@ -1,13 +0,0 @@
-/**
- * @license Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved.
- * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license
- */
-
-CKEDITOR.plugins.setLang( 'codesnippet', 'th', {
-	button: 'แทรกชิ้นส่วนของรหัสหรือโค้ด',
-	codeContents: 'Code content', // MISSING
-	emptySnippetError: 'A code snippet cannot be empty.', // MISSING
-	language: 'Language', // MISSING
-	title: 'Code snippet', // MISSING
-	pathName: 'code snippet' // MISSING
-} );
diff --git a/web/libraries/codesnippet/lang/tr.js b/web/libraries/codesnippet/lang/tr.js
deleted file mode 100644
index c618d2ca2b0af98dd3e6be598609d5d3e2a98483..0000000000000000000000000000000000000000
--- a/web/libraries/codesnippet/lang/tr.js
+++ /dev/null
@@ -1,13 +0,0 @@
-/**
- * @license Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved.
- * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license
- */
-
-CKEDITOR.plugins.setLang( 'codesnippet', 'tr', {
-	button: 'Kod parçacığı ekle',
-	codeContents: 'Kod',
-	emptySnippetError: 'Kod parçacığı boş bırakılamaz',
-	language: 'Dil',
-	title: 'Kod parçacığı',
-	pathName: 'kod parçacığı'
-} );
diff --git a/web/libraries/codesnippet/lang/tt.js b/web/libraries/codesnippet/lang/tt.js
deleted file mode 100644
index db7956a2e9f240c323677c8e83d9f05aca62d24e..0000000000000000000000000000000000000000
--- a/web/libraries/codesnippet/lang/tt.js
+++ /dev/null
@@ -1,13 +0,0 @@
-/**
- * @license Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved.
- * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license
- */
-
-CKEDITOR.plugins.setLang( 'codesnippet', 'tt', {
-	button: 'Код өзеген өстәү',
-	codeContents: 'Код эчтәлеге',
-	emptySnippetError: 'Код өзеге буш булмаска тиеш.',
-	language: 'Тел',
-	title: 'Код өзеге',
-	pathName: 'код өзеге'
-} );
diff --git a/web/libraries/codesnippet/lang/ug.js b/web/libraries/codesnippet/lang/ug.js
deleted file mode 100644
index ea564b5b30f464f1567ed42efbd5b9274a87a2ea..0000000000000000000000000000000000000000
--- a/web/libraries/codesnippet/lang/ug.js
+++ /dev/null
@@ -1,13 +0,0 @@
-/**
- * @license Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved.
- * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license
- */
-
-CKEDITOR.plugins.setLang( 'codesnippet', 'ug', {
-	button: 'كود پارچىسى قىستۇرۇش',
-	codeContents: 'كود مەزمۇنى',
-	emptySnippetError: 'كود پارچىسى بوش قالمايدۇ',
-	language: 'تىل',
-	title: 'كود پارچىسى',
-	pathName: 'كود پارچىسى'
-} );
diff --git a/web/libraries/codesnippet/lang/uk.js b/web/libraries/codesnippet/lang/uk.js
deleted file mode 100644
index e56517984ee6f5d2f779c96a0f92a18cb7c01af7..0000000000000000000000000000000000000000
--- a/web/libraries/codesnippet/lang/uk.js
+++ /dev/null
@@ -1,13 +0,0 @@
-/**
- * @license Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved.
- * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license
- */
-
-CKEDITOR.plugins.setLang( 'codesnippet', 'uk', {
-	button: 'Вставити фрагмент коду',
-	codeContents: 'Код',
-	emptySnippetError: 'Фрагмент коду не може бути порожнім.',
-	language: 'Мова',
-	title: 'Фрагмент коду',
-	pathName: 'фрагмент коду'
-} );
diff --git a/web/libraries/codesnippet/lang/vi.js b/web/libraries/codesnippet/lang/vi.js
deleted file mode 100644
index f0713be1a22382fa8e9d3df1afc28f61350620d2..0000000000000000000000000000000000000000
--- a/web/libraries/codesnippet/lang/vi.js
+++ /dev/null
@@ -1,13 +0,0 @@
-/**
- * @license Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved.
- * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license
- */
-
-CKEDITOR.plugins.setLang( 'codesnippet', 'vi', {
-	button: 'Chèn đoạn mã',
-	codeContents: 'Nội dung mã',
-	emptySnippetError: 'Một đoạn mã không thể để trống.',
-	language: 'Ngôn ngữ',
-	title: 'Đoạn mã',
-	pathName: 'mã dính'
-} );
diff --git a/web/libraries/codesnippet/lang/zh-cn.js b/web/libraries/codesnippet/lang/zh-cn.js
deleted file mode 100644
index 6fc56cb768c6b643b705437dd4bbc9e800880061..0000000000000000000000000000000000000000
--- a/web/libraries/codesnippet/lang/zh-cn.js
+++ /dev/null
@@ -1,13 +0,0 @@
-/**
- * @license Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved.
- * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license
- */
-
-CKEDITOR.plugins.setLang( 'codesnippet', 'zh-cn', {
-	button: '插入代码段',
-	codeContents: '代码内容',
-	emptySnippetError: '插入的代码不能为空。',
-	language: '代码语言',
-	title: '代码段',
-	pathName: '代码段'
-} );
diff --git a/web/libraries/codesnippet/lang/zh.js b/web/libraries/codesnippet/lang/zh.js
deleted file mode 100644
index 0ad41fe1c1a868d385c445a5f99526f66ca86217..0000000000000000000000000000000000000000
--- a/web/libraries/codesnippet/lang/zh.js
+++ /dev/null
@@ -1,13 +0,0 @@
-/**
- * @license Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved.
- * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license
- */
-
-CKEDITOR.plugins.setLang( 'codesnippet', 'zh', {
-	button: '插入程式碼片段',
-	codeContents: '程式碼內容',
-	emptySnippetError: '程式碼片段不可為空白。',
-	language: '語言',
-	title: '程式碼片段',
-	pathName: '程式碼片段'
-} );
diff --git a/web/libraries/codesnippet/lib/highlight/CHANGES.md b/web/libraries/codesnippet/lib/highlight/CHANGES.md
deleted file mode 100644
index f878062bb4ae1890903867a1d244884d603392b6..0000000000000000000000000000000000000000
--- a/web/libraries/codesnippet/lib/highlight/CHANGES.md
+++ /dev/null
@@ -1,827 +0,0 @@
-## Version 8.0 beta
-
-This new major release is quite a big overhaul bringing both new features and
-some backwards incompatible changes. However, chances are that the majority of
-users won't be affected by the latter: the basic scenario described in the
-README is left intact.
-
-Here's what did change in an incompatible way:
-
-- We're now prefixing all classes located in [CSS classes reference][cr] with
-  `hljs-`, by default, because some class names would collide with other
-  people's stylesheets. If you were using an older version, you might still want
-  the previous behavior, but still want to upgrade. To suppress this new
-  behavior, you would initialize like so:
-
-  ```html
-  <script type="text/javascript">
-    hljs.configure({classPrefix: ''});
-    hljs.initHighlightingOnLoad();
-  </script>
-  ```
-
-- `tabReplace` and `useBR` that were used in different places are also unified
-  into the global options object and are to be set using `configure(options)`.
-  This function is documented in our [API docs][]. Also note that these
-  parameters are gone from `highlightBlock` and `fixMarkup` which are now also
-  rely on `configure`.
-
-- We removed public-facing (though undocumented) object `hljs.LANGUAGES` which
-  was used to register languages with the library in favor of two new methods:
-  `registerLanguage` and `getLanguage`. Both are documented in our [API docs][].
-
-- Result returned from `highlight` and `highlightAuto` no longer contains two
-  separate attributes contributing to relevance score, `relevance` and
-  `keyword_count`. They are now unified in `relevance`.
-
-Another technically compatible change that nonetheless might need attention:
-
-- The structure of the NPM package was refactored, so if you had installed it
-  locally, you'll have to update your paths. The usual `require('highlight.js')`
-  works as before. This is contributed by [Dmitry Smolin][].
-
-New features:
-
-- Languages now can be recognized by multiple names like "js" for JavaScript or
-  "html" for, well, HTML (which earlier insisted on calling it "xml"). These
-  aliases can be specified in the class attribute of the code container in your
-  HTML as well as in various API calls. For now there are only a few very common
-  aliases but we'll expand it in the future. All of them are listed in the
-  [class reference][].
-
-- Language detection can now be restricted to a subset of languages relevant in
-  a given context — a web page or even a single highlighting call. This is
-  especially useful for node.js build that includes all the known languages.
-  Another example is a StackOverflow-style site where users specify languages
-  as tags rather than in the markdown-formatted code snippets. This is
-  documented in the [API reference][] (see methods `highlightAuto` and
-  `configure`).
-
-- Language definition syntax streamlined with [variants][] and
-  [beginKeywords][].
-
-New languages and styles:
-
-- *Oxygene* by [Carlo Kok][]
-- *Mathematica* by [Daniel Kvasnička][]
-- *Autohotkey* by [Seongwon Lee][]
-- *Atelier* family of styles in 10 variants by [Bram de Haan][]
-- *Paraíso* styles by [Jan T. Sott][]
-
-Miscelleanous improvements:
-
-- Highlighting `=>` prompts in Clojure.
-- [Jeremy Hull][] fixed a lot of styles for consistency.
-- Finally, highlighting PHP and HTML [mixed in peculiar ways][php-html].
-- Objective C and C# now properly highlight titles in method definition.
-- Big overhaul of relevance counting for a number of languages. Please do report
-  bugs about mis-detection of non-trivial code snippets!
-
-[cr]: http://highlightjs.readthedocs.org/en/latest/css-classes-reference.html
-[api docs]: http://highlightjs.readthedocs.org/en/latest/api.html
-[variants]: https://groups.google.com/d/topic/highlightjs/VoGC9-1p5vk/discussion
-[beginKeywords]: https://github.com/isagalaev/highlight.js/commit/6c7fdea002eb3949577a85b3f7930137c7c3038d
-[php-html]: https://twitter.com/highlightjs/status/408890903017689088
-
-[Carlo Kok]: https://github.com/carlokok
-[Bram de Haan]: https://github.com/atelierbram
-[Daniel Kvasnička]: https://github.com/dkvasnicka
-[Dmitry Smolin]: https://github.com/dimsmol
-[Jeremy Hull]: https://github.com/sourrust
-[Seongwon Lee]: https://github.com/dlimpid
-[Jan T. Sott]: https://github.com/idleberg
-
-
-## Version 7.5
-
-A catch-up release dealing with some of the accumulated contributions. This one
-is probably will be the last before the 8.0 which will be slightly backwards
-incompatible regarding some advanced use-cases.
-
-One outstanding change in this version is the addition of 6 languages to the
-[hosted script][d]: Markdown, ObjectiveC, CoffeeScript, Apache, Nginx and
-Makefile. It now weighs about 6K more but we're going to keep it under 30K.
-
-New languages:
-
-- OCaml by [Mehdi Dogguy][mehdid] and [Nicolas Braud-Santoni][nbraud]
-- [LiveCode Server][lcs] by [Ralf Bitter][revig]
-- Scilab by [Sylvestre Ledru][sylvestre]
-- basic support for Makefile by [Ivan Sagalaev][isagalaev]
-
-Improvements:
-
-- Ruby's got support for characters like `?A`, `?1`, `?\012` etc. and `%r{..}`
-  regexps.
-- Clojure now allows a function call in the beginning of s-expressions
-  `(($filter "myCount") (arr 1 2 3 4 5))`.
-- Haskell's got new keywords and now recognizes more things like pragmas,
-  preprocessors, modules, containers, FFIs etc. Thanks to [Zena Treep][treep]
-  for the implementation and to [Jeremy Hull][sourrust] for guiding it.
-- Miscelleanous fixes in PHP, Brainfuck, SCSS, Asciidoc, CMake, Python and F#.
-
-[mehdid]: https://github.com/mehdid
-[nbraud]: https://github.com/nbraud
-[revig]: https://github.com/revig
-[lcs]: http://livecode.com/developers/guides/server/
-[sylvestre]: https://github.com/sylvestre
-[isagalaev]: https://github.com/isagalaev
-[treep]: https://github.com/treep
-[sourrust]: https://github.com/sourrust
-[d]: http://highlightjs.org/download/
-
-
-## New core developers
-
-The latest long period of almost complete inactivity in the project coincided
-with growing interest to it led to a decision that now seems completely obvious:
-we need more core developers.
-
-So without further ado let me welcome to the core team two long-time
-contributors: [Jeremy Hull][] and [Oleg
-Efimov][].
-
-Hope now we'll be able to work through stuff faster!
-
-P.S. The historical commit is [here][1] for the record.
-
-[Jeremy Hull]: https://github.com/sourrust
-[Oleg Efimov]: https://github.com/sannis
-[1]: https://github.com/isagalaev/highlight.js/commit/f3056941bda56d2b72276b97bc0dd5f230f2473f
-
-
-## Version 7.4
-
-This long overdue version is a snapshot of the current source tree with all the
-changes that happened during the past year. Sorry for taking so long!
-
-Along with the changes in code highlight.js has finally got its new home at
-<http://highlightjs.org/>, moving from its craddle on Software Maniacs which it
-outgrew a long time ago. Be sure to report any bugs about the site to
-<mailto:info@highlightjs.org>.
-
-On to what's new…
-
-New languages:
-
-- Handlebars templates by [Robin Ward][]
-- Oracle Rules Language by [Jason Jacobson][]
-- F# by [Joans Follesø][]
-- AsciiDoc and Haml by [Dan Allen][]
-- Lasso by [Eric Knibbe][]
-- SCSS by [Kurt Emch][]
-- VB.NET by [Poren Chiang][]
-- Mizar by [Kelley van Evert][]
-
-[Robin Ward]: https://github.com/eviltrout
-[Jason Jacobson]: https://github.com/jayce7
-[Joans Follesø]: https://github.com/follesoe
-[Dan Allen]: https://github.com/mojavelinux
-[Eric Knibbe]: https://github.com/EricFromCanada
-[Kurt Emch]: https://github.com/kemch
-[Poren Chiang]: https://github.com/rschiang
-[Kelley van Evert]: https://github.com/kelleyvanevert
-
-New style themes:
-
-- Monokai Sublime by [noformnocontent][]
-- Railscasts by [Damien White][]
-- Obsidian by [Alexander Marenin][]
-- Docco by [Simon Madine][]
-- Mono Blue by [Ivan Sagalaev][] (uses a single color hue for everything)
-- Foundation by [Dan Allen][]
-
-[noformnocontent]: http://nn.mit-license.org/
-[Damien White]: https://github.com/visoft
-[Alexander Marenin]: https://github.com/ioncreature
-[Simon Madine]: https://github.com/thingsinjars
-[Ivan Sagalaev]: https://github.com/isagalaev
-
-Other notable changes:
-
-- Corrected many corner cases in CSS.
-- Dropped Python 2 version of the build tool.
-- Implemented building for the AMD format.
-- Updated Rust keywords (thanks to [Dmitry Medvinsky][]).
-- Literal regexes can now be used in language definitions.
-- CoffeeScript highlighting is now significantly more robust and rich due to
-  input from [Cédric Néhémie][].
-
-[Dmitry Medvinsky]: https://github.com/dmedvinsky
-[Cédric Néhémie]: https://github.com/abe33
-
-
-## Version 7.3
-
-- Since this version highlight.js no longer works in IE version 8 and older.
-  It's made it possible to reduce the library size and dramatically improve code
-  readability and made it easier to maintain. Time to go forward!
-
-- New languages: AppleScript (by [Nathan Grigg][ng] and [Dr. Drang][dd]) and
-  Brainfuck (by [Evgeny Stepanischev][bolk]).
-
-- Improvements to existing languages:
-
-    - interpreter prompt in Python (`>>>` and `...`)
-    - @-properties and classes in CoffeeScript
-    - E4X in JavaScript (by [Oleg Efimov][oe])
-    - new keywords in Perl (by [Kirk Kimmel][kk])
-    - big Ruby syntax update (by [Vasily Polovnyov][vast])
-    - small fixes in Bash
-
-- Also Oleg Efimov did a great job of moving all the docs for language and style
-  developers and contributors from the old wiki under the source code in the
-  "docs" directory. Now these docs are nicely presented at
-  <http://highlightjs.readthedocs.org/>.
-
-[ng]: https://github.com/nathan11g
-[dd]: https://github.com/drdrang
-[bolk]: https://github.com/bolknote
-[oe]: https://github.com/Sannis
-[kk]: https://github.com/kimmel
-[vast]: https://github.com/vast
-
-
-## Version 7.2
-
-A regular bug-fix release without any significant new features. Enjoy!
-
-
-## Version 7.1
-
-A Summer crop:
-
-- [Marc Fornos][mf] made the definition for Clojure along with the matching
-  style Rainbow (which, of course, works for other languages too).
-- CoffeeScript support continues to improve getting support for regular
-  expressions.
-- Yoshihide Jimbo ported to highlight.js [five Tomorrow styles][tm] from the
-  [project by Chris Kempson][tm0].
-- Thanks to [Casey Duncun][cd] the library can now be built in the popular
-  [AMD format][amd].
-- And last but not least, we've got a fair number of correctness and consistency
-  fixes, including a pretty significant refactoring of Ruby.
-
-[mf]: https://github.com/mfornos
-[tm]: http://jmblog.github.com/color-themes-for-highlightjs/
-[tm0]: https://github.com/ChrisKempson/Tomorrow-Theme
-[cd]: https://github.com/caseman
-[amd]: http://requirejs.org/docs/whyamd.html
-
-
-## Version 7.0
-
-The reason for the new major version update is a global change of keyword syntax
-which resulted in the library getting smaller once again. For example, the
-hosted build is 2K less than at the previous version while supporting two new
-languages.
-
-Notable changes:
-
-- The library now works not only in a browser but also with [node.js][]. It is
-  installable with `npm install highlight.js`. [API][] docs are available on our
-  wiki.
-
-- The new unique feature (apparently) among syntax highlighters is highlighting
-  *HTTP* headers and an arbitrary language in the request body. The most useful
-  languages here are *XML* and *JSON* both of which highlight.js does support.
-  Here's [the detailed post][p] about the feature.
-
-- Two new style themes: a dark "south" *[Pojoaque][]* by Jason Tate and an
-  emulation of*XCode* IDE by [Angel Olloqui][ao].
-
-- Three new languages: *D* by [Aleksandar Ružičić][ar], *R* by [Joe Cheng][jc]
-  and *GLSL* by [Sergey Tikhomirov][st].
-
-- *Nginx* syntax has become a million times smaller and more universal thanks to
-  remaking it in a more generic manner that doesn't require listing all the
-  directives in the known universe.
-
-- Function titles are now highlighted in *PHP*.
-
-- *Haskell* and *VHDL* were significantly reworked to be more rich and correct
-  by their respective maintainers [Jeremy Hull][sr] and [Igor Kalnitsky][ik].
-
-And last but not least, many bugs have been fixed around correctness and
-language detection.
-
-Overall highlight.js currently supports 51 languages and 20 style themes.
-
-[node.js]: http://nodejs.org/
-[api]: http://softwaremaniacs.org/wiki/doku.php/highlight.js:api
-[p]: http://softwaremaniacs.org/blog/2012/05/10/http-and-json-in-highlight-js/en/
-[pojoaque]: http://web-cms-designs.com/ftopict-10-pojoaque-style-for-highlight-js-code-highlighter.html
-[ao]: https://github.com/angelolloqui
-[ar]: https://github.com/raleksandar
-[jc]: https://github.com/jcheng5
-[st]: https://github.com/tikhomirov
-[sr]: https://github.com/sourrust
-[ik]: https://github.com/ikalnitsky
-
-
-## Version 6.2
-
-A lot of things happened in highlight.js since the last version! We've got nine
-new contributors, the discussion group came alive, and the main branch on GitHub
-now counts more than 350 followers. Here are most significant results coming
-from all this activity:
-
-- 5 (five!) new languages: Rust, ActionScript, CoffeeScript, MatLab and
-  experimental support for markdown. Thanks go to [Andrey Vlasovskikh][av],
-  [Alexander Myadzel][am], [Dmytrii Nagirniak][dn], [Oleg Efimov][oe], [Denis
-  Bardadym][db] and [John Crepezzi][jc].
-
-- 2 new style themes: Monokai by [Luigi Maselli][lm] and stylistic imitation of
-  another well-known highlighter Google Code Prettify by [Aahan Krish][ak].
-
-- A vast number of [correctness fixes and code refactorings][log], mostly made
-  by [Oleg Efimov][oe] and [Evgeny Stepanischev][es].
-
-[av]: https://github.com/vlasovskikh
-[am]: https://github.com/myadzel
-[dn]: https://github.com/dnagir
-[oe]: https://github.com/Sannis
-[db]: https://github.com/btd
-[jc]: https://github.com/seejohnrun
-[lm]: http://grigio.org/
-[ak]: https://github.com/geekpanth3r
-[es]: https://github.com/bolknote
-[log]: https://github.com/isagalaev/highlight.js/commits/
-
-
-## Version 6.1 — Solarized
-
-[Jeremy Hull][jh] has implemented my dream feature — a port of [Solarized][]
-style theme famous for being based on the intricate color theory to achieve
-correct contrast and color perception. It is now available for highlight.js in
-both variants — light and dark.
-
-This version also adds a new original style Arta. Its author pumbur maintains a
-[heavily modified fork of highlight.js][pb] on GitHub.
-
-[jh]: https://github.com/sourrust
-[solarized]: http://ethanschoonover.com/solarized
-[pb]: https://github.com/pumbur/highlight.js
-
-
-## Version 6.0
-
-New major version of the highlighter has been built on a significantly
-refactored syntax. Due to this it's even smaller than the previous one while
-supporting more languages!
-
-New languages are:
-
-- Haskell by [Jeremy Hull][sourrust]
-- Erlang in two varieties — module and REPL — made collectively by [Nikolay
-  Zakharov][desh], [Dmitry Kovega][arhibot] and [Sergey Ignatov][ignatov]
-- Objective C by [Valerii Hiora][vhbit]
-- Vala by [Antono Vasiljev][antono]
-- Go by [Stephan Kountso][steplg]
-
-[sourrust]: https://github.com/sourrust
-[desh]: http://desh.su/
-[arhibot]: https://github.com/arhibot
-[ignatov]: https://github.com/ignatov
-[vhbit]: https://github.com/vhbit
-[antono]: https://github.com/antono
-[steplg]: https://github.com/steplg
-
-Also this version is marginally faster and fixes a number of small long-standing
-bugs.
-
-Developer overview of the new language syntax is available in a [blog post about
-recent beta release][beta].
-
-[beta]: http://softwaremaniacs.org/blog/2011/04/25/highlight-js-60-beta/en/
-
-P.S. New version is not yet available on a Yandex' CDN, so for now you have to
-download [your own copy][d].
-
-[d]: /soft/highlight/en/download/
-
-
-## Version 5.14
-
-Fixed bugs in HTML/XML detection and relevance introduced in previous
-refactoring.
-
-Also test.html now shows the second best result of language detection by
-relevance.
-
-
-## Version 5.13
-
-Past weekend began with a couple of simple additions for existing languages but
-ended up in a big code refactoring bringing along nice improvements for language
-developers.
-
-### For users
-
-- Description of C++ has got new keywords from the upcoming [C++ 0x][] standard.
-- Description of HTML has got new tags from [HTML 5][].
-- CSS-styles have been unified to use consistent padding and also have lost
-  pop-outs with names of detected languages.
-- [Igor Kalnitsky][ik] has sent two new language descriptions: CMake и VHDL.
-
-This makes total number of languages supported by highlight.js to reach 35.
-
-Bug fixes:
-
-- Custom classes on `<pre>` tags are not being overridden anymore
-- More correct highlighting of code blocks inside non-`<pre>` containers:
-  highlighter now doesn't insist on replacing them with its own container and
-  just replaces the contents.
-- Small fixes in browser compatibility and heuristics.
-
-[c++ 0x]: http://ru.wikipedia.org/wiki/C%2B%2B0x
-[html 5]: http://en.wikipedia.org/wiki/HTML5
-[ik]: http://kalnitsky.org.ua/
-
-### For developers
-
-The most significant change is the ability to include language submodes right
-under `contains` instead of defining explicit named submodes in the main array:
-
-    contains: [
-      'string',
-      'number',
-      {begin: '\\n', end: hljs.IMMEDIATE_RE}
-    ]
-
-This is useful for auxiliary modes needed only in one place to define parsing.
-Note that such modes often don't have `className` and hence won't generate a
-separate `<span>` in the resulting markup. This is similar in effect to
-`noMarkup: true`. All existing languages have been refactored accordingly.
-
-Test file test.html has at last become a real test. Now it not only puts the
-detected language name under the code snippet but also tests if it matches the
-expected one. Test summary is displayed right above all language snippets.
-
-
-## CDN
-
-Fine people at [Yandex][] agreed to host highlight.js on their big fast servers.
-[Link up][l]!
-
-[yandex]: http://yandex.com/
-[l]: http://softwaremaniacs.org/soft/highlight/en/download/
-
-
-## Version 5.10 — "Paris".
-
-Though I'm on a vacation in Paris, I decided to release a new version with a
-couple of small fixes:
-
-- Tomas Vitvar discovered that TAB replacement doesn't always work when used
-  with custom markup in code
-- SQL parsing is even more rigid now and doesn't step over SmallTalk in tests
-
-
-## Version 5.9
-
-A long-awaited version is finally released.
-
-New languages:
-
-- Andrew Fedorov made a definition for Lua
-- a long-time highlight.js contributor [Peter Leonov][pl] made a definition for
-  Nginx config
-- [Vladimir Moskva][vm] made a definition for TeX
-
-[pl]: http://kung-fu-tzu.ru/
-[vm]: http://fulc.ru/
-
-Fixes for existing languages:
-
-- [Loren Segal][ls] reworked the Ruby definition and added highlighting for
-  [YARD][] inline documentation
-- the definition of SQL has become more solid and now it shouldn't be overly
-  greedy when it comes to language detection
-
-[ls]: http://gnuu.org/
-[yard]: http://yardoc.org/
-
-The highlighter has become more usable as a library allowing to do highlighting
-from initialization code of JS frameworks and in ajax methods (see.
-readme.eng.txt).
-
-Also this version drops support for the [WordPress][wp] plugin. Everyone is
-welcome to [pick up its maintenance][p] if needed.
-
-[wp]: http://wordpress.org/
-[p]: http://bazaar.launchpad.net/~isagalaev/+junk/highlight/annotate/342/src/wp_highlight.js.php
-
-
-## Version 5.8
-
-- Jan Berkel has contributed a definition for Scala. +1 to hotness!
-- All CSS-styles are rewritten to work only inside `<pre>` tags to avoid
-  conflicts with host site styles.
-
-
-## Version 5.7.
-
-Fixed escaping of quotes in VBScript strings.
-
-
-## Version 5.5
-
-This version brings a small change: now .ini-files allow digits, underscores and
-square brackets in key names.
-
-
-## Version 5.4
-
-Fixed small but upsetting bug in the packer which caused incorrect highlighting
-of explicitly specified languages. Thanks to Andrew Fedorov for precise
-diagnostics!
-
-
-## Version 5.3
-
-The version to fulfil old promises.
-
-The most significant change is that highlight.js now preserves custom user
-markup in code along with its own highlighting markup. This means that now it's
-possible to use, say, links in code. Thanks to [Vladimir Dolzhenko][vd] for the
-[initial proposal][1] and for making a proof-of-concept patch.
-
-Also in this version:
-
-- [Vasily Polovnyov][vp] has sent a GitHub-like style and has implemented
-  support for CSS @-rules and Ruby symbols.
-- Yura Zaripov has sent two styles: Brown Paper and School Book.
-- Oleg Volchkov has sent a definition for [Parser 3][p3].
-
-[1]: http://softwaremaniacs.org/forum/highlightjs/6612/
-[p3]: http://www.parser.ru/
-[vp]: http://vasily.polovnyov.ru/
-[vd]: http://dolzhenko.blogspot.com/
-
-
-## Version 5.2
-
-- at last it's possible to replace indentation TABs with something sensible (e.g. 2 or 4 spaces)
-- new keywords and built-ins for 1C by Sergey Baranov
-- a couple of small fixes to Apache highlighting
-
-
-## Version 5.1
-
-This is one of those nice version consisting entirely of new and shiny
-contributions!
-
-- [Vladimir Ermakov][vooon] created highlighting for AVR Assembler
-- [Ruslan Keba][rukeba] created highlighting for Apache config file. Also his
-  original visual style for it is now available for all highlight.js languages
-  under the name "Magula".
-- [Shuen-Huei Guan][drake] (aka Drake) sent new keywords for RenderMan
-  languages. Also thanks go to [Konstantin Evdokimenko][ke] for his advice on
-  the matter.
-
-[vooon]: http://vehq.ru/about/
-[rukeba]: http://rukeba.com/
-[drake]: http://drakeguan.org/
-[ke]: http://k-evdokimenko.moikrug.ru/
-
-
-## Version 5.0
-
-The main change in the new major version of highlight.js is a mechanism for
-packing several languages along with the library itself into a single compressed
-file. Now sites using several languages will load considerably faster because
-the library won't dynamically include additional files while loading.
-
-Also this version fixes a long-standing bug with Javascript highlighting that
-couldn't distinguish between regular expressions and division operations.
-
-And as usually there were a couple of minor correctness fixes.
-
-Great thanks to all contributors! Keep using highlight.js.
-
-
-## Version 4.3
-
-This version comes with two contributions from [Jason Diamond][jd]:
-
-- language definition for C# (yes! it was a long-missed thing!)
-- Visual Studio-like highlighting style
-
-Plus there are a couple of minor bug fixes for parsing HTML and XML attributes.
-
-[jd]: http://jason.diamond.name/weblog/
-
-
-## Version 4.2
-
-The biggest news is highlighting for Lisp, courtesy of Vasily Polovnyov. It's
-somewhat experimental meaning that for highlighting "keywords" it doesn't use
-any pre-defined set of a Lisp dialect. Instead it tries to highlight first word
-in parentheses wherever it makes sense. I'd like to ask people programming in
-Lisp to confirm if it's a good idea and send feedback to [the forum][f].
-
-Other changes:
-
-- Smalltalk was excluded from DEFAULT_LANGUAGES to save traffic
-- [Vladimir Epifanov][voldmar] has implemented javascript style switcher for
-  test.html
-- comments now allowed inside Ruby function definition
-- [MEL][] language from [Shuen-Huei Guan][drake]
-- whitespace now allowed between `<pre>` and `<code>`
-- better auto-detection of C++ and PHP
-- HTML allows embedded VBScript (`<% .. %>`)
-
-[f]: http://softwaremaniacs.org/forum/highlightjs/
-[voldmar]: http://voldmar.ya.ru/
-[mel]: http://en.wikipedia.org/wiki/Maya_Embedded_Language
-[drake]: http://drakeguan.org/
-
-
-## Version 4.1
-
-Languages:
-
-- Bash from Vah
-- DOS bat-files from Alexander Makarov (Sam)
-- Diff files from Vasily Polovnyov
-- Ini files from myself though initial idea was from Sam
-
-Styles:
-
-- Zenburn from Vladimir Epifanov, this is an imitation of a
-  [well-known theme for Vim][zenburn].
-- Ascetic from myself, as a realization of ideals of non-flashy highlighting:
-  just one color in only three gradations :-)
-
-In other news. [One small bug][bug] was fixed, built-in keywords were added for
-Python and C++ which improved auto-detection for the latter (it was shame that
-[my wife's blog][alenacpp] had issues with it from time to time). And lastly
-thanks go to Sam for getting rid of my stylistic comments in code that were
-getting in the way of [JSMin][].
-
-[zenburn]: http://en.wikipedia.org/wiki/Zenburn
-[alenacpp]: http://alenacpp.blogspot.com/
-[bug]: http://softwaremaniacs.org/forum/viewtopic.php?id=1823
-[jsmin]: http://code.google.com/p/jsmin-php/
-
-
-## Version 4.0
-
-New major version is a result of vast refactoring and of many contributions.
-
-Visible new features:
-
-- Highlighting of embedded languages. Currently is implemented highlighting of
-  Javascript and CSS inside HTML.
-- Bundled 5 ready-made style themes!
-
-Invisible new features:
-
-- Highlight.js no longer pollutes global namespace. Only one object and one
-  function for backward compatibility.
-- Performance is further increased by about 15%.
-
-Changing of a major version number caused by a new format of language definition
-files. If you use some third-party language files they should be updated.
-
-
-## Version 3.5
-
-A very nice version in my opinion fixing a number of small bugs and slightly
-increased speed in a couple of corner cases. Thanks to everybody who reports
-bugs in he [forum][f] and by email!
-
-There is also a new language — XML. A custom XML formerly was detected as HTML
-and didn't highlight custom tags. In this version I tried to make custom XML to
-be detected and highlighted by its own rules. Which by the way include such
-things as CDATA sections and processing instructions (`<? ... ?>`).
-
-[f]: http://softwaremaniacs.org/forum/viewforum.php?id=6
-
-
-## Version 3.3
-
-[Vladimir Gubarkov][xonix] has provided an interesting and useful addition.
-File export.html contains a little program that shows and allows to copy and
-paste an HTML code generated by the highlighter for any code snippet. This can
-be useful in situations when one can't use the script itself on a site.
-
-
-[xonix]: http://xonixx.blogspot.com/
-
-
-## Version 3.2 consists completely of contributions:
-
-- Vladimir Gubarkov has described SmallTalk
-- Yuri Ivanov has described 1C
-- Peter Leonov has packaged the highlighter as a Firefox extension
-- Vladimir Ermakov has compiled a mod for phpBB
-
-Many thanks to you all!
-
-
-## Version 3.1
-
-Three new languages are available: Django templates, SQL and Axapta. The latter
-two are sent by [Dmitri Roudakov][1]. However I've almost entirely rewrote an
-SQL definition but I'd never started it be it from the ground up :-)
-
-The engine itself has got a long awaited feature of grouping keywords
-("keyword", "built-in function", "literal"). No more hacks!
-
-[1]: http://roudakov.ru/
-
-
-## Version 3.0
-
-It is major mainly because now highlight.js has grown large and has become
-modular. Now when you pass it a list of languages to highlight it will
-dynamically load into a browser only those languages.
-
-Also:
-
-- Konstantin Evdokimenko of [RibKit][] project has created a highlighting for
-  RenderMan Shading Language and RenderMan Interface Bytestream. Yay for more
-  languages!
-- Heuristics for C++ and HTML got better.
-- I've implemented (at last) a correct handling of backslash escapes in C-like
-  languages.
-
-There is also a small backwards incompatible change in the new version. The
-function initHighlighting that was used to initialize highlighting instead of
-initHighlightingOnLoad a long time ago no longer works. If you by chance still
-use it — replace it with the new one.
-
-[RibKit]: http://ribkit.sourceforge.net/
-
-
-## Version 2.9
-
-Highlight.js is a parser, not just a couple of regular expressions. That said
-I'm glad to announce that in the new version 2.9 has support for:
-
-- in-string substitutions for Ruby -- `#{...}`
-- strings from from numeric symbol codes (like #XX) for Delphi
-
-
-## Version 2.8
-
-A maintenance release with more tuned heuristics. Fully backwards compatible.
-
-
-## Version 2.7
-
-- Nikita Ledyaev presents highlighting for VBScript, yay!
-- A couple of bugs with escaping in strings were fixed thanks to Mickle
-- Ongoing tuning of heuristics
-
-Fixed bugs were rather unpleasant so I encourage everyone to upgrade!
-
-
-## Version 2.4
-
-- Peter Leonov provides another improved highlighting for Perl
-- Javascript gets a new kind of keywords — "literals". These are the words
-  "true", "false" and "null"
-
-Also highlight.js homepage now lists sites that use the library. Feel free to
-add your site by [dropping me a message][mail] until I find the time to build a
-submit form.
-
-[mail]: mailto:Maniac@SoftwareManiacs.Org
-
-
-## Version 2.3
-
-This version fixes IE breakage in previous version. My apologies to all who have
-already downloaded that one!
-
-
-## Version 2.2
-
-- added highlighting for Javascript
-- at last fixed parsing of Delphi's escaped apostrophes in strings
-- in Ruby fixed highlighting of keywords 'def' and 'class', same for 'sub' in
-  Perl
-
-
-## Version 2.0
-
-- Ruby support by [Anton Kovalyov][ak]
-- speed increased by orders of magnitude due to new way of parsing
-- this same way allows now correct highlighting of keywords in some tricky
-  places (like keyword "End" at the end of Delphi classes)
-
-[ak]: http://anton.kovalyov.net/
-
-
-## Version 1.0
-
-Version 1.0 of javascript syntax highlighter is released!
-
-It's the first version available with English description. Feel free to post
-your comments and question to [highlight.js forum][forum]. And don't be afraid
-if you find there some fancy Cyrillic letters -- it's for Russian users too :-)
-
-[forum]: http://softwaremaniacs.org/forum/viewforum.php?id=6
diff --git a/web/libraries/codesnippet/lib/highlight/LICENSE b/web/libraries/codesnippet/lib/highlight/LICENSE
deleted file mode 100644
index 422deb7350fe14c2cefdc65d0689f214b45c4764..0000000000000000000000000000000000000000
--- a/web/libraries/codesnippet/lib/highlight/LICENSE
+++ /dev/null
@@ -1,24 +0,0 @@
-Copyright (c) 2006, Ivan Sagalaev
-All rights reserved.
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions are met:
-
-    * Redistributions of source code must retain the above copyright
-      notice, this list of conditions and the following disclaimer.
-    * Redistributions in binary form must reproduce the above copyright
-      notice, this list of conditions and the following disclaimer in the
-      documentation and/or other materials provided with the distribution.
-    * Neither the name of highlight.js nor the names of its contributors 
-      may be used to endorse or promote products derived from this software 
-      without specific prior written permission.
-
-THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND ANY
-EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
-DISCLAIMED. IN NO EVENT SHALL THE REGENTS AND CONTRIBUTORS BE LIABLE FOR ANY
-DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
-(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
-LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
-ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
-SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
diff --git a/web/libraries/codesnippet/lib/highlight/README.md b/web/libraries/codesnippet/lib/highlight/README.md
deleted file mode 100644
index 0ee96377ff105fe62ece4c415933bfc152bfed34..0000000000000000000000000000000000000000
--- a/web/libraries/codesnippet/lib/highlight/README.md
+++ /dev/null
@@ -1,167 +0,0 @@
-# Highlight.js
-
-Highlight.js highlights syntax in code examples on blogs, forums and,
-in fact, on any web page. It's very easy to use because it works
-automatically: finds blocks of code, detects a language, highlights it.
-
-Autodetection can be fine tuned when it fails by itself (see "Heuristics").
-
-
-## Basic usage
-
-Link the library and a stylesheet from your page and hook highlighting to
-the page load event:
-
-```html
-<link rel="stylesheet" href="styles/default.css">
-<script src="highlight.pack.js"></script>
-<script>hljs.initHighlightingOnLoad();</script>
-```
-
-This will highlight all code on the page marked up as `<pre><code> .. </code></pre>`.
-If you use different markup or need to apply highlighting dynamically, read
-"Custom initialization" below.
-
-- You can download your own customized version of "highlight.pack.js" or
-  use the hosted one as described on the download page:
-  <http://highlightjs.org/download/>
-
-- Style themes are available in the download package or as hosted files.
-  To create a custom style for your site see the class reference in the file
-  [CSS classes reference][cr] from the downloaded package.
-
-[cr]: http://highlightjs.readthedocs.org/en/latest/css-classes-reference.html
-
-
-## node.js
-
-Highlight.js can be used under node.js. The package with all supported languages is
-installable from NPM:
-
-    npm install highlight.js
-
-Alternatively, you can build it from the source with only languages you need:
-
-    python3 tools/build.py -tnode lang1 lang2 ..
-
-Using the library:
-
-```javascript
-var hljs = require('highlight.js');
-
-// If you know the language
-hljs.highlight(lang, code).value;
-
-// Automatic language detection
-hljs.highlightAuto(code).value;
-```
-
-
-## AMD
-
-Highlight.js can be used with an AMD loader.  You will need to build it from
-source in order to do so:
-
-```bash
-$ python3 tools/build.py -tamd lang1 lang2 ..
-```
-
-Which will generate a `build/highlight.pack.js` which will load as an AMD
-module with support for the built languages and can be used like so:
-
-```javascript
-require(["highlight.js/build/highlight.pack"], function(hljs){
-
-  // If you know the language
-  hljs.highlight(lang, code).value;
-
-  // Automatic language detection
-  hljs.highlightAuto(code).value;
-});
-```
-
-
-## Tab replacement
-
-You can replace TAB ('\x09') characters used for indentation in your code
-with some fixed number of spaces or with a `<span>` to give them special
-styling:
-
-```html
-<script type="text/javascript">
-  hljs.configure({tabReplace: '    '}); // 4 spaces
-  // ... or
-  hljs.configure({tabReplace: '<span class="indent">\t</span>'});
-
-  hljs.initHighlightingOnLoad();
-</script>
-```
-
-## Custom initialization
-
-If you use different markup for code blocks you can initialize them manually
-with `highlightBlock(code)` function. It takes a DOM element containing the
-code to highlight and optionally a string with which to replace TAB
-characters.
-
-Initialization using, for example, jQuery might look like this:
-
-```javascript
-$(document).ready(function() {
-  $('pre code').each(function(i, e) {hljs.highlightBlock(e)});
-});
-```
-
-You can use `highlightBlock` to highlight blocks dynamically inserted into
-the page. Just make sure you don't do it twice for already highlighted
-blocks.
-
-If your code container relies on `<br>` tags instead of line breaks (i.e. if
-it's not `<pre>`) set the `useBR` option to `true`:
-
-```javascript
-hljs.configure({useBR: true});
-$('div.code').each(function(i, e) {hljs.highlightBlock(e)});
-```
-
-
-## Heuristics
-
-Autodetection of a code's language is done using a simple heuristic:
-the program tries to highlight a fragment with all available languages and
-counts all syntactic structures that it finds along the way. The language
-with greatest count wins.
-
-This means that in short fragments the probability of an error is high
-(and it really happens sometimes). In this cases you can set the fragment's
-language explicitly by assigning a class to the `<code>` element:
-
-```html
-<pre><code class="html">...</code></pre>
-```
-
-You can use class names recommended in HTML5: "language-html",
-"language-php". Classes also can be assigned to the `<pre>` element.
-
-To disable highlighting of a fragment altogether use "no-highlight" class:
-
-```html
-<pre><code class="no-highlight">...</code></pre>
-```
-
-
-## Export
-
-File export.html contains a little program that allows you to paste in a code
-snippet and then copy and paste the resulting HTML code generated by the
-highlighter. This is useful in situations when you can't use the script itself
-on a site.
-
-
-## Meta
-
-- Version: 8.0
-- URL:     http://highlightjs.org/
-
-For the license terms see LICENSE files.
-For authors and contributors see AUTHORS.en.txt file.
diff --git a/web/libraries/codesnippet/lib/highlight/README.ru.md b/web/libraries/codesnippet/lib/highlight/README.ru.md
deleted file mode 100644
index 0d0e0fea8aa39b69d46c2a368e04c3af8be0e2e5..0000000000000000000000000000000000000000
--- a/web/libraries/codesnippet/lib/highlight/README.ru.md
+++ /dev/null
@@ -1,171 +0,0 @@
-# Highlight.js
-
-Highlight.js нужен для подсветки синтаксиса в примерах кода в блогах,
-форумах и вообще на любых веб-страницах. Пользоваться им очень просто,
-потому что работает он автоматически: сам находит блоки кода, сам
-определяет язык, сам подсвечивает.
-
-Автоопределением языка можно управлять, когда оно не справляется само (см.
-дальше "Эвристика").
-
-
-## Простое использование
-
-Подключите библиотеку и стиль на страницу и повесть вызов подсветки на
-загрузку страницы:
-
-```html
-<link rel="stylesheet" href="styles/default.css">
-<script src="highlight.pack.js"></script>
-<script>hljs.initHighlightingOnLoad();</script>
-```
-
-Весь код на странице, обрамлённый в теги `<pre><code> .. </code></pre>`
-будет автоматически подсвечен. Если вы используете другие теги или хотите
-подсвечивать блоки кода динамически, читайте "Инициализацию вручную" ниже.
-
-- Вы можете скачать собственную версию "highlight.pack.js" или сослаться
-  на захостенный файл, как описано на странице загрузки:
-  <http://highlightjs.org/download/>
-
-- Стилевые темы можно найти в загруженном архиве или также использовать
-  захостенные. Чтобы сделать собственный стиль для своего сайта, вам
-  будет полезен [CSS classes reference][cr], который тоже есть в архиве.
-
-[cr]: http://highlightjs.readthedocs.org/en/latest/css-classes-reference.html
-
-
-## node.js
-
-Highlight.js можно использовать в node.js. Библиотеку со всеми возможными языками можно
-установить с NPM:
-
-    npm install highlight.js
-
-Также её можно собрать из исходников с только теми языками, которые нужны:
-
-    python3 tools/build.py -tnode lang1 lang2 ..
-
-Использование библиотеки:
-
-```javascript
-var hljs = require('highlight.js');
-
-// Если вы знаете язык
-hljs.highlight(lang, code).value;
-
-// Автоопределение языка
-hljs.highlightAuto(code).value;
-```
-
-
-## AMD
-
-Highlight.js можно использовать с загрузчиком AMD-модулей.  Для этого его
-нужно собрать из исходников следующей командой:
-
-```bash
-$ python3 tools/build.py -tamd lang1 lang2 ..
-```
-
-Она создаст файл `build/highlight.pack.js`, который является загружаемым
-AMD-модулем и содержит все выбранные при сборке языки. Используется он так:
-
-```javascript
-require(["highlight.js/build/highlight.pack"], function(hljs){
-
-  // Если вы знаете язык
-  hljs.highlight(lang, code).value;
-
-  // Автоопределение языка
-  hljs.highlightAuto(code).value;
-});
-```
-
-
-## Замена TABов
-
-Также вы можете заменить символы TAB ('\x09'), используемые для отступов, на
-фиксированное количество пробелов или на отдельный `<span>`, чтобы задать ему
-какой-нибудь специальный стиль:
-
-```html
-<script type="text/javascript">
-  hljs.configure({tabReplace: '    '}); // 4 spaces
-  // ... or
-  hljs.configure({tabReplace: '<span class="indent">\t</span>'});
-
-  hljs.initHighlightingOnLoad();
-</script>
-```
-
-
-## Инициализация вручную
-
-Если вы используете другие теги для блоков кода, вы можете инициализировать их
-явно с помощью функции `highlightBlock(code)`. Она принимает DOM-элемент с
-текстом расцвечиваемого кода и опционально - строчку для замены символов TAB.
-
-Например с использованием jQuery код инициализации может выглядеть так:
-
-```javascript
-$(document).ready(function() {
-  $('pre code').each(function(i, e) {hljs.highlightBlock(e)});
-});
-```
-
-`highlightBlock` можно также использовать, чтобы подсветить блоки кода,
-добавленные на страницу динамически. Только убедитесь, что вы не делаете этого
-повторно для уже раскрашенных блоков.
-
-Если ваш блок кода использует `<br>` вместо переводов строки (т.е. если это не
-`<pre>`), включите опцию `useBR`:
-
-```javascript
-hljs.configure({useBR: true});
-$('div.code').each(function(i, e) {hljs.highlightBlock(e)});
-```
-
-
-## Эвристика
-
-Определение языка, на котором написан фрагмент, делается с помощью
-довольно простой эвристики: программа пытается расцветить фрагмент всеми
-языками подряд, и для каждого языка считает количество подошедших
-синтаксически конструкций и ключевых слов. Для какого языка нашлось больше,
-тот и выбирается.
-
-Это означает, что в коротких фрагментах высока вероятность ошибки, что
-периодически и случается. Чтобы указать язык фрагмента явно, надо написать
-его название в виде класса к элементу `<code>`:
-
-```html
-<pre><code class="html">...</code></pre>
-```
-
-Можно использовать рекомендованные в HTML5 названия классов:
-"language-html", "language-php". Также можно назначать классы на элемент
-`<pre>`.
-
-Чтобы запретить расцветку фрагмента вообще, используется класс "no-highlight":
-
-```html
-<pre><code class="no-highlight">...</code></pre>
-```
-
-
-## Экспорт
-
-В файле export.html находится небольшая программка, которая показывает и дает
-скопировать непосредственно HTML-код подсветки для любого заданного фрагмента кода.
-Это может понадобится например на сайте, на котором нельзя подключить сам скрипт
-highlight.js.
-
-
-## Координаты
-
-- Версия: 8.0
-- URL:    http://highlightjs.org/
-
-Лицензионное соглашение читайте в файле LICENSE.
-Список авторов и соавторов читайте в файле AUTHORS.ru.txt
diff --git a/web/libraries/codesnippet/lib/highlight/highlight.pack.js b/web/libraries/codesnippet/lib/highlight/highlight.pack.js
deleted file mode 100644
index 2f0a664de5e471713402cd50bafc3267ff0c8b1b..0000000000000000000000000000000000000000
--- a/web/libraries/codesnippet/lib/highlight/highlight.pack.js
+++ /dev/null
@@ -1,2 +0,0 @@
-// %LEAVE_UNMINIFIED% %REMOVE_LINE%
-var hljs=new function(){function k(v){return v.replace(/&/gm,"&amp;").replace(/</gm,"&lt;").replace(/>/gm,"&gt;")}function t(v){return v.nodeName.toLowerCase()}function i(w,x){var v=w&&w.exec(x);return v&&v.index==0}function d(v){return Array.prototype.map.call(v.childNodes,function(w){if(w.nodeType==3){return b.useBR?w.nodeValue.replace(/\n/g,""):w.nodeValue}if(t(w)=="br"){return"\n"}return d(w)}).join("")}function r(w){var v=(w.className+" "+(w.parentNode?w.parentNode.className:"")).split(/\s+/);v=v.map(function(x){return x.replace(/^language-/,"")});return v.filter(function(x){return j(x)||x=="no-highlight"})[0]}function o(x,y){var v={};for(var w in x){v[w]=x[w]}if(y){for(var w in y){v[w]=y[w]}}return v}function u(x){var v=[];(function w(y,z){for(var A=y.firstChild;A;A=A.nextSibling){if(A.nodeType==3){z+=A.nodeValue.length}else{if(t(A)=="br"){z+=1}else{if(A.nodeType==1){v.push({event:"start",offset:z,node:A});z=w(A,z);v.push({event:"stop",offset:z,node:A})}}}}return z})(x,0);return v}function q(w,y,C){var x=0;var F="";var z=[];function B(){if(!w.length||!y.length){return w.length?w:y}if(w[0].offset!=y[0].offset){return(w[0].offset<y[0].offset)?w:y}return y[0].event=="start"?w:y}function A(H){function G(I){return" "+I.nodeName+'="'+k(I.value)+'"'}F+="<"+t(H)+Array.prototype.map.call(H.attributes,G).join("")+">"}function E(G){F+="</"+t(G)+">"}function v(G){(G.event=="start"?A:E)(G.node)}while(w.length||y.length){var D=B();F+=k(C.substr(x,D[0].offset-x));x=D[0].offset;if(D==w){z.reverse().forEach(E);do{v(D.splice(0,1)[0]);D=B()}while(D==w&&D.length&&D[0].offset==x);z.reverse().forEach(A)}else{if(D[0].event=="start"){z.push(D[0].node)}else{z.pop()}v(D.splice(0,1)[0])}}return F+k(C.substr(x))}function m(y){function v(z){return(z&&z.source)||z}function w(A,z){return RegExp(v(A),"m"+(y.cI?"i":"")+(z?"g":""))}function x(D,C){if(D.compiled){return}D.compiled=true;D.k=D.k||D.bK;if(D.k){var z={};function E(G,F){if(y.cI){F=F.toLowerCase()}F.split(" ").forEach(function(H){var I=H.split("|");z[I[0]]=[G,I[1]?Number(I[1]):1]})}if(typeof D.k=="string"){E("keyword",D.k)}else{Object.keys(D.k).forEach(function(F){E(F,D.k[F])})}D.k=z}D.lR=w(D.l||/\b[A-Za-z0-9_]+\b/,true);if(C){if(D.bK){D.b=D.bK.split(" ").join("|")}if(!D.b){D.b=/\B|\b/}D.bR=w(D.b);if(!D.e&&!D.eW){D.e=/\B|\b/}if(D.e){D.eR=w(D.e)}D.tE=v(D.e)||"";if(D.eW&&C.tE){D.tE+=(D.e?"|":"")+C.tE}}if(D.i){D.iR=w(D.i)}if(D.r===undefined){D.r=1}if(!D.c){D.c=[]}var B=[];D.c.forEach(function(F){if(F.v){F.v.forEach(function(G){B.push(o(F,G))})}else{B.push(F=="self"?D:F)}});D.c=B;D.c.forEach(function(F){x(F,D)});if(D.starts){x(D.starts,C)}var A=D.c.map(function(F){return F.bK?"\\.?\\b("+F.b+")\\b\\.?":F.b}).concat([D.tE]).concat([D.i]).map(v).filter(Boolean);D.t=A.length?w(A.join("|"),true):{exec:function(F){return null}};D.continuation={}}x(y)}function c(S,L,J,R){function v(U,V){for(var T=0;T<V.c.length;T++){if(i(V.c[T].bR,U)){return V.c[T]}}}function z(U,T){if(i(U.eR,T)){return U}if(U.eW){return z(U.parent,T)}}function A(T,U){return !J&&i(U.iR,T)}function E(V,T){var U=M.cI?T[0].toLowerCase():T[0];return V.k.hasOwnProperty(U)&&V.k[U]}function w(Z,X,W,V){var T=V?"":b.classPrefix,U='<span class="'+T,Y=W?"":"</span>";U+=Z+'">';return U+X+Y}function N(){var U=k(C);if(!I.k){return U}var T="";var X=0;I.lR.lastIndex=0;var V=I.lR.exec(U);while(V){T+=U.substr(X,V.index-X);var W=E(I,V);if(W){H+=W[1];T+=w(W[0],V[0])}else{T+=V[0]}X=I.lR.lastIndex;V=I.lR.exec(U)}return T+U.substr(X)}function F(){if(I.sL&&!f[I.sL]){return k(C)}var T=I.sL?c(I.sL,C,true,I.continuation.top):g(C);if(I.r>0){H+=T.r}if(I.subLanguageMode=="continuous"){I.continuation.top=T.top}return w(T.language,T.value,false,true)}function Q(){return I.sL!==undefined?F():N()}function P(V,U){var T=V.cN?w(V.cN,"",true):"";if(V.rB){D+=T;C=""}else{if(V.eB){D+=k(U)+T;C=""}else{D+=T;C=U}}I=Object.create(V,{parent:{value:I}})}function G(T,X){C+=T;if(X===undefined){D+=Q();return 0}var V=v(X,I);if(V){D+=Q();P(V,X);return V.rB?0:X.length}var W=z(I,X);if(W){var U=I;if(!(U.rE||U.eE)){C+=X}D+=Q();do{if(I.cN){D+="</span>"}H+=I.r;I=I.parent}while(I!=W.parent);if(U.eE){D+=k(X)}C="";if(W.starts){P(W.starts,"")}return U.rE?0:X.length}if(A(X,I)){throw new Error('Illegal lexeme "'+X+'" for mode "'+(I.cN||"<unnamed>")+'"')}C+=X;return X.length||1}var M=j(S);if(!M){throw new Error('Unknown language: "'+S+'"')}m(M);var I=R||M;var D="";for(var K=I;K!=M;K=K.parent){if(K.cN){D=w(K.cN,D,true)}}var C="";var H=0;try{var B,y,x=0;while(true){I.t.lastIndex=x;B=I.t.exec(L);if(!B){break}y=G(L.substr(x,B.index-x),B[0]);x=B.index+y}G(L.substr(x));for(var K=I;K.parent;K=K.parent){if(K.cN){D+="</span>"}}return{r:H,value:D,language:S,top:I}}catch(O){if(O.message.indexOf("Illegal")!=-1){return{r:0,value:k(L)}}else{throw O}}}function g(y,x){x=x||b.languages||Object.keys(f);var v={r:0,value:k(y)};var w=v;x.forEach(function(z){if(!j(z)){return}var A=c(z,y,false);A.language=z;if(A.r>w.r){w=A}if(A.r>v.r){w=v;v=A}});if(w.language){v.second_best=w}return v}function h(v){if(b.tabReplace){v=v.replace(/^((<[^>]+>|\t)+)/gm,function(w,z,y,x){return z.replace(/\t/g,b.tabReplace)})}if(b.useBR){v=v.replace(/\n/g,"<br>")}return v}function p(z){var y=d(z);var A=r(z);if(A=="no-highlight"){return}var v=A?c(A,y,true):g(y);var w=u(z);if(w.length){var x=document.createElementNS("http://www.w3.org/1999/xhtml","pre");x.innerHTML=v.value;v.value=q(w,u(x),y)}v.value=h(v.value);z.innerHTML=v.value;z.className+=" hljs "+(!A&&v.language||"");z.result={language:v.language,re:v.r};if(v.second_best){z.second_best={language:v.second_best.language,re:v.second_best.r}}}var b={classPrefix:"hljs-",tabReplace:null,useBR:false,languages:undefined};function s(v){b=o(b,v)}function l(){if(l.called){return}l.called=true;var v=document.querySelectorAll("pre code");Array.prototype.forEach.call(v,p)}function a(){addEventListener("DOMContentLoaded",l,false);addEventListener("load",l,false)}var f={};var n={};function e(v,x){var w=f[v]=x(this);if(w.aliases){w.aliases.forEach(function(y){n[y]=v})}}function j(v){return f[v]||f[n[v]]}this.highlight=c;this.highlightAuto=g;this.fixMarkup=h;this.highlightBlock=p;this.configure=s;this.initHighlighting=l;this.initHighlightingOnLoad=a;this.registerLanguage=e;this.getLanguage=j;this.inherit=o;this.IR="[a-zA-Z][a-zA-Z0-9_]*";this.UIR="[a-zA-Z_][a-zA-Z0-9_]*";this.NR="\\b\\d+(\\.\\d+)?";this.CNR="(\\b0[xX][a-fA-F0-9]+|(\\b\\d+(\\.\\d*)?|\\.\\d+)([eE][-+]?\\d+)?)";this.BNR="\\b(0b[01]+)";this.RSR="!|!=|!==|%|%=|&|&&|&=|\\*|\\*=|\\+|\\+=|,|-|-=|/=|/|:|;|<<|<<=|<=|<|===|==|=|>>>=|>>=|>=|>>>|>>|>|\\?|\\[|\\{|\\(|\\^|\\^=|\\||\\|=|\\|\\||~";this.BE={b:"\\\\[\\s\\S]",r:0};this.ASM={cN:"string",b:"'",e:"'",i:"\\n",c:[this.BE]};this.QSM={cN:"string",b:'"',e:'"',i:"\\n",c:[this.BE]};this.CLCM={cN:"comment",b:"//",e:"$"};this.CBLCLM={cN:"comment",b:"/\\*",e:"\\*/"};this.HCM={cN:"comment",b:"#",e:"$"};this.NM={cN:"number",b:this.NR,r:0};this.CNM={cN:"number",b:this.CNR,r:0};this.BNM={cN:"number",b:this.BNR,r:0};this.REGEXP_MODE={cN:"regexp",b:/\//,e:/\/[gim]*/,i:/\n/,c:[this.BE,{b:/\[/,e:/\]/,r:0,c:[this.BE]}]};this.TM={cN:"title",b:this.IR,r:0};this.UTM={cN:"title",b:this.UIR,r:0}}();hljs.registerLanguage("bash",function(b){var a={cN:"variable",v:[{b:/\$[\w\d#@][\w\d_]*/},{b:/\$\{(.*?)\}/}]};var d={cN:"string",b:/"/,e:/"/,c:[b.BE,a,{cN:"variable",b:/\$\(/,e:/\)/,c:[b.BE]}]};var c={cN:"string",b:/'/,e:/'/};return{l:/-?[a-z\.]+/,k:{keyword:"if then else elif fi for break continue while in do done exit return set declare case esac export exec",literal:"true false",built_in:"printf echo read cd pwd pushd popd dirs let eval unset typeset readonly getopts source shopt caller type hash bind help sudo",operator:"-ne -eq -lt -gt -f -d -e -s -l -a"},c:[{cN:"shebang",b:/^#![^\n]+sh\s*$/,r:10},{cN:"function",b:/\w[\w\d_]*\s*\(\s*\)\s*\{/,rB:true,c:[b.inherit(b.TM,{b:/\w[\w\d_]*/})],r:0},b.HCM,b.NM,d,c,a]}});hljs.registerLanguage("cs",function(b){var a="abstract as base bool break byte case catch char checked const continue decimal default delegate do double else enum event explicit extern false finally fixed float for foreach goto if implicit in int interface internal is lock long new null object operator out override params private protected public readonly ref return sbyte sealed short sizeof stackalloc static string struct switch this throw true try typeof uint ulong unchecked unsafe ushort using virtual volatile void while async await ascending descending from get group into join let orderby partial select set value var where yield";return{k:a,c:[{cN:"comment",b:"///",e:"$",rB:true,c:[{cN:"xmlDocTag",b:"///|<!--|-->"},{cN:"xmlDocTag",b:"</?",e:">"}]},b.CLCM,b.CBLCLM,{cN:"preprocessor",b:"#",e:"$",k:"if else elif endif define undef warning error line region endregion pragma checksum"},{cN:"string",b:'@"',e:'"',c:[{b:'""'}]},b.ASM,b.QSM,b.CNM,{bK:"protected public private internal",e:/[{;=]/,k:a,c:[{bK:"class namespace interface",starts:{c:[b.TM]}},{b:b.IR+"\\s*\\(",rB:true,c:[b.TM]}]}]}});hljs.registerLanguage("ruby",function(e){var h="[a-zA-Z_]\\w*[!?=]?|[-+~]\\@|<<|>>|=~|===?|<=>|[<>]=?|\\*\\*|[-/+%^&*~`|]|\\[\\]=?";var g="and false then defined module in return redo if BEGIN retry end for true self when next until do begin unless END rescue nil else break undef not super class case require yield alias while ensure elsif or include attr_reader attr_writer attr_accessor";var a={cN:"yardoctag",b:"@[A-Za-z]+"};var i={cN:"comment",v:[{b:"#",e:"$",c:[a]},{b:"^\\=begin",e:"^\\=end",c:[a],r:10},{b:"^__END__",e:"\\n$"}]};var c={cN:"subst",b:"#\\{",e:"}",k:g};var d={cN:"string",c:[e.BE,c],v:[{b:/'/,e:/'/},{b:/"/,e:/"/},{b:"%[qw]?\\(",e:"\\)"},{b:"%[qw]?\\[",e:"\\]"},{b:"%[qw]?{",e:"}"},{b:"%[qw]?<",e:">",r:10},{b:"%[qw]?/",e:"/",r:10},{b:"%[qw]?%",e:"%",r:10},{b:"%[qw]?-",e:"-",r:10},{b:"%[qw]?\\|",e:"\\|",r:10},{b:/\B\?(\\\d{1,3}|\\x[A-Fa-f0-9]{1,2}|\\u[A-Fa-f0-9]{4}|\\?\S)\b/}]};var b={cN:"params",b:"\\(",e:"\\)",k:g};var f=[d,i,{cN:"class",bK:"class module",e:"$|;",i:/=/,c:[e.inherit(e.TM,{b:"[A-Za-z_]\\w*(::\\w+)*(\\?|\\!)?"}),{cN:"inheritance",b:"<\\s*",c:[{cN:"parent",b:"("+e.IR+"::)?"+e.IR}]},i]},{cN:"function",bK:"def",e:" |$|;",r:0,c:[e.inherit(e.TM,{b:h}),b,i]},{cN:"constant",b:"(::)?(\\b[A-Z]\\w*(::)?)+",r:0},{cN:"symbol",b:":",c:[d,{b:h}],r:0},{cN:"symbol",b:e.UIR+"(\\!|\\?)?:",r:0},{cN:"number",b:"(\\b0[0-7_]+)|(\\b0x[0-9a-fA-F_]+)|(\\b[1-9][0-9_]*(\\.[0-9_]+)?)|[0_]\\b",r:0},{cN:"variable",b:"(\\$\\W)|((\\$|\\@\\@?)(\\w+))"},{b:"("+e.RSR+")\\s*",c:[i,{cN:"regexp",c:[e.BE,c],i:/\n/,v:[{b:"/",e:"/[a-z]*"},{b:"%r{",e:"}[a-z]*"},{b:"%r\\(",e:"\\)[a-z]*"},{b:"%r!",e:"![a-z]*"},{b:"%r\\[",e:"\\][a-z]*"}]}],r:0}];c.c=f;b.c=f;return{k:g,c:f}});hljs.registerLanguage("diff",function(a){return{c:[{cN:"chunk",r:10,v:[{b:/^\@\@ +\-\d+,\d+ +\+\d+,\d+ +\@\@$/},{b:/^\*\*\* +\d+,\d+ +\*\*\*\*$/},{b:/^\-\-\- +\d+,\d+ +\-\-\-\-$/}]},{cN:"header",v:[{b:/Index: /,e:/$/},{b:/=====/,e:/=====$/},{b:/^\-\-\-/,e:/$/},{b:/^\*{3} /,e:/$/},{b:/^\+\+\+/,e:/$/},{b:/\*{5}/,e:/\*{5}$/}]},{cN:"addition",b:"^\\+",e:"$"},{cN:"deletion",b:"^\\-",e:"$"},{cN:"change",b:"^\\!",e:"$"}]}});hljs.registerLanguage("javascript",function(a){return{aliases:["js"],k:{keyword:"in if for while finally var new function do return void else break catch instanceof with throw case default try this switch continue typeof delete let yield const class",literal:"true false null undefined NaN Infinity",built_in:"eval isFinite isNaN parseFloat parseInt decodeURI decodeURIComponent encodeURI encodeURIComponent escape unescape Object Function Boolean Error EvalError InternalError RangeError ReferenceError StopIteration SyntaxError TypeError URIError Number Math Date String RegExp Array Float32Array Float64Array Int16Array Int32Array Int8Array Uint16Array Uint32Array Uint8Array Uint8ClampedArray ArrayBuffer DataView JSON Intl arguments require"},c:[{cN:"pi",b:/^\s*('|")use strict('|")/,r:10},a.ASM,a.QSM,a.CLCM,a.CBLCLM,a.CNM,{b:"("+a.RSR+"|\\b(case|return|throw)\\b)\\s*",k:"return throw case",c:[a.CLCM,a.CBLCLM,a.REGEXP_MODE,{b:/</,e:/>;/,r:0,sL:"xml"}],r:0},{cN:"function",bK:"function",e:/\{/,c:[a.inherit(a.TM,{b:/[A-Za-z$_][0-9A-Za-z$_]*/}),{cN:"params",b:/\(/,e:/\)/,c:[a.CLCM,a.CBLCLM],i:/["'\(]/}],i:/\[|%/},{b:/\$[(.]/},{b:"\\."+a.IR,r:0}]}});hljs.registerLanguage("xml",function(a){var c="[A-Za-z0-9\\._:-]+";var d={b:/<\?(php)?(?!\w)/,e:/\?>/,sL:"php",subLanguageMode:"continuous"};var b={eW:true,i:/</,r:0,c:[d,{cN:"attribute",b:c,r:0},{b:"=",r:0,c:[{cN:"value",v:[{b:/"/,e:/"/},{b:/'/,e:/'/},{b:/[^\s\/>]+/}]}]}]};return{aliases:["html"],cI:true,c:[{cN:"doctype",b:"<!DOCTYPE",e:">",r:10,c:[{b:"\\[",e:"\\]"}]},{cN:"comment",b:"<!--",e:"-->",r:10},{cN:"cdata",b:"<\\!\\[CDATA\\[",e:"\\]\\]>",r:10},{cN:"tag",b:"<style(?=\\s|>|$)",e:">",k:{title:"style"},c:[b],starts:{e:"</style>",rE:true,sL:"css"}},{cN:"tag",b:"<script(?=\\s|>|$)",e:">",k:{title:"script"},c:[b],starts:{e:"<\/script>",rE:true,sL:"javascript"}},{b:"<%",e:"%>",sL:"vbscript"},d,{cN:"pi",b:/<\?\w+/,e:/\?>/,r:10},{cN:"tag",b:"</?",e:"/?>",c:[{cN:"title",b:"[^ /><]+",r:0},b]}]}});hljs.registerLanguage("markdown",function(a){return{c:[{cN:"header",v:[{b:"^#{1,6}",e:"$"},{b:"^.+?\\n[=-]{2,}$"}]},{b:"<",e:">",sL:"xml",r:0},{cN:"bullet",b:"^([*+-]|(\\d+\\.))\\s+"},{cN:"strong",b:"[*_]{2}.+?[*_]{2}"},{cN:"emphasis",v:[{b:"\\*.+?\\*"},{b:"_.+?_",r:0}]},{cN:"blockquote",b:"^>\\s+",e:"$"},{cN:"code",v:[{b:"`.+?`"},{b:"^( {4}|\t)",e:"$",r:0}]},{cN:"horizontal_rule",b:"^[-\\*]{3,}",e:"$"},{b:"\\[.+?\\][\\(\\[].+?[\\)\\]]",rB:true,c:[{cN:"link_label",b:"\\[",e:"\\]",eB:true,rE:true,r:0},{cN:"link_url",b:"\\]\\(",e:"\\)",eB:true,eE:true},{cN:"link_reference",b:"\\]\\[",e:"\\]",eB:true,eE:true,}],r:10},{b:"^\\[.+\\]:",e:"$",rB:true,c:[{cN:"link_reference",b:"\\[",e:"\\]",eB:true,eE:true},{cN:"link_url",b:"\\s",e:"$"}]}]}});hljs.registerLanguage("css",function(a){var b="[a-zA-Z-][a-zA-Z0-9_-]*";var c={cN:"function",b:b+"\\(",e:"\\)",c:["self",a.NM,a.ASM,a.QSM]};return{cI:true,i:"[=/|']",c:[a.CBLCLM,{cN:"id",b:"\\#[A-Za-z0-9_-]+"},{cN:"class",b:"\\.[A-Za-z0-9_-]+",r:0},{cN:"attr_selector",b:"\\[",e:"\\]",i:"$"},{cN:"pseudo",b:":(:)?[a-zA-Z0-9\\_\\-\\+\\(\\)\\\"\\']+"},{cN:"at_rule",b:"@(font-face|page)",l:"[a-z-]+",k:"font-face page"},{cN:"at_rule",b:"@",e:"[{;]",c:[{cN:"keyword",b:/\S+/},{b:/\s/,eW:true,eE:true,r:0,c:[c,a.ASM,a.QSM,a.NM]}]},{cN:"tag",b:b,r:0},{cN:"rules",b:"{",e:"}",i:"[^\\s]",r:0,c:[a.CBLCLM,{cN:"rule",b:"[^\\s]",rB:true,e:";",eW:true,c:[{cN:"attribute",b:"[A-Z\\_\\.\\-]+",e:":",eE:true,i:"[^\\s]",starts:{cN:"value",eW:true,eE:true,c:[c,a.NM,a.QSM,a.ASM,a.CBLCLM,{cN:"hexcolor",b:"#[0-9A-Fa-f]+"},{cN:"important",b:"!important"}]}}]}]}]}});hljs.registerLanguage("http",function(a){return{i:"\\S",c:[{cN:"status",b:"^HTTP/[0-9\\.]+",e:"$",c:[{cN:"number",b:"\\b\\d{3}\\b"}]},{cN:"request",b:"^[A-Z]+ (.*?) HTTP/[0-9\\.]+$",rB:true,e:"$",c:[{cN:"string",b:" ",e:" ",eB:true,eE:true}]},{cN:"attribute",b:"^\\w",e:": ",eE:true,i:"\\n|\\s|=",starts:{cN:"string",e:"$"}},{b:"\\n\\n",starts:{sL:"",eW:true}}]}});hljs.registerLanguage("java",function(b){var a="false synchronized int abstract float private char boolean static null if const for true while long throw strictfp finally protected import native final return void enum else break transient new catch instanceof byte super volatile case assert short package default double public try this switch continue throws";return{k:a,i:/<\//,c:[{cN:"javadoc",b:"/\\*\\*",e:"\\*/",c:[{cN:"javadoctag",b:"(^|\\s)@[A-Za-z]+"}],r:10},b.CLCM,b.CBLCLM,b.ASM,b.QSM,{bK:"protected public private",e:/[{;=]/,k:a,c:[{cN:"class",bK:"class interface",eW:true,i:/[:"<>]/,c:[{bK:"extends implements",r:10},b.UTM]},{b:b.UIR+"\\s*\\(",rB:true,c:[b.UTM]}]},b.CNM,{cN:"annotation",b:"@[A-Za-z]+"}]}});hljs.registerLanguage("php",function(b){var e={cN:"variable",b:"\\$+[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*"};var a={cN:"preprocessor",b:/<\?(php)?|\?>/};var c={cN:"string",c:[b.BE,a],v:[{b:'b"',e:'"'},{b:"b'",e:"'"},b.inherit(b.ASM,{i:null}),b.inherit(b.QSM,{i:null})]};var d={v:[b.BNM,b.CNM]};return{cI:true,k:"and include_once list abstract global private echo interface as static endswitch array null if endwhile or const for endforeach self var while isset public protected exit foreach throw elseif include __FILE__ empty require_once do xor return parent clone use __CLASS__ __LINE__ else break print eval new catch __METHOD__ case exception default die require __FUNCTION__ enddeclare final try switch continue endfor endif declare unset true false trait goto instanceof insteadof __DIR__ __NAMESPACE__ yield finally",c:[b.CLCM,b.HCM,{cN:"comment",b:"/\\*",e:"\\*/",c:[{cN:"phpdoc",b:"\\s@[A-Za-z]+"},a]},{cN:"comment",b:"__halt_compiler.+?;",eW:true,k:"__halt_compiler",l:b.UIR},{cN:"string",b:"<<<['\"]?\\w+['\"]?$",e:"^\\w+;",c:[b.BE]},a,e,{cN:"function",bK:"function",e:/[;{]/,i:"\\$|\\[|%",c:[b.UTM,{cN:"params",b:"\\(",e:"\\)",c:["self",e,b.CBLCLM,c,d]}]},{cN:"class",bK:"class interface",e:"{",i:/[:\(\$"]/,c:[{bK:"extends implements",r:10},b.UTM]},{bK:"namespace",e:";",i:/[\.']/,c:[b.UTM]},{bK:"use",e:";",c:[b.UTM]},{b:"=>"},c,d]}});hljs.registerLanguage("python",function(a){var f={cN:"prompt",b:/^(>>>|\.\.\.) /};var b={cN:"string",c:[a.BE],v:[{b:/(u|b)?r?'''/,e:/'''/,c:[f],r:10},{b:/(u|b)?r?"""/,e:/"""/,c:[f],r:10},{b:/(u|r|ur)'/,e:/'/,r:10},{b:/(u|r|ur)"/,e:/"/,r:10},{b:/(b|br)'/,e:/'/,},{b:/(b|br)"/,e:/"/,},a.ASM,a.QSM]};var d={cN:"number",r:0,v:[{b:a.BNR+"[lLjJ]?"},{b:"\\b(0o[0-7]+)[lLjJ]?"},{b:a.CNR+"[lLjJ]?"}]};var e={cN:"params",b:/\(/,e:/\)/,c:["self",f,d,b]};var c={e:/:/,i:/[${=;\n]/,c:[a.UTM,e]};return{k:{keyword:"and elif is global as in if from raise for except finally print import pass return exec else break not with class assert yield try while continue del or def lambda nonlocal|10 None True False",built_in:"Ellipsis NotImplemented"},i:/(<\/|->|\?)/,c:[f,d,b,a.HCM,a.inherit(c,{cN:"function",bK:"def",r:10}),a.inherit(c,{cN:"class",bK:"class"}),{cN:"decorator",b:/@/,e:/$/},{b:/\b(print|exec)\(/}]}});hljs.registerLanguage("sql",function(a){return{cI:true,i:/[<>]/,c:[{cN:"operator",b:"\\b(begin|end|start|commit|rollback|savepoint|lock|alter|create|drop|rename|call|delete|do|handler|insert|load|replace|select|truncate|update|set|show|pragma|grant|merge)\\b(?!:)",e:";",eW:true,k:{keyword:"all partial global month current_timestamp using go revoke smallint indicator end-exec disconnect zone with character assertion to add current_user usage input local alter match collate real then rollback get read timestamp session_user not integer bit unique day minute desc insert execute like ilike|2 level decimal drop continue isolation found where constraints domain right national some module transaction relative second connect escape close system_user for deferred section cast current sqlstate allocate intersect deallocate numeric public preserve full goto initially asc no key output collation group by union session both last language constraint column of space foreign deferrable prior connection unknown action commit view or first into float year primary cascaded except restrict set references names table outer open select size are rows from prepare distinct leading create only next inner authorization schema corresponding option declare precision immediate else timezone_minute external varying translation true case exception join hour default double scroll value cursor descriptor values dec fetch procedure delete and false int is describe char as at in varchar null trailing any absolute current_time end grant privileges when cross check write current_date pad begin temporary exec time update catalog user sql date on identity timezone_hour natural whenever interval work order cascade diagnostics nchar having left call do handler load replace truncate start lock show pragma exists number trigger if before after each row merge matched database",aggregate:"count sum min max avg"},c:[{cN:"string",b:"'",e:"'",c:[a.BE,{b:"''"}]},{cN:"string",b:'"',e:'"',c:[a.BE,{b:'""'}]},{cN:"string",b:"`",e:"`",c:[a.BE]},a.CNM]},a.CBLCLM,{cN:"comment",b:"--",e:"$"}]}});hljs.registerLanguage("ini",function(a){return{cI:true,i:/\S/,c:[{cN:"comment",b:";",e:"$"},{cN:"title",b:"^\\[",e:"\\]"},{cN:"setting",b:"^[a-z0-9\\[\\]_-]+[ \\t]*=[ \\t]*",e:"$",c:[{cN:"value",eW:true,k:"on off true false yes no",c:[a.QSM,a.NM],r:0}]}]}});hljs.registerLanguage("perl",function(c){var d="getpwent getservent quotemeta msgrcv scalar kill dbmclose undef lc ma syswrite tr send umask sysopen shmwrite vec qx utime local oct semctl localtime readpipe do return format read sprintf dbmopen pop getpgrp not getpwnam rewinddir qqfileno qw endprotoent wait sethostent bless s|0 opendir continue each sleep endgrent shutdown dump chomp connect getsockname die socketpair close flock exists index shmgetsub for endpwent redo lstat msgctl setpgrp abs exit select print ref gethostbyaddr unshift fcntl syscall goto getnetbyaddr join gmtime symlink semget splice x|0 getpeername recv log setsockopt cos last reverse gethostbyname getgrnam study formline endhostent times chop length gethostent getnetent pack getprotoent getservbyname rand mkdir pos chmod y|0 substr endnetent printf next open msgsnd readdir use unlink getsockopt getpriority rindex wantarray hex system getservbyport endservent int chr untie rmdir prototype tell listen fork shmread ucfirst setprotoent else sysseek link getgrgid shmctl waitpid unpack getnetbyname reset chdir grep split require caller lcfirst until warn while values shift telldir getpwuid my getprotobynumber delete and sort uc defined srand accept package seekdir getprotobyname semop our rename seek if q|0 chroot sysread setpwent no crypt getc chown sqrt write setnetent setpriority foreach tie sin msgget map stat getlogin unless elsif truncate exec keys glob tied closedirioctl socket readlink eval xor readline binmode setservent eof ord bind alarm pipe atan2 getgrent exp time push setgrent gt lt or ne m|0 break given say state when";var f={cN:"subst",b:"[$@]\\{",e:"\\}",k:d};var g={b:"->{",e:"}"};var a={cN:"variable",v:[{b:/\$\d/},{b:/[\$\%\@\*](\^\w\b|#\w+(\:\:\w+)*|{\w+}|\w+(\:\:\w*)*)/},{b:/[\$\%\@\*][^\s\w{]/,r:0}]};var e={cN:"comment",b:"^(__END__|__DATA__)",e:"\\n$",r:5};var h=[c.BE,f,a];var b=[a,c.HCM,e,{cN:"comment",b:"^\\=\\w",e:"\\=cut",eW:true},g,{cN:"string",c:h,v:[{b:"q[qwxr]?\\s*\\(",e:"\\)",r:5},{b:"q[qwxr]?\\s*\\[",e:"\\]",r:5},{b:"q[qwxr]?\\s*\\{",e:"\\}",r:5},{b:"q[qwxr]?\\s*\\|",e:"\\|",r:5},{b:"q[qwxr]?\\s*\\<",e:"\\>",r:5},{b:"qw\\s+q",e:"q",r:5},{b:"'",e:"'",c:[c.BE]},{b:'"',e:'"'},{b:"`",e:"`",c:[c.BE]},{b:"{\\w+}",c:[],r:0},{b:"-?\\w+\\s*\\=\\>",c:[],r:0}]},{cN:"number",b:"(\\b0[0-7_]+)|(\\b0x[0-9a-fA-F_]+)|(\\b[1-9][0-9_]*(\\.[0-9_]+)?)|[0_]\\b",r:0},{b:"(\\/\\/|"+c.RSR+"|\\b(split|return|print|reverse|grep)\\b)\\s*",k:"split return print reverse grep",r:0,c:[c.HCM,e,{cN:"regexp",b:"(s|tr|y)/(\\\\.|[^/])*/(\\\\.|[^/])*/[a-z]*",r:10},{cN:"regexp",b:"(m|qr)?/",e:"/[a-z]*",c:[c.BE],r:0}]},{cN:"sub",bK:"sub",e:"(\\s*\\(.*?\\))?[;{]",r:5},{cN:"operator",b:"-\\w\\b",r:0}];f.c=b;g.c=b;return{k:d,c:b}});hljs.registerLanguage("objectivec",function(a){var d={keyword:"int float while char export sizeof typedef const struct for union unsigned long volatile static bool mutable if do return goto void enum else break extern asm case short default double register explicit signed typename this switch continue wchar_t inline readonly assign self synchronized id nonatomic super unichar IBOutlet IBAction strong weak @private @protected @public @try @property @end @throw @catch @finally @synthesize @dynamic @selector @optional @required",literal:"false true FALSE TRUE nil YES NO NULL",built_in:"NSString NSDictionary CGRect CGPoint UIButton UILabel UITextView UIWebView MKMapView UISegmentedControl NSObject UITableViewDelegate UITableViewDataSource NSThread UIActivityIndicator UITabbar UIToolBar UIBarButtonItem UIImageView NSAutoreleasePool UITableView BOOL NSInteger CGFloat NSException NSLog NSMutableString NSMutableArray NSMutableDictionary NSURL NSIndexPath CGSize UITableViewCell UIView UIViewController UINavigationBar UINavigationController UITabBarController UIPopoverController UIPopoverControllerDelegate UIImage NSNumber UISearchBar NSFetchedResultsController NSFetchedResultsChangeType UIScrollView UIScrollViewDelegate UIEdgeInsets UIColor UIFont UIApplication NSNotFound NSNotificationCenter NSNotification UILocalNotification NSBundle NSFileManager NSTimeInterval NSDate NSCalendar NSUserDefaults UIWindow NSRange NSArray NSError NSURLRequest NSURLConnection UIInterfaceOrientation MPMoviePlayerController dispatch_once_t dispatch_queue_t dispatch_sync dispatch_async dispatch_once"};var c=/[a-zA-Z@][a-zA-Z0-9_]*/;var b="@interface @class @protocol @implementation";return{k:d,l:c,i:"</",c:[a.CLCM,a.CBLCLM,a.CNM,a.QSM,{cN:"string",b:"'",e:"[^\\\\]'",i:"[^\\\\][^']"},{cN:"preprocessor",b:"#import",e:"$",c:[{cN:"title",b:'"',e:'"'},{cN:"title",b:"<",e:">"}]},{cN:"preprocessor",b:"#",e:"$"},{cN:"class",b:"("+b.split(" ").join("|")+")\\b",e:"({|$)",k:b,l:c,c:[a.UTM]},{cN:"variable",b:"\\."+a.UIR,r:0}]}});hljs.registerLanguage("coffeescript",function(c){var b={keyword:"in if for while finally new do return else break catch instanceof throw try this switch continue typeof delete debugger super then unless until loop of by when and or is isnt not",literal:"true false null undefined yes no on off",reserved:"case default function var void with const let enum export import native __hasProp __extends __slice __bind __indexOf",built_in:"npm require console print module exports global window document"};var a="[A-Za-z$_][0-9A-Za-z$_]*";var f=c.inherit(c.TM,{b:a});var e={cN:"subst",b:/#\{/,e:/}/,k:b};var d=[c.BNM,c.inherit(c.CNM,{starts:{e:"(\\s*/)?",r:0}}),{cN:"string",v:[{b:/'''/,e:/'''/,c:[c.BE]},{b:/'/,e:/'/,c:[c.BE]},{b:/"""/,e:/"""/,c:[c.BE,e]},{b:/"/,e:/"/,c:[c.BE,e]}]},{cN:"regexp",v:[{b:"///",e:"///",c:[e,c.HCM]},{b:"//[gim]*",r:0},{b:"/\\S(\\\\.|[^\\n])*?/[gim]*(?=\\s|\\W|$)"}]},{cN:"property",b:"@"+a},{b:"`",e:"`",eB:true,eE:true,sL:"javascript"}];e.c=d;return{k:b,c:d.concat([{cN:"comment",b:"###",e:"###"},c.HCM,{cN:"function",b:"("+a+"\\s*=\\s*)?(\\(.*\\))?\\s*\\B[-=]>",e:"[-=]>",rB:true,c:[f,{cN:"params",b:"\\(",rB:true,c:[{b:/\(/,e:/\)/,k:b,c:["self"].concat(d)}]}]},{cN:"class",bK:"class",e:"$",i:/[:="\[\]]/,c:[{bK:"extends",eW:true,i:/[:="\[\]]/,c:[f]},f]},{cN:"attribute",b:a+":",e:":",rB:true,eE:true,r:0}])}});hljs.registerLanguage("nginx",function(c){var b={cN:"variable",v:[{b:/\$\d+/},{b:/\$\{/,e:/}/},{b:"[\\$\\@]"+c.UIR}]};var a={eW:true,l:"[a-z/_]+",k:{built_in:"on off yes no true false none blocked debug info notice warn error crit select break last permanent redirect kqueue rtsig epoll poll /dev/poll"},r:0,i:"=>",c:[c.HCM,{cN:"string",c:[c.BE,b],v:[{b:/"/,e:/"/},{b:/'/,e:/'/}]},{cN:"url",b:"([a-z]+):/",e:"\\s",eW:true,eE:true},{cN:"regexp",c:[c.BE,b],v:[{b:"\\s\\^",e:"\\s|{|;",rE:true},{b:"~\\*?\\s+",e:"\\s|{|;",rE:true},{b:"\\*(\\.[a-z\\-]+)+"},{b:"([a-z\\-]+\\.)+\\*"}]},{cN:"number",b:"\\b\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}(:\\d{1,5})?\\b"},{cN:"number",b:"\\b\\d+[kKmMgGdshdwy]*\\b",r:0},b]};return{c:[c.HCM,{b:c.UIR+"\\s",e:";|{",rB:true,c:[c.inherit(c.UTM,{starts:a})],r:0}],i:"[^\\s\\}]"}});hljs.registerLanguage("json",function(a){var e={literal:"true false null"};var d=[a.QSM,a.CNM];var c={cN:"value",e:",",eW:true,eE:true,c:d,k:e};var b={b:"{",e:"}",c:[{cN:"attribute",b:'\\s*"',e:'"\\s*:\\s*',eB:true,eE:true,c:[a.BE],i:"\\n",starts:c}],i:"\\S"};var f={b:"\\[",e:"\\]",c:[a.inherit(c,{cN:null})],i:"\\S"};d.splice(d.length,0,b,f);return{c:d,k:e,i:"\\S"}});hljs.registerLanguage("apache",function(a){var b={cN:"number",b:"[\\$%]\\d+"};return{cI:true,c:[a.HCM,{cN:"tag",b:"</?",e:">"},{cN:"keyword",b:/\w+/,r:0,k:{common:"order deny allow setenv rewriterule rewriteengine rewritecond documentroot sethandler errordocument loadmodule options header listen serverroot servername"},starts:{e:/$/,r:0,k:{literal:"on off all"},c:[{cN:"sqbracket",b:"\\s\\[",e:"\\]$"},{cN:"cbracket",b:"[\\$%]\\{",e:"\\}",c:["self",b]},b,a.QSM]}}],i:/\S/}});hljs.registerLanguage("cpp",function(a){var b={keyword:"false int float while private char catch export virtual operator sizeof dynamic_cast|10 typedef const_cast|10 const struct for static_cast|10 union namespace unsigned long throw volatile static protected bool template mutable if public friend do return goto auto void enum else break new extern using true class asm case typeid short reinterpret_cast|10 default double register explicit signed typename try this switch continue wchar_t inline delete alignof char16_t char32_t constexpr decltype noexcept nullptr static_assert thread_local restrict _Bool complex _Complex _Imaginary",built_in:"std string cin cout cerr clog stringstream istringstream ostringstream auto_ptr deque list queue stack vector map set bitset multiset multimap unordered_set unordered_map unordered_multiset unordered_multimap array shared_ptr abort abs acos asin atan2 atan calloc ceil cosh cos exit exp fabs floor fmod fprintf fputs free frexp fscanf isalnum isalpha iscntrl isdigit isgraph islower isprint ispunct isspace isupper isxdigit tolower toupper labs ldexp log10 log malloc memchr memcmp memcpy memset modf pow printf putchar puts scanf sinh sin snprintf sprintf sqrt sscanf strcat strchr strcmp strcpy strcspn strlen strncat strncmp strncpy strpbrk strrchr strspn strstr tanh tan vfprintf vprintf vsprintf"};return{aliases:["c"],k:b,i:"</",c:[a.CLCM,a.CBLCLM,a.QSM,{cN:"string",b:"'\\\\?.",e:"'",i:"."},{cN:"number",b:"\\b(\\d+(\\.\\d*)?|\\.\\d+)(u|U|l|L|ul|UL|f|F)"},a.CNM,{cN:"preprocessor",b:"#",e:"$",c:[{b:"include\\s*<",e:">",i:"\\n"},a.CLCM]},{cN:"stl_container",b:"\\b(deque|list|queue|stack|vector|map|set|bitset|multiset|multimap|unordered_map|unordered_set|unordered_multiset|unordered_multimap|array)\\s*<",e:">",k:b,r:10,c:["self"]}]}});hljs.registerLanguage("makefile",function(a){var b={cN:"variable",b:/\$\(/,e:/\)/,c:[a.BE]};return{c:[a.HCM,{b:/^\w+\s*\W*=/,rB:true,r:0,starts:{cN:"constant",e:/\s*\W*=/,eE:true,starts:{e:/$/,r:0,c:[b],}}},{cN:"title",b:/^[\w]+:\s*$/},{cN:"phony",b:/^\.PHONY:/,e:/$/,k:".PHONY",l:/[\.\w]+/},{b:/^\t+/,e:/$/,c:[a.QSM,b]}]}});
\ No newline at end of file
diff --git a/web/libraries/codesnippet/lib/highlight/styles/arta.css b/web/libraries/codesnippet/lib/highlight/styles/arta.css
deleted file mode 100644
index 02db86a2791fcf23060e357e1c980c40a0e2d869..0000000000000000000000000000000000000000
--- a/web/libraries/codesnippet/lib/highlight/styles/arta.css
+++ /dev/null
@@ -1,160 +0,0 @@
-/*
-Date: 17.V.2011
-Author: pumbur <pumbur@pumbur.net>
-*/
-
-.hljs
-{
-  display: block; padding: 0.5em;
-  background: #222;
-}
-
-.profile .hljs-header *,
-.ini .hljs-title,
-.nginx .hljs-title
-{
-  color: #fff;
-}
-
-.hljs-comment,
-.hljs-javadoc,
-.hljs-preprocessor,
-.hljs-preprocessor .hljs-title,
-.hljs-pragma,
-.hljs-shebang,
-.profile .hljs-summary,
-.diff,
-.hljs-pi,
-.hljs-doctype,
-.hljs-tag,
-.hljs-template_comment,
-.css .hljs-rules,
-.tex .hljs-special
-{
-  color: #444;
-}
-
-.hljs-string,
-.hljs-symbol,
-.diff .hljs-change,
-.hljs-regexp,
-.xml .hljs-attribute,
-.smalltalk .hljs-char,
-.xml .hljs-value,
-.ini .hljs-value,
-.clojure .hljs-attribute,
-.coffeescript .hljs-attribute
-{
-  color: #ffcc33;
-}
-
-.hljs-number,
-.hljs-addition
-{
-  color: #00cc66;
-}
-
-.hljs-built_in,
-.hljs-literal,
-.vhdl .hljs-typename,
-.go .hljs-constant,
-.go .hljs-typename,
-.ini .hljs-keyword,
-.lua .hljs-title,
-.perl .hljs-variable,
-.php .hljs-variable,
-.mel .hljs-variable,
-.django .hljs-variable,
-.css .funtion,
-.smalltalk .method,
-.hljs-hexcolor,
-.hljs-important,
-.hljs-flow,
-.hljs-inheritance,
-.parser3 .hljs-variable
-{
-  color: #32AAEE;
-}
-
-.hljs-keyword,
-.hljs-tag .hljs-title,
-.css .hljs-tag,
-.css .hljs-class,
-.css .hljs-id,
-.css .hljs-pseudo,
-.css .hljs-attr_selector,
-.lisp .hljs-title,
-.clojure .hljs-built_in,
-.hljs-winutils,
-.tex .hljs-command,
-.hljs-request,
-.hljs-status
-{
-  color: #6644aa;
-}
-
-.hljs-title,
-.ruby .hljs-constant,
-.vala .hljs-constant,
-.hljs-parent,
-.hljs-deletion,
-.hljs-template_tag,
-.css .hljs-keyword,
-.objectivec .hljs-class .hljs-id,
-.smalltalk .hljs-class,
-.lisp .hljs-keyword,
-.apache .hljs-tag,
-.nginx .hljs-variable,
-.hljs-envvar,
-.bash .hljs-variable,
-.go .hljs-built_in,
-.vbscript .hljs-built_in,
-.lua .hljs-built_in,
-.rsl .hljs-built_in,
-.tail,
-.avrasm .hljs-label,
-.tex .hljs-formula,
-.tex .hljs-formula *
-{
-  color: #bb1166;
-}
-
-.hljs-yardoctag,
-.hljs-phpdoc,
-.profile .hljs-header,
-.ini .hljs-title,
-.apache .hljs-tag,
-.parser3 .hljs-title
-{
-  font-weight: bold;
-}
-
-.coffeescript .javascript,
-.javascript .xml,
-.tex .hljs-formula,
-.xml .javascript,
-.xml .vbscript,
-.xml .css,
-.xml .hljs-cdata
-{
-  opacity: 0.6;
-}
-
-.hljs,
-.javascript,
-.css,
-.xml,
-.hljs-subst,
-.diff .hljs-chunk,
-.css .hljs-value,
-.css .hljs-attribute,
-.lisp .hljs-string,
-.lisp .hljs-number,
-.tail .hljs-params,
-.hljs-container,
-.haskell *,
-.erlang *,
-.erlang_repl *
-{
-  color: #aaa;
-}
diff --git a/web/libraries/codesnippet/lib/highlight/styles/ascetic.css b/web/libraries/codesnippet/lib/highlight/styles/ascetic.css
deleted file mode 100644
index 031c88a0e1f74499740e1ad23f0ebd1652c7acc4..0000000000000000000000000000000000000000
--- a/web/libraries/codesnippet/lib/highlight/styles/ascetic.css
+++ /dev/null
@@ -1,50 +0,0 @@
-/*
-
-Original style from softwaremaniacs.org (c) Ivan Sagalaev <Maniac@SoftwareManiacs.Org>
-
-*/
-
-.hljs {
-  display: block; padding: 0.5em;
-  background: white; color: black;
-}
-
-.hljs-string,
-.hljs-tag .hljs-value,
-.hljs-filter .hljs-argument,
-.hljs-addition,
-.hljs-change,
-.apache .hljs-tag,
-.apache .hljs-cbracket,
-.nginx .hljs-built_in,
-.tex .hljs-formula {
-  color: #888;
-}
-
-.hljs-comment,
-.hljs-template_comment,
-.hljs-shebang,
-.hljs-doctype,
-.hljs-pi,
-.hljs-javadoc,
-.hljs-deletion,
-.apache .hljs-sqbracket {
-  color: #CCC;
-}
-
-.hljs-keyword,
-.hljs-tag .hljs-title,
-.ini .hljs-title,
-.lisp .hljs-title,
-.clojure .hljs-title,
-.http .hljs-title,
-.nginx .hljs-title,
-.css .hljs-tag,
-.hljs-winutils,
-.hljs-flow,
-.apache .hljs-tag,
-.tex .hljs-command,
-.hljs-request,
-.hljs-status {
-  font-weight: bold;
-}
diff --git a/web/libraries/codesnippet/lib/highlight/styles/atelier-dune.dark.css b/web/libraries/codesnippet/lib/highlight/styles/atelier-dune.dark.css
deleted file mode 100644
index 277960152e52cd672f98cb1202a81b1050bcd0fa..0000000000000000000000000000000000000000
--- a/web/libraries/codesnippet/lib/highlight/styles/atelier-dune.dark.css
+++ /dev/null
@@ -1,93 +0,0 @@
-/* Base16 Atelier Dune Dark - Theme */
-/* by Bram de Haan (http://atelierbram.github.io/syntax-highlighting/atelier-schemes/dune) */ 
-/* Original Base16 color scheme by Chris Kempson (https://github.com/chriskempson/base16) */
-/* https://github.com/jmblog/color-themes-for-highlightjs */
-
-/* Atelier Dune Dark Comment */
-.hljs-comment,
-.hljs-title {
-  color: #999580;
-}
-
-/* Atelier Dune Dark Red */
-.hljs-variable,
-.hljs-attribute,
-.hljs-tag,
-.hljs-regexp,
-.ruby .hljs-constant,
-.xml .hljs-tag .hljs-title,
-.xml .hljs-pi,
-.xml .hljs-doctype,
-.html .hljs-doctype,
-.css .hljs-id,
-.css .hljs-class,
-.css .hljs-pseudo {
-  color: #d73737;
-}
-
-/* Atelier Dune Dark Orange */
-.hljs-number,
-.hljs-preprocessor,
-.hljs-pragma,
-.hljs-built_in,
-.hljs-literal,
-.hljs-params,
-.hljs-constant {
-  color: #b65611;
-}
-
-/* Atelier Dune Dark Yellow */
-.ruby .hljs-class .hljs-title,
-.css .hljs-rules .hljs-attribute {
-  color: #cfb017;
-}
-
-/* Atelier Dune Dark Green */
-.hljs-string,
-.hljs-value,
-.hljs-inheritance,
-.hljs-header,
-.ruby .hljs-symbol,
-.xml .hljs-cdata {
-  color: #60ac39;
-}
-
-/* Atelier Dune Dark Aqua */
-.css .hljs-hexcolor {
-  color: #1fad83;
-}
-
-/* Atelier Dune Dark Blue */
-.hljs-function,
-.python .hljs-decorator,
-.python .hljs-title,
-.ruby .hljs-function .hljs-title,
-.ruby .hljs-title .hljs-keyword,
-.perl .hljs-sub,
-.javascript .hljs-title,
-.coffeescript .hljs-title {
-  color: #6684e1;
-}
-
-/* Atelier Dune Dark Purple */
-.hljs-keyword,
-.javascript .hljs-function {
-  color: #b854d4;
-}
-
-.hljs {
-  display: block;
-  background: #292824;
-  color: #a6a28c;
-  padding: 0.5em;
-}
-
-.coffeescript .javascript,
-.javascript .xml,
-.tex .hljs-formula,
-.xml .javascript,
-.xml .vbscript,
-.xml .css,
-.xml .hljs-cdata {
-  opacity: 0.5;
-}
diff --git a/web/libraries/codesnippet/lib/highlight/styles/atelier-dune.light.css b/web/libraries/codesnippet/lib/highlight/styles/atelier-dune.light.css
deleted file mode 100644
index 11c74232cd08553fbd9c829778e3b63286a416b1..0000000000000000000000000000000000000000
--- a/web/libraries/codesnippet/lib/highlight/styles/atelier-dune.light.css
+++ /dev/null
@@ -1,93 +0,0 @@
-/* Base16 Atelier Dune Light - Theme */
-/* by Bram de Haan (http://atelierbram.github.io/syntax-highlighting/atelier-schemes/dune) */ 
-/* Original Base16 color scheme by Chris Kempson (https://github.com/chriskempson/base16) */
-/* https://github.com/jmblog/color-themes-for-highlightjs */
-
-/* Atelier Dune Light Comment */
-.hljs-comment,
-.hljs-title {
-  color: #7d7a68;
-}
-
-/* Atelier Dune Light Red */
-.hljs-variable,
-.hljs-attribute,
-.hljs-tag,
-.hljs-regexp,
-.ruby .hljs-constant,
-.xml .hljs-tag .hljs-title,
-.xml .hljs-pi,
-.xml .hljs-doctype,
-.html .hljs-doctype,
-.css .hljs-id,
-.css .hljs-class,
-.css .hljs-pseudo {
-  color: #d73737;
-}
-
-/* Atelier Dune Light Orange */
-.hljs-number,
-.hljs-preprocessor,
-.hljs-pragma,
-.hljs-built_in,
-.hljs-literal,
-.hljs-params,
-.hljs-constant {
-  color: #b65611;
-}
-
-/* Atelier Dune Light Yellow */
-.hljs-ruby .hljs-class .hljs-title,
-.css .hljs-rules .hljs-attribute {
-  color: #cfb017;
-}
-
-/* Atelier Dune Light Green */
-.hljs-string,
-.hljs-value,
-.hljs-inheritance,
-.hljs-header,
-.ruby .hljs-symbol,
-.xml .hljs-cdata {
-  color: #60ac39;
-}
-
-/* Atelier Dune Light Aqua */
-.css .hljs-hexcolor {
-  color: #1fad83;
-}
-
-/* Atelier Dune Light Blue */
-.hljs-function,
-.python .hljs-decorator,
-.python .hljs-title,
-.ruby .hljs-function .hljs-title,
-.ruby .hljs-title .hljs-keyword,
-.perl .hljs-sub,
-.javascript .hljs-title,
-.coffeescript .hljs-title {
-  color: #6684e1;
-}
-
-/* Atelier Dune Light Purple */
-.hljs-keyword,
-.javascript .hljs-function {
-  color: #b854d4;
-}
-
-.hljs {
-  display: block;
-  background: #fefbec;
-  color: #6e6b5e;
-  padding: 0.5em;
-}
-
-.coffeescript .javascript,
-.javascript .xml,
-.tex .hljs-formula,
-.xml .javascript,
-.xml .vbscript,
-.xml .css,
-.xml .hljs-cdata {
-  opacity: 0.5;
-}
diff --git a/web/libraries/codesnippet/lib/highlight/styles/atelier-forest.dark.css b/web/libraries/codesnippet/lib/highlight/styles/atelier-forest.dark.css
deleted file mode 100644
index c1f7211fcfe93bfb12f36d5c9cee3e2bdffaf003..0000000000000000000000000000000000000000
--- a/web/libraries/codesnippet/lib/highlight/styles/atelier-forest.dark.css
+++ /dev/null
@@ -1,93 +0,0 @@
-/* Base16 Atelier Forest Dark - Theme */
-/* by Bram de Haan (http://atelierbram.github.io/syntax-highlighting/atelier-schemes/forest) */ 
-/* Original Base16 color scheme by Chris Kempson (https://github.com/chriskempson/base16) */
-/* https://github.com/jmblog/color-themes-for-highlightjs */
-
-/* Atelier Forest Dark Comment */
-.hljs-comment,
-.hljs-title {
-  color: #9c9491;
-}
-
-/* Atelier Forest Dark Red */
-.hljs-variable,
-.hljs-attribute,
-.hljs-tag,
-.hljs-regexp,
-.ruby .hljs-constant,
-.xml .hljs-tag .hljs-title,
-.xml .hljs-pi,
-.xml .hljs-doctype,
-.html .hljs-doctype,
-.css .hljs-id,
-.css .hljs-class,
-.css .hljs-pseudo {
-  color: #f22c40;
-}
-
-/* Atelier Forest Dark Orange */
-.hljs-number,
-.hljs-preprocessor,
-.hljs-pragma,
-.hljs-built_in,
-.hljs-literal,
-.hljs-params,
-.hljs-constant {
-  color: #df5320;
-}
-
-/* Atelier Forest Dark Yellow */
-.hljs-ruby .hljs-class .hljs-title,
-.css .hljs-rules .hljs-attribute {
-  color: #d5911a;
-}
-
-/* Atelier Forest Dark Green */
-.hljs-string,
-.hljs-value,
-.hljs-inheritance,
-.hljs-header,
-.ruby .hljs-symbol,
-.xml .hljs-cdata {
-  color: #5ab738;
-}
-
-/* Atelier Forest Dark Aqua */
-.css .hljs-hexcolor {
-  color: #00ad9c;
-}
-
-/* Atelier Forest Dark Blue */
-.hljs-function,
-.python .hljs-decorator,
-.python .hljs-title,
-.ruby .hljs-function .hljs-title,
-.ruby .hljs-title .hljs-keyword,
-.perl .hljs-sub,
-.javascript .hljs-title,
-.coffeescript .hljs-title {
-  color: #407ee7;
-}
-
-/* Atelier Forest Dark Purple */
-.hljs-keyword,
-.javascript .hljs-function {
-  color: #6666ea;
-}
-
-.hljs {
-  display: block;
-  background: #2c2421;
-  color: #a8a19f;
-  padding: 0.5em;
-}
-
-.coffeescript .javascript,
-.javascript .xml,
-.tex .hljs-formula,
-.xml .javascript,
-.xml .vbscript,
-.xml .css,
-.xml .hljs-cdata {
-  opacity: 0.5;
-}
diff --git a/web/libraries/codesnippet/lib/highlight/styles/atelier-forest.light.css b/web/libraries/codesnippet/lib/highlight/styles/atelier-forest.light.css
deleted file mode 100644
index 806ba7394380d2ea762e941efb00a354ba6dae1f..0000000000000000000000000000000000000000
--- a/web/libraries/codesnippet/lib/highlight/styles/atelier-forest.light.css
+++ /dev/null
@@ -1,93 +0,0 @@
-/* Base16 Atelier Forest Light - Theme */
-/* by Bram de Haan (http://atelierbram.github.io/syntax-highlighting/atelier-schemes/forest) */ 
-/* Original Base16 color scheme by Chris Kempson (https://github.com/chriskempson/base16) */
-/* https://github.com/jmblog/color-themes-for-highlightjs */
-
-/* Atelier Forest Light Comment */
-.hljs-comment,
-.hljs-title {
-  color: #766e6b;
-}
-
-/* Atelier Forest Light Red */
-.hljs-variable,
-.hljs-attribute,
-.hljs-tag,
-.hljs-regexp,
-.ruby .hljs-constant,
-.xml .hljs-tag .hljs-title,
-.xml .hljs-pi,
-.xml .hljs-doctype,
-.html .hljs-doctype,
-.css .hljs-id,
-.css .hljs-class,
-.css .hljs-pseudo {
-  color: #f22c40;
-}
-
-/* Atelier Forest Light Orange */
-.hljs-number,
-.hljs-preprocessor,
-.hljs-pragma,
-.hljs-built_in,
-.hljs-literal,
-.hljs-params,
-.hljs-constant {
-  color: #df5320;
-}
-
-/* Atelier Forest Light Yellow */
-.hljs-ruby .hljs-class .hljs-title,
-.css .hljs-rules .hljs-attribute {
-  color: #d5911a;
-}
-
-/* Atelier Forest Light Green */
-.hljs-string,
-.hljs-value,
-.hljs-inheritance,
-.hljs-header,
-.ruby .hljs-symbol,
-.xml .hljs-cdata {
-  color: #5ab738;
-}
-
-/* Atelier Forest Light Aqua */
-.css .hljs-hexcolor {
-  color: #00ad9c;
-}
-
-/* Atelier Forest Light Blue */
-.hljs-function,
-.python .hljs-decorator,
-.python .hljs-title,
-.ruby .hljs-function .hljs-title,
-.ruby .hljs-title .hljs-keyword,
-.perl .hljs-sub,
-.javascript .hljs-title,
-.coffeescript .hljs-title {
-  color: #407ee7;
-}
-
-/* Atelier Forest Light Purple */
-.hljs-keyword,
-.javascript .hljs-function {
-  color: #6666ea;
-}
-
-.hljs {
-  display: block;
-  background: #f1efee;
-  color: #68615e;
-  padding: 0.5em;
-}
-
-.coffeescript .javascript,
-.javascript .xml,
-.tex .hljs-formula,
-.xml .javascript,
-.xml .vbscript,
-.xml .css,
-.xml .hljs-cdata {
-  opacity: 0.5;
-}
diff --git a/web/libraries/codesnippet/lib/highlight/styles/atelier-heath.dark.css b/web/libraries/codesnippet/lib/highlight/styles/atelier-heath.dark.css
deleted file mode 100644
index 36706698313920fe2baea42e39a1e132e5ef002b..0000000000000000000000000000000000000000
--- a/web/libraries/codesnippet/lib/highlight/styles/atelier-heath.dark.css
+++ /dev/null
@@ -1,93 +0,0 @@
-/* Base16 Atelier Heath Dark - Theme */
-/* by Bram de Haan (http://atelierbram.github.io/syntax-highlighting/atelier-schemes/heath) */ 
-/* Original Base16 color scheme by Chris Kempson (https://github.com/chriskempson/base16) */
-/* https://github.com/jmblog/color-themes-for-highlightjs */
-
-/* Atelier Heath Dark Comment */
-.hljs-comment,
-.hljs-title {
-  color: #9e8f9e;
-}
-
-/* Atelier Heath Dark Red */
-.hljs-variable,
-.hljs-attribute,
-.hljs-tag,
-.hljs-regexp,
-.ruby .hljs-constant,
-.xml .hljs-tag .hljs-title,
-.xml .hljs-pi,
-.xml .hljs-doctype,
-.html .hljs-doctype,
-.css .hljs-id,
-.css .hljs-class,
-.css .hljs-pseudo {
-  color: #ca402b;
-}
-
-/* Atelier Heath Dark Orange */
-.hljs-number,
-.hljs-preprocessor,
-.hljs-pragma,
-.hljs-built_in,
-.hljs-literal,
-.hljs-params,
-.hljs-constant {
-  color: #a65926;
-}
-
-/* Atelier Heath Dark Yellow */
-.hljs-ruby .hljs-class .hljs-title,
-.css .hljs-rules .hljs-attribute {
-  color: #bb8a35;
-}
-
-/* Atelier Heath Dark Green */
-.hljs-string,
-.hljs-value,
-.hljs-inheritance,
-.hljs-header,
-.ruby .hljs-symbol,
-.xml .hljs-cdata {
-  color: #379a37;
-}
-
-/* Atelier Heath Dark Aqua */
-.css .hljs-hexcolor {
-  color: #159393;
-}
-
-/* Atelier Heath Dark Blue */
-.hljs-function,
-.python .hljs-decorator,
-.python .hljs-title,
-.ruby .hljs-function .hljs-title,
-.ruby .hljs-title .hljs-keyword,
-.perl .hljs-sub,
-.javascript .hljs-title,
-.coffeescript .hljs-title {
-  color: #516aec;
-}
-
-/* Atelier Heath Dark Purple */
-.hljs-keyword,
-.javascript .hljs-function {
-  color: #7b59c0;
-}
-
-.hljs {
-  display: block;
-  background: #292329;
-  color: #ab9bab;
-  padding: 0.5em;
-}
-
-.coffeescript .javascript,
-.javascript .xml,
-.tex .hljs-formula,
-.xml .javascript,
-.xml .vbscript,
-.xml .css,
-.xml .hljs-cdata {
-  opacity: 0.5;
-}
diff --git a/web/libraries/codesnippet/lib/highlight/styles/atelier-heath.light.css b/web/libraries/codesnippet/lib/highlight/styles/atelier-heath.light.css
deleted file mode 100644
index e73a0b8bbc5ce27598e7e6b986e314d47116a97a..0000000000000000000000000000000000000000
--- a/web/libraries/codesnippet/lib/highlight/styles/atelier-heath.light.css
+++ /dev/null
@@ -1,93 +0,0 @@
-/* Base16 Atelier Heath Light - Theme */
-/* by Bram de Haan (http://atelierbram.github.io/syntax-highlighting/atelier-schemes/heath) */ 
-/* Original Base16 color scheme by Chris Kempson (https://github.com/chriskempson/base16) */
-/* https://github.com/jmblog/color-themes-for-highlightjs */
-
-/* Atelier Heath Light Comment */
-.hljs-comment,
-.hljs-title {
-  color: #776977;
-}
-
-/* Atelier Heath Light Red */
-.hljs-variable,
-.hljs-attribute,
-.hljs-tag,
-.hljs-regexp,
-.ruby .hljs-constant,
-.xml .hljs-tag .hljs-title,
-.xml .hljs-pi,
-.xml .hljs-doctype,
-.html .hljs-doctype,
-.css .hljs-id,
-.css .hljs-class,
-.css .hljs-pseudo {
-  color: #ca402b;
-}
-
-/* Atelier Heath Light Orange */
-.hljs-number,
-.hljs-preprocessor,
-.hljs-pragma,
-.hljs-built_in,
-.hljs-literal,
-.hljs-params,
-.hljs-constant {
-  color: #a65926;
-}
-
-/* Atelier Heath Light Yellow */
-.hljs-ruby .hljs-class .hljs-title,
-.css .hljs-rules .hljs-attribute {
-  color: #bb8a35;
-}
-
-/* Atelier Heath Light Green */
-.hljs-string,
-.hljs-value,
-.hljs-inheritance,
-.hljs-header,
-.ruby .hljs-symbol,
-.xml .hljs-cdata {
-  color: #379a37;
-}
-
-/* Atelier Heath Light Aqua */
-.css .hljs-hexcolor {
-  color: #159393;
-}
-
-/* Atelier Heath Light Blue */
-.hljs-function,
-.python .hljs-decorator,
-.python .hljs-title,
-.ruby .hljs-function .hljs-title,
-.ruby .hljs-title .hljs-keyword,
-.perl .hljs-sub,
-.javascript .hljs-title,
-.coffeescript .hljs-title {
-  color: #516aec;
-}
-
-/* Atelier Heath Light Purple */
-.hljs-keyword,
-.javascript .hljs-function {
-  color: #7b59c0;
-}
-
-.hljs {
-  display: block;
-  background: #f7f3f7;
-  color: #695d69;
-  padding: 0.5em;
-}
-
-.coffeescript .javascript,
-.javascript .xml,
-.tex .hljs-formula,
-.xml .javascript,
-.xml .vbscript,
-.xml .css,
-.xml .hljs-cdata {
-  opacity: 0.5;
-}
diff --git a/web/libraries/codesnippet/lib/highlight/styles/atelier-lakeside.dark.css b/web/libraries/codesnippet/lib/highlight/styles/atelier-lakeside.dark.css
deleted file mode 100644
index 8506246db3dbe8d919d565ff70d822f3989ab407..0000000000000000000000000000000000000000
--- a/web/libraries/codesnippet/lib/highlight/styles/atelier-lakeside.dark.css
+++ /dev/null
@@ -1,93 +0,0 @@
-/* Base16 Atelier Lakeside Dark - Theme */
-/* by Bram de Haan (http://atelierbram.github.io/syntax-highlighting/atelier-schemes/lakeside/) */ 
-/* Original Base16 color scheme by Chris Kempson (https://github.com/chriskempson/base16) */
-/* https://github.com/jmblog/color-themes-for-highlightjs */
-
-/* Atelier Lakeside Dark Comment */
-.hljs-comment,
-.hljs-title {
-  color: #7195a8;
-}
-
-/* Atelier Lakeside Dark Red */
-.hljs-variable,
-.hljs-attribute,
-.hljs-tag,
-.hljs-regexp,
-.ruby .hljs-constant,
-.xml .hljs-tag .hljs-title,
-.xml .hljs-pi,
-.xml .hljs-doctype,
-.html .hljs-doctype,
-.css .hljs-id,
-.css .hljs-class,
-.css .hljs-pseudo {
-  color: #d22d72;
-}
-
-/* Atelier Lakeside Dark Orange */
-.hljs-number,
-.hljs-preprocessor,
-.hljs-pragma,
-.hljs-built_in,
-.hljs-literal,
-.hljs-params,
-.hljs-constant {
-  color: #935c25;
-}
-
-/* Atelier Lakeside Dark Yellow */
-.hljs-ruby .hljs-class .hljs-title,
-.css .hljs-rules .hljs-attribute {
-  color: #8a8a0f;
-}
-
-/* Atelier Lakeside Dark Green */
-.hljs-string,
-.hljs-value,
-.hljs-inheritance,
-.hljs-header,
-.ruby .hljs-symbol,
-.xml .hljs-cdata {
-  color: #568c3b;
-}
-
-/* Atelier Lakeside Dark Aqua */
-.css .hljs-hexcolor {
-  color: #2d8f6f;
-}
-
-/* Atelier Lakeside Dark Blue */
-.hljs-function,
-.python .hljs-decorator,
-.python .hljs-title,
-.ruby .hljs-function .hljs-title,
-.ruby .hljs-title .hljs-keyword,
-.perl .hljs-sub,
-.javascript .hljs-title,
-.coffeescript .hljs-title {
-  color: #257fad;
-}
-
-/* Atelier Lakeside Dark Purple */
-.hljs-keyword,
-.javascript .hljs-function {
-  color: #5d5db1;
-}
-
-.hljs {
-  display: block;
-  background: #1f292e;
-  color: #7ea2b4;
-  padding: 0.5em;
-}
-
-.coffeescript .javascript,
-.javascript .xml,
-.tex .hljs-formula,
-.xml .javascript,
-.xml .vbscript,
-.xml .css,
-.xml .hljs-cdata {
-  opacity: 0.5;
-}
diff --git a/web/libraries/codesnippet/lib/highlight/styles/atelier-lakeside.light.css b/web/libraries/codesnippet/lib/highlight/styles/atelier-lakeside.light.css
deleted file mode 100644
index 006ae6d91ed4373e97b5ccf2140d367619726d01..0000000000000000000000000000000000000000
--- a/web/libraries/codesnippet/lib/highlight/styles/atelier-lakeside.light.css
+++ /dev/null
@@ -1,93 +0,0 @@
-/* Base16 Atelier Lakeside Light - Theme */
-/* by Bram de Haan (http://atelierbram.github.io/syntax-highlighting/atelier-schemes/lakeside/) */ 
-/* Original Base16 color scheme by Chris Kempson (https://github.com/chriskempson/base16) */
-/* https://github.com/jmblog/color-themes-for-highlightjs */
-
-/* Atelier Lakeside Light Comment */
-.hljs-comment,
-.hljs-title {
-  color: #5a7b8c;
-}
-
-/* Atelier Lakeside Light Red */
-.hljs-variable,
-.hljs-attribute,
-.hljs-tag,
-.hljs-regexp,
-.ruby .hljs-constant,
-.xml .hljs-tag .hljs-title,
-.xml .hljs-pi,
-.xml .hljs-doctype,
-.html .hljs-doctype,
-.css .hljs-id,
-.css .hljs-class,
-.css .hljs-pseudo {
-  color: #d22d72;
-}
-
-/* Atelier Lakeside Light Orange */
-.hljs-number,
-.hljs-preprocessor,
-.hljs-pragma,
-.hljs-built_in,
-.hljs-literal,
-.hljs-params,
-.hljs-constant {
-  color: #935c25;
-}
-
-/* Atelier Lakeside Light Yellow */
-.hljs-ruby .hljs-class .hljs-title,
-.css .hljs-rules .hljs-attribute {
-  color: #8a8a0f;
-}
-
-/* Atelier Lakeside Light Green */
-.hljs-string,
-.hljs-value,
-.hljs-inheritance,
-.hljs-header,
-.ruby .hljs-symbol,
-.xml .hljs-cdata {
-  color: #568c3b;
-}
-
-/* Atelier Lakeside Light Aqua */
-.css .hljs-hexcolor {
-  color: #2d8f6f;
-}
-
-/* Atelier Lakeside Light Blue */
-.hljs-function,
-.python .hljs-decorator,
-.python .hljs-title,
-.ruby .hljs-function .hljs-title,
-.ruby .hljs-title .hljs-keyword,
-.perl .hljs-sub,
-.javascript .hljs-title,
-.coffeescript .hljs-title {
-  color: #257fad;
-}
-
-/* Atelier Lakeside Light Purple */
-.hljs-keyword,
-.javascript .hljs-function {
-  color: #5d5db1;
-}
-
-.hljs {
-  display: block;
-  background: #ebf8ff;
-  color: #516d7b;
-  padding: 0.5em;
-}
-
-.coffeescript .javascript,
-.javascript .xml,
-.tex .hljs-formula,
-.xml .javascript,
-.xml .vbscript,
-.xml .css,
-.xml .hljs-cdata {
-  opacity: 0.5;
-}
diff --git a/web/libraries/codesnippet/lib/highlight/styles/atelier-seaside.dark.css b/web/libraries/codesnippet/lib/highlight/styles/atelier-seaside.dark.css
deleted file mode 100644
index cbea6ed4caa455c505283acd151d8290f85ea1f3..0000000000000000000000000000000000000000
--- a/web/libraries/codesnippet/lib/highlight/styles/atelier-seaside.dark.css
+++ /dev/null
@@ -1,93 +0,0 @@
-/* Base16 Atelier Seaside Dark - Theme */
-/* by Bram de Haan (http://atelierbram.github.io/syntax-highlighting/atelier-schemes/seaside/) */ 
-/* Original Base16 color scheme by Chris Kempson (https://github.com/chriskempson/base16) */
-/* https://github.com/jmblog/color-themes-for-highlightjs */
-
-/* Atelier Seaside Dark Comment */
-.hljs-comment,
-.hljs-title {
-  color: #809980;
-}
-
-/* Atelier Seaside Dark Red */
-.hljs-variable,
-.hljs-attribute,
-.hljs-tag,
-.hljs-regexp,
-.ruby .hljs-constant,
-.xml .hljs-tag .hljs-title,
-.xml .hljs-pi,
-.xml .hljs-doctype,
-.html .hljs-doctype,
-.css .hljs-id,
-.css .hljs-class,
-.css .hljs-pseudo {
-  color: #e6193c;
-}
-
-/* Atelier Seaside Dark Orange */
-.hljs-number,
-.hljs-preprocessor,
-.hljs-pragma,
-.hljs-built_in,
-.hljs-literal,
-.hljs-params,
-.hljs-constant {
-  color: #87711d;
-}
-
-/* Atelier Seaside Dark Yellow */
-.hljs-ruby .hljs-class .hljs-title,
-.css .hljs-rules .hljs-attribute {
-  color: #c3c322;
-}
-
-/* Atelier Seaside Dark Green */
-.hljs-string,
-.hljs-value,
-.hljs-inheritance,
-.hljs-header,
-.ruby .hljs-symbol,
-.xml .hljs-cdata {
-  color: #29a329;
-}
-
-/* Atelier Seaside Dark Aqua */
-.css .hljs-hexcolor {
-  color: #1999b3;
-}
-
-/* Atelier Seaside Dark Blue */
-.hljs-function,
-.python .hljs-decorator,
-.python .hljs-title,
-.ruby .hljs-function .hljs-title,
-.ruby .hljs-title .hljs-keyword,
-.perl .hljs-sub,
-.javascript .hljs-title,
-.coffeescript .hljs-title {
-  color: #3d62f5;
-}
-
-/* Atelier Seaside Dark Purple */
-.hljs-keyword,
-.javascript .hljs-function {
-  color: #ad2bee;
-}
-
-.hljs {
-  display: block;
-  background: #242924;
-  color: #8ca68c;
-  padding: 0.5em;
-}
-
-.coffeescript .javascript,
-.javascript .xml,
-.tex .hljs-formula,
-.xml .javascript,
-.xml .vbscript,
-.xml .css,
-.xml .hljs-cdata {
-  opacity: 0.5;
-}
diff --git a/web/libraries/codesnippet/lib/highlight/styles/atelier-seaside.light.css b/web/libraries/codesnippet/lib/highlight/styles/atelier-seaside.light.css
deleted file mode 100644
index 159121e7029bce1134836599128463e466c504ab..0000000000000000000000000000000000000000
--- a/web/libraries/codesnippet/lib/highlight/styles/atelier-seaside.light.css
+++ /dev/null
@@ -1,93 +0,0 @@
-/* Base16 Atelier Seaside Light - Theme */
-/* by Bram de Haan (http://atelierbram.github.io/syntax-highlighting/atelier-schemes/seaside/) */ 
-/* Original Base16 color scheme by Chris Kempson (https://github.com/chriskempson/base16) */
-/* https://github.com/jmblog/color-themes-for-highlightjs */
-
-/* Atelier Seaside Light Comment */
-.hljs-comment,
-.hljs-title {
-  color: #687d68;
-}
-
-/* Atelier Seaside Light Red */
-.hljs-variable,
-.hljs-attribute,
-.hljs-tag,
-.hljs-regexp,
-.ruby .hljs-constant,
-.xml .hljs-tag .hljs-title,
-.xml .hljs-pi,
-.xml .hljs-doctype,
-.html .hljs-doctype,
-.css .hljs-id,
-.css .hljs-class,
-.css .hljs-pseudo {
-  color: #e6193c;
-}
-
-/* Atelier Seaside Light Orange */
-.hljs-number,
-.hljs-preprocessor,
-.hljs-pragma,
-.hljs-built_in,
-.hljs-literal,
-.hljs-params,
-.hljs-constant {
-  color: #87711d;
-}
-
-/* Atelier Seaside Light Yellow */
-.hljs-ruby .hljs-class .hljs-title,
-.css .hljs-rules .hljs-attribute {
-  color: #c3c322;
-}
-
-/* Atelier Seaside Light Green */
-.hljs-string,
-.hljs-value,
-.hljs-inheritance,
-.hljs-header,
-.ruby .hljs-symbol,
-.xml .hljs-cdata {
-  color: #29a329;
-}
-
-/* Atelier Seaside Light Aqua */
-.css .hljs-hexcolor {
-  color: #1999b3;
-}
-
-/* Atelier Seaside Light Blue */
-.hljs-function,
-.python .hljs-decorator,
-.python .hljs-title,
-.ruby .hljs-function .hljs-title,
-.ruby .hljs-title .hljs-keyword,
-.perl .hljs-sub,
-.javascript .hljs-title,
-.coffeescript .hljs-title {
-  color: #3d62f5;
-}
-
-/* Atelier Seaside Light Purple */
-.hljs-keyword,
-.javascript .hljs-function {
-  color: #ad2bee;
-}
-
-.hljs {
-  display: block;
-  background: #f0fff0;
-  color: #5e6e5e;
-  padding: 0.5em;
-}
-
-.coffeescript .javascript,
-.javascript .xml,
-.tex .hljs-formula,
-.xml .javascript,
-.xml .vbscript,
-.xml .css,
-.xml .hljs-cdata {
-  opacity: 0.5;
-}
diff --git a/web/libraries/codesnippet/lib/highlight/styles/brown_paper.css b/web/libraries/codesnippet/lib/highlight/styles/brown_paper.css
deleted file mode 100644
index f9541c3a4f17f53b9733cd576cb650e213023a3d..0000000000000000000000000000000000000000
--- a/web/libraries/codesnippet/lib/highlight/styles/brown_paper.css
+++ /dev/null
@@ -1,105 +0,0 @@
-/*
-
-Brown Paper style from goldblog.com.ua (c) Zaripov Yura <yur4ik7@ukr.net>
-
-*/
-
-.hljs {
-  display: block; padding: 0.5em;
-  background:#b7a68e url(./brown_papersq.png);
-}
-
-.hljs-keyword,
-.hljs-literal,
-.hljs-change,
-.hljs-winutils,
-.hljs-flow,
-.lisp .hljs-title,
-.clojure .hljs-built_in,
-.nginx .hljs-title,
-.tex .hljs-special,
-.hljs-request,
-.hljs-status {
-  color:#005599;
-  font-weight:bold;
-}
-
-.hljs,
-.hljs-subst,
-.hljs-tag .hljs-keyword {
-  color: #363C69;
-}
-
-.hljs-string,
-.hljs-title,
-.haskell .hljs-type,
-.hljs-tag .hljs-value,
-.css .hljs-rules .hljs-value,
-.hljs-preprocessor,
-.hljs-pragma,
-.ruby .hljs-symbol,
-.ruby .hljs-symbol .hljs-string,
-.ruby .hljs-class .hljs-parent,
-.hljs-built_in,
-.sql .hljs-aggregate,
-.django .hljs-template_tag,
-.django .hljs-variable,
-.smalltalk .hljs-class,
-.hljs-javadoc,
-.ruby .hljs-string,
-.django .hljs-filter .hljs-argument,
-.smalltalk .hljs-localvars,
-.smalltalk .hljs-array,
-.hljs-attr_selector,
-.hljs-pseudo,
-.hljs-addition,
-.hljs-stream,
-.hljs-envvar,
-.apache .hljs-tag,
-.apache .hljs-cbracket,
-.tex .hljs-number {
-  color: #2C009F;
-}
-
-.hljs-comment,
-.java .hljs-annotation,
-.python .hljs-decorator,
-.hljs-template_comment,
-.hljs-pi,
-.hljs-doctype,
-.hljs-deletion,
-.hljs-shebang,
-.apache .hljs-sqbracket,
-.nginx .hljs-built_in,
-.tex .hljs-formula {
-  color: #802022;
-}
-
-.hljs-keyword,
-.hljs-literal,
-.css .hljs-id,
-.hljs-phpdoc,
-.hljs-title,
-.haskell .hljs-type,
-.vbscript .hljs-built_in,
-.sql .hljs-aggregate,
-.rsl .hljs-built_in,
-.smalltalk .hljs-class,
-.diff .hljs-header,
-.hljs-chunk,
-.hljs-winutils,
-.bash .hljs-variable,
-.apache .hljs-tag,
-.tex .hljs-command {
-  font-weight: bold;
-}
-
-.coffeescript .javascript,
-.javascript .xml,
-.tex .hljs-formula,
-.xml .javascript,
-.xml .vbscript,
-.xml .css,
-.xml .hljs-cdata {
-  opacity: 0.8;
-}
diff --git a/web/libraries/codesnippet/lib/highlight/styles/brown_papersq.png b/web/libraries/codesnippet/lib/highlight/styles/brown_papersq.png
deleted file mode 100644
index 3813903dbf9fa7b1fb5bd11d9534c06667d9056f..0000000000000000000000000000000000000000
--- a/web/libraries/codesnippet/lib/highlight/styles/brown_papersq.png
+++ /dev/null
@@ -1,82 +0,0 @@
-�PNG
-
-���
IHDR������#���Žb���gAMA����7�����tEXtSoftware�Adobe ImageReadyq�e<��F�IDATx��ْ,I�f�fnn�EDf޼�����@!(�G�@(�"=f!�2�H������W��9�#g못dfD�fnnϱ,��gWW���p7S=�r���Q�����Ͼ�~��8ފB�M-��{{—R�k�+��Onw�:=>>�Tx��v����ͼ��]��R���A�����SmmB��s������u���5���S;��x���S��u{�}?4�������w�����JU�ۮ��j�&!��4�2�T��jW%����>�P�F+�_��^ɺ�H������b�X�t;`��x]&�|~�}YxJӘ�m>����5-vCp~�Sb���pD{��v�m���R�����vϟO�gs��,c�Lo������.����ۺ�>>\��1�
-~������]�ݜ����($|�w���<O������i�˰��i���Pr��RUI�mj�n]�$�8^�CY�N�6���u�EQu�����Z�Oߜ��Fk��z�E|81%S��񮕄=a�%��aN���0<��O�d��z����ژJJ;m���Ԇ������`7�����s��ڡ��U�T�6|��/D�x$0����uUVMpX�
-���ه��>����#e�,p�W��~��c��珿�2�}ǂ�8,�:�����������������O�E�L�'I%�i�7W5
-P+T٘�;��kv�ۺ�-D��YbǪt>j��EΗs�v���,��5�����*��̣֍Hi����n��rv���M����5�^k-�
-"	�
-�S*�;�6@������f7)�uZQ�V[�F�b��hB��>"\Y��G�c�u�RT����m�)j]�����y>
bc^��(e)������}3S�ػ�%P���ٮ�$����
F�`a,AT{�T)��i�U�WY;�1�J���v������q�c!�y-U75�SD\�X�jZ���`�v��N��I"#Ą��$
-�N�naD,2����\bW*"��vߢ��fs���E�
-��F����V��|o����X���}U�˶���*8�����km��3E
-�,�0�0JUG�e�+�1��W�t]w���g&*��m��2��O6��R���1�� K��Ҳ��Vp"��w��%��ܧ�e��/��A��F��S����b�E�HؚG�q�ʕRX́�����?������ſ���	����i���e�u�"ж-n���Ńϵ}E�x��  �1BD�σi@?J��ҁ�
-��%
-^�g�i�D�$��(�u�
-ʥˢ\��{����ߗ�1~}��v���)E0p��݂�oD0��Rp�Ғ����6��
�>F<�N5'�ID�}\�w�SV�:�3�-�
�/
]�`�>D\��*�
�O�N׍_�1���.�2����
->��w�"�S�T��o����a��D0_L�.)����ݐP��-��M��/�3R�ҵ ���x�
�
i+!i�� �p8���,�L"U��aR�7��鄌4͓bJR����4��B;���n�x?�Z^`��pJX�ǭ���ok
�2���;�Ey��HX�V��D(p7xt�F�,�pn��"�u�[7��=y8�^j�Yo���þ�i�b���6C�D�O��y�\�T��u]��\��
-x���U�Z"���R’	�G�?����������[��?����춚����������z}��iY��@q�5�sp������	��6k����|�n&�EΎ��He�hS;\$��Դ�*��6�����_�B�U5"�V�;�	<!�D�v��S��[�ɹ�T�;ыQذhc������;y��#���}pO|�4�����&�Wk���y��X��{[���
-F(J�1(���7�*�D��I��	A�5�v����!¢zQ���h+A���ǖ��BX�0�}��^�s����kz<t�RVU�7B���T5�؜�)�oZ՟>��h|z|X���E��;F��/��Zlv��"�,��a�`������3�ݘPƏu]=>>"�!M��v��y�9�����)R`d��T
-�߽�
-��u�ݶ0
�ǿ����<�j��@�瀦nW�f�ԛ[a�δ���f`����� ��,.�a�q�Mxv������˾��i:Õ#7ܗ�6m�
�z�oo�����|���TX�������?������ſ�Ϳ�=���ia�~��i��i����_�|��)�aY�x�]_7x6�H;m�IY��v�M��-p����nan��:�Z�.g�������陼6��<.��@�������~�cK 7�I��P���p���`t<���A��t��ŏ?~��e<�0�TW��{���5�T������.����
-/P�(��놼ٓ��u}:��R���c�(��f>Y��3���vC@�qvs,��@-�3 ��m��`@v/l�LJ�A�@�-���cp�<-!x0�����ۍ+S`ɒ�t�b�(�z��������k-����D�k��[Y�	7�M�-x��ƀ���!�QZ���z'v�Eߦ����f�&�6
4�^���xh�ỏx�Sc'��p̜��j<K�}DA2�.pЅ=�e�|�D���o�yA⸜Oo׷�/��
-v܋Ύ�6���
-U!f9V+@�H%����=���DY\.��D���������?�����_���Ae������|>_��$�F��u�_YcdT�*����}`*�8a'1�UJ4�����a<�HBt���Ժ)�v�v-A㺎�w���`-����!��Jӈ�~���ϟ��ŶqO\���6��i�w��KQ��um�ymXFKT�,�%)�`�.Aة�e!@Xh���S��Y-(YϢRUc���9b����p�H,��6l���۶za�ml�@L�jV�5p�T�Z}���Hٴw��ߣ8ƒ�}�D�$~�
�N���W
-�	�F��t���{?>�7�����kU��V�;�"Q�>�k5⩁A&��y~~F�!��|d-l��MXJ�l��
�i�?_N����3
>���{�w�4\v��6��ˎ`N2d�����8�/'v���9d��x��pz,���BI�^�m�T��@��y�s���4Z�n�x\��I8���������+�F��֛���S��4m[�5����>�3�|:���?����������1���~�m{��8��7z��F<D����?<=�	�� PɪY���Ɍ�B�ܮ�aME�$þ��H��%�[Y9%�轮��ұ�	�g-p~]W�:�u
�gw�W�*�.m>8�ns��s+>���O2ʺm�jS�PmO��*	����Kv�T��!r\o�a�	����LT�X����M�XCa{|mxH�%��2������(/3��}�n8\�`!{I:aD����"n������u���f�E���7�Q���c��٧�벀��߼�^A�
v���W`f���2���SiZq���b�ӑT��U��Q��m��/��
�dW�(�5�Kv�����g#����,�R�́ʟ}��0�>}�b�ȹ��pO%�v�Ư/�ۦ}����
-nV�Exn<
-d�6H�(��G�†��F�T`��Mq�C��5MKʊ������C)�0����PBt!���EuY�r鵪����t�}����?�����������_���@����vx�r���1ĝU��P��@K��(g�����[�^�%�喅.�v�I����/�����WK�"E��`x�4�1�t$�ֶ��%>&UT�6�"I��j6�(�S��hm�0cA"�b!Ȓ�_�]��t�M��)��n++M|����}�i;�(\��,���D�(�E�eDr
-ؚ�Ժ��u�p��g��ׯ/48��^����.�#��_߾ ���d��3K�������6�'��ԁm+$ʦ����Eb��js��X���(/�����9H)�e�dJ��n����
-s7Fզ��n���b��4N�	�2���%b�����N���^��m�6E�tQ��m
"�F�`�5�_��ܷ
	���gl̀:�-B�d��
r�gpV�
!#Syj���\� �+ղ4pK4��dF�����+�A�
��t�t��OÙ�7t�HÀP������"�jivkE��C*��������?������ſ�ͯ����ܮo�[:\�
�{Q�15[���XkCdz4^�a�;8�'�_,�<�,�R��� ��&k�R��
-�
���6��YJ���KvR�-���:5q�a�	Pm{��������t:�t
--����*�|�������m��N�ƺb��6�c������ bm��G��@��nVӍ��OI"�N����̪n]�Ng��Zw��/�K��/�/�
�M�8`�`8��-��;�T�1���}�7�C?Q\�%U��M��R������y]B.$�D>
�M��1 ���y���$������o�����ʪ&�U�*�ݏӤxAT�i
-;-�.��]�]?�TF�!
�����
����dΎq+v ��|�g�e���u�Ls9p��ʹ��v6w:�c�V�vi��{1j��)�)�j���X�����D�K0*��4@�(��T��gD�d��[6�IJ޳E����"�tup;�&잝����?����������������j��:�
->�+�×/���/1mM�@ܰ���X5 ^dip�ߓ*����>�7�R7��Nu{��y�W*.��b���n�
+�e�Y9��DYU���<Jo���~������d� �D�x���	L������@�3(��*�	�w���|�1f��]K������&����v��7��L���J,�6\@�]
Pn�7R���6��Y�u>?��}��y�(���w�N�Ē(A�K����b>)3,�oB@����t�w-~C�V�5§6��J���2��
�s-d%�o+�M�e�&���� r��<0�xJ���c3�n#K}�Mv^����_���-���׫�S�2�¦��n��˺�!}���VhW����� �����;�l�M�&���
p�`�X
-�#_]���|T�3v��&J9�T��@��F�ȳ7e�@H�����5v{)T��$��H��Xi�]ߴۺ1��:D7M�|7�"��~��$fQpd@U+fcw�{�@́�����?������ſ���pVVD���Q���Ç�dTA���vh�΋i�S��&��:�eYA<D�;���/�C���,7�`��\�2�֏b���=Ć2ك�x�|	j��0"%��~}��e����3L#�+��e��Uú��x���6�/x���e	�4b�iq��v�3~���0O7ɳ�*�1�u]�QX�b��^x���=�f�@ 9�ɺ���+��R�1	c;X]�`G�L�%8����6~��窞�^w�����S���,�q����9S`��n9��J��yC�S_�%��V��Ԁ(��m��T��؁�+�E�R��3`��]����f�x���
-��w�qC�bQWJ��:3����������$��#������4�g@+e	Ǚ��H5!츺m4X��K���Ⲉ� VCd?5r"|c�6-;-ʂ^��-��s�Y��O�2*��*�.�
-�!2�E<������`�ۜu�/(��ڼ�|mL�u�1���E���&|ց�����?�����7ſ�ͯ��aj�bz�֔�lz���zUJ��O�]����o��%j1�o�ۄ�f��h���@.5�`}[VɁ-��#�}r�ɨi	��,ý_�X���~�
�?<���:�i��c��i�g�m�iv�r�mP����!������]�Fy�@.HnA�qO��U�j�O�92����Ϳ;+�"	MU�����������-���'.�r�_V��x|ͽ#��Ӏn�e��~}����������8[��N��狁�\���U���q��|�M��y�6��m+˶b�����)��?E��OFj�%������XVہ�"���\�%�SS!�H�v
St�s��p,���X/;��8X�M��N�?U�vf�	��D�@Va�l`���&I�O�9�D�A��4�^�$X��aca�T�-c�<�`�/�mvN_�,y�7�)׺,@yZ��F3�Æ�֖�����������?����������-����?_�	t���#͢y���v��Z8I��z���|��q�q��D�J]S=Ϧا����t)�7���c��r3�4?I�bW��&�g(�4�����4O����Xŕ�\�B~����p��t.qn��� I0��D�����-H�.�%���GU*��ք�y@:$��	�q
-SP�h���V�=���"�t�G�NIE��/p��k���x.#��v���p�/%��󇏫-�^T
-iap�X�a�U���t��g��:�҂Z�W�A�����2�q�m%��i�n�+[DJ����,��-z
x��'�E��u^��G�H�(-��
-�e���dϯW��
-`��ܖ�-�1x�:�=��_E���G�48,x���a��A�M#=�Ҁ7��Ҵ�Q�����Ya�uՈ��T�`Ps�0��
$��"$yĦhO���H����B>���{j�"�M�#S�X��6����p>�Z�B��Ư/_�g8����������������˟������z���W����F�}k����
���;0�ݭ5u'��<m>uM]I�`��<UqV�[%`�Lt�s�ϣV�,�#�b��ry%;h=O+�v1��E˲n�����4���S���=
%y'���!Fy��u��d>��݁��c5�y�h
G� :XU�P�@y�R�6��\��iO�n���``K�,�h�3�����>�⺽]oIć�Ǫ�)���7��{�6��J"�q/Cp��
-��׬�2a�e�K��T����JU���+ު=��>.�g�A���ެ�*s�@�90l����rw��F�$��Nv�ぜC�寐�t�l��x-Co�u�c�C�s�E�a=�^����ϱG������;�.O��j; S��z�x�U����Z��ev`̵H8<���/�^���.�\/��Vǃ�V`�`�nK6��}�������LB��_����~�"�D�����������+L<�#>X=<\��?����������-����?�6������GQ��YbK��
����Z?=>+�4gL�#)�֦�;���
9N�E�a0F��@�8h���e��jvI�a^�@��?�,�}߳ex]cV�S�2�E�!�����~����<D`E��"KY�>"@�<U�6:�1񷠱xv)������l��A93IP��"2�9쮈�JA�h�L�GQB2D-5g�I���^�2����͏��ވd���߁^.���׿aٽ݅�*�W���X��o~��w�tO?����<̺��/6��������j�u��0R����%)�������yPc�kҾ��J�
�a�.��k��@�=�^yHV�g�F���p����,���
4�1����B�<�^�
�U*���#���y�]����X��Y0�	����wY۵X8J��9��F�lq�e��;���e�Z�x��'K�Jlo����8��=?I��\�`�u�TX��!9���L�{���V����9;������X!w�<�)���?�����������gT�pC�}�+�V�lr]�̱i���_>��
���O�Y���j�qr�yo5�3�u�X��rr����!	Ӧ�1T
��d��UM�m���15���-���ZKJ�
`���C��R	�cs�%
-{#"�#bQ(��jYF�7bAO�J�!<o��<�O発=��de���;���4�l�%\	؟U_x�J�x�������?��mo�__��"+�ԙq6u�7�}���TIJ�ˇg�?��M=t��Ok��6�JZ7//_��)9�#�~8�T��қ`W�d��nZ��mUF�.�-�j��4�E\l�Dʲr���ܲ�$el�������L�����v��Ƿ�?�H����u��}{x|��~���*Y��_9�8�}Z���:� ��3��eCG�Ql#$�$��d1KCq!]�\D��'–������.�3rt�~W�7����qQ*���p�0��G�$+�XW��Å�N�rn�f��
���?�����������~�O�y�
-O���<�,n�X׏��@���^��B�l)��Ղ
�"\.O]w�!���v5��<-�:-��M�����|>�J��]_,X�#��;�ʍ�1���.���m�2,8�6��ٰ<����|�n����q����Uy�~Ymʓ`J�����<��S7P�SU��s���;R]��\Շ�'p5�*���!����P��^���Y��>�Ct������i<{ث���Χ˿�˿�t�����a��˕m�J�]�p1�8��[��R�
-���~��*ؚ��t���#/��<]7���Y`5��a;0;8�J �������F
W�.�p
p�ѬۣpM[�J��R�^W)S�B��M��v}ja-�XV��9�a�Ȭ~��H��Z5:�P�Ȕ��C�IE�M
(F;�T����;��c��.��SǑ��
-Su
f��pܰ�+�~�����|�)�AI���E�7KY���R.	?�s��?�������������������XnwY�~�kU��+��������%�3�U74*K�/�ԛ,��.bp+%ӛFÅ�aUZV:���Q���(��-�XXe��U�n������}/	��0�u�݁}p겼7p���o��T`��8�
-+iA��;\fV�O�hA�NӪ<�����ϒ;�b���h���)~��,�x-pQ�����S*�>�󏟍2���p\W�m�������.�
@����?��zX��y.S�uM��&W�s<疑S����g��|[���=n���'"d��=�;K����C��#	���%�Q�R�[q�0"w�Z!��}k�:�U-g��#���e�0�F���5���U\5{�	9R<��~�@
�"�ahM�[��C�@����h�,}�8������K�~J�G�%w%��r
-�ܶe����t�7�2oG�V�߆�t-�px!�ә�U��7σKǪ�P����+���?����������)������M�����������?�G�釧�u�mgp���۴s�MU�|�Á���,��c�&��9J�
-�N�Oꝲ �@ED�Bg�>u�l+�DR�b=V���úyP��9�[�������X�m��K�5	6�nkHACvU����?��OmN�&Y��#���H�Q��z����ދ&���N,�Ip�����u*▛��e���7��m�n�eUm*S?>?��[�m?�����
-�?]Nޭ����~�=���Ã�+v7;7¢�e�|�g)�E ���Ip�D�n+���V��u����zX�Ф���N�K��B�������� ����D:� �iG���0��ؚI��k]Â�����w?$��B��SWU��yaGKE1א)�_��e�3�
-f&v��ޠ�*����{5�c�l{��܅���Mֆ����t�5Qo*r���iy#��`,y�vax�������oNX��w�C�r z����������?��m�/��~w�@<�;�U�����*��΂j�H�#\�צV���]_�^�|]++JY�EΣ�� �M�?ٶM�K���
-��H��L��L����{�Ø�T�g:l����3V%�FԶ-���K>�P��=1ϕ=�ګ���j���]gDg�29+�&ֈ�b�|pӡ�B�Oy�k�Xn���x6mS�����߃�=����?�z�I���x�9�J�����`�o��&�_���0������'h���������ϟ?��O�ʮ��a��gb�ݖ2�O:�sV�o�e�=��-n�QUZ�0 bD����~��d%�)�c�>f�V!sd�O~a�y�p�oA7�1Y�4պ�x��d�w�)�}�N��YUK��J�{-"����B$P�������e��N=+�!�d`�t�`]�·�_�o�����(@��S<���F)U�o@��I��U�*,O��%�kX�ű`T;�+��sno	Ҍ�	����<�������[���?����������)��_�����aYYU��?���_�5V�nSȭ��Y��8��I���G%ɗ�8���ƙ�`92�����5R��TǺm��楖�\5��4 ��V5�)T�P�̘��17e���G9�J���Z ��=���s�CŃ�S��)J}?���[�Z��!TL=�k�i�XQUdi�mLM�J
���%������������ࡗ�/Gsi��}�J6.4�6����r���u~~���߯�e�|�qÚM}�O�z�jeXd���d-�yy��dA��2,��ݢ��|F��mYΟ�`�Fc(�~�6
���mۭvAʯ
-\���9�y8V��Mxj�����;���\��#�W�(#|��w�R�'��A�8���<<4���ϧ�tN�3���*.�"�j��%
-��X��|>���W^���8QV���ǐ&����0�3�أ/x�W��"��<��υ�@H�^u��*�r�\
�4�f����a��`Ǻ10c��)�(j��5n��8������������������~����ݻmw:��SU���N]Wk����u!��.��h��.ݹzz2]��~<U^�1
��Z�����m�|$Ҡ�Ӈ�(���io�+	�Ķ�y^�ְw��q�v���}�+��4�DV�a�;��6'BKޮ�y]`P<Tf�}���v'�Y�������xaS�����.s��v��j��
-��P4����ek��i�2d�PK��.�*�5Oe1K�8�b�+�^ߦ��;��_��m������6"<~���!3����C"@m!l���!��	\�2����r�@�Éb>��!�.�[�˲�vN�
����*k`C
-�A$�dm��Q�X��d��n��n���4�r!{�A�R�[�^���b�k7t�M����h�1�
-l�w�����=���A�]���+�),]ו��9��iY�M�,J�\��S|� ���Z�%��O0S�Kv����f{;�H0�=�h��;��"�	��8�~ >M}}{��q!{��[�����?�������o����+��
-�8�t�����V2����v�3S���9pIUu�!KA�W�#�$��jY���i4B�n���cJ�Z�'Ԧ��m��,IM��H`KZkܺiZA9w�X)/<�PF��<k~+=|ϣ**�͂�P�3z���Tp��PQ����2��2	Xl�e�0X�u
-v�*Yl�<��.?�v�e�n��,)�i$x�|9�R�
�ц��LB�+�_�,3���]�O�p���b�`�"�?~����SG�����h: ̇
�g������R�(P�<Z���\�䙌�l�;|+yP�5pd�b�����

�M�c��s���<�����d�Hgl��-�J59:�]�)΅�/p����߮�Y�^�+� �4�9/��R9��6�Wq�>�y��x+rKO:P�����&P;�"9���<d��j�
-�_�mϑi1�1`���o��{���T��tu�#��8~%�[X�����4]�o/_�`ecρ�����?������Ŀ����]0��yкY7M7<����v��L��@Y���7Ժ�+	dL V��ִnC���
(g�*�Cи��R)�dWIP��o�����[�ԗ�P#��r�h<hYF;O0�:U(l����b[����4�ʹ��'K9���KA}����w�I-��G�����y"D���	�J�w�6���延��P꺬bV0���m�"�����T��ƴR�І�
;C`���[�*N��\Uy�n��	�_cX�m�
C�k~��e�OΧ~]Wf*��i��.��\Rb���aYPCj=Q��SR��$l+W|J�l��]�]P�|��8�@�4ROSk�+��u�s
�b�� x�-�|x�6�g�)�F��X*�MW���������y���\����H�m�"#05�6�םGE��,��yW�
͜���{��S�Rok�Z<w�l�r8Η����xb�^���݃h�o7l��{�3R�]�r�y�����g?��px8����������?�����3;��a�ݨSXБ�M��r>U�E����^*���0�E�����7�t\n��d]��)R�����gX.�5���1
-�s ��ƒ���=U���=�$�[ȟ$�ieJڀ�r�i���E��1J�Y�OO"$��R�\j���}�`�Iƴ#��e�}>�`6����X�KAN�����=��lky$$~*C*��o|XNd
v�Q��[]�#�R�ȁz#����>�~�\�"?}�Ggr��ۺVp��z��svC��[��EdyY�1
-���]Ӱ�[UY��H�jˬrI%���+2�׳xwf}U��y����%M]3�P'U��p=�ԙ<kj^�YԈZE}��6�}���?��Y���,�
=V��Q�
Xo��)Ć���bA��K��c��&���Ԑ�B�
-��B<��I��0���Z%����V��j8�]����~��Z@R�+ac�uv2W|�Rp��˲ʃ�����?�������o�����윞��I1�H�u���}����_>{���yZ���YiN@�xܣJ�2�NIe�S����u�����`I�,L�jNh�A��
�GE�8�Bv�	���X�$E��B�a����S:d(�����<�����m�eQ��B�ڊ���>�	��,������ͺ�]6��|�w�7�T��r~`(J�!t�ë����:a�;�Ѳe���'��l+�&Z��Œ��L��E�N^��8���m�ق[m�ZnN1wM_.=�<x�!v9_H�����L��X��d�`ʗ
-���F�1��B*�~�5	N�,��l7)$����n���<�=�v�
�+>��ZU�tj�#7aTY�����`�Φ������\Y��\F��%GQ!��u����s�/b�o��^tm��/���8�{otV�Rl�($����@�n��3����W�ik�6Ȓ��u�	2�f�y���t�8.z�
-��b���N ����?�����������������}��v��X"u�O��X��?���j����sD(�\P:����Ӣ!���8%@&����u�<�$@,�f|M�{�m��d��Sit"��%�U�$jm�JY`Ԯ���G���g��R���u8��*��H�M߲��eO#c~���GKn1�i��\�O��E���v������jٮ��^ؒ����
����_?�N'ӀCw�=��t�����Ya��-k�8��H��9���p�ixk�0}�����П.���u��<M�S€\�f�@D�e6yR%"�czW���*.���*�n�>M�[��7�������p�����������P3v�`F6�=�ۖa�����8����������"7]oW�k]f<��y�UQd���W�aQP�,	���'%��q�|;"��w`�"�-h��(\�HHuA���Ѩx�d��*��;�p�~�ba<��b���O�8�f��S����p�-Gي����?�������o��?�揱�i�@Zp����p�Sp#�@j��(�Ik]�(����1U����us�m�W��%džR�\'8O����<
-��H#E8 ��vbX�C����\|W�!}"O�����Sk��l;
-׿��dU08�Nj���Џ�q;���'��\��Z�;��>J��M+G@uu���tz�[�q]M�]�dʚ���~���u��쥸Lk�e�7��;��m�8��,�TP�S��7yNj�6����W�Q�p6SK~y�\|��J�r9&�f�Evu�@a'Q������{�cYgv�krn0�����������v,����fy�w`�H<�VΓ��I	�gqdOt ��&+%rv��R��tB$c��u6Y�S0�(���8�H-�Op�1K��&q������+�'�~_�\>xG@��6���gL����,�,J�P���iWDVd�U_�s��t� ���
S�u�3yՂ��T�
���?�����������O����	웥j��j�$"�;,	��V�t�<��x�K(��J,Έ�Cd�W���1��ήy���f{��Y�D	OS�y��+��vD,�
-P7 �'Np@*@�
-��a_lYӰ�6�w��j]l^��l>[�����Y:r~x��Ij�������*A����T�t�5m�a^��Hv��ב�*�t;MR��̲7��-��pM�
-0�\.1��`@[�9�,�w}UW]Bـl�MM��R�'1I�mZX�}{C�>?D� �L#5�*Y"�`X�u�u�$�-���0i�f�I�j�2�J.8=�-���J�[~��yYl�hc�[�4޾�|��A��[��
-��,�*s��aR�A$)��e�ۮ��@+�a/��(�;��$k�$�4F�H ��@�s�8V
�<���[�����0��(�۶��S���ɫ�$���HG+R��8���"+��3��!��T
-X��|j�4�=�:�.�������?�������o�������@ͺ��j1��,��P���=�]��p���~æA/�)�"$�o�[�g���mߍn�VО෾��;���h\RRZ���ϥ\�m�PXPV
-���wy��#��:NPҔ�a�D��Lh�Z�l��3�B���X��bTK���N�#	kql��ݮ����αJe�ߧ�:��Q�?����A���؉�k��tҴL<YQ%>��Sk`���mA���f�ݐ9��|6"���I`�?��/��i��NϪ�z�827���)88q6lə��mӴ�H��R�<�ѦE�����n�iY� v�L�̳�97��<-lF�&E��lږ��۞�k�)�9<W���Y�[��[��fT���A�b^V����
g�f��J��xd�;�!jN��{?Mw�]��^���A��˳(�KS�V�HzI����w���6ea,���r����3���%�e̔��iߩdU
-�"�L�__>�?����������[��?�o�K�I�O��i�lF%�mSU��"p��ffP��z,l�+��
-WdvXK����sJ�j�|: @��P��m��)���M%��P(d%R��T�ɵasߵA�Z�ԓTXhSGq�w�)9(���q*���H��h�w��]k�5"<��c9����AR��s�V����:��_���܁y���}��~�Cq>��}�u�Lm���R�����M)��v���������:x��J�e�X��H�(4�GDP�v%�M^E2�] ���j#�&D�����Mp�L�S���yu���� W
-K���|��U_ˆ�s+��+��Hٔ�4���e��%��rDY�����붎��c��o��n�*�H
�Ɠ9����Y�8��w((����%�;9��ۇ˃���.,����g�6
-Ӳ�]��{��;BQCt�MK3�_a����nS�q��9�D>[ׅS�����,kӶ���N�Y������?�������o��?���O�iY�/)�H�X��:;�ZH2u�>��)W@��|�K�7�׺u���e�e���o�r��
[�KYq
-��SA���)vKH�_YV�x�|�$�q3����}��[2��Z�E�S'04���FaM�����]3HHFK��Ԓ�`�]�'�qۢ`�R����MH	��1<}x|�\��XIj�(Y��a;����㢢l�%L=�#��j�<
-}�<��(���m�p�Nv�"z����;G�zV�5�H�J�P������zN���*���˧=lb��{�����<��L�9V��]�\�d����Y�dlt�w�`O@UHo/o�v�|``=g�s�˧���
-1W 
-�0N�
- �X�]������X�W�f?|���M�,	��2Z�c�lj�ɝ���|�i��mMS[�Y�e:v�늳	|(�Jg$�R�� � �����+|��
-�*E�5�͕�~E7��1_� &�pD�B>F��¨]��ۦ?������������������ἮSF*P���7Ms��c.�as(���R���>WV��8��5�O�ϽͲ�v^�g��pT��'ϧ���v+XS�rK�O]Rf�Qʿ���l;�C�o2���3ەT��h��n��D(��m�p�yO6�9s��|:�|d"%y6���y����[���4��2]ŗO��uyp��?,�_�uX2\�[�� ���ɽ�Y\,E|��sH
-�,��3����������S��]����}4�{K�1bg�ߋ��]߱�C��:�z)����\��N�),�p&X�^owIU%=//Y^G�3�,xߗ��8l�d���Vk��A�.#��Ƙ�2v�/���v��������T+�H�t4��%���}BZ���4|ٰm[��R����,5�a_^>;�=<<"�������yj[�cs�߀#4������O�]���J���*�r��@�۾`Fl��������SJp]�v��4I=Z�!���Tu����������?��m�/����Wl����	�uMa����_��N��ǦU��}������i4�^�p@��n/��zY��lS7੉��`b\0�3>΀Q����0,�浊���/K��WR�F��;��Q٥��aA�:�d���Zf�&�wM�Ӷ��g�P͎ÓX��gp���wf�<�n���u)7\�Q��ﱰ�a��ZWy*%��2p$,��.p�~�\7�ͱ�
�i��4MYI�t�`v1�gP&��k{I6����U?~<�N���ח:�����(��
-x .GƖ<h�H�����(d����M-�m:�$xė:��ws�=���L��U�wF�"ˌ�-�o{�т���]Ql�����~��6��f�X�����[���"�/g`��S�*�y����������p�i�D�-�R`i�h~
��l�Ra��i��Ra����u�����T�f��
7��f�5�&��T^��� aww����������?��m�/��_��]�i�ņ�\oleu���S;����:�k�3�;H	g����o��:�OOE��g�M��$��,�LWj都�ב
��~�i�,�cYZTq,,;9�Ҵ-���s?����.캲s��N�?h�RV�dj8V+36Q�p�C����We]����A�vv;{j0㈰,�y��=?��r�,�����}p��`U�' ��E�Ǻ.
$�`�����d�:;��>r,r�V�~�\��7l�dѕ�����ƎR�U@a�y²�H
/��L�������ݛVc%ާ,c�K��ĺ�����DӜv�tD��:}Cw9?~���r�6,po7I��z�����H��oT)��a�=��Aǀ-����cC���+[m���/������������?��
��LY�HW�q�/�Y�VhX��Wp��
-7��#K�ʉuct%S+��Lw>]*N)[y�cdLV��E��Df�j0��v��|$��C����'�����?��������������*�gu�������IEND�B`�
\ No newline at end of file
diff --git a/web/libraries/codesnippet/lib/highlight/styles/dark.css b/web/libraries/codesnippet/lib/highlight/styles/dark.css
deleted file mode 100644
index e479d0a6bcc4c2b444d7bedb1f82e2b44a2e1ec9..0000000000000000000000000000000000000000
--- a/web/libraries/codesnippet/lib/highlight/styles/dark.css
+++ /dev/null
@@ -1,105 +0,0 @@
-/*
-
-Dark style from softwaremaniacs.org (c) Ivan Sagalaev <Maniac@SoftwareManiacs.Org>
-
-*/
-
-.hljs {
-  display: block; padding: 0.5em;
-  background: #444;
-}
-
-.hljs-keyword,
-.hljs-literal,
-.hljs-change,
-.hljs-winutils,
-.hljs-flow,
-.lisp .hljs-title,
-.clojure .hljs-built_in,
-.nginx .hljs-title,
-.tex .hljs-special {
-  color: white;
-}
-
-.hljs,
-.hljs-subst {
-  color: #DDD;
-}
-
-.hljs-string,
-.hljs-title,
-.haskell .hljs-type,
-.ini .hljs-title,
-.hljs-tag .hljs-value,
-.css .hljs-rules .hljs-value,
-.hljs-preprocessor,
-.hljs-pragma,
-.ruby .hljs-symbol,
-.ruby .hljs-symbol .hljs-string,
-.ruby .hljs-class .hljs-parent,
-.hljs-built_in,
-.sql .hljs-aggregate,
-.django .hljs-template_tag,
-.django .hljs-variable,
-.smalltalk .hljs-class,
-.hljs-javadoc,
-.ruby .hljs-string,
-.django .hljs-filter .hljs-argument,
-.smalltalk .hljs-localvars,
-.smalltalk .hljs-array,
-.hljs-attr_selector,
-.hljs-pseudo,
-.hljs-addition,
-.hljs-stream,
-.hljs-envvar,
-.apache .hljs-tag,
-.apache .hljs-cbracket,
-.tex .hljs-command,
-.hljs-prompt,
-.coffeescript .hljs-attribute {
-  color: #D88;
-}
-
-.hljs-comment,
-.java .hljs-annotation,
-.python .hljs-decorator,
-.hljs-template_comment,
-.hljs-pi,
-.hljs-doctype,
-.hljs-deletion,
-.hljs-shebang,
-.apache .hljs-sqbracket,
-.tex .hljs-formula {
-  color: #777;
-}
-
-.hljs-keyword,
-.hljs-literal,
-.hljs-title,
-.css .hljs-id,
-.hljs-phpdoc,
-.haskell .hljs-type,
-.vbscript .hljs-built_in,
-.sql .hljs-aggregate,
-.rsl .hljs-built_in,
-.smalltalk .hljs-class,
-.diff .hljs-header,
-.hljs-chunk,
-.hljs-winutils,
-.bash .hljs-variable,
-.apache .hljs-tag,
-.tex .hljs-special,
-.hljs-request,
-.hljs-status {
-  font-weight: bold;
-}
-
-.coffeescript .javascript,
-.javascript .xml,
-.tex .hljs-formula,
-.xml .javascript,
-.xml .vbscript,
-.xml .css,
-.xml .hljs-cdata {
-  opacity: 0.5;
-}
diff --git a/web/libraries/codesnippet/lib/highlight/styles/default.css b/web/libraries/codesnippet/lib/highlight/styles/default.css
deleted file mode 100644
index 3d8485b48c594120d6ad706c1962a99a1e527349..0000000000000000000000000000000000000000
--- a/web/libraries/codesnippet/lib/highlight/styles/default.css
+++ /dev/null
@@ -1,153 +0,0 @@
-/*
-
-Original style from softwaremaniacs.org (c) Ivan Sagalaev <Maniac@SoftwareManiacs.Org>
-
-*/
-
-.hljs {
-  display: block; padding: 0.5em;
-  background: #F0F0F0;
-}
-
-.hljs,
-.hljs-subst,
-.hljs-tag .hljs-title,
-.lisp .hljs-title,
-.clojure .hljs-built_in,
-.nginx .hljs-title {
-  color: black;
-}
-
-.hljs-string,
-.hljs-title,
-.hljs-constant,
-.hljs-parent,
-.hljs-tag .hljs-value,
-.hljs-rules .hljs-value,
-.hljs-rules .hljs-value .hljs-number,
-.hljs-preprocessor,
-.hljs-pragma,
-.haml .hljs-symbol,
-.ruby .hljs-symbol,
-.ruby .hljs-symbol .hljs-string,
-.hljs-aggregate,
-.hljs-template_tag,
-.django .hljs-variable,
-.smalltalk .hljs-class,
-.hljs-addition,
-.hljs-flow,
-.hljs-stream,
-.bash .hljs-variable,
-.apache .hljs-tag,
-.apache .hljs-cbracket,
-.tex .hljs-command,
-.tex .hljs-special,
-.erlang_repl .hljs-function_or_atom,
-.asciidoc .hljs-header,
-.markdown .hljs-header,
-.coffeescript .hljs-attribute {
-  color: #800;
-}
-
-.smartquote,
-.hljs-comment,
-.hljs-annotation,
-.hljs-template_comment,
-.diff .hljs-header,
-.hljs-chunk,
-.asciidoc .hljs-blockquote,
-.markdown .hljs-blockquote {
-  color: #888;
-}
-
-.hljs-number,
-.hljs-date,
-.hljs-regexp,
-.hljs-literal,
-.hljs-hexcolor,
-.smalltalk .hljs-symbol,
-.smalltalk .hljs-char,
-.go .hljs-constant,
-.hljs-change,
-.lasso .hljs-variable,
-.makefile .hljs-variable,
-.asciidoc .hljs-bullet,
-.markdown .hljs-bullet,
-.asciidoc .hljs-link_url,
-.markdown .hljs-link_url {
-  color: #080;
-}
-
-.hljs-label,
-.hljs-javadoc,
-.ruby .hljs-string,
-.hljs-decorator,
-.hljs-filter .hljs-argument,
-.hljs-localvars,
-.hljs-array,
-.hljs-attr_selector,
-.hljs-important,
-.hljs-pseudo,
-.hljs-pi,
-.haml .hljs-bullet,
-.hljs-doctype,
-.hljs-deletion,
-.hljs-envvar,
-.hljs-shebang,
-.apache .hljs-sqbracket,
-.nginx .hljs-built_in,
-.tex .hljs-formula,
-.erlang_repl .hljs-reserved,
-.hljs-prompt,
-.asciidoc .hljs-link_label,
-.markdown .hljs-link_label,
-.vhdl .hljs-attribute,
-.clojure .hljs-attribute,
-.asciidoc .hljs-attribute,
-.lasso .hljs-attribute,
-.coffeescript .hljs-property,
-.hljs-phony {
-  color: #88F
-}
-
-.hljs-keyword,
-.hljs-id,
-.hljs-title,
-.hljs-built_in,
-.hljs-aggregate,
-.css .hljs-tag,
-.hljs-javadoctag,
-.hljs-phpdoc,
-.hljs-yardoctag,
-.smalltalk .hljs-class,
-.hljs-winutils,
-.bash .hljs-variable,
-.apache .hljs-tag,
-.go .hljs-typename,
-.tex .hljs-command,
-.asciidoc .hljs-strong,
-.markdown .hljs-strong,
-.hljs-request,
-.hljs-status {
-  font-weight: bold;
-}
-
-.asciidoc .hljs-emphasis,
-.markdown .hljs-emphasis {
-  font-style: italic;
-}
-
-.nginx .hljs-built_in {
-  font-weight: normal;
-}
-
-.coffeescript .javascript,
-.javascript .xml,
-.lasso .markup,
-.tex .hljs-formula,
-.xml .javascript,
-.xml .vbscript,
-.xml .css,
-.xml .hljs-cdata {
-  opacity: 0.5;
-}
diff --git a/web/libraries/codesnippet/lib/highlight/styles/docco.css b/web/libraries/codesnippet/lib/highlight/styles/docco.css
deleted file mode 100644
index 993fd268d13709fd373cffdc12eca1be27b2eda3..0000000000000000000000000000000000000000
--- a/web/libraries/codesnippet/lib/highlight/styles/docco.css
+++ /dev/null
@@ -1,132 +0,0 @@
-/*
-Docco style used in http://jashkenas.github.com/docco/ converted by Simon Madine (@thingsinjars)
-*/
-
-.hljs {
-  display: block; padding: 0.5em;
-  color: #000;
-  background: #f8f8ff
-}
-
-.hljs-comment,
-.hljs-template_comment,
-.diff .hljs-header,
-.hljs-javadoc {
-  color: #408080;
-  font-style: italic
-}
-
-.hljs-keyword,
-.assignment,
-.hljs-literal,
-.css .rule .hljs-keyword,
-.hljs-winutils,
-.javascript .hljs-title,
-.lisp .hljs-title,
-.hljs-subst {
-  color: #954121;
-}
-
-.hljs-number,
-.hljs-hexcolor {
-  color: #40a070
-}
-
-.hljs-string,
-.hljs-tag .hljs-value,
-.hljs-phpdoc,
-.tex .hljs-formula {
-  color: #219161;
-}
-
-.hljs-title,
-.hljs-id {
-  color: #19469D;
-}
-.hljs-params {
-  color: #00F;
-}
-
-.javascript .hljs-title,
-.lisp .hljs-title,
-.hljs-subst {
-  font-weight: normal
-}
-
-.hljs-class .hljs-title,
-.haskell .hljs-label,
-.tex .hljs-command {
-  color: #458;
-  font-weight: bold
-}
-
-.hljs-tag,
-.hljs-tag .hljs-title,
-.hljs-rules .hljs-property,
-.django .hljs-tag .hljs-keyword {
-  color: #000080;
-  font-weight: normal
-}
-
-.hljs-attribute,
-.hljs-variable,
-.instancevar,
-.lisp .hljs-body {
-  color: #008080
-}
-
-.hljs-regexp {
-  color: #B68
-}
-
-.hljs-class {
-  color: #458;
-  font-weight: bold
-}
-
-.hljs-symbol,
-.ruby .hljs-symbol .hljs-string,
-.ruby .hljs-symbol .hljs-keyword,
-.ruby .hljs-symbol .keymethods,
-.lisp .hljs-keyword,
-.tex .hljs-special,
-.input_number {
-  color: #990073
-}
-
-.builtin,
-.constructor,
-.hljs-built_in,
-.lisp .hljs-title {
-  color: #0086b3
-}
-
-.hljs-preprocessor,
-.hljs-pragma,
-.hljs-pi,
-.hljs-doctype,
-.hljs-shebang,
-.hljs-cdata {
-  color: #999;
-  font-weight: bold
-}
-
-.hljs-deletion {
-  background: #fdd
-}
-
-.hljs-addition {
-  background: #dfd
-}
-
-.diff .hljs-change {
-  background: #0086b3
-}
-
-.hljs-chunk {
-  color: #aaa
-}
-
-.tex .hljs-formula {
-  opacity: 0.5;
-}
diff --git a/web/libraries/codesnippet/lib/highlight/styles/far.css b/web/libraries/codesnippet/lib/highlight/styles/far.css
deleted file mode 100644
index ecac3c9a095cae20d8aad50df965b8bdbab6c037..0000000000000000000000000000000000000000
--- a/web/libraries/codesnippet/lib/highlight/styles/far.css
+++ /dev/null
@@ -1,113 +0,0 @@
-/*
-
-FAR Style (c) MajestiC <majestic2k@gmail.com>
-
-*/
-
-.hljs {
-  display: block; padding: 0.5em;
-  background: #000080;
-}
-
-.hljs,
-.hljs-subst {
-  color: #0FF;
-}
-
-.hljs-string,
-.ruby .hljs-string,
-.haskell .hljs-type,
-.hljs-tag .hljs-value,
-.css .hljs-rules .hljs-value,
-.css .hljs-rules .hljs-value .hljs-number,
-.hljs-preprocessor,
-.hljs-pragma,
-.ruby .hljs-symbol,
-.ruby .hljs-symbol .hljs-string,
-.hljs-built_in,
-.sql .hljs-aggregate,
-.django .hljs-template_tag,
-.django .hljs-variable,
-.smalltalk .hljs-class,
-.hljs-addition,
-.apache .hljs-tag,
-.apache .hljs-cbracket,
-.tex .hljs-command,
-.clojure .hljs-title,
-.coffeescript .hljs-attribute {
-  color: #FF0;
-}
-
-.hljs-keyword,
-.css .hljs-id,
-.hljs-title,
-.haskell .hljs-type,
-.vbscript .hljs-built_in,
-.sql .hljs-aggregate,
-.rsl .hljs-built_in,
-.smalltalk .hljs-class,
-.xml .hljs-tag .hljs-title,
-.hljs-winutils,
-.hljs-flow,
-.hljs-change,
-.hljs-envvar,
-.bash .hljs-variable,
-.tex .hljs-special,
-.clojure .hljs-built_in {
-  color: #FFF;
-}
-
-.hljs-comment,
-.hljs-phpdoc,
-.hljs-javadoc,
-.java .hljs-annotation,
-.hljs-template_comment,
-.hljs-deletion,
-.apache .hljs-sqbracket,
-.tex .hljs-formula {
-  color: #888;
-}
-
-.hljs-number,
-.hljs-date,
-.hljs-regexp,
-.hljs-literal,
-.smalltalk .hljs-symbol,
-.smalltalk .hljs-char,
-.clojure .hljs-attribute {
-  color: #0F0;
-}
-
-.python .hljs-decorator,
-.django .hljs-filter .hljs-argument,
-.smalltalk .hljs-localvars,
-.smalltalk .hljs-array,
-.hljs-attr_selector,
-.hljs-pseudo,
-.xml .hljs-pi,
-.diff .hljs-header,
-.hljs-chunk,
-.hljs-shebang,
-.nginx .hljs-built_in,
-.hljs-prompt {
-  color: #008080;
-}
-
-.hljs-keyword,
-.css .hljs-id,
-.hljs-title,
-.haskell .hljs-type,
-.vbscript .hljs-built_in,
-.sql .hljs-aggregate,
-.rsl .hljs-built_in,
-.smalltalk .hljs-class,
-.hljs-winutils,
-.hljs-flow,
-.apache .hljs-tag,
-.nginx .hljs-built_in,
-.tex .hljs-command,
-.tex .hljs-special,
-.hljs-request,
-.hljs-status {
-  font-weight: bold;
-}
diff --git a/web/libraries/codesnippet/lib/highlight/styles/foundation.css b/web/libraries/codesnippet/lib/highlight/styles/foundation.css
deleted file mode 100644
index bc8d4df426a1f710adc9bc4a3a496337f4c49f7a..0000000000000000000000000000000000000000
--- a/web/libraries/codesnippet/lib/highlight/styles/foundation.css
+++ /dev/null
@@ -1,133 +0,0 @@
-/*
-Description: Foundation 4 docs style for highlight.js
-Author: Dan Allen <dan.j.allen@gmail.com>
-Website: http://foundation.zurb.com/docs/
-Version: 1.0
-Date: 2013-04-02
-*/
-
-.hljs {
-  display: block; padding: 0.5em;
-  background: #eee;
-}
-
-.hljs-header,
-.hljs-decorator,
-.hljs-annotation {
-  color: #000077;
-}
-
-.hljs-horizontal_rule,
-.hljs-link_url,
-.hljs-emphasis,
-.hljs-attribute {
-  color: #070;
-}
-
-.hljs-emphasis {
-  font-style: italic;
-}
-
-.hljs-link_label,
-.hljs-strong,
-.hljs-value,
-.hljs-string,
-.scss .hljs-value .hljs-string {
-  color: #d14;
-}
-
-.hljs-strong {
-  font-weight: bold;
-}
-
-.hljs-blockquote,
-.hljs-comment {
-  color: #998;
-  font-style: italic;
-}
-
-.asciidoc .hljs-title,
-.hljs-function .hljs-title {
-  color: #900;
-}
-
-.hljs-class {
-  color: #458;
-}
-
-.hljs-id,
-.hljs-pseudo,
-.hljs-constant,
-.hljs-hexcolor {
-  color: teal;
-}
-
-.hljs-variable {
-  color: #336699;
-}
-
-.hljs-bullet,
-.hljs-javadoc {
-  color: #997700;
-}
-
-.hljs-pi,
-.hljs-doctype {
-  color: #3344bb;
-}
-
-.hljs-code,
-.hljs-number {
-  color: #099;
-}
-
-.hljs-important {
-  color: #f00;
-}
-
-.smartquote,
-.hljs-label {
-  color: #970;
-}
-
-.hljs-preprocessor,
-.hljs-pragma {
-  color: #579;
-}
-
-.hljs-reserved,
-.hljs-keyword,
-.scss .hljs-value {
-  color: #000;
-}
-
-.hljs-regexp {
-  background-color: #fff0ff;
-  color: #880088;
-}
-
-.hljs-symbol {
-  color: #990073;
-}
-
-.hljs-symbol .hljs-string {
-  color: #a60;
-}
-
-.hljs-tag {
-  color: #007700;
-}
-
-.hljs-at_rule,
-.hljs-at_rule .hljs-keyword {
-  color: #088;
-}
-
-.hljs-at_rule .hljs-preprocessor {
-  color: #808;
-}
-
-.scss .hljs-tag,
-.scss .hljs-attribute {
-  color: #339;
-}
diff --git a/web/libraries/codesnippet/lib/highlight/styles/github.css b/web/libraries/codesnippet/lib/highlight/styles/github.css
deleted file mode 100644
index 71967a3739cd8569638cb577829f5fc1361ee10e..0000000000000000000000000000000000000000
--- a/web/libraries/codesnippet/lib/highlight/styles/github.css
+++ /dev/null
@@ -1,125 +0,0 @@
-/*
-
-github.com style (c) Vasily Polovnyov <vast@whiteants.net>
-
-*/
-
-.hljs {
-  display: block; padding: 0.5em;
-  color: #333;
-  background: #f8f8f8
-}
-
-.hljs-comment,
-.hljs-template_comment,
-.diff .hljs-header,
-.hljs-javadoc {
-  color: #998;
-  font-style: italic
-}
-
-.hljs-keyword,
-.css .rule .hljs-keyword,
-.hljs-winutils,
-.javascript .hljs-title,
-.nginx .hljs-title,
-.hljs-subst,
-.hljs-request,
-.hljs-status {
-  color: #333;
-  font-weight: bold
-}
-
-.hljs-number,
-.hljs-hexcolor,
-.ruby .hljs-constant {
-  color: #099;
-}
-
-.hljs-string,
-.hljs-tag .hljs-value,
-.hljs-phpdoc,
-.tex .hljs-formula {
-  color: #d14
-}
-
-.hljs-title,
-.hljs-id,
-.coffeescript .hljs-params,
-.scss .hljs-preprocessor {
-  color: #900;
-  font-weight: bold
-}
-
-.javascript .hljs-title,
-.lisp .hljs-title,
-.clojure .hljs-title,
-.hljs-subst {
-  font-weight: normal
-}
-
-.hljs-class .hljs-title,
-.haskell .hljs-type,
-.vhdl .hljs-literal,
-.tex .hljs-command {
-  color: #458;
-  font-weight: bold
-}
-
-.hljs-tag,
-.hljs-tag .hljs-title,
-.hljs-rules .hljs-property,
-.django .hljs-tag .hljs-keyword {
-  color: #000080;
-  font-weight: normal
-}
-
-.hljs-attribute,
-.hljs-variable,
-.lisp .hljs-body {
-  color: #008080
-}
-
-.hljs-regexp {
-  color: #009926
-}
-
-.hljs-symbol,
-.ruby .hljs-symbol .hljs-string,
-.lisp .hljs-keyword,
-.tex .hljs-special,
-.hljs-prompt {
-  color: #990073
-}
-
-.hljs-built_in,
-.lisp .hljs-title,
-.clojure .hljs-built_in {
-  color: #0086b3
-}
-
-.hljs-preprocessor,
-.hljs-pragma,
-.hljs-pi,
-.hljs-doctype,
-.hljs-shebang,
-.hljs-cdata {
-  color: #999;
-  font-weight: bold
-}
-
-.hljs-deletion {
-  background: #fdd
-}
-
-.hljs-addition {
-  background: #dfd
-}
-
-.diff .hljs-change {
-  background: #0086b3
-}
-
-.hljs-chunk {
-  color: #aaa
-}
diff --git a/web/libraries/codesnippet/lib/highlight/styles/googlecode.css b/web/libraries/codesnippet/lib/highlight/styles/googlecode.css
deleted file mode 100644
index 45b8b3bf6765ac8fa5d7373bdef5c2496bde3d04..0000000000000000000000000000000000000000
--- a/web/libraries/codesnippet/lib/highlight/styles/googlecode.css
+++ /dev/null
@@ -1,147 +0,0 @@
-/*
-
-Google Code style (c) Aahan Krish <geekpanth3r@gmail.com>
-
-*/
-
-.hljs {
-  display: block; padding: 0.5em;
-  background: white; color: black;
-}
-
-.hljs-comment,
-.hljs-template_comment,
-.hljs-javadoc,
-.hljs-comment * {
-  color: #800;
-}
-
-.hljs-keyword,
-.method,
-.hljs-list .hljs-title,
-.clojure .hljs-built_in,
-.nginx .hljs-title,
-.hljs-tag .hljs-title,
-.setting .hljs-value,
-.hljs-winutils,
-.tex .hljs-command,
-.http .hljs-title,
-.hljs-request,
-.hljs-status {
-  color: #008;
-}
-
-.hljs-envvar,
-.tex .hljs-special {
-  color: #660;
-}
-
-.hljs-string,
-.hljs-tag .hljs-value,
-.hljs-cdata,
-.hljs-filter .hljs-argument,
-.hljs-attr_selector,
-.apache .hljs-cbracket,
-.hljs-date,
-.hljs-regexp,
-.coffeescript .hljs-attribute {
-  color: #080;
-}
-
-.hljs-sub .hljs-identifier,
-.hljs-pi,
-.hljs-tag,
-.hljs-tag .hljs-keyword,
-.hljs-decorator,
-.ini .hljs-title,
-.hljs-shebang,
-.hljs-prompt,
-.hljs-hexcolor,
-.hljs-rules .hljs-value,
-.css .hljs-value .hljs-number,
-.hljs-literal,
-.hljs-symbol,
-.ruby .hljs-symbol .hljs-string,
-.hljs-number,
-.css .hljs-function,
-.clojure .hljs-attribute {
-  color: #066;
-}
-
-.hljs-class .hljs-title,
-.haskell .hljs-type,
-.smalltalk .hljs-class,
-.hljs-javadoctag,
-.hljs-yardoctag,
-.hljs-phpdoc,
-.hljs-typename,
-.hljs-tag .hljs-attribute,
-.hljs-doctype,
-.hljs-class .hljs-id,
-.hljs-built_in,
-.setting,
-.hljs-params,
-.hljs-variable,
-.clojure .hljs-title {
-  color: #606;
-}
-
-.css .hljs-tag,
-.hljs-rules .hljs-property,
-.hljs-pseudo,
-.hljs-subst {
-  color: #000;
-}
-
-.css .hljs-class,
-.css .hljs-id {
-  color: #9B703F;
-}
-
-.hljs-value .hljs-important {
-  color: #ff7700;
-  font-weight: bold;
-}
-
-.hljs-rules .hljs-keyword {
-  color: #C5AF75;
-}
-
-.hljs-annotation,
-.apache .hljs-sqbracket,
-.nginx .hljs-built_in {
-  color: #9B859D;
-}
-
-.hljs-preprocessor,
-.hljs-preprocessor *,
-.hljs-pragma {
-  color: #444;
-}
-
-.tex .hljs-formula {
-  background-color: #EEE;
-  font-style: italic;
-}
-
-.diff .hljs-header,
-.hljs-chunk {
-  color: #808080;
-  font-weight: bold;
-}
-
-.diff .hljs-change {
-  background-color: #BCCFF9;
-}
-
-.hljs-addition {
-  background-color: #BAEEBA;
-}
-
-.hljs-deletion {
-  background-color: #FFC8BD;
-}
-
-.hljs-comment .hljs-yardoctag {
-  font-weight: bold;
-}
diff --git a/web/libraries/codesnippet/lib/highlight/styles/idea.css b/web/libraries/codesnippet/lib/highlight/styles/idea.css
deleted file mode 100644
index 77352f4bb37c7c5d9e09a1a92baf56fde12467d7..0000000000000000000000000000000000000000
--- a/web/libraries/codesnippet/lib/highlight/styles/idea.css
+++ /dev/null
@@ -1,122 +0,0 @@
-/*
-
-Intellij Idea-like styling (c) Vasily Polovnyov <vast@whiteants.net>
-
-*/
-
-.hljs {
-  display: block; padding: 0.5em;
-  color: #000;
-  background: #fff;
-}
-
-.hljs-subst,
-.hljs-title {
-  font-weight: normal;
-  color: #000;
-}
-
-.hljs-comment,
-.hljs-template_comment,
-.hljs-javadoc,
-.diff .hljs-header {
-  color: #808080;
-  font-style: italic;
-}
-
-.hljs-annotation,
-.hljs-decorator,
-.hljs-preprocessor,
-.hljs-pragma,
-.hljs-doctype,
-.hljs-pi,
-.hljs-chunk,
-.hljs-shebang,
-.apache .hljs-cbracket,
-.hljs-prompt,
-.http .hljs-title {
-  color: #808000;
-}
-
-.hljs-tag,
-.hljs-pi {
-  background: #efefef;
-}
-
-.hljs-tag .hljs-title,
-.hljs-id,
-.hljs-attr_selector,
-.hljs-pseudo,
-.hljs-literal,
-.hljs-keyword,
-.hljs-hexcolor,
-.css .hljs-function,
-.ini .hljs-title,
-.css .hljs-class,
-.hljs-list .hljs-title,
-.clojure .hljs-title,
-.nginx .hljs-title,
-.tex .hljs-command,
-.hljs-request,
-.hljs-status {
-  font-weight: bold;
-  color: #000080;
-}
-
-.hljs-attribute,
-.hljs-rules .hljs-keyword,
-.hljs-number,
-.hljs-date,
-.hljs-regexp,
-.tex .hljs-special {
-  font-weight: bold;
-  color: #0000ff;
-}
-
-.hljs-number,
-.hljs-regexp {
-  font-weight: normal;
-}
-
-.hljs-string,
-.hljs-value,
-.hljs-filter .hljs-argument,
-.css .hljs-function .hljs-params,
-.apache .hljs-tag {
-  color: #008000;
-  font-weight: bold;
-}
-
-.hljs-symbol,
-.ruby .hljs-symbol .hljs-string,
-.hljs-char,
-.tex .hljs-formula {
-  color: #000;
-  background: #d0eded;
-  font-style: italic;
-}
-
-.hljs-phpdoc,
-.hljs-yardoctag,
-.hljs-javadoctag {
-  text-decoration: underline;
-}
-
-.hljs-variable,
-.hljs-envvar,
-.apache .hljs-sqbracket,
-.nginx .hljs-built_in {
-  color: #660e7a;
-}
-
-.hljs-addition {
-  background: #baeeba;
-}
-
-.hljs-deletion {
-  background: #ffc8bd;
-}
-
-.diff .hljs-change {
-  background: #bccff9;
-}
diff --git a/web/libraries/codesnippet/lib/highlight/styles/ir_black.css b/web/libraries/codesnippet/lib/highlight/styles/ir_black.css
deleted file mode 100644
index cc64ef5c5b02edec3ed06a02345f32d29dbe4f3f..0000000000000000000000000000000000000000
--- a/web/libraries/codesnippet/lib/highlight/styles/ir_black.css
+++ /dev/null
@@ -1,105 +0,0 @@
-/*
-  IR_Black style (c) Vasily Mikhailitchenko <vaskas@programica.ru>
-*/
-
-.hljs {
-  display: block; padding: 0.5em;
-  background: #000; color: #f8f8f8;
-}
-
-.hljs-shebang,
-.hljs-comment,
-.hljs-template_comment,
-.hljs-javadoc {
-  color: #7c7c7c;
-}
-
-.hljs-keyword,
-.hljs-tag,
-.tex .hljs-command,
-.hljs-request,
-.hljs-status,
-.clojure .hljs-attribute {
-  color: #96CBFE;
-}
-
-.hljs-sub .hljs-keyword,
-.method,
-.hljs-list .hljs-title,
-.nginx .hljs-title {
-  color: #FFFFB6;
-}
-
-.hljs-string,
-.hljs-tag .hljs-value,
-.hljs-cdata,
-.hljs-filter .hljs-argument,
-.hljs-attr_selector,
-.apache .hljs-cbracket,
-.hljs-date,
-.coffeescript .hljs-attribute {
-  color: #A8FF60;
-}
-
-.hljs-subst {
-  color: #DAEFA3;
-}
-
-.hljs-regexp {
-  color: #E9C062;
-}
-
-.hljs-title,
-.hljs-sub .hljs-identifier,
-.hljs-pi,
-.hljs-decorator,
-.tex .hljs-special,
-.haskell .hljs-type,
-.hljs-constant,
-.smalltalk .hljs-class,
-.hljs-javadoctag,
-.hljs-yardoctag,
-.hljs-phpdoc,
-.nginx .hljs-built_in {
-  color: #FFFFB6;
-}
-
-.hljs-symbol,
-.ruby .hljs-symbol .hljs-string,
-.hljs-number,
-.hljs-variable,
-.vbscript,
-.hljs-literal {
-  color: #C6C5FE;
-}
-
-.css .hljs-tag {
-  color: #96CBFE;
-}
-
-.css .hljs-rules .hljs-property,
-.css .hljs-id {
-  color: #FFFFB6;
-}
-
-.css .hljs-class {
-  color: #FFF;
-}
-
-.hljs-hexcolor {
-  color: #C6C5FE;
-}
-
-.hljs-number {
-  color:#FF73FD;
-}
-
-.coffeescript .javascript,
-.javascript .xml,
-.tex .hljs-formula,
-.xml .javascript,
-.xml .vbscript,
-.xml .css,
-.xml .hljs-cdata {
-  opacity: 0.7;
-}
diff --git a/web/libraries/codesnippet/lib/highlight/styles/magula.css b/web/libraries/codesnippet/lib/highlight/styles/magula.css
deleted file mode 100644
index cafe3d3ee2ea565222995276ce2762f89606ec04..0000000000000000000000000000000000000000
--- a/web/libraries/codesnippet/lib/highlight/styles/magula.css
+++ /dev/null
@@ -1,123 +0,0 @@
-/*
-Description: Magula style for highligh.js
-Author: Ruslan Keba <rukeba@gmail.com>
-Website: http://rukeba.com/
-Version: 1.0
-Date: 2009-01-03
-Music: Aphex Twin / Xtal
-*/
-
-.hljs {
-  display: block; padding: 0.5em;
-  background-color: #f4f4f4;
-}
-
-.hljs,
-.hljs-subst,
-.lisp .hljs-title,
-.clojure .hljs-built_in {
-  color: black;
-}
-
-.hljs-string,
-.hljs-title,
-.hljs-parent,
-.hljs-tag .hljs-value,
-.hljs-rules .hljs-value,
-.hljs-rules .hljs-value .hljs-number,
-.hljs-preprocessor,
-.hljs-pragma,
-.ruby .hljs-symbol,
-.ruby .hljs-symbol .hljs-string,
-.hljs-aggregate,
-.hljs-template_tag,
-.django .hljs-variable,
-.smalltalk .hljs-class,
-.hljs-addition,
-.hljs-flow,
-.hljs-stream,
-.bash .hljs-variable,
-.apache .hljs-cbracket,
-.coffeescript .hljs-attribute {
-  color: #050;
-}
-
-.hljs-comment,
-.hljs-annotation,
-.hljs-template_comment,
-.diff .hljs-header,
-.hljs-chunk {
-  color: #777;
-}
-
-.hljs-number,
-.hljs-date,
-.hljs-regexp,
-.hljs-literal,
-.smalltalk .hljs-symbol,
-.smalltalk .hljs-char,
-.hljs-change,
-.tex .hljs-special {
-  color: #800;
-}
-
-.hljs-label,
-.hljs-javadoc,
-.ruby .hljs-string,
-.hljs-decorator,
-.hljs-filter .hljs-argument,
-.hljs-localvars,
-.hljs-array,
-.hljs-attr_selector,
-.hljs-pseudo,
-.hljs-pi,
-.hljs-doctype,
-.hljs-deletion,
-.hljs-envvar,
-.hljs-shebang,
-.apache .hljs-sqbracket,
-.nginx .hljs-built_in,
-.tex .hljs-formula,
-.hljs-prompt,
-.clojure .hljs-attribute {
-  color: #00e;
-}
-
-.hljs-keyword,
-.hljs-id,
-.hljs-phpdoc,
-.hljs-title,
-.hljs-built_in,
-.hljs-aggregate,
-.smalltalk .hljs-class,
-.hljs-winutils,
-.bash .hljs-variable,
-.apache .hljs-tag,
-.xml .hljs-tag,
-.tex .hljs-command,
-.hljs-request,
-.hljs-status {
-  font-weight: bold;
-  color: navy;
-}
-
-.nginx .hljs-built_in {
-  font-weight: normal;
-}
-
-.coffeescript .javascript,
-.javascript .xml,
-.tex .hljs-formula,
-.xml .javascript,
-.xml .vbscript,
-.xml .css,
-.xml .hljs-cdata {
-  opacity: 0.5;
-}
-
-/* --- */
-.apache .hljs-tag {
-  font-weight: bold;
-  color: blue;
-}
-
diff --git a/web/libraries/codesnippet/lib/highlight/styles/mono-blue.css b/web/libraries/codesnippet/lib/highlight/styles/mono-blue.css
deleted file mode 100644
index 4152d82d6d5b5e265a49260189d03d46a727899a..0000000000000000000000000000000000000000
--- a/web/libraries/codesnippet/lib/highlight/styles/mono-blue.css
+++ /dev/null
@@ -1,62 +0,0 @@
-/*
-  Five-color theme from a single blue hue.
-*/
-.hljs {
-  display: block; padding: 0.5em;
-  background: #EAEEF3; color: #00193A;
-}
-
-.hljs-keyword,
-.hljs-title,
-.hljs-important,
-.hljs-request,
-.hljs-header,
-.hljs-javadoctag {
-  font-weight: bold;
-}
-
-.hljs-comment,
-.hljs-chunk,
-.hljs-template_comment {
-  color: #738191;
-}
-
-.hljs-string,
-.hljs-title,
-.hljs-parent,
-.hljs-built_in,
-.hljs-literal,
-.hljs-filename,
-.hljs-value,
-.hljs-addition,
-.hljs-tag,
-.hljs-argument,
-.hljs-link_label,
-.hljs-blockquote,
-.hljs-header {
-  color: #0048AB;
-}
-
-.hljs-decorator,
-.hljs-prompt,
-.hljs-yardoctag,
-.hljs-subst,
-.hljs-symbol,
-.hljs-doctype,
-.hljs-regexp,
-.hljs-preprocessor,
-.hljs-pragma,
-.hljs-pi,
-.hljs-attribute,
-.hljs-attr_selector,
-.hljs-javadoc,
-.hljs-xmlDocTag,
-.hljs-deletion,
-.hljs-shebang,
-.hljs-string .hljs-variable,
-.hljs-link_url,
-.hljs-bullet,
-.hljs-sqbracket,
-.hljs-phony {
-  color: #4C81C9;
-}
diff --git a/web/libraries/codesnippet/lib/highlight/styles/monokai.css b/web/libraries/codesnippet/lib/highlight/styles/monokai.css
deleted file mode 100644
index 4e49befdd33edb11ce3b1f92d43b33567dfd0fef..0000000000000000000000000000000000000000
--- a/web/libraries/codesnippet/lib/highlight/styles/monokai.css
+++ /dev/null
@@ -1,127 +0,0 @@
-/*
-Monokai style - ported by Luigi Maselli - http://grigio.org
-*/
-
-.hljs {
-  display: block; padding: 0.5em;
-  background: #272822;
-}
-
-.hljs-tag,
-.hljs-tag .hljs-title,
-.hljs-keyword,
-.hljs-literal,
-.hljs-strong,
-.hljs-change,
-.hljs-winutils,
-.hljs-flow,
-.lisp .hljs-title,
-.clojure .hljs-built_in,
-.nginx .hljs-title,
-.tex .hljs-special {
-  color: #F92672;
-}
-
-.hljs {
-  color: #DDD;
-}
-
-.hljs .hljs-constant,
-.asciidoc .hljs-code {
-	color: #66D9EF;
-}
-
-.hljs-code,
-.hljs-class .hljs-title,
-.hljs-header {
-	color: white;
-}
-
-.hljs-link_label,
-.hljs-attribute,
-.hljs-symbol,
-.hljs-symbol .hljs-string,
-.hljs-value,
-.hljs-regexp {
-	color: #BF79DB;
-}
-
-.hljs-link_url,
-.hljs-tag .hljs-value,
-.hljs-string,
-.hljs-bullet,
-.hljs-subst,
-.hljs-title,
-.hljs-emphasis,
-.haskell .hljs-type,
-.hljs-preprocessor,
-.hljs-pragma,
-.ruby .hljs-class .hljs-parent,
-.hljs-built_in,
-.sql .hljs-aggregate,
-.django .hljs-template_tag,
-.django .hljs-variable,
-.smalltalk .hljs-class,
-.hljs-javadoc,
-.django .hljs-filter .hljs-argument,
-.smalltalk .hljs-localvars,
-.smalltalk .hljs-array,
-.hljs-attr_selector,
-.hljs-pseudo,
-.hljs-addition,
-.hljs-stream,
-.hljs-envvar,
-.apache .hljs-tag,
-.apache .hljs-cbracket,
-.tex .hljs-command,
-.hljs-prompt {
-  color: #A6E22E;
-}
-
-.hljs-comment,
-.java .hljs-annotation,
-.smartquote,
-.hljs-blockquote,
-.hljs-horizontal_rule,
-.python .hljs-decorator,
-.hljs-template_comment,
-.hljs-pi,
-.hljs-doctype,
-.hljs-deletion,
-.hljs-shebang,
-.apache .hljs-sqbracket,
-.tex .hljs-formula {
-  color: #75715E;
-}
-
-.hljs-keyword,
-.hljs-literal,
-.css .hljs-id,
-.hljs-phpdoc,
-.hljs-title,
-.hljs-header,
-.haskell .hljs-type,
-.vbscript .hljs-built_in,
-.sql .hljs-aggregate,
-.rsl .hljs-built_in,
-.smalltalk .hljs-class,
-.diff .hljs-header,
-.hljs-chunk,
-.hljs-winutils,
-.bash .hljs-variable,
-.apache .hljs-tag,
-.tex .hljs-special,
-.hljs-request,
-.hljs-status {
-  font-weight: bold;
-}
-
-.coffeescript .javascript,
-.javascript .xml,
-.tex .hljs-formula,
-.xml .javascript,
-.xml .vbscript,
-.xml .css,
-.xml .hljs-cdata {
-  opacity: 0.5;
-}
diff --git a/web/libraries/codesnippet/lib/highlight/styles/monokai_sublime.css b/web/libraries/codesnippet/lib/highlight/styles/monokai_sublime.css
deleted file mode 100644
index 7b0eb2e37730c2621b4407ad80d424a0a560dece..0000000000000000000000000000000000000000
--- a/web/libraries/codesnippet/lib/highlight/styles/monokai_sublime.css
+++ /dev/null
@@ -1,149 +0,0 @@
-/*
-
-Monokai Sublime style. Derived from Monokai by noformnocontent http://nn.mit-license.org/
-
-*/
-
-.hljs {
-  display: block;
-  padding: 0.5em;
-  background: #23241f;
-}
-
-.hljs,
-.hljs-tag,
-.css .hljs-rules,
-.css .hljs-value,
-.css .hljs-function
-.hljs-preprocessor,
-.hljs-pragma {
-  color: #f8f8f2;
-}
-
-.hljs-strongemphasis,
-.hljs-strong,
-.hljs-emphasis {
-  color: #a8a8a2;
-}
-
-.hljs-bullet,
-.hljs-blockquote,
-.hljs-horizontal_rule,
-.hljs-number,
-.hljs-regexp,
-.alias .hljs-keyword,
-.hljs-literal,
-.hljs-hexcolor {
-  color: #ae81ff;
-}
-
-.hljs-tag .hljs-value,
-.hljs-code,
-.hljs-title,
-.css .hljs-class,
-.hljs-class .hljs-title:last-child {
-  color: #a6e22e;
-}
-
-.hljs-link_url {
-  font-size: 80%;
-}
-
-.hljs-strong,
-.hljs-strongemphasis {
-  font-weight: bold;
-}
-
-.hljs-emphasis,
-.hljs-strongemphasis,
-.hljs-class .hljs-title:last-child {
-  font-style: italic;
-}
-
-.hljs-keyword,
-.hljs-function,
-.hljs-change,
-.hljs-winutils,
-.hljs-flow,
-.lisp .hljs-title,
-.clojure .hljs-built_in,
-.nginx .hljs-title,
-.tex .hljs-special,
-.hljs-header,
-.hljs-attribute,
-.hljs-symbol,
-.hljs-symbol .hljs-string,
-.hljs-tag .hljs-title,
-.hljs-value,
-.alias .hljs-keyword:first-child,
-.css .hljs-tag,
-.css .unit,
-.css .hljs-important {
-  color: #F92672;
-}
-
-.hljs-function .hljs-keyword,
-.hljs-class .hljs-keyword:first-child,
-.hljs-constant,
-.css .hljs-attribute {
-  color: #66d9ef;
-}
-
-.hljs-variable,
-.hljs-params,
-.hljs-class .hljs-title {
-  color: #f8f8f2;
-}
-
-.hljs-string,
-.css .hljs-id,
-.hljs-subst,
-.haskell .hljs-type,
-.ruby .hljs-class .hljs-parent,
-.hljs-built_in,
-.sql .hljs-aggregate,
-.django .hljs-template_tag,
-.django .hljs-variable,
-.smalltalk .hljs-class,
-.django .hljs-filter .hljs-argument,
-.smalltalk .hljs-localvars,
-.smalltalk .hljs-array,
-.hljs-attr_selector,
-.hljs-pseudo,
-.hljs-addition,
-.hljs-stream,
-.hljs-envvar,
-.apache .hljs-tag,
-.apache .hljs-cbracket,
-.tex .hljs-command,
-.hljs-prompt,
-.hljs-link_label,
-.hljs-link_url {
-  color: #e6db74;
-}
-
-.hljs-comment,
-.hljs-javadoc,
-.java .hljs-annotation,
-.python .hljs-decorator,
-.hljs-template_comment,
-.hljs-pi,
-.hljs-doctype,
-.hljs-deletion,
-.hljs-shebang,
-.apache .hljs-sqbracket,
-.tex .hljs-formula {
-  color: #75715e;
-}
-
-.coffeescript .javascript,
-.javascript .xml,
-.tex .hljs-formula,
-.xml .javascript,
-.xml .vbscript,
-.xml .css,
-.xml .hljs-cdata,
-.xml .php,
-.php .xml {
-  opacity: 0.5;
-}
diff --git a/web/libraries/codesnippet/lib/highlight/styles/obsidian.css b/web/libraries/codesnippet/lib/highlight/styles/obsidian.css
deleted file mode 100644
index 1174e4c1c252ad6595fdd889615a4d69b2bf9154..0000000000000000000000000000000000000000
--- a/web/libraries/codesnippet/lib/highlight/styles/obsidian.css
+++ /dev/null
@@ -1,154 +0,0 @@
-/**
- * Obsidian style
- * ported by Alexander Marenin (http://github.com/ioncreature)
- */
-
-.hljs {
-    display: block; padding: 0.5em;
-    background: #282B2E;
-}
-
-.hljs-keyword,
-.hljs-literal,
-.hljs-change,
-.hljs-winutils,
-.hljs-flow,
-.lisp .hljs-title,
-.clojure .hljs-built_in,
-.nginx .hljs-title,
-.css .hljs-id,
-.tex .hljs-special {
-    color: #93C763;
-}
-
-.hljs-number {
-    color: #FFCD22;
-}
-
-.hljs {
-    color: #E0E2E4;
-}
-
-.css .hljs-tag,
-.css .hljs-pseudo {
-    color: #D0D2B5;
-}
-
-.hljs-attribute,
-.hljs .hljs-constant {
-    color: #668BB0;
-}
-
-.xml .hljs-attribute {
-    color: #B3B689;
-}
-
-.xml .hljs-tag .hljs-value {
-    color: #E8E2B7;
-}
-
-.hljs-code,
-.hljs-class .hljs-title,
-.hljs-header {
-    color: white;
-}
-
-.hljs-class,
-.hljs-hexcolor {
-    color: #93C763;
-}
-
-.hljs-regexp {
-    color: #D39745;
-}
-
-.hljs-at_rule,
-.hljs-at_rule .hljs-keyword {
-    color: #A082BD;
-}
-
-.hljs-doctype {
-    color: #557182;
-}
-
-.hljs-link_url,
-.hljs-tag,
-.hljs-tag .hljs-title,
-.hljs-bullet,
-.hljs-subst,
-.hljs-emphasis,
-.haskell .hljs-type,
-.hljs-preprocessor,
-.hljs-pragma,
-.ruby .hljs-class .hljs-parent,
-.hljs-built_in,
-.sql .hljs-aggregate,
-.django .hljs-template_tag,
-.django .hljs-variable,
-.smalltalk .hljs-class,
-.hljs-javadoc,
-.django .hljs-filter .hljs-argument,
-.smalltalk .hljs-localvars,
-.smalltalk .hljs-array,
-.hljs-attr_selector,
-.hljs-pseudo,
-.hljs-addition,
-.hljs-stream,
-.hljs-envvar,
-.apache .hljs-tag,
-.apache .hljs-cbracket,
-.tex .hljs-command,
-.hljs-prompt {
-    color: #8CBBAD;
-}
-
-.hljs-string {
-    color: #EC7600;
-}
-
-.hljs-comment,
-.java .hljs-annotation,
-.hljs-blockquote,
-.hljs-horizontal_rule,
-.python .hljs-decorator,
-.hljs-template_comment,
-.hljs-pi,
-.hljs-deletion,
-.hljs-shebang,
-.apache .hljs-sqbracket,
-.tex .hljs-formula {
-    color: #818E96;
-}
-
-.hljs-keyword,
-.hljs-literal,
-.css .hljs-id,
-.hljs-phpdoc,
-.hljs-title,
-.hljs-header,
-.haskell .hljs-type,
-.vbscript .hljs-built_in,
-.sql .hljs-aggregate,
-.rsl .hljs-built_in,
-.smalltalk .hljs-class,
-.diff .hljs-header,
-.hljs-chunk,
-.hljs-winutils,
-.bash .hljs-variable,
-.apache .hljs-tag,
-.tex .hljs-special,
-.hljs-request,
-.hljs-at_rule .hljs-keyword,
-.hljs-status {
-    font-weight: bold;
-}
-
-.coffeescript .javascript,
-.javascript .xml,
-.tex .hljs-formula,
-.xml .javascript,
-.xml .vbscript,
-.xml .css,
-.xml .hljs-cdata {
-    opacity: 0.5;
-}
diff --git a/web/libraries/codesnippet/lib/highlight/styles/paraiso.dark.css b/web/libraries/codesnippet/lib/highlight/styles/paraiso.dark.css
deleted file mode 100644
index bbbccdd5497396662bbd0c6f8699fa1553f70990..0000000000000000000000000000000000000000
--- a/web/libraries/codesnippet/lib/highlight/styles/paraiso.dark.css
+++ /dev/null
@@ -1,93 +0,0 @@
-/*
-    Paraíso (dark)
-    Created by Jan T. Sott (http://github.com/idleberg)
-    Inspired by the art of Rubens LP (http://www.rubenslp.com.br)
-*/
-
-/* Paraíso Comment */
-.hljs-comment,
-.hljs-title {
-  color: #8d8687;
-}
-
-/* Paraíso Red */
-.hljs-variable,
-.hljs-attribute,
-.hljs-tag,
-.hljs-regexp,
-.ruby .hljs-constant,
-.xml .hljs-tag .hljs-title,
-.xml .hljs-pi,
-.xml .hljs-doctype,
-.html .hljs-doctype,
-.css .hljs-id,
-.css .hljs-class,
-.css .hljs-pseudo {
-  color: #ef6155;
-}
-
-/* Paraíso Orange */
-.hljs-number,
-.hljs-preprocessor,
-.hljs-built_in,
-.hljs-literal,
-.hljs-params,
-.hljs-constant {
-  color: #f99b15;
-}
-
-/* Paraíso Yellow */
-.ruby .hljs-class .hljs-title,
-.css .hljs-rules .hljs-attribute {
-  color: #fec418;
-}
-
-/* Paraíso Green */
-.hljs-string,
-.hljs-value,
-.hljs-inheritance,
-.hljs-header,
-.ruby .hljs-symbol,
-.xml .hljs-cdata {
-  color: #48b685;
-}
-
-/* Paraíso Aqua */
-.css .hljs-hexcolor {
-  color: #5bc4bf;
-}
-
-/* Paraíso Blue */
-.hljs-function,
-.python .hljs-decorator,
-.python .hljs-title,
-.ruby .hljs-function .hljs-title,
-.ruby .hljs-title .hljs-keyword,
-.perl .hljs-sub,
-.javascript .hljs-title,
-.coffeescript .hljs-title {
-  color: #06b6ef;
-}
-
-/* Paraíso Purple */
-.hljs-keyword,
-.javascript .hljs-function {
-  color: #815ba4;
-}
-
-.hljs {
-  display: block;
-  background: #2f1e2e;
-  color: #a39e9b;
-  padding: 0.5em;
-}
-
-.coffeescript .javascript,
-.javascript .xml,
-.tex .hljs-formula,
-.xml .javascript,
-.xml .vbscript,
-.xml .css,
-.xml .hljs-cdata {
-  opacity: 0.5;
-}
diff --git a/web/libraries/codesnippet/lib/highlight/styles/paraiso.light.css b/web/libraries/codesnippet/lib/highlight/styles/paraiso.light.css
deleted file mode 100644
index 494fcb4cb1f009cd41420e9d386a92424690b64e..0000000000000000000000000000000000000000
--- a/web/libraries/codesnippet/lib/highlight/styles/paraiso.light.css
+++ /dev/null
@@ -1,93 +0,0 @@
-/*
-    Paraíso (light)
-    Created by Jan T. Sott (http://github.com/idleberg)
-    Inspired by the art of Rubens LP (http://www.rubenslp.com.br)
-*/
-
-/* Paraíso Comment */
-.hljs-comment,
-.hljs-title {
-  color: #776e71;
-}
-
-/* Paraíso Red */
-.hljs-variable,
-.hljs-attribute,
-.hljs-tag,
-.hljs-regexp,
-.ruby .hljs-constant,
-.xml .hljs-tag .hljs-title,
-.xml .hljs-pi,
-.xml .hljs-doctype,
-.html .hljs-doctype,
-.css .hljs-id,
-.css .hljs-class,
-.css .hljs-pseudo {
-  color: #ef6155;
-}
-
-/* Paraíso Orange */
-.hljs-number,
-.hljs-preprocessor,
-.hljs-built_in,
-.hljs-literal,
-.hljs-params,
-.hljs-constant {
-  color: #f99b15;
-}
-
-/* Paraíso Yellow */
-.ruby .hljs-class .hljs-title,
-.css .hljs-rules .hljs-attribute {
-  color: #fec418;
-}
-
-/* Paraíso Green */
-.hljs-string,
-.hljs-value,
-.hljs-inheritance,
-.hljs-header,
-.ruby .hljs-symbol,
-.xml .hljs-cdata {
-  color: #48b685;
-}
-
-/* Paraíso Aqua */
-.css .hljs-hexcolor {
-  color: #5bc4bf;
-}
-
-/* Paraíso Blue */
-.hljs-function,
-.python .hljs-decorator,
-.python .hljs-title,
-.ruby .hljs-function .hljs-title,
-.ruby .hljs-title .hljs-keyword,
-.perl .hljs-sub,
-.javascript .hljs-title,
-.coffeescript .hljs-title {
-  color: #06b6ef;
-}
-
-/* Paraíso Purple */
-.hljs-keyword,
-.javascript .hljs-function {
-  color: #815ba4;
-}
-
-.hljs {
-  display: block;
-  background: #e7e9db;
-  color: #4f424c;
-  padding: 0.5em;
-}
-
-.coffeescript .javascript,
-.javascript .xml,
-.tex .hljs-formula,
-.xml .javascript,
-.xml .vbscript,
-.xml .css,
-.xml .hljs-cdata {
-  opacity: 0.5;
-}
diff --git a/web/libraries/codesnippet/lib/highlight/styles/pojoaque.css b/web/libraries/codesnippet/lib/highlight/styles/pojoaque.css
deleted file mode 100644
index 6ee925defd4edb2feb5be51b229993c9dd22927e..0000000000000000000000000000000000000000
--- a/web/libraries/codesnippet/lib/highlight/styles/pojoaque.css
+++ /dev/null
@@ -1,106 +0,0 @@
-/*
-
-Pojoaque Style by Jason Tate
-http://web-cms-designs.com/ftopict-10-pojoaque-style-for-highlight-js-code-highlighter.html
-Based on Solarized Style from http://ethanschoonover.com/solarized
-
-*/
-
-.hljs {
-  display: block; padding: 0.5em;
-  color: #DCCF8F;
-  background: url(./pojoaque.jpg) repeat scroll left top #181914;
-}
-
-.hljs-comment,
-.hljs-template_comment,
-.diff .hljs-header,
-.hljs-doctype,
-.lisp .hljs-string,
-.hljs-javadoc {
-  color: #586e75;
-  font-style: italic;
-}
-
-.hljs-keyword,
-.css .rule .hljs-keyword,
-.hljs-winutils,
-.javascript .hljs-title,
-.method,
-.hljs-addition,
-.css .hljs-tag,
-.clojure .hljs-title,
-.nginx .hljs-title {
-  color: #B64926;
-}
-
-.hljs-number,
-.hljs-command,
-.hljs-string,
-.hljs-tag .hljs-value,
-.hljs-phpdoc,
-.tex .hljs-formula,
-.hljs-regexp,
-.hljs-hexcolor {
-  color: #468966;
-}
-
-.hljs-title,
-.hljs-localvars,
-.hljs-function .hljs-title,
-.hljs-chunk,
-.hljs-decorator,
-.hljs-built_in,
-.lisp .hljs-title,
-.clojure .hljs-built_in,
-.hljs-identifier,
-.hljs-id {
-  color: #FFB03B;
-}
-
-.hljs-attribute,
-.hljs-variable,
-.lisp .hljs-body,
-.smalltalk .hljs-number,
-.hljs-constant,
-.hljs-class .hljs-title,
-.hljs-parent,
-.haskell .hljs-type {
-  color: #b58900;
-}
-
-.css .hljs-attribute {
-  color: #b89859;
-}
-
-.css .hljs-number,
-.css .hljs-hexcolor {
-  color: #DCCF8F;
-}
-
-.css .hljs-class {
-  color: #d3a60c;
-}
-
-.hljs-preprocessor,
-.hljs-pragma,
-.hljs-pi,
-.hljs-shebang,
-.hljs-symbol,
-.hljs-symbol .hljs-string,
-.diff .hljs-change,
-.hljs-special,
-.hljs-attr_selector,
-.hljs-important,
-.hljs-subst,
-.hljs-cdata {
-  color: #cb4b16;
-}
-
-.hljs-deletion {
-  color: #dc322f;
-}
-
-.tex .hljs-formula {
-  background: #073642;
-}
diff --git a/web/libraries/codesnippet/lib/highlight/styles/pojoaque.jpg b/web/libraries/codesnippet/lib/highlight/styles/pojoaque.jpg
deleted file mode 100644
index 9c07d4ab40b6d77e90ff69f0012bcd33b21d31c3..0000000000000000000000000000000000000000
--- a/web/libraries/codesnippet/lib/highlight/styles/pojoaque.jpg
+++ /dev/null
@@ -1,11 +0,0 @@
-�����JFIF���d�d�����Ducky�����0�����Adobe�d���������			

		

&&&&&++++++++++		
-	
-
-$$#$$++++++++++�������"����^�����������������������������������������!a�1�AQq���������������������������?��aD�v�Kg�ͳ���-o�&��0
-uϐ�f	3�>�\\QK����o��	{��(�"�QKl�ko���|���a���j"�w����\���T��^�*�o����N8o3��d��;�cȧ<��Z��p�H�E�5�pP�o���Z��N��o�0�,d�����wA�?�in�&�<}*�����-�E:v7m�*H��-g�!D��y��Ÿڅ�7�?�"��Z�7ˍ	~o��\\E�fQNM��_�����7�Y|
-ݶ`�	��
-uȋ>�U�0��T��yP;����aU�
�)� ��a���Xn���$Z�r�*�!�>�[r��co�Q[�Z{H�c��2
��)��
-������v���[�QH�b�R�On%H�� :a����5��4������wp���GQ7�����sɜU����Kw�7��UC�i����T�IN���8	R�q��&��/wT�"��[0~yL�a��5����J���b��B�A[�%O������ i��ቜ�����������~k{В�B�ˉ�@U7��8���F;@
-[#����J��OD�w�)�>B՘
-��I�qqE.�R�o�A[�D[�:��)m���� �����)��v|0����و���
-[>vm�J��������p�����
�L�-��a@����u��<��
-���	{�à�`�R�;��a7�t���v�+}��-D[�����w��7�Kdin�&�U|�wԴQ�2gH�\}Z�cȧ<����\��3�@@����=��kl��0]�Z}-o�%!���)�3�Z��@-|�o1�W��:x�U���ܛ��
\ No newline at end of file
diff --git a/web/libraries/codesnippet/lib/highlight/styles/railscasts.css b/web/libraries/codesnippet/lib/highlight/styles/railscasts.css
deleted file mode 100644
index 6a38064446b55be002f26286f67172e7a282c688..0000000000000000000000000000000000000000
--- a/web/libraries/codesnippet/lib/highlight/styles/railscasts.css
+++ /dev/null
@@ -1,182 +0,0 @@
-/*
-
-Railscasts-like style (c) Visoft, Inc. (Damien White)
-
-*/
-
-.hljs {
-  display: block;
-  padding: 0.5em;
-  background: #232323;
-  color: #E6E1DC;
-}
-
-.hljs-comment,
-.hljs-template_comment,
-.hljs-javadoc,
-.hljs-shebang {
-  color: #BC9458;
-  font-style: italic;
-}
-
-.hljs-keyword,
-.ruby .hljs-function .hljs-keyword,
-.hljs-request,
-.hljs-status,
-.nginx .hljs-title,
-.method,
-.hljs-list .hljs-title {
-  color: #C26230;
-}
-
-.hljs-string,
-.hljs-number,
-.hljs-regexp,
-.hljs-tag .hljs-value,
-.hljs-cdata,
-.hljs-filter .hljs-argument,
-.hljs-attr_selector,
-.apache .hljs-cbracket,
-.hljs-date,
-.tex .hljs-command,
-.markdown .hljs-link_label {
-  color: #A5C261;
-}
-
-.hljs-subst {
-  color: #519F50;
-}
-
-.hljs-tag,
-.hljs-tag .hljs-keyword,
-.hljs-tag .hljs-title,
-.hljs-doctype,
-.hljs-sub .hljs-identifier,
-.hljs-pi,
-.input_number {
-  color: #E8BF6A;
-}
-
-.hljs-identifier {
-  color: #D0D0FF;
-}
-
-.hljs-class .hljs-title,
-.haskell .hljs-type,
-.smalltalk .hljs-class,
-.hljs-javadoctag,
-.hljs-yardoctag,
-.hljs-phpdoc {
-  text-decoration: none;
-}
-
-.hljs-constant {
-  color: #DA4939;
-}
-
-
-.hljs-symbol,
-.hljs-built_in,
-.ruby .hljs-symbol .hljs-string,
-.ruby .hljs-symbol .hljs-identifier,
-.markdown .hljs-link_url,
-.hljs-attribute {
-  color: #6D9CBE;
-}
-
-.markdown .hljs-link_url {
-  text-decoration: underline;
-}
-
-
-
-.hljs-params,
-.hljs-variable,
-.clojure .hljs-attribute {
-  color: #D0D0FF;
-}
-
-.css .hljs-tag,
-.hljs-rules .hljs-property,
-.hljs-pseudo,
-.tex .hljs-special {
-  color: #CDA869;
-}
-
-.css .hljs-class {
-  color: #9B703F;
-}
-
-.hljs-rules .hljs-keyword {
-  color: #C5AF75;
-}
-
-.hljs-rules .hljs-value {
-  color: #CF6A4C;
-}
-
-.css .hljs-id {
-  color: #8B98AB;
-}
-
-.hljs-annotation,
-.apache .hljs-sqbracket,
-.nginx .hljs-built_in {
-  color: #9B859D;
-}
-
-.hljs-preprocessor,
-.hljs-preprocessor *,
-.hljs-pragma {
-  color: #8996A8 !important;
-}
-
-.hljs-hexcolor,
-.css .hljs-value .hljs-number {
-  color: #A5C261;
-}
-
-.hljs-title,
-.hljs-decorator,
-.css .hljs-function {
-  color: #FFC66D;
-}
-
-.diff .hljs-header,
-.hljs-chunk {
-  background-color: #2F33AB;
-  color: #E6E1DC;
-  display: inline-block;
-  width: 100%;
-}
-
-.diff .hljs-change {
-  background-color: #4A410D;
-  color: #F8F8F8;
-  display: inline-block;
-  width: 100%;
-}
-
-.hljs-addition {
-  background-color: #144212;
-  color: #E6E1DC;
-  display: inline-block;
-  width: 100%;
-}
-
-.hljs-deletion {
-  background-color: #600;
-  color: #E6E1DC;
-  display: inline-block;
-  width: 100%;
-}
-
-.coffeescript .javascript,
-.javascript .xml,
-.tex .hljs-formula,
-.xml .javascript,
-.xml .vbscript,
-.xml .css,
-.xml .hljs-cdata {
-  opacity: 0.7;
-}
diff --git a/web/libraries/codesnippet/lib/highlight/styles/rainbow.css b/web/libraries/codesnippet/lib/highlight/styles/rainbow.css
deleted file mode 100644
index d9ffef6d1de846509ebff8a61f141c112d3290cc..0000000000000000000000000000000000000000
--- a/web/libraries/codesnippet/lib/highlight/styles/rainbow.css
+++ /dev/null
@@ -1,112 +0,0 @@
-/*
-
-Style with support for rainbow parens
-
-*/
-
-.hljs {
-  display: block; padding: 0.5em;
-  background: #474949; color: #D1D9E1;
-}
-
-
-.hljs-body,
-.hljs-collection {
-   color: #D1D9E1;
-}
-
-.hljs-comment,
-.hljs-template_comment,
-.diff .hljs-header,
-.hljs-doctype,
-.lisp .hljs-string,
-.hljs-javadoc {
-  color: #969896;
-  font-style: italic;
-}
-
-.hljs-keyword,
-.clojure .hljs-attribute,
-.hljs-winutils,
-.javascript .hljs-title,
-.hljs-addition,
-.css .hljs-tag {
-  color: #cc99cc;
-}
-
-.hljs-number { color: #f99157; }
-
-.hljs-command,
-.hljs-string,
-.hljs-tag .hljs-value,
-.hljs-phpdoc,
-.tex .hljs-formula,
-.hljs-regexp,
-.hljs-hexcolor {
-  color: #8abeb7;
-}
-
-.hljs-title,
-.hljs-localvars,
-.hljs-function .hljs-title,
-.hljs-chunk,
-.hljs-decorator,
-.hljs-built_in,
-.lisp .hljs-title,
-.hljs-identifier
-{
-  color: #b5bd68;
-}
-
-.hljs-class .hljs-keyword
-{
-  color: #f2777a;
-}
-
-.hljs-variable,
-.lisp .hljs-body,
-.smalltalk .hljs-number,
-.hljs-constant,
-.hljs-class .hljs-title,
-.hljs-parent,
-.haskell .hljs-label,
-.hljs-id,
-.lisp .hljs-title,
-.clojure .hljs-title .hljs-built_in {
-   color: #ffcc66;
-}
-
-.hljs-tag .hljs-title,
-.hljs-rules .hljs-property,
-.django .hljs-tag .hljs-keyword,
-.clojure .hljs-title .hljs-built_in {
-  font-weight: bold;
-}
-
-.hljs-attribute,
-.clojure .hljs-title {
-  color: #81a2be;
-}
-
-.hljs-preprocessor,
-.hljs-pragma,
-.hljs-pi,
-.hljs-shebang,
-.hljs-symbol,
-.hljs-symbol .hljs-string,
-.diff .hljs-change,
-.hljs-special,
-.hljs-attr_selector,
-.hljs-important,
-.hljs-subst,
-.hljs-cdata {
-  color: #f99157;
-}
-
-.hljs-deletion {
-  color: #dc322f;
-}
-
-.tex .hljs-formula {
-  background: #eee8d5;
-}
diff --git a/web/libraries/codesnippet/lib/highlight/styles/school_book.css b/web/libraries/codesnippet/lib/highlight/styles/school_book.css
deleted file mode 100644
index 98a3bd27d597583ac4c373cc017b8ce1bca4e883..0000000000000000000000000000000000000000
--- a/web/libraries/codesnippet/lib/highlight/styles/school_book.css
+++ /dev/null
@@ -1,113 +0,0 @@
-/*
-
-School Book style from goldblog.com.ua (c) Zaripov Yura <yur4ik7@ukr.net>
-
-*/
-
-.hljs {
-  display: block; padding: 15px 0.5em 0.5em 30px;
-  font-size: 11px !important;
-  line-height:16px !important;
-}
-
-pre{
-  background:#f6f6ae url(./school_book.png);
-  border-top: solid 2px #d2e8b9;
-  border-bottom: solid 1px #d2e8b9;
-}
-
-.hljs-keyword,
-.hljs-literal,
-.hljs-change,
-.hljs-winutils,
-.hljs-flow,
-.lisp .hljs-title,
-.clojure .hljs-built_in,
-.nginx .hljs-title,
-.tex .hljs-special {
-  color:#005599;
-  font-weight:bold;
-}
-
-.hljs,
-.hljs-subst,
-.hljs-tag .hljs-keyword {
-  color: #3E5915;
-}
-
-.hljs-string,
-.hljs-title,
-.haskell .hljs-type,
-.hljs-tag .hljs-value,
-.css .hljs-rules .hljs-value,
-.hljs-preprocessor,
-.hljs-pragma,
-.ruby .hljs-symbol,
-.ruby .hljs-symbol .hljs-string,
-.ruby .hljs-class .hljs-parent,
-.hljs-built_in,
-.sql .hljs-aggregate,
-.django .hljs-template_tag,
-.django .hljs-variable,
-.smalltalk .hljs-class,
-.hljs-javadoc,
-.ruby .hljs-string,
-.django .hljs-filter .hljs-argument,
-.smalltalk .hljs-localvars,
-.smalltalk .hljs-array,
-.hljs-attr_selector,
-.hljs-pseudo,
-.hljs-addition,
-.hljs-stream,
-.hljs-envvar,
-.apache .hljs-tag,
-.apache .hljs-cbracket,
-.nginx .hljs-built_in,
-.tex .hljs-command,
-.coffeescript .hljs-attribute {
-  color: #2C009F;
-}
-
-.hljs-comment,
-.java .hljs-annotation,
-.python .hljs-decorator,
-.hljs-template_comment,
-.hljs-pi,
-.hljs-doctype,
-.hljs-deletion,
-.hljs-shebang,
-.apache .hljs-sqbracket {
-  color: #E60415;
-}
-
-.hljs-keyword,
-.hljs-literal,
-.css .hljs-id,
-.hljs-phpdoc,
-.hljs-title,
-.haskell .hljs-type,
-.vbscript .hljs-built_in,
-.sql .hljs-aggregate,
-.rsl .hljs-built_in,
-.smalltalk .hljs-class,
-.xml .hljs-tag .hljs-title,
-.diff .hljs-header,
-.hljs-chunk,
-.hljs-winutils,
-.bash .hljs-variable,
-.apache .hljs-tag,
-.tex .hljs-command,
-.hljs-request,
-.hljs-status {
-  font-weight: bold;
-}
-
-.coffeescript .javascript,
-.javascript .xml,
-.tex .hljs-formula,
-.xml .javascript,
-.xml .vbscript,
-.xml .css,
-.xml .hljs-cdata {
-  opacity: 0.5;
-}
diff --git a/web/libraries/codesnippet/lib/highlight/styles/school_book.png b/web/libraries/codesnippet/lib/highlight/styles/school_book.png
deleted file mode 100644
index 956e9790a0e2c079b3d568348ff3accd1d9cac30..0000000000000000000000000000000000000000
--- a/web/libraries/codesnippet/lib/highlight/styles/school_book.png
+++ /dev/null
@@ -1,3 +0,0 @@
-�PNG
-
-���
IHDR���������Nl6���gAMA����7�����tEXtSoftware�Adobe ImageReadyq�e<��xIDATx��ݻN�0`�E��A�yh^��@���H%$ȡ�j��q����%�ŗG���Λ�S���_sno�N9�m��}	������.6�j��cfe����-������m������@�����m������@�>������/,���a������@����a�dߊ
����-l���	���g�������k����ώ������>nW�������a��&*߈^�q�Mc�{�P�Am�-���eX�]�s�ɼ��~6J}�j=U��9u)�ί
����Ɏ\��拵Q���ݾ1�	�����KM����5Z�-�K3Ư�!�(�'Sa����f��F����-�W5]B�5�/�x�\N]���G�jd�Ջb����IEND�B`�
\ No newline at end of file
diff --git a/web/libraries/codesnippet/lib/highlight/styles/solarized_dark.css b/web/libraries/codesnippet/lib/highlight/styles/solarized_dark.css
deleted file mode 100644
index f520533f26eca3c1a86a80c382d8c3bbd9e8b093..0000000000000000000000000000000000000000
--- a/web/libraries/codesnippet/lib/highlight/styles/solarized_dark.css
+++ /dev/null
@@ -1,107 +0,0 @@
-/*
-
-Orginal Style from ethanschoonover.com/solarized (c) Jeremy Hull <sourdrums@gmail.com>
-
-*/
-
-.hljs {
-  display: block;
-  padding: 0.5em;
-  background: #002b36;
-  color: #839496;
-}
-
-.hljs-comment,
-.hljs-template_comment,
-.diff .hljs-header,
-.hljs-doctype,
-.hljs-pi,
-.lisp .hljs-string,
-.hljs-javadoc {
-  color: #586e75;
-}
-
-/* Solarized Green */
-.hljs-keyword,
-.hljs-winutils,
-.method,
-.hljs-addition,
-.css .hljs-tag,
-.hljs-request,
-.hljs-status,
-.nginx .hljs-title {
-  color: #859900;
-}
-
-/* Solarized Cyan */
-.hljs-number,
-.hljs-command,
-.hljs-string,
-.hljs-tag .hljs-value,
-.hljs-rules .hljs-value,
-.hljs-phpdoc,
-.tex .hljs-formula,
-.hljs-regexp,
-.hljs-hexcolor,
-.hljs-link_url {
-  color: #2aa198;
-}
-
-/* Solarized Blue */
-.hljs-title,
-.hljs-localvars,
-.hljs-chunk,
-.hljs-decorator,
-.hljs-built_in,
-.hljs-identifier,
-.vhdl .hljs-literal,
-.hljs-id,
-.css .hljs-function {
-  color: #268bd2;
-}
-
-/* Solarized Yellow */
-.hljs-attribute,
-.hljs-variable,
-.lisp .hljs-body,
-.smalltalk .hljs-number,
-.hljs-constant,
-.hljs-class .hljs-title,
-.hljs-parent,
-.haskell .hljs-type,
-.hljs-link_reference {
-  color: #b58900;
-}
-
-/* Solarized Orange */
-.hljs-preprocessor,
-.hljs-preprocessor .hljs-keyword,
-.hljs-pragma,
-.hljs-shebang,
-.hljs-symbol,
-.hljs-symbol .hljs-string,
-.diff .hljs-change,
-.hljs-special,
-.hljs-attr_selector,
-.hljs-subst,
-.hljs-cdata,
-.clojure .hljs-title,
-.css .hljs-pseudo,
-.hljs-header {
-  color: #cb4b16;
-}
-
-/* Solarized Red */
-.hljs-deletion,
-.hljs-important {
-  color: #dc322f;
-}
-
-/* Solarized Violet */
-.hljs-link_label {
-  color: #6c71c4;
-}
-
-.tex .hljs-formula {
-  background: #073642;
-}
diff --git a/web/libraries/codesnippet/lib/highlight/styles/solarized_light.css b/web/libraries/codesnippet/lib/highlight/styles/solarized_light.css
deleted file mode 100644
index ad7047414d5e47cc53acea9651a6e1c46fb0f0b5..0000000000000000000000000000000000000000
--- a/web/libraries/codesnippet/lib/highlight/styles/solarized_light.css
+++ /dev/null
@@ -1,107 +0,0 @@
-/*
-
-Orginal Style from ethanschoonover.com/solarized (c) Jeremy Hull <sourdrums@gmail.com>
-
-*/
-
-.hljs {
-  display: block;
-  padding: 0.5em;
-  background: #fdf6e3;
-  color: #657b83;
-}
-
-.hljs-comment,
-.hljs-template_comment,
-.diff .hljs-header,
-.hljs-doctype,
-.hljs-pi,
-.lisp .hljs-string,
-.hljs-javadoc {
-  color: #93a1a1;
-}
-
-/* Solarized Green */
-.hljs-keyword,
-.hljs-winutils,
-.method,
-.hljs-addition,
-.css .hljs-tag,
-.hljs-request,
-.hljs-status,
-.nginx .hljs-title {
-  color: #859900;
-}
-
-/* Solarized Cyan */
-.hljs-number,
-.hljs-command,
-.hljs-string,
-.hljs-tag .hljs-value,
-.hljs-rules .hljs-value,
-.hljs-phpdoc,
-.tex .hljs-formula,
-.hljs-regexp,
-.hljs-hexcolor,
-.hljs-link_url {
-  color: #2aa198;
-}
-
-/* Solarized Blue */
-.hljs-title,
-.hljs-localvars,
-.hljs-chunk,
-.hljs-decorator,
-.hljs-built_in,
-.hljs-identifier,
-.vhdl .hljs-literal,
-.hljs-id,
-.css .hljs-function {
-  color: #268bd2;
-}
-
-/* Solarized Yellow */
-.hljs-attribute,
-.hljs-variable,
-.lisp .hljs-body,
-.smalltalk .hljs-number,
-.hljs-constant,
-.hljs-class .hljs-title,
-.hljs-parent,
-.haskell .hljs-type,
-.hljs-link_reference {
-  color: #b58900;
-}
-
-/* Solarized Orange */
-.hljs-preprocessor,
-.hljs-preprocessor .hljs-keyword,
-.hljs-pragma,
-.hljs-shebang,
-.hljs-symbol,
-.hljs-symbol .hljs-string,
-.diff .hljs-change,
-.hljs-special,
-.hljs-attr_selector,
-.hljs-subst,
-.hljs-cdata,
-.clojure .hljs-title,
-.css .hljs-pseudo,
-.hljs-header {
-  color: #cb4b16;
-}
-
-/* Solarized Red */
-.hljs-deletion,
-.hljs-important {
-  color: #dc322f;
-}
-
-/* Solarized Violet */
-.hljs-link_label {
-  color: #6c71c4;
-}
-
-.tex .hljs-formula {
-  background: #eee8d5;
-}
diff --git a/web/libraries/codesnippet/lib/highlight/styles/sunburst.css b/web/libraries/codesnippet/lib/highlight/styles/sunburst.css
deleted file mode 100644
index 07b30c2435eba3de244a33d7d4aa0572f0542cf6..0000000000000000000000000000000000000000
--- a/web/libraries/codesnippet/lib/highlight/styles/sunburst.css
+++ /dev/null
@@ -1,160 +0,0 @@
-/*
-
-Sunburst-like style (c) Vasily Polovnyov <vast@whiteants.net>
-
-*/
-
-.hljs {
-  display: block; padding: 0.5em;
-  background: #000; color: #f8f8f8;
-}
-
-.hljs-comment,
-.hljs-template_comment,
-.hljs-javadoc {
-  color: #aeaeae;
-  font-style: italic;
-}
-
-.hljs-keyword,
-.ruby .hljs-function .hljs-keyword,
-.hljs-request,
-.hljs-status,
-.nginx .hljs-title {
-  color: #E28964;
-}
-
-.hljs-function .hljs-keyword,
-.hljs-sub .hljs-keyword,
-.method,
-.hljs-list .hljs-title {
-  color: #99CF50;
-}
-
-.hljs-string,
-.hljs-tag .hljs-value,
-.hljs-cdata,
-.hljs-filter .hljs-argument,
-.hljs-attr_selector,
-.apache .hljs-cbracket,
-.hljs-date,
-.tex .hljs-command,
-.coffeescript .hljs-attribute {
-  color: #65B042;
-}
-
-.hljs-subst {
-  color: #DAEFA3;
-}
-
-.hljs-regexp {
-  color: #E9C062;
-}
-
-.hljs-title,
-.hljs-sub .hljs-identifier,
-.hljs-pi,
-.hljs-tag,
-.hljs-tag .hljs-keyword,
-.hljs-decorator,
-.hljs-shebang,
-.hljs-prompt {
-  color: #89BDFF;
-}
-
-.hljs-class .hljs-title,
-.haskell .hljs-type,
-.smalltalk .hljs-class,
-.hljs-javadoctag,
-.hljs-yardoctag,
-.hljs-phpdoc {
-  text-decoration: underline;
-}
-
-.hljs-symbol,
-.ruby .hljs-symbol .hljs-string,
-.hljs-number {
-  color: #3387CC;
-}
-
-.hljs-params,
-.hljs-variable,
-.clojure .hljs-attribute {
-  color: #3E87E3;
-}
-
-.css .hljs-tag,
-.hljs-rules .hljs-property,
-.hljs-pseudo,
-.tex .hljs-special {
-  color: #CDA869;
-}
-
-.css .hljs-class {
-  color: #9B703F;
-}
-
-.hljs-rules .hljs-keyword {
-  color: #C5AF75;
-}
-
-.hljs-rules .hljs-value {
-  color: #CF6A4C;
-}
-
-.css .hljs-id {
-  color: #8B98AB;
-}
-
-.hljs-annotation,
-.apache .hljs-sqbracket,
-.nginx .hljs-built_in {
-  color: #9B859D;
-}
-
-.hljs-preprocessor,
-.hljs-pragma {
-  color: #8996A8;
-}
-
-.hljs-hexcolor,
-.css .hljs-value .hljs-number {
-  color: #DD7B3B;
-}
-
-.css .hljs-function {
-  color: #DAD085;
-}
-
-.diff .hljs-header,
-.hljs-chunk,
-.tex .hljs-formula {
-  background-color: #0E2231;
-  color: #F8F8F8;
-  font-style: italic;
-}
-
-.diff .hljs-change {
-  background-color: #4A410D;
-  color: #F8F8F8;
-}
-
-.hljs-addition {
-  background-color: #253B22;
-  color: #F8F8F8;
-}
-
-.hljs-deletion {
-  background-color: #420E09;
-  color: #F8F8F8;
-}
-
-.coffeescript .javascript,
-.javascript .xml,
-.tex .hljs-formula,
-.xml .javascript,
-.xml .vbscript,
-.xml .css,
-.xml .hljs-cdata {
-  opacity: 0.5;
-}
diff --git a/web/libraries/codesnippet/lib/highlight/styles/tomorrow-night-blue.css b/web/libraries/codesnippet/lib/highlight/styles/tomorrow-night-blue.css
deleted file mode 100644
index dfe26752419d0dee7520ef86c20416dd0ea70ac2..0000000000000000000000000000000000000000
--- a/web/libraries/codesnippet/lib/highlight/styles/tomorrow-night-blue.css
+++ /dev/null
@@ -1,93 +0,0 @@
-/* Tomorrow Night Blue Theme */
-/* http://jmblog.github.com/color-themes-for-google-code-highlightjs */
-/* Original theme - https://github.com/chriskempson/tomorrow-theme */
-/* http://jmblog.github.com/color-themes-for-google-code-highlightjs */
-
-/* Tomorrow Comment */
-.hljs-comment,
-.hljs-title {
-  color: #7285b7;
-}
-
-/* Tomorrow Red */
-.hljs-variable,
-.hljs-attribute,
-.hljs-tag,
-.hljs-regexp,
-.ruby .hljs-constant,
-.xml .hljs-tag .hljs-title,
-.xml .hljs-pi,
-.xml .hljs-doctype,
-.html .hljs-doctype,
-.css .hljs-id,
-.css .hljs-class,
-.css .hljs-pseudo {
-  color: #ff9da4;
-}
-
-/* Tomorrow Orange */
-.hljs-number,
-.hljs-preprocessor,
-.hljs-pragma,
-.hljs-built_in,
-.hljs-literal,
-.hljs-params,
-.hljs-constant {
-  color: #ffc58f;
-}
-
-/* Tomorrow Yellow */
-.ruby .hljs-class .hljs-title,
-.css .hljs-rules .hljs-attribute {
-  color: #ffeead;
-}
-
-/* Tomorrow Green */
-.hljs-string,
-.hljs-value,
-.hljs-inheritance,
-.hljs-header,
-.ruby .hljs-symbol,
-.xml .hljs-cdata {
-  color: #d1f1a9;
-}
-
-/* Tomorrow Aqua */
-.css .hljs-hexcolor {
-  color: #99ffff;
-}
-
-/* Tomorrow Blue */
-.hljs-function,
-.python .hljs-decorator,
-.python .hljs-title,
-.ruby .hljs-function .hljs-title,
-.ruby .hljs-title .hljs-keyword,
-.perl .hljs-sub,
-.javascript .hljs-title,
-.coffeescript .hljs-title {
-  color: #bbdaff;
-}
-
-/* Tomorrow Purple */
-.hljs-keyword,
-.javascript .hljs-function {
-  color: #ebbbff;
-}
-
-.hljs {
-  display: block;
-  background: #002451;
-  color: white;
-  padding: 0.5em;
-}
-
-.coffeescript .javascript,
-.javascript .xml,
-.tex .hljs-formula,
-.xml .javascript,
-.xml .vbscript,
-.xml .css,
-.xml .hljs-cdata {
-  opacity: 0.5;
-}
diff --git a/web/libraries/codesnippet/lib/highlight/styles/tomorrow-night-bright.css b/web/libraries/codesnippet/lib/highlight/styles/tomorrow-night-bright.css
deleted file mode 100644
index 4ad5d25f41d374b039dcd03c85eabb8dd53c8a19..0000000000000000000000000000000000000000
--- a/web/libraries/codesnippet/lib/highlight/styles/tomorrow-night-bright.css
+++ /dev/null
@@ -1,92 +0,0 @@
-/* Tomorrow Night Bright Theme */
-/* Original theme - https://github.com/chriskempson/tomorrow-theme */
-/* http://jmblog.github.com/color-themes-for-google-code-highlightjs */
-
-/* Tomorrow Comment */
-.hljs-comment,
-.hljs-title {
-  color: #969896;
-}
-
-/* Tomorrow Red */
-.hljs-variable,
-.hljs-attribute,
-.hljs-tag,
-.hljs-regexp,
-.ruby .hljs-constant,
-.xml .hljs-tag .hljs-title,
-.xml .hljs-pi,
-.xml .hljs-doctype,
-.html .hljs-doctype,
-.css .hljs-id,
-.css .hljs-class,
-.css .hljs-pseudo {
-  color: #d54e53;
-}
-
-/* Tomorrow Orange */
-.hljs-number,
-.hljs-preprocessor,
-.hljs-pragma,
-.hljs-built_in,
-.hljs-literal,
-.hljs-params,
-.hljs-constant {
-  color: #e78c45;
-}
-
-/* Tomorrow Yellow */
-.ruby .hljs-class .hljs-title,
-.css .hljs-rules .hljs-attribute {
-  color: #e7c547;
-}
-
-/* Tomorrow Green */
-.hljs-string,
-.hljs-value,
-.hljs-inheritance,
-.hljs-header,
-.ruby .hljs-symbol,
-.xml .hljs-cdata {
-  color: #b9ca4a;
-}
-
-/* Tomorrow Aqua */
-.css .hljs-hexcolor {
-  color: #70c0b1;
-}
-
-/* Tomorrow Blue */
-.hljs-function,
-.python .hljs-decorator,
-.python .hljs-title,
-.ruby .hljs-function .hljs-title,
-.ruby .hljs-title .hljs-keyword,
-.perl .hljs-sub,
-.javascript .hljs-title,
-.coffeescript .hljs-title {
-  color: #7aa6da;
-}
-
-/* Tomorrow Purple */
-.hljs-keyword,
-.javascript .hljs-function {
-  color: #c397d8;
-}
-
-.hljs {
-  display: block;
-  background: black;
-  color: #eaeaea;
-  padding: 0.5em;
-}
-
-.coffeescript .javascript,
-.javascript .xml,
-.tex .hljs-formula,
-.xml .javascript,
-.xml .vbscript,
-.xml .css,
-.xml .hljs-cdata {
-  opacity: 0.5;
-}
diff --git a/web/libraries/codesnippet/lib/highlight/styles/tomorrow-night-eighties.css b/web/libraries/codesnippet/lib/highlight/styles/tomorrow-night-eighties.css
deleted file mode 100644
index 08b49c623c5345dd5c05d48c5a67893f49513891..0000000000000000000000000000000000000000
--- a/web/libraries/codesnippet/lib/highlight/styles/tomorrow-night-eighties.css
+++ /dev/null
@@ -1,92 +0,0 @@
-/* Tomorrow Night Eighties Theme */
-/* Original theme - https://github.com/chriskempson/tomorrow-theme */
-/* http://jmblog.github.com/color-themes-for-google-code-highlightjs */
-
-/* Tomorrow Comment */
-.hljs-comment,
-.hljs-title {
-  color: #999999;
-}
-
-/* Tomorrow Red */
-.hljs-variable,
-.hljs-attribute,
-.hljs-tag,
-.hljs-regexp,
-.ruby .hljs-constant,
-.xml .hljs-tag .hljs-title,
-.xml .hljs-pi,
-.xml .hljs-doctype,
-.html .hljs-doctype,
-.css .hljs-id,
-.css .hljs-class,
-.css .hljs-pseudo {
-  color: #f2777a;
-}
-
-/* Tomorrow Orange */
-.hljs-number,
-.hljs-preprocessor,
-.hljs-pragma,
-.hljs-built_in,
-.hljs-literal,
-.hljs-params,
-.hljs-constant {
-  color: #f99157;
-}
-
-/* Tomorrow Yellow */
-.ruby .hljs-class .hljs-title,
-.css .hljs-rules .hljs-attribute {
-  color: #ffcc66;
-}
-
-/* Tomorrow Green */
-.hljs-string,
-.hljs-value,
-.hljs-inheritance,
-.hljs-header,
-.ruby .hljs-symbol,
-.xml .hljs-cdata {
-  color: #99cc99;
-}
-
-/* Tomorrow Aqua */
-.css .hljs-hexcolor {
-  color: #66cccc;
-}
-
-/* Tomorrow Blue */
-.hljs-function,
-.python .hljs-decorator,
-.python .hljs-title,
-.ruby .hljs-function .hljs-title,
-.ruby .hljs-title .hljs-keyword,
-.perl .hljs-sub,
-.javascript .hljs-title,
-.coffeescript .hljs-title {
-  color: #6699cc;
-}
-
-/* Tomorrow Purple */
-.hljs-keyword,
-.javascript .hljs-function {
-  color: #cc99cc;
-}
-
-.hljs {
-  display: block;
-  background: #2d2d2d;
-  color: #cccccc;
-  padding: 0.5em;
-}
-
-.coffeescript .javascript,
-.javascript .xml,
-.tex .hljs-formula,
-.xml .javascript,
-.xml .vbscript,
-.xml .css,
-.xml .hljs-cdata {
-  opacity: 0.5;
-}
diff --git a/web/libraries/codesnippet/lib/highlight/styles/tomorrow-night.css b/web/libraries/codesnippet/lib/highlight/styles/tomorrow-night.css
deleted file mode 100644
index c269b17e7522b75be78881e92da79071cd4bc1b3..0000000000000000000000000000000000000000
--- a/web/libraries/codesnippet/lib/highlight/styles/tomorrow-night.css
+++ /dev/null
@@ -1,93 +0,0 @@
-/* Tomorrow Night Theme */
-/* http://jmblog.github.com/color-themes-for-google-code-highlightjs */
-/* Original theme - https://github.com/chriskempson/tomorrow-theme */
-/* http://jmblog.github.com/color-themes-for-google-code-highlightjs */
-
-/* Tomorrow Comment */
-.hljs-comment,
-.hljs-title {
-  color: #969896;
-}
-
-/* Tomorrow Red */
-.hljs-variable,
-.hljs-attribute,
-.hljs-tag,
-.hljs-regexp,
-.ruby .hljs-constant,
-.xml .hljs-tag .hljs-title,
-.xml .hljs-pi,
-.xml .hljs-doctype,
-.html .hljs-doctype,
-.css .hljs-id,
-.css .hljs-class,
-.css .hljs-pseudo {
-  color: #cc6666;
-}
-
-/* Tomorrow Orange */
-.hljs-number,
-.hljs-preprocessor,
-.hljs-pragma,
-.hljs-built_in,
-.hljs-literal,
-.hljs-params,
-.hljs-constant {
-  color: #de935f;
-}
-
-/* Tomorrow Yellow */
-.ruby .hljs-class .hljs-title,
-.css .hljs-rules .hljs-attribute {
-  color: #f0c674;
-}
-
-/* Tomorrow Green */
-.hljs-string,
-.hljs-value,
-.hljs-inheritance,
-.hljs-header,
-.ruby .hljs-symbol,
-.xml .hljs-cdata {
-  color: #b5bd68;
-}
-
-/* Tomorrow Aqua */
-.css .hljs-hexcolor {
-  color: #8abeb7;
-}
-
-/* Tomorrow Blue */
-.hljs-function,
-.python .hljs-decorator,
-.python .hljs-title,
-.ruby .hljs-function .hljs-title,
-.ruby .hljs-title .hljs-keyword,
-.perl .hljs-sub,
-.javascript .hljs-title,
-.coffeescript .hljs-title {
-  color: #81a2be;
-}
-
-/* Tomorrow Purple */
-.hljs-keyword,
-.javascript .hljs-function {
-  color: #b294bb;
-}
-
-.hljs {
-  display: block;
-  background: #1d1f21;
-  color: #c5c8c6;
-  padding: 0.5em;
-}
-
-.coffeescript .javascript,
-.javascript .xml,
-.tex .hljs-formula,
-.xml .javascript,
-.xml .vbscript,
-.xml .css,
-.xml .hljs-cdata {
-  opacity: 0.5;
-}
diff --git a/web/libraries/codesnippet/lib/highlight/styles/tomorrow.css b/web/libraries/codesnippet/lib/highlight/styles/tomorrow.css
deleted file mode 100644
index 3bdead6036be3cbd1918c1ca63dfc88e21d8c209..0000000000000000000000000000000000000000
--- a/web/libraries/codesnippet/lib/highlight/styles/tomorrow.css
+++ /dev/null
@@ -1,90 +0,0 @@
-/* http://jmblog.github.com/color-themes-for-google-code-highlightjs */
-
-/* Tomorrow Comment */
-.hljs-comment,
-.hljs-title {
-  color: #8e908c;
-}
-
-/* Tomorrow Red */
-.hljs-variable,
-.hljs-attribute,
-.hljs-tag,
-.hljs-regexp,
-.ruby .hljs-constant,
-.xml .hljs-tag .hljs-title,
-.xml .hljs-pi,
-.xml .hljs-doctype,
-.html .hljs-doctype,
-.css .hljs-id,
-.css .hljs-class,
-.css .hljs-pseudo {
-  color: #c82829;
-}
-
-/* Tomorrow Orange */
-.hljs-number,
-.hljs-preprocessor,
-.hljs-pragma,
-.hljs-built_in,
-.hljs-literal,
-.hljs-params,
-.hljs-constant {
-  color: #f5871f;
-}
-
-/* Tomorrow Yellow */
-.ruby .hljs-class .hljs-title,
-.css .hljs-rules .hljs-attribute {
-  color: #eab700;
-}
-
-/* Tomorrow Green */
-.hljs-string,
-.hljs-value,
-.hljs-inheritance,
-.hljs-header,
-.ruby .hljs-symbol,
-.xml .hljs-cdata {
-  color: #718c00;
-}
-
-/* Tomorrow Aqua */
-.css .hljs-hexcolor {
-  color: #3e999f;
-}
-
-/* Tomorrow Blue */
-.hljs-function,
-.python .hljs-decorator,
-.python .hljs-title,
-.ruby .hljs-function .hljs-title,
-.ruby .hljs-title .hljs-keyword,
-.perl .hljs-sub,
-.javascript .hljs-title,
-.coffeescript .hljs-title {
-  color: #4271ae;
-}
-
-/* Tomorrow Purple */
-.hljs-keyword,
-.javascript .hljs-function {
-  color: #8959a8;
-}
-
-.hljs {
-  display: block;
-  background: white;
-  color: #4d4d4c;
-  padding: 0.5em;
-}
-
-.coffeescript .javascript,
-.javascript .xml,
-.tex .hljs-formula,
-.xml .javascript,
-.xml .vbscript,
-.xml .css,
-.xml .hljs-cdata {
-  opacity: 0.5;
-}
diff --git a/web/libraries/codesnippet/lib/highlight/styles/vs.css b/web/libraries/codesnippet/lib/highlight/styles/vs.css
deleted file mode 100644
index bf33f0fb678ea3a4041856442cb5f0d3e6e3d004..0000000000000000000000000000000000000000
--- a/web/libraries/codesnippet/lib/highlight/styles/vs.css
+++ /dev/null
@@ -1,89 +0,0 @@
-/*
-
-Visual Studio-like style based on original C# coloring by Jason Diamond <jason@diamond.name>
-
-*/
-.hljs {
-  display: block; padding: 0.5em;
-  background: white; color: black;
-}
-
-.hljs-comment,
-.hljs-annotation,
-.hljs-template_comment,
-.diff .hljs-header,
-.hljs-chunk,
-.apache .hljs-cbracket {
-  color: #008000;
-}
-
-.hljs-keyword,
-.hljs-id,
-.hljs-built_in,
-.smalltalk .hljs-class,
-.hljs-winutils,
-.bash .hljs-variable,
-.tex .hljs-command,
-.hljs-request,
-.hljs-status,
-.nginx .hljs-title,
-.xml .hljs-tag,
-.xml .hljs-tag .hljs-value {
-  color: #00f;
-}
-
-.hljs-string,
-.hljs-title,
-.hljs-parent,
-.hljs-tag .hljs-value,
-.hljs-rules .hljs-value,
-.hljs-rules .hljs-value .hljs-number,
-.ruby .hljs-symbol,
-.ruby .hljs-symbol .hljs-string,
-.hljs-aggregate,
-.hljs-template_tag,
-.django .hljs-variable,
-.hljs-addition,
-.hljs-flow,
-.hljs-stream,
-.apache .hljs-tag,
-.hljs-date,
-.tex .hljs-formula,
-.coffeescript .hljs-attribute {
-  color: #a31515;
-}
-
-.ruby .hljs-string,
-.hljs-decorator,
-.hljs-filter .hljs-argument,
-.hljs-localvars,
-.hljs-array,
-.hljs-attr_selector,
-.hljs-pseudo,
-.hljs-pi,
-.hljs-doctype,
-.hljs-deletion,
-.hljs-envvar,
-.hljs-shebang,
-.hljs-preprocessor,
-.hljs-pragma,
-.userType,
-.apache .hljs-sqbracket,
-.nginx .hljs-built_in,
-.tex .hljs-special,
-.hljs-prompt {
-  color: #2b91af;
-}
-
-.hljs-phpdoc,
-.hljs-javadoc,
-.hljs-xmlDocTag {
-  color: #808080;
-}
-
-.vhdl .hljs-typename { font-weight: bold; }
-.vhdl .hljs-string { color: #666666; }
-.vhdl .hljs-literal { color: #a31515; }
-.vhdl .hljs-attribute { color: #00B0E8; }
-
-.xml .hljs-attribute { color: #f00; }
diff --git a/web/libraries/codesnippet/lib/highlight/styles/xcode.css b/web/libraries/codesnippet/lib/highlight/styles/xcode.css
deleted file mode 100644
index 57bd748e0ac8d3c7f5b84470da15eaf50c4bac9c..0000000000000000000000000000000000000000
--- a/web/libraries/codesnippet/lib/highlight/styles/xcode.css
+++ /dev/null
@@ -1,158 +0,0 @@
-/*
-
-XCode style (c) Angel Garcia <angelgarcia.mail@gmail.com>
-
-*/
-
-.hljs {
-  display: block; padding: 0.5em;
-  background: #fff; color: black;
-}
-
-.hljs-comment,
-.hljs-template_comment,
-.hljs-javadoc,
-.hljs-comment * {
-  color: #006a00;
-}
-
-.hljs-keyword,
-.hljs-literal,
-.nginx .hljs-title {
-  color: #aa0d91;
-}
-.method,
-.hljs-list .hljs-title,
-.hljs-tag .hljs-title,
-.setting .hljs-value,
-.hljs-winutils,
-.tex .hljs-command,
-.http .hljs-title,
-.hljs-request,
-.hljs-status {
-  color: #008;
-}
-
-.hljs-envvar,
-.tex .hljs-special {
-  color: #660;
-}
-
-.hljs-string {
-  color: #c41a16;
-}
-.hljs-tag .hljs-value,
-.hljs-cdata,
-.hljs-filter .hljs-argument,
-.hljs-attr_selector,
-.apache .hljs-cbracket,
-.hljs-date,
-.hljs-regexp {
-  color: #080;
-}
-
-.hljs-sub .hljs-identifier,
-.hljs-pi,
-.hljs-tag,
-.hljs-tag .hljs-keyword,
-.hljs-decorator,
-.ini .hljs-title,
-.hljs-shebang,
-.hljs-prompt,
-.hljs-hexcolor,
-.hljs-rules .hljs-value,
-.css .hljs-value .hljs-number,
-.hljs-symbol,
-.hljs-symbol .hljs-string,
-.hljs-number,
-.css .hljs-function,
-.clojure .hljs-title,
-.clojure .hljs-built_in,
-.hljs-function .hljs-title,
-.coffeescript .hljs-attribute {
-  color: #1c00cf;
-}
-
-.hljs-class .hljs-title,
-.haskell .hljs-type,
-.smalltalk .hljs-class,
-.hljs-javadoctag,
-.hljs-yardoctag,
-.hljs-phpdoc,
-.hljs-typename,
-.hljs-tag .hljs-attribute,
-.hljs-doctype,
-.hljs-class .hljs-id,
-.hljs-built_in,
-.setting,
-.hljs-params,
-.clojure .hljs-attribute {
-  color: #5c2699;
-}
-
-.hljs-variable {
- color: #3f6e74;
-}
-.css .hljs-tag,
-.hljs-rules .hljs-property,
-.hljs-pseudo,
-.hljs-subst {
-  color: #000;
-}
-
-.css .hljs-class,
-.css .hljs-id {
-  color: #9B703F;
-}
-
-.hljs-value .hljs-important {
-  color: #ff7700;
-  font-weight: bold;
-}
-
-.hljs-rules .hljs-keyword {
-  color: #C5AF75;
-}
-
-.hljs-annotation,
-.apache .hljs-sqbracket,
-.nginx .hljs-built_in {
-  color: #9B859D;
-}
-
-.hljs-preprocessor,
-.hljs-preprocessor *,
-.hljs-pragma {
-  color: #643820;
-}
-
-.tex .hljs-formula {
-  background-color: #EEE;
-  font-style: italic;
-}
-
-.diff .hljs-header,
-.hljs-chunk {
-  color: #808080;
-  font-weight: bold;
-}
-
-.diff .hljs-change {
-  background-color: #BCCFF9;
-}
-
-.hljs-addition {
-  background-color: #BAEEBA;
-}
-
-.hljs-deletion {
-  background-color: #FFC8BD;
-}
-
-.hljs-comment .hljs-yardoctag {
-  font-weight: bold;
-}
-
-.method .hljs-id {
-  color: #000;
-}
diff --git a/web/libraries/codesnippet/lib/highlight/styles/zenburn.css b/web/libraries/codesnippet/lib/highlight/styles/zenburn.css
deleted file mode 100644
index f6cb0983a7f717557166beee70bac3daa6f2f75e..0000000000000000000000000000000000000000
--- a/web/libraries/codesnippet/lib/highlight/styles/zenburn.css
+++ /dev/null
@@ -1,117 +0,0 @@
-/*
-
-Zenburn style from voldmar.ru (c) Vladimir Epifanov <voldmar@voldmar.ru>
-based on dark.css by Ivan Sagalaev
-
-*/
-
-.hljs {
-  display: block; padding: 0.5em;
-  background: #3F3F3F;
-  color: #DCDCDC;
-}
-
-.hljs-keyword,
-.hljs-tag,
-.css .hljs-class,
-.css .hljs-id,
-.lisp .hljs-title,
-.nginx .hljs-title,
-.hljs-request,
-.hljs-status,
-.clojure .hljs-attribute {
-  color: #E3CEAB;
-}
-
-.django .hljs-template_tag,
-.django .hljs-variable,
-.django .hljs-filter .hljs-argument {
-  color: #DCDCDC;
-}
-
-.hljs-number,
-.hljs-date {
-  color: #8CD0D3;
-}
-
-.dos .hljs-envvar,
-.dos .hljs-stream,
-.hljs-variable,
-.apache .hljs-sqbracket {
-  color: #EFDCBC;
-}
-
-.dos .hljs-flow,
-.diff .hljs-change,
-.python .exception,
-.python .hljs-built_in,
-.hljs-literal,
-.tex .hljs-special {
-  color: #EFEFAF;
-}
-
-.diff .hljs-chunk,
-.hljs-subst {
-  color: #8F8F8F;
-}
-
-.dos .hljs-keyword,
-.python .hljs-decorator,
-.hljs-title,
-.haskell .hljs-type,
-.diff .hljs-header,
-.ruby .hljs-class .hljs-parent,
-.apache .hljs-tag,
-.nginx .hljs-built_in,
-.tex .hljs-command,
-.hljs-prompt {
-    color: #efef8f;
-}
-
-.dos .hljs-winutils,
-.ruby .hljs-symbol,
-.ruby .hljs-symbol .hljs-string,
-.ruby .hljs-string {
-  color: #DCA3A3;
-}
-
-.diff .hljs-deletion,
-.hljs-string,
-.hljs-tag .hljs-value,
-.hljs-preprocessor,
-.hljs-pragma,
-.hljs-built_in,
-.sql .hljs-aggregate,
-.hljs-javadoc,
-.smalltalk .hljs-class,
-.smalltalk .hljs-localvars,
-.smalltalk .hljs-array,
-.css .hljs-rules .hljs-value,
-.hljs-attr_selector,
-.hljs-pseudo,
-.apache .hljs-cbracket,
-.tex .hljs-formula,
-.coffeescript .hljs-attribute {
-  color: #CC9393;
-}
-
-.hljs-shebang,
-.diff .hljs-addition,
-.hljs-comment,
-.java .hljs-annotation,
-.hljs-template_comment,
-.hljs-pi,
-.hljs-doctype {
-  color: #7F9F7F;
-}
-
-.coffeescript .javascript,
-.javascript .xml,
-.tex .hljs-formula,
-.xml .javascript,
-.xml .vbscript,
-.xml .css,
-.xml .hljs-cdata {
-  opacity: 0.5;
-}
-
diff --git a/web/libraries/codesnippet/package.json b/web/libraries/codesnippet/package.json
deleted file mode 100644
index 58f517e90d566b1f3630e10ef5fa64c3bda7b19b..0000000000000000000000000000000000000000
--- a/web/libraries/codesnippet/package.json
+++ /dev/null
@@ -1,15 +0,0 @@
-{
-  "name": "@drupal-ckeditor-libraries-group/codesnippet",
-  "description": "CKEditor 4 codesnippet plugin",
-  "keywords": ["ckeditor", "plugin", "codesnippet"],
-  "homepage": "https://ckeditor.com/cke4/addon/codesnippet",
-  "bugs": {
-    "url": "https://github.com/ckeditor/ckeditor4/issues"
-  },
-  "license" : "(GPL-2.0-or-later OR LGPL-2.1-or-later OR MPL-1.1)",
-  "repository": {
-		"type": "git",
-    "url": "https://github.com/ckeditor/ckeditor4.git",
-    "directory": "plugins/codesnippet"
-	}
-}
\ No newline at end of file
diff --git a/web/libraries/codesnippet/plugin.js b/web/libraries/codesnippet/plugin.js
deleted file mode 100644
index 07580a8ec68a701aa48e746838b816c0bb66d367..0000000000000000000000000000000000000000
--- a/web/libraries/codesnippet/plugin.js
+++ /dev/null
@@ -1,488 +0,0 @@
-/**
- * @license Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved.
- * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license
- */
-
-/**
- * @fileOverview Rich code snippets for CKEditor.
- */
-
-'use strict';
-
-( function() {
-	CKEDITOR.plugins.add( 'codesnippet', {
-		requires: 'widget,dialog',
-		// jscs:disable maximumLineLength
-		lang: 'ar,az,bg,ca,cs,da,de,de-ch,el,en,en-au,en-gb,eo,es,es-mx,et,eu,fa,fi,fr,fr-ca,gl,he,hr,hu,id,it,ja,km,ko,ku,lt,lv,nb,nl,no,oc,pl,pt,pt-br,ro,ru,sk,sl,sq,sr,sr-latn,sv,th,tr,tt,ug,uk,vi,zh,zh-cn', // %REMOVE_LINE_CORE%
-		// jscs:enable maximumLineLength
-		icons: 'codesnippet', // %REMOVE_LINE_CORE%
-		hidpi: true, // %REMOVE_LINE_CORE%
-
-		isSupportedEnvironment: function() {
-			return !CKEDITOR.env.ie || CKEDITOR.env.version > 8;
-		},
-
-		beforeInit: function( editor ) {
-			editor._.codesnippet = {};
-
-			/**
-			 * Sets the custom syntax highlighter. See {@link CKEDITOR.plugins.codesnippet.highlighter}
-			 * to learn how to register a custom highlighter.
-			 *
-			 * **Note**:
-			 *
-			 * * This method can only be called while initialising plugins (in one of
-			 * the three callbacks).
-			 * * This method is accessible through the `editor.plugins.codesnippet` namespace only.
-			 *
-			 * @since 4.4.0
-			 * @member CKEDITOR.plugins.codesnippet
-			 * @param {CKEDITOR.plugins.codesnippet.highlighter} highlighter
-			 */
-			this.setHighlighter = function( highlighter ) {
-				editor._.codesnippet.highlighter = highlighter;
-
-				var langs = editor._.codesnippet.langs =
-					editor.config.codeSnippet_languages || highlighter.languages;
-
-				// We might escape special regex chars below, but we expect that there
-				// should be no crazy values used as lang keys.
-				editor._.codesnippet.langsRegex = new RegExp( '(?:^|\\s)language-(' +
-					CKEDITOR.tools.object.keys( langs ).join( '|' ) + ')(?:\\s|$)' );
-			};
-
-			editor.once( 'pluginsLoaded', function() {
-				// Remove the method once it cannot be used, because it leaks the editor reference (#589).
-				this.setHighlighter = null;
-			}, this );
-		},
-
-		onLoad: function() {
-			CKEDITOR.dialog.add( 'codeSnippet', this.path + 'dialogs/codesnippet.js' );
-		},
-
-		init: function( editor ) {
-			editor.ui.addButton && editor.ui.addButton( 'CodeSnippet', {
-				label: editor.lang.codesnippet.button,
-				command: 'codeSnippet',
-				toolbar: 'insert,10'
-			} );
-		},
-
-		afterInit: function( editor ) {
-			var path = this.path;
-
-			registerWidget( editor );
-
-			// At the very end, if no custom highlighter was set so far (by plugin#setHighlighter)
-			// we will set default one.
-			if ( !editor._.codesnippet.highlighter ) {
-				var hljsHighlighter = new CKEDITOR.plugins.codesnippet.highlighter( {
-					languages: {
-						apache: 'Apache',
-						bash: 'Bash',
-						coffeescript: 'CoffeeScript',
-						cpp: 'C++',
-						cs: 'C#',
-						css: 'CSS',
-						diff: 'Diff',
-						html: 'HTML',
-						http: 'HTTP',
-						ini: 'INI',
-						java: 'Java',
-						javascript: 'JavaScript',
-						json: 'JSON',
-						makefile: 'Makefile',
-						markdown: 'Markdown',
-						nginx: 'Nginx',
-						objectivec: 'Objective-C',
-						perl: 'Perl',
-						php: 'PHP',
-						python: 'Python',
-						ruby: 'Ruby',
-						sql: 'SQL',
-						vbscript: 'VBScript',
-						xhtml: 'XHTML',
-						xml: 'XML'
-					},
-
-					init: function( callback ) {
-						var that = this;
-
-						if ( editor.plugins.codesnippet.isSupportedEnvironment() ) {
-							CKEDITOR.scriptLoader.load( path + 'lib/highlight/highlight.pack.js', function() {
-								that.hljs = window.hljs;
-								callback();
-							} );
-						}
-
-						// Method is available only if wysiwygarea exists.
-						if ( editor.addContentsCss ) {
-							editor.addContentsCss( path + 'lib/highlight/styles/' + editor.config.codeSnippet_theme + '.css' );
-						}
-					},
-
-					highlighter: function( code, language, callback ) {
-						var highlighted = this.hljs.highlightAuto( code,
-								this.hljs.getLanguage( language ) ? [ language ] : undefined );
-
-						if ( highlighted )
-							callback( highlighted.value );
-					}
-				} );
-
-				this.setHighlighter( hljsHighlighter );
-			}
-		}
-	} );
-
-	/**
-	 * Global helpers and classes of the Code Snippet plugin.
-	 *
-	 * For more information see the {@glink features/codesnippet Code Snippet Guide}.
-	 *
-	 * @class
-	 * @singleton
-	 */
-	CKEDITOR.plugins.codesnippet = {
-		highlighter: Highlighter
-	};
-
-	/**
-	 * A Code Snippet highlighter. It can be set as a default highlighter
-	 * using {@link CKEDITOR.plugins.codesnippet#setHighlighter}, for example:
-	 *
-	 *		// Create a new plugin which registers a custom code highlighter
-	 *		// based on customEngine in order to replace the one that comes
-	 *		// with the Code Snippet plugin.
-	 *		CKEDITOR.plugins.add( 'myCustomHighlighter', {
-	 *			afterInit: function( editor ) {
-	 *				// Create a new instance of the highlighter.
-	 *				var myHighlighter = new CKEDITOR.plugins.codesnippet.highlighter( {
-	 *					init: function( ready ) {
-	 *						// Asynchronous code to load resources and libraries for customEngine.
-	 *						customEngine.loadResources( function() {
-	 *							// Let the editor know that everything is ready.
-	 *							ready();
-	 *						} );
-	 *					},
-	 *					highlighter: function( code, language, callback ) {
-	 *						// Let the customEngine highlight the code.
-	 *						customEngine.highlight( code, language, function() {
-	 *							callback( highlightedCode );
-	 *						} );
-	 *					}
-	 *				} );
-	 *
-	 *				// Check how it performs.
-	 *				myHighlighter.highlight( 'foo()', 'javascript', function( highlightedCode ) {
-	 *					console.log( highlightedCode ); // -> <span class="pretty">foo()</span>
-	 *				} );
-	 *
-	 *				// From now on, myHighlighter will be used as a Code Snippet
-	 *				// highlighter, overwriting the default engine.
-	 *				editor.plugins.codesnippet.setHighlighter( myHighlighter );
-	 *			}
-	 *		} );
-	 *
-	 * @since 4.4.0
-	 * @class CKEDITOR.plugins.codesnippet.highlighter
-	 * @extends CKEDITOR.plugins.codesnippet
-	 * @param {Object} def Highlighter definition. See {@link #highlighter}, {@link #init} and {@link #languages}.
-	 */
-	function Highlighter( def ) {
-		CKEDITOR.tools.extend( this, def );
-
-		/**
-		 * A queue of {@link #highlight} jobs to be
-		 * done once the highlighter is {@link #ready}.
-		 *
-		 * @readonly
-		 * @property {Array} [=[]]
-		 */
-		this.queue = [];
-
-		// Async init – execute jobs when ready.
-		if ( this.init ) {
-			this.init( CKEDITOR.tools.bind( function() {
-				// Execute pending jobs.
-				var job;
-
-				while ( ( job = this.queue.pop() ) )
-					job.call( this );
-
-				this.ready = true;
-			}, this ) );
-		} else {
-			this.ready = true;
-		}
-
-		/**
-		 * If specified, this function should asynchronously load highlighter-specific
-		 * resources and execute `ready` when the highlighter is ready.
-		 *
-		 * @property {Function} [init]
-		 * @param {Function} ready The function to be called once
-		 * the highlighter is {@link #ready}.
-		 */
-
-		/**
-		 * A function which highlights given plain text `code` in a given `language` and, once done,
-		 * calls the `callback` function with highlighted markup as an argument.
-		 *
-		 * @property {Function} [highlighter]
-		 * @param {String} code Code to be formatted.
-		 * @param {String} lang Language to be used ({@link CKEDITOR.config#codeSnippet_languages}).
-		 * @param {Function} callback Function which accepts highlighted String as an argument.
-		 */
-
-		/**
-		 * Defines languages supported by the highlighter.
-		 * They can be restricted with the {@link CKEDITOR.config#codeSnippet_languages} configuration option.
-		 *
-		 * **Note**: If {@link CKEDITOR.config#codeSnippet_languages} is set, **it will
-		 * overwrite** the languages listed in `languages`.
-		 *
-		 *		languages: {
-		 *			coffeescript: 'CoffeeScript',
-		 *			cpp: 'C++',
-		 *			cs: 'C#',
-		 *			css: 'CSS'
-		 *		}
-		 *
-		 * More information on how to change the list of languages is available
-		 * in the {@glink features/codesnippet#changing-supported-languages Code Snippet documentation}.
-		 *
-		 * @property {Object} languages
-		 */
-
-		/**
-		 * A flag which indicates whether the highlighter is ready to do jobs
-		 * from the {@link #queue}.
-		 *
-		 * @readonly
-		 * @property {Boolean} ready
-		 */
-	}
-
-	/**
-	 * Executes the {@link #highlighter}. If the highlighter is not ready, it defers the job ({@link #queue})
-	 * and executes it when the highlighter is {@link #ready}.
-	 *
-	 * @param {String} code Code to be formatted.
-	 * @param {String} lang Language to be used ({@link CKEDITOR.config#codeSnippet_languages}).
-	 * @param {Function} callback Function which accepts highlighted String as an argument.
-	 */
-	Highlighter.prototype.highlight = function() {
-		var arg = arguments;
-
-		// Highlighter is ready – do it now.
-		if ( this.ready )
-			this.highlighter.apply( this, arg );
-		// Queue the job. It will be done once ready.
-		else {
-			this.queue.push( function() {
-				this.highlighter.apply( this, arg );
-			} );
-		}
-	};
-
-	// Encapsulates snippet widget registration code.
-	// @param {CKEDITOR.editor} editor
-	function registerWidget( editor ) {
-		var codeClass = editor.config.codeSnippet_codeClass,
-			newLineRegex = /\r?\n/g,
-			textarea = new CKEDITOR.dom.element( 'textarea' ),
-			lang = editor.lang.codesnippet;
-
-		editor.widgets.add( 'codeSnippet', {
-			allowedContent: 'pre; code(language-*)',
-			// Actually we need both - pre and code, but ACF does not make it possible
-			// to defire required content with "and" operator.
-			requiredContent: 'pre',
-			styleableElements: 'pre',
-			template: '<pre><code class="' + codeClass + '"></code></pre>',
-			dialog: 'codeSnippet',
-			pathName: lang.pathName,
-			mask: true,
-
-			parts: {
-				pre: 'pre',
-				code: 'code'
-			},
-
-			highlight: function() {
-				var that = this,
-					widgetData = this.data,
-					callback = function( formatted ) {
-						// IE8 (not supported browser) have issue with new line chars, when using innerHTML.
-						// It will simply strip it.
-						that.parts.code.setHtml( editor.plugins.codesnippet.isSupportedEnvironment() ?
-							formatted : formatted.replace( newLineRegex, '<br>' ) );
-					};
-
-				// Set plain code first, so even if custom handler will not call it the code will be there.
-				callback( CKEDITOR.tools.htmlEncode( widgetData.code ) );
-
-				// Call higlighter to apply its custom highlighting.
-				editor._.codesnippet.highlighter.highlight( widgetData.code, widgetData.lang, function( formatted ) {
-					editor.fire( 'lockSnapshot' );
-					callback( formatted );
-					editor.fire( 'unlockSnapshot' );
-				} );
-			},
-
-			data: function() {
-				var newData = this.data,
-					oldData = this.oldData;
-
-				if ( newData.code )
-					this.parts.code.setHtml( CKEDITOR.tools.htmlEncode( newData.code ) );
-
-				// Remove old .language-* class.
-				if ( oldData && newData.lang != oldData.lang )
-					this.parts.code.removeClass( 'language-' + oldData.lang );
-
-				// Lang needs to be specified in order to apply formatting.
-				if ( newData.lang ) {
-					// Apply new .language-* class.
-					this.parts.code.addClass( 'language-' + newData.lang );
-
-					this.highlight();
-				}
-
-				// Save oldData.
-				this.oldData = CKEDITOR.tools.copy( newData );
-			},
-
-			// Upcasts <pre><code [class="language-*"]>...</code></pre>
-			upcast: function( el, data ) {
-				if ( el.name != 'pre' )
-					return;
-
-				var childrenArray = getNonEmptyChildren( el ),
-					code;
-
-				if ( childrenArray.length != 1 || ( code = childrenArray[ 0 ] ).name != 'code' )
-					return;
-
-				// Upcast <code> with text only: https://dev.ckeditor.com/ticket/11926#comment:4
-				if ( code.children.length != 1 || code.children[ 0 ].type != CKEDITOR.NODE_TEXT )
-					return;
-
-				// Read language-* from <code> class attribute.
-				var matchResult = editor._.codesnippet.langsRegex.exec( code.attributes[ 'class' ] );
-
-				if ( matchResult )
-					data.lang = matchResult[ 1 ];
-
-				// Use textarea to decode HTML entities (https://dev.ckeditor.com/ticket/11926).
-				textarea.setHtml( code.getHtml() );
-				data.code = textarea.getValue();
-
-				code.addClass( codeClass );
-
-				return el;
-			},
-
-			// Downcasts to <pre><code [class="language-*"]>...</code></pre>
-			downcast: function( el ) {
-				var code = el.getFirst( 'code' );
-
-				// Remove pretty formatting from <code>...</code>.
-				code.children.length = 0;
-
-				// Remove config#codeSnippet_codeClass.
-				code.removeClass( codeClass );
-
-				// Set raw text inside <code>...</code>.
-				code.add( new CKEDITOR.htmlParser.text( CKEDITOR.tools.htmlEncode( this.data.code ) ) );
-
-				return el;
-			}
-		} );
-
-		// Returns an **array** of child elements, with whitespace-only text nodes
-		// filtered out.
-		// @param {CKEDITOR.htmlParser.element} parentElement
-		// @return Array - array of CKEDITOR.htmlParser.node
-		var whitespaceOnlyRegex = /^[\s\n\r]*$/;
-
-		function getNonEmptyChildren( parentElement ) {
-			var ret = [],
-				preChildrenList = parentElement.children,
-				curNode;
-
-			// Filter out empty text nodes.
-			for ( var i = preChildrenList.length - 1; i >= 0; i-- ) {
-				curNode = preChildrenList[ i ];
-
-				if ( curNode.type != CKEDITOR.NODE_TEXT || !curNode.value.match( whitespaceOnlyRegex ) )
-					ret.push( curNode );
-			}
-
-			return ret;
-		}
-	}
-} )();
-
-/**
- * A CSS class of the `<code>` element used internally for styling
- * (by default [highlight.js](https://highlightjs.org) themes, see
- * {@link CKEDITOR.config#codeSnippet_theme config.codeSnippet_theme}),
- * which means that it is **not present** in the editor output data.
- *
- *		// Changes the class to "myCustomClass".
- *		config.codeSnippet_codeClass = 'myCustomClass';
- *
- * **Note**: The class might need to be changed when you are using a custom
- * highlighter (the default is [highlight.js](https://highlightjs.org)).
- * See {@link CKEDITOR.plugins.codesnippet.highlighter} to read more.
- *
- * Read more in the {@glink features/codesnippet documentation}
- * and see the {@glink examples/codesnippet example}.
- *
- * @since 4.4.0
- * @cfg {String} [codeSnippet_codeClass='hljs']
- * @member CKEDITOR.config
- */
-CKEDITOR.config.codeSnippet_codeClass = 'hljs';
-
-/**
- * Restricts languages available in the "Code Snippet" dialog window.
- * An empty value is always added to the list.
- *
- * **Note**: If using a custom highlighter library (the default is [highlight.js](https://highlightjs.org)),
- * you may need to refer to external documentation to set `config.codeSnippet_languages` properly.
- *
- * Read more in the {@glink features/codesnippet#changing-supported-languages documentation}
- * and see the {@glink examples/codesnippet example}.
- *
- *		// Restricts languages to JavaScript and PHP.
- *		config.codeSnippet_languages = {
- *			javascript: 'JavaScript',
- *			php: 'PHP'
- *		};
- *
- * @since 4.4.0
- * @cfg {Object} [codeSnippet_languages=null]
- * @member CKEDITOR.config
- */
-
-/**
- * A theme used to render code snippets. See [available themes](https://highlightjs.org/static/demo/).
- *
- * **Note**: This will only work with the default highlighter
- * ([highlight.js](https://highlightjs.org/static/demo/)).
- *
- * Read more in the {@glink features/codesnippet#changing-highlighter-theme documentation}
- * and see the {@glink examples/codesnippet example}.
- *
- *		// Changes the theme to "pojoaque".
- *		config.codeSnippet_theme = 'pojoaque';
- *
- * @since 4.4.0
- * @cfg {String} [codeSnippet_theme='default']
- * @member CKEDITOR.config
- */
-CKEDITOR.config.codeSnippet_theme = 'default';
diff --git a/web/libraries/codesnippet/samples/codesnippet.html b/web/libraries/codesnippet/samples/codesnippet.html
deleted file mode 100644
index 9d22b7cea09a8f7dda8b4baaf03ed9ecfc7982dd..0000000000000000000000000000000000000000
--- a/web/libraries/codesnippet/samples/codesnippet.html
+++ /dev/null
@@ -1,239 +0,0 @@
-<!DOCTYPE html>
-<!--
-Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved.
-For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license
--->
-<html lang="en">
-<head>
-	<meta charset="utf-8">
-	<title>Code Snippet &mdash; CKEditor Sample</title>
-	<script src="../../../ckeditor.js"></script>
-	<link href="../../../samples/old/sample.css" rel="stylesheet">
-	<!-- %REMOVE_LINE%
-	<link href="../../../plugins/codesnippet/lib/highlight/styles/monokai_sublime.css" rel="stylesheet">
-	%REMOVE_LINE% -->
-	<link href="../lib/highlight/styles/monokai_sublime.css" rel="stylesheet"><!-- %REMOVE_LINE% -->
-	<meta name="ckeditor-sample-name" content="Code Snippet plugin">
-	<meta name="ckeditor-sample-group" content="Plugins">
-	<meta name="ckeditor-sample-description" content="View and modify code using the Code Snippet plugin.">
-	<meta name="ckeditor-sample-isnew" content="1">
-	<meta name="description" content="Try the latest sample of CKEditor 4 and learn more about customizing your WYSIWYG editor with endless possibilities.">
-	<style>
-
-		#editable
-		{
-			padding: 10px 20px;
-		}
-
-	</style>
-</head>
-<body>
-	<h1 class="samples">
-		<a href="../../../samples/old/index.html">CKEditor Samples</a> &raquo; Code Snippet Plugin
-	</h1>
-	<div class="warning deprecated">
-		This sample is not maintained anymore. Check out its <a href="https://ckeditor.com/docs/ckeditor4/latest/examples/codesnippet.html">brand new version in CKEditor Examples</a>.
-	</div>
-
-	<div class="description">
-		<p>
-			This editor is using the <strong><a href="https://ckeditor.com/cke4/addon/codesnippet">Code Snippet</a></strong> plugin which introduces beautiful code snippets.
-			By default the <code>codesnippet</code> plugin depends on the built-in client-side syntax highlighting
-			library <a href="https://highlightjs.org">highlight.js</a>.
-		</p>
-		<p>
-			You can adjust the appearance of code snippets using the <code><a href="https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_config.html#cfg-codeSnippet_theme">codeSnippet_theme</a></code> configuration variable
-			(see <a href="https://highlightjs.org/static/demo/">available themes</a>).
-		</p>
-		<p>
-			Select theme: <select id="select"></select>
-		</p>
-		<p>
-			The CKEditor instance below was created by using the following configuration settings:
-		</p>
-
-<pre class="samples" id="sampleConfig">
-CKEDITOR.replace( 'editor1', {
-	<strong>extraPlugins: 'codesnippet',</strong>
-	codeSnippet_theme: 'monokai_sublime'
-} );
-</pre>
-
-		<p id="ie8-warning">
-			Please note that this plugin is not compatible with Internet Explorer 8.
-		</p>
-	</div>
-
-	<textarea id="editor1">
-&lt;p&gt;JavaScript code:&lt;/p&gt;
-
-&lt;pre&gt;
-&lt;code class="language-javascript"&gt;function isEmpty( object ) {
-	for ( var i in object ) {
-		if ( object.hasOwnProperty( i ) )
-			return false;
-	}
-	return true;
-}&lt;/code&gt;&lt;/pre&gt;
-
-&lt;p&gt;SQL query:&lt;/p&gt;
-
-&lt;pre&gt;
-&lt;code class="language-sql"&gt;SELECT cust.id FROM cust LEFT JOIN loc ON ( cust.loc_id = loc.id ) WHERE cust.type IN ( 1, 2 );&lt;/code&gt;&lt;/pre&gt;
-
-&lt;p&gt;Unknown markup:&lt;/p&gt;
-
-&lt;pre&gt;
-&lt;code&gt; ________________
-/                \
-| How about moo? |  ^__^
-\________________/  (oo)\_______
-                  \ (__)\       )\/\
-                        ||----w |
-                        ||     ||
-&lt;/code&gt;&lt;/pre&gt;
-	</textarea>
-
-	<h2>Inline editor</h2>
-
-	<div class="description">
-		<p>
-			The following sample shows the <strong>Code Snippet</strong> plugin running inside
-			an inline CKEditor instance. The CKEditor instance below was created by using the following configuration settings:
-		</p>
-
-<pre class="samples">
-CKEDITOR.inline( 'editable', {
-	<strong>extraPlugins: 'codesnippet'</strong>
-} );
-</pre>
-
-		<p>
-			<strong>Note</strong>: The <a href="https://highlightjs.org/static/demo/">highlight.js themes</a>
-			must be loaded manually to be applied inside an inline editor instance, as the
-			<code>codeSnippet_theme</code> setting will not work in that case.
-			You need to include the stylesheet in the <code>&lt;head&gt;</code> section of the page, for example:
-		</p>
-
-<pre class="samples">
-&lt;head&gt;
-	...
-	&lt;link href="path/to/highlight.js/styles/monokai_sublime.css" rel="stylesheet"&gt;
-&lt;/head&gt;
-</pre>
-
-	</div>
-
-	<div id="editable" contenteditable="true">
-
-<p>JavaScript code:</p>
-
-<pre><code class="language-javascript">function isEmpty( object ) {
-	for ( var i in object ) {
-		if ( object.hasOwnProperty( i ) )
-			return false;
-	}
-	return true;
-}</code></pre>
-
-<p>SQL query:</p>
-
-<pre><code class="language-sql">SELECT cust.id, cust.name, loc.city FROM cust LEFT JOIN loc ON ( cust.loc_id = loc.id ) WHERE cust.type IN ( 1, 2 );</code></pre>
-
-<p>Unknown markup:</p>
-
-<pre><code> ________________
-/                \
-| How about moo? |  ^__^
-\________________/  (oo)\_______
-                  \ (__)\       )\/\
-                        ||----w |
-                        ||     ||
-</code></pre>
-	</div>
-
-	<h2>Server-side Highlighting and Custom Highlighting Engines</h2>
-
-	<p>
-		The <a href="https://ckeditor.com/cke4/addon/codesnippetgeshi"><strong>Code Snippet GeSHi</strong></a> plugin is an
-		extension of the <strong>Code Snippet</strong> plugin which uses a server-side highligter.
-	</p>
-
-	<p>
-		It also is possible to replace the default highlighter with any library using
-		the <a href="https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_plugins_codesnippet_highlighter.html">Highlighter API</a>
-		and the <a href="https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_plugins_codesnippet.html#method-setHighlighter"><code>editor.plugins.codesnippet.setHighlighter()</code></a> method.
-	</p>
-
-	<script>
-		( function() {
-			CKEDITOR.disableAutoInline = true;
-
-			var config = {
-				extraPlugins: 'codesnippet',
-				toolbar: [
-					[ 'Source' ], [ 'Undo', 'Redo' ], [ 'Bold', 'Italic', 'Underline' ], [ 'CodeSnippet' ]
-				],
-				codeSnippet_theme: 'monokai_sublime',
-				height: 400
-			};
-
-			CKEDITOR.replace( 'editor1', config );
-
-			CKEDITOR.inline( 'editable', CKEDITOR.tools.extend( {}, config, {
-				extraPlugins: 'codesnippet'
-			}, true ) );
-
-			initThemeChange();
-
-			function initThemeChange() {
-				var templates = [
-						'monokai_sublime', 'default', 'arta', 'ascetic', 'atelier-dune.dark', 'atelier-dune.light', 'atelier-forest.dark', 'atelier-forest.light', 'atelier-heath.dark', 'atelier-heath.light', 'atelier-lakeside.dark', 'atelier-lakeside.light', 'atelier-seaside.dark', 'atelier-seaside.light', 'brown_paper', 'dark', 'docco', 'far', 'foundation', 'github', 'googlecode', 'idea', 'ir_black', 'magula', 'mono-blue', 'monokai', 'obsidian', 'paraiso.dark', 'paraiso.light', 'pojoaque', 'railscasts', 'rainbow', 'school_book', 'solarized_dark', 'solarized_light', 'sunburst', 'tomorrow-night-blue', 'tomorrow-night-bright', 'tomorrow-night-eighties', 'tomorrow-night', 'tomorrow', 'vs', 'xcode', 'zenburn'
-					],
-					pre = CKEDITOR.document.getById( 'sampleConfig' ),
-					select = CKEDITOR.document.getById( 'select' ),
-					codeTemplate = 'CKEDITOR.replace( \'editor1\', {\n' +
-						'	<strong>extraPlugins: \'codesnippet\',</strong>\n' +
-						'	codeSnippet_theme: \'{tpl}\'\n' +
-					'} );',
-					name, option;
-
-				while ( ( name = templates.shift() ) ) {
-					option = CKEDITOR.document.createElement( 'option', {
-						attributes: {
-							value: name
-						}
-					} );
-
-					option.setText( name );
-					select.append( option );
-				}
-
-				select.$.onchange = function() {
-					if ( CKEDITOR.instances.editor1 )
-						CKEDITOR.instances.editor1.destroy();
-
-					CKEDITOR.replace( 'editor1', CKEDITOR.tools.extend( {}, config, {
-						codeSnippet_theme: this.value
-					}, true ) );
-
-					pre.setHtml( codeTemplate.replace( '{tpl}', this.value ) );
-				};
-			}
-
-			if ( CKEDITOR.env.ie && CKEDITOR.env.version == 8 )
-				CKEDITOR.document.getById( 'ie8-warning' ).addClass( 'warning' );
-		}() );
-	</script>
-
-	<div id="footer">
-		<hr>
-		<p>
-			CKEditor - The text editor for the Internet - <a class="samples" href="https://ckeditor.com/">https://ckeditor.com</a>
-		</p>
-		<p id="copy">
-			Copyright &copy; 2003-2022, <a class="samples" href="https://cksource.com/">CKSource</a> Holding sp. z o.o. All rights reserved.
-		</p>
-	</div>
-</body>
-</html>
diff --git a/web/libraries/jquery.cycle/jquery.cycle.all.js b/web/libraries/jquery.cycle/jquery.cycle.all.js
deleted file mode 100644
index dc474ea0cb1da920daef85dfeae13c0ba706daff..0000000000000000000000000000000000000000
--- a/web/libraries/jquery.cycle/jquery.cycle.all.js
+++ /dev/null
@@ -1,1543 +0,0 @@
-/*!
- * jQuery Cycle Plugin (with Transition Definitions)
- * Examples and documentation at: http://jquery.malsup.com/cycle/
- * Copyright (c) 2007-2013 M. Alsup
- * Version: 3.0.3 (11-JUL-2013)
- * Dual licensed under the MIT and GPL licenses.
- * http://jquery.malsup.com/license.html
- * Requires: jQuery v1.7.1 or later
- */
-;(function($, undefined) {
-"use strict";
-
-var ver = '3.0.3';
-
-function debug(s) {
-	if ($.fn.cycle.debug)
-		log(s);
-}		
-function log() {
-	/*global console */
-	if (window.console && console.log)
-		console.log('[cycle] ' + Array.prototype.join.call(arguments,' '));
-}
-$.expr[':'].paused = function(el) {
-	return el.cyclePause;
-};
-
-
-// the options arg can be...
-//   a number  - indicates an immediate transition should occur to the given slide index
-//   a string  - 'pause', 'resume', 'toggle', 'next', 'prev', 'stop', 'destroy' or the name of a transition effect (ie, 'fade', 'zoom', etc)
-//   an object - properties to control the slideshow
-//
-// the arg2 arg can be...
-//   the name of an fx (only used in conjunction with a numeric value for 'options')
-//   the value true (only used in first arg == 'resume') and indicates
-//	 that the resume should occur immediately (not wait for next timeout)
-
-$.fn.cycle = function(options, arg2) {
-	var o = { s: this.selector, c: this.context };
-
-	// in 1.3+ we can fix mistakes with the ready state
-	if (this.length === 0 && options != 'stop') {
-		if (!$.isReady && o.s) {
-			log('DOM not ready, queuing slideshow');
-			$(function() {
-				$(o.s,o.c).cycle(options,arg2);
-			});
-			return this;
-		}
-		// is your DOM ready?  http://docs.jquery.com/Tutorials:Introducing_$(document).ready()
-		log('terminating; zero elements found by selector' + ($.isReady ? '' : ' (DOM not ready)'));
-		return this;
-	}
-
-	// iterate the matched nodeset
-	return this.each(function() {
-		var opts = handleArguments(this, options, arg2);
-		if (opts === false)
-			return;
-
-		opts.updateActivePagerLink = opts.updateActivePagerLink || $.fn.cycle.updateActivePagerLink;
-		
-		// stop existing slideshow for this container (if there is one)
-		if (this.cycleTimeout)
-			clearTimeout(this.cycleTimeout);
-		this.cycleTimeout = this.cyclePause = 0;
-		this.cycleStop = 0; // issue #108
-
-		var $cont = $(this);
-		var $slides = opts.slideExpr ? $(opts.slideExpr, this) : $cont.children();
-		var els = $slides.get();
-
-		if (els.length < 2) {
-			log('terminating; too few slides: ' + els.length);
-			return;
-		}
-
-		var opts2 = buildOptions($cont, $slides, els, opts, o);
-		if (opts2 === false)
-			return;
-
-		var startTime = opts2.continuous ? 10 : getTimeout(els[opts2.currSlide], els[opts2.nextSlide], opts2, !opts2.backwards);
-
-		// if it's an auto slideshow, kick it off
-		if (startTime) {
-			startTime += (opts2.delay || 0);
-			if (startTime < 10)
-				startTime = 10;
-			debug('first timeout: ' + startTime);
-			this.cycleTimeout = setTimeout(function(){go(els,opts2,0,!opts.backwards);}, startTime);
-		}
-	});
-};
-
-function triggerPause(cont, byHover, onPager) {
-	var opts = $(cont).data('cycle.opts');
-	if (!opts)
-		return;
-	var paused = !!cont.cyclePause;
-	if (paused && opts.paused)
-		opts.paused(cont, opts, byHover, onPager);
-	else if (!paused && opts.resumed)
-		opts.resumed(cont, opts, byHover, onPager);
-}
-
-// process the args that were passed to the plugin fn
-function handleArguments(cont, options, arg2) {
-	if (cont.cycleStop === undefined)
-		cont.cycleStop = 0;
-	if (options === undefined || options === null)
-		options = {};
-	if (options.constructor == String) {
-		switch(options) {
-		case 'destroy':
-		case 'stop':
-			var opts = $(cont).data('cycle.opts');
-			if (!opts)
-				return false;
-			cont.cycleStop++; // callbacks look for change
-			if (cont.cycleTimeout)
-				clearTimeout(cont.cycleTimeout);
-			cont.cycleTimeout = 0;
-			if (opts.elements)
-				$(opts.elements).stop();
-			$(cont).removeData('cycle.opts');
-			if (options == 'destroy')
-				destroy(cont, opts);
-			return false;
-		case 'toggle':
-			cont.cyclePause = (cont.cyclePause === 1) ? 0 : 1;
-			checkInstantResume(cont.cyclePause, arg2, cont);
-			triggerPause(cont);
-			return false;
-		case 'pause':
-			cont.cyclePause = 1;
-			triggerPause(cont);
-			return false;
-		case 'resume':
-			cont.cyclePause = 0;
-			checkInstantResume(false, arg2, cont);
-			triggerPause(cont);
-			return false;
-		case 'prev':
-		case 'next':
-			opts = $(cont).data('cycle.opts');
-			if (!opts) {
-				log('options not found, "prev/next" ignored');
-				return false;
-			}
-			if (typeof arg2 == 'string') 
-				opts.oneTimeFx = arg2;
-			$.fn.cycle[options](opts);
-			return false;
-		default:
-			options = { fx: options };
-		}
-		return options;
-	}
-	else if (options.constructor == Number) {
-		// go to the requested slide
-		var num = options;
-		options = $(cont).data('cycle.opts');
-		if (!options) {
-			log('options not found, can not advance slide');
-			return false;
-		}
-		if (num < 0 || num >= options.elements.length) {
-			log('invalid slide index: ' + num);
-			return false;
-		}
-		options.nextSlide = num;
-		if (cont.cycleTimeout) {
-			clearTimeout(cont.cycleTimeout);
-			cont.cycleTimeout = 0;
-		}
-		if (typeof arg2 == 'string')
-			options.oneTimeFx = arg2;
-		go(options.elements, options, 1, num >= options.currSlide);
-		return false;
-	}
-	return options;
-	
-	function checkInstantResume(isPaused, arg2, cont) {
-		if (!isPaused && arg2 === true) { // resume now!
-			var options = $(cont).data('cycle.opts');
-			if (!options) {
-				log('options not found, can not resume');
-				return false;
-			}
-			if (cont.cycleTimeout) {
-				clearTimeout(cont.cycleTimeout);
-				cont.cycleTimeout = 0;
-			}
-			go(options.elements, options, 1, !options.backwards);
-		}
-	}
-}
-
-function removeFilter(el, opts) {
-	if (!$.support.opacity && opts.cleartype && el.style.filter) {
-		try { el.style.removeAttribute('filter'); }
-		catch(smother) {} // handle old opera versions
-	}
-}
-
-// unbind event handlers
-function destroy(cont, opts) {
-	if (opts.next)
-		$(opts.next).unbind(opts.prevNextEvent);
-	if (opts.prev)
-		$(opts.prev).unbind(opts.prevNextEvent);
-	
-	if (opts.pager || opts.pagerAnchorBuilder)
-		$.each(opts.pagerAnchors || [], function() {
-			this.unbind().remove();
-		});
-	opts.pagerAnchors = null;
-	$(cont).unbind('mouseenter.cycle mouseleave.cycle');
-	if (opts.destroy) // callback
-		opts.destroy(opts);
-}
-
-// one-time initialization
-function buildOptions($cont, $slides, els, options, o) {
-	var startingSlideSpecified;
-	// support metadata plugin (v1.0 and v2.0)
-	var opts = $.extend({}, $.fn.cycle.defaults, options || {}, $.metadata ? $cont.metadata() : $.meta ? $cont.data() : {});
-	var meta = $.isFunction($cont.data) ? $cont.data(opts.metaAttr) : null;
-	if (meta)
-		opts = $.extend(opts, meta);
-	if (opts.autostop)
-		opts.countdown = opts.autostopCount || els.length;
-
-	var cont = $cont[0];
-	$cont.data('cycle.opts', opts);
-	opts.$cont = $cont;
-	opts.stopCount = cont.cycleStop;
-	opts.elements = els;
-	opts.before = opts.before ? [opts.before] : [];
-	opts.after = opts.after ? [opts.after] : [];
-
-	// push some after callbacks
-	if (!$.support.opacity && opts.cleartype)
-		opts.after.push(function() { removeFilter(this, opts); });
-	if (opts.continuous)
-		opts.after.push(function() { go(els,opts,0,!opts.backwards); });
-
-	saveOriginalOpts(opts);
-
-	// clearType corrections
-	if (!$.support.opacity && opts.cleartype && !opts.cleartypeNoBg)
-		clearTypeFix($slides);
-
-	// container requires non-static position so that slides can be position within
-	if ($cont.css('position') == 'static')
-		$cont.css('position', 'relative');
-	if (opts.width)
-		$cont.width(opts.width);
-	if (opts.height && opts.height != 'auto')
-		$cont.height(opts.height);
-
-	if (opts.startingSlide !== undefined) {
-		opts.startingSlide = parseInt(opts.startingSlide,10);
-		if (opts.startingSlide >= els.length || opts.startSlide < 0)
-			opts.startingSlide = 0; // catch bogus input
-		else 
-			startingSlideSpecified = true;
-	}
-	else if (opts.backwards)
-		opts.startingSlide = els.length - 1;
-	else
-		opts.startingSlide = 0;
-
-	// if random, mix up the slide array
-	if (opts.random) {
-		opts.randomMap = [];
-		for (var i = 0; i < els.length; i++)
-			opts.randomMap.push(i);
-		opts.randomMap.sort(function(a,b) {return Math.random() - 0.5;});
-		if (startingSlideSpecified) {
-			// try to find the specified starting slide and if found set start slide index in the map accordingly
-			for ( var cnt = 0; cnt < els.length; cnt++ ) {
-				if ( opts.startingSlide == opts.randomMap[cnt] ) {
-					opts.randomIndex = cnt;
-				}
-			}
-		}
-		else {
-			opts.randomIndex = 1;
-			opts.startingSlide = opts.randomMap[1];
-		}
-	}
-	else if (opts.startingSlide >= els.length)
-		opts.startingSlide = 0; // catch bogus input
-	opts.currSlide = opts.startingSlide || 0;
-	var first = opts.startingSlide;
-
-	// set position and zIndex on all the slides
-	$slides.css({position: 'absolute', top:0, left:0}).hide().each(function(i) {
-		var z;
-		if (opts.backwards)
-			z = first ? i <= first ? els.length + (i-first) : first-i : els.length-i;
-		else
-			z = first ? i >= first ? els.length - (i-first) : first-i : els.length-i;
-		$(this).css('z-index', z);
-	});
-
-	// make sure first slide is visible
-	$(els[first]).css('opacity',1).show(); // opacity bit needed to handle restart use case
-	removeFilter(els[first], opts);
-
-	// stretch slides
-	if (opts.fit) {
-		if (!opts.aspect) {
-	        if (opts.width)
-	            $slides.width(opts.width);
-	        if (opts.height && opts.height != 'auto')
-	            $slides.height(opts.height);
-		} else {
-			$slides.each(function(){
-				var $slide = $(this);
-				var ratio = (opts.aspect === true) ? $slide.width()/$slide.height() : opts.aspect;
-				if( opts.width && $slide.width() != opts.width ) {
-					$slide.width( opts.width );
-					$slide.height( opts.width / ratio );
-				}
-
-				if( opts.height && $slide.height() < opts.height ) {
-					$slide.height( opts.height );
-					$slide.width( opts.height * ratio );
-				}
-			});
-		}
-	}
-
-	if (opts.center && ((!opts.fit) || opts.aspect)) {
-		$slides.each(function(){
-			var $slide = $(this);
-			$slide.css({
-				"margin-left": opts.width ?
-					((opts.width - $slide.width()) / 2) + "px" :
-					0,
-				"margin-top": opts.height ?
-					((opts.height - $slide.height()) / 2) + "px" :
-					0
-			});
-		});
-	}
-
-	if (opts.center && !opts.fit && !opts.slideResize) {
-		$slides.each(function(){
-			var $slide = $(this);
-			$slide.css({
-				"margin-left": opts.width ? ((opts.width - $slide.width()) / 2) + "px" : 0,
-				"margin-top": opts.height ? ((opts.height - $slide.height()) / 2) + "px" : 0
-			});
-		});
-	}
-		
-	// stretch container
-	var reshape = (opts.containerResize || opts.containerResizeHeight) && $cont.innerHeight() < 1;
-	if (reshape) { // do this only if container has no size http://tinyurl.com/da2oa9
-		var maxw = 0, maxh = 0;
-		for(var j=0; j < els.length; j++) {
-			var $e = $(els[j]), e = $e[0], w = $e.outerWidth(), h = $e.outerHeight();
-			if (!w) w = e.offsetWidth || e.width || $e.attr('width');
-			if (!h) h = e.offsetHeight || e.height || $e.attr('height');
-			maxw = w > maxw ? w : maxw;
-			maxh = h > maxh ? h : maxh;
-		}
-		if (opts.containerResize && maxw > 0 && maxh > 0)
-			$cont.css({width:maxw+'px',height:maxh+'px'});
-		if (opts.containerResizeHeight && maxh > 0)
-			$cont.css({height:maxh+'px'});
-	}
-
-	var pauseFlag = false;  // https://github.com/malsup/cycle/issues/44
-	if (opts.pause)
-		$cont.bind('mouseenter.cycle', function(){
-			pauseFlag = true;
-			this.cyclePause++;
-			triggerPause(cont, true);
-		}).bind('mouseleave.cycle', function(){
-				if (pauseFlag)
-					this.cyclePause--;
-				triggerPause(cont, true);
-		});
-
-	if (supportMultiTransitions(opts) === false)
-		return false;
-
-	// apparently a lot of people use image slideshows without height/width attributes on the images.
-	// Cycle 2.50+ requires the sizing info for every slide; this block tries to deal with that.
-	var requeue = false;
-	options.requeueAttempts = options.requeueAttempts || 0;
-	$slides.each(function() {
-		// try to get height/width of each slide
-		var $el = $(this);
-		this.cycleH = (opts.fit && opts.height) ? opts.height : ($el.height() || this.offsetHeight || this.height || $el.attr('height') || 0);
-		this.cycleW = (opts.fit && opts.width) ? opts.width : ($el.width() || this.offsetWidth || this.width || $el.attr('width') || 0);
-
-		if ( $el.is('img') ) {
-			var loading = (this.cycleH === 0 && this.cycleW === 0 && !this.complete);
-			// don't requeue for images that are still loading but have a valid size
-			if (loading) {
-				if (o.s && opts.requeueOnImageNotLoaded && ++options.requeueAttempts < 100) { // track retry count so we don't loop forever
-					log(options.requeueAttempts,' - img slide not loaded, requeuing slideshow: ', this.src, this.cycleW, this.cycleH);
-					setTimeout(function() {$(o.s,o.c).cycle(options);}, opts.requeueTimeout);
-					requeue = true;
-					return false; // break each loop
-				}
-				else {
-					log('could not determine size of image: '+this.src, this.cycleW, this.cycleH);
-				}
-			}
-		}
-		return true;
-	});
-
-	if (requeue)
-		return false;
-
-	opts.cssBefore = opts.cssBefore || {};
-	opts.cssAfter = opts.cssAfter || {};
-	opts.cssFirst = opts.cssFirst || {};
-	opts.animIn = opts.animIn || {};
-	opts.animOut = opts.animOut || {};
-
-	$slides.not(':eq('+first+')').css(opts.cssBefore);
-	$($slides[first]).css(opts.cssFirst);
-
-	if (opts.timeout) {
-		opts.timeout = parseInt(opts.timeout,10);
-		// ensure that timeout and speed settings are sane
-		if (opts.speed.constructor == String)
-			opts.speed = $.fx.speeds[opts.speed] || parseInt(opts.speed,10);
-		if (!opts.sync)
-			opts.speed = opts.speed / 2;
-		
-		var buffer = opts.fx == 'none' ? 0 : opts.fx == 'shuffle' ? 500 : 250;
-		while((opts.timeout - opts.speed) < buffer) // sanitize timeout
-			opts.timeout += opts.speed;
-	}
-	if (opts.easing)
-		opts.easeIn = opts.easeOut = opts.easing;
-	if (!opts.speedIn)
-		opts.speedIn = opts.speed;
-	if (!opts.speedOut)
-		opts.speedOut = opts.speed;
-
-	opts.slideCount = els.length;
-	opts.currSlide = opts.lastSlide = first;
-	if (opts.random) {
-		if (++opts.randomIndex == els.length)
-			opts.randomIndex = 0;
-		opts.nextSlide = opts.randomMap[opts.randomIndex];
-	}
-	else if (opts.backwards)
-		opts.nextSlide = opts.startingSlide === 0 ? (els.length-1) : opts.startingSlide-1;
-	else
-		opts.nextSlide = opts.startingSlide >= (els.length-1) ? 0 : opts.startingSlide+1;
-
-	// run transition init fn
-	if (!opts.multiFx) {
-		var init = $.fn.cycle.transitions[opts.fx];
-		if ($.isFunction(init))
-			init($cont, $slides, opts);
-		else if (opts.fx != 'custom' && !opts.multiFx) {
-			log('unknown transition: ' + opts.fx,'; slideshow terminating');
-			return false;
-		}
-	}
-
-	// fire artificial events
-	var e0 = $slides[first];
-	if (!opts.skipInitializationCallbacks) {
-		if (opts.before.length)
-			opts.before[0].apply(e0, [e0, e0, opts, true]);
-		if (opts.after.length)
-			opts.after[0].apply(e0, [e0, e0, opts, true]);
-	}
-	if (opts.next)
-		$(opts.next).bind(opts.prevNextEvent,function(){return advance(opts,1);});
-	if (opts.prev)
-		$(opts.prev).bind(opts.prevNextEvent,function(){return advance(opts,0);});
-	if (opts.pager || opts.pagerAnchorBuilder)
-		buildPager(els,opts);
-
-	exposeAddSlide(opts, els);
-
-	return opts;
-}
-
-// save off original opts so we can restore after clearing state
-function saveOriginalOpts(opts) {
-	opts.original = { before: [], after: [] };
-	opts.original.cssBefore = $.extend({}, opts.cssBefore);
-	opts.original.cssAfter  = $.extend({}, opts.cssAfter);
-	opts.original.animIn	= $.extend({}, opts.animIn);
-	opts.original.animOut   = $.extend({}, opts.animOut);
-	$.each(opts.before, function() { opts.original.before.push(this); });
-	$.each(opts.after,  function() { opts.original.after.push(this); });
-}
-
-function supportMultiTransitions(opts) {
-	var i, tx, txs = $.fn.cycle.transitions;
-	// look for multiple effects
-	if (opts.fx.indexOf(',') > 0) {
-		opts.multiFx = true;
-		opts.fxs = opts.fx.replace(/\s*/g,'').split(',');
-		// discard any bogus effect names
-		for (i=0; i < opts.fxs.length; i++) {
-			var fx = opts.fxs[i];
-			tx = txs[fx];
-			if (!tx || !txs.hasOwnProperty(fx) || !$.isFunction(tx)) {
-				log('discarding unknown transition: ',fx);
-				opts.fxs.splice(i,1);
-				i--;
-			}
-		}
-		// if we have an empty list then we threw everything away!
-		if (!opts.fxs.length) {
-			log('No valid transitions named; slideshow terminating.');
-			return false;
-		}
-	}
-	else if (opts.fx == 'all') {  // auto-gen the list of transitions
-		opts.multiFx = true;
-		opts.fxs = [];
-		for (var p in txs) {
-			if (txs.hasOwnProperty(p)) {
-				tx = txs[p];
-				if (txs.hasOwnProperty(p) && $.isFunction(tx))
-					opts.fxs.push(p);
-			}
-		}
-	}
-	if (opts.multiFx && opts.randomizeEffects) {
-		// munge the fxs array to make effect selection random
-		var r1 = Math.floor(Math.random() * 20) + 30;
-		for (i = 0; i < r1; i++) {
-			var r2 = Math.floor(Math.random() * opts.fxs.length);
-			opts.fxs.push(opts.fxs.splice(r2,1)[0]);
-		}
-		debug('randomized fx sequence: ',opts.fxs);
-	}
-	return true;
-}
-
-// provide a mechanism for adding slides after the slideshow has started
-function exposeAddSlide(opts, els) {
-	opts.addSlide = function(newSlide, prepend) {
-		var $s = $(newSlide), s = $s[0];
-		if (!opts.autostopCount)
-			opts.countdown++;
-		els[prepend?'unshift':'push'](s);
-		if (opts.els)
-			opts.els[prepend?'unshift':'push'](s); // shuffle needs this
-		opts.slideCount = els.length;
-
-		// add the slide to the random map and resort
-		if (opts.random) {
-			opts.randomMap.push(opts.slideCount-1);
-			opts.randomMap.sort(function(a,b) {return Math.random() - 0.5;});
-		}
-
-		$s.css('position','absolute');
-		$s[prepend?'prependTo':'appendTo'](opts.$cont);
-
-		if (prepend) {
-			opts.currSlide++;
-			opts.nextSlide++;
-		}
-
-		if (!$.support.opacity && opts.cleartype && !opts.cleartypeNoBg)
-			clearTypeFix($s);
-
-		if (opts.fit && opts.width)
-			$s.width(opts.width);
-		if (opts.fit && opts.height && opts.height != 'auto')
-			$s.height(opts.height);
-		s.cycleH = (opts.fit && opts.height) ? opts.height : $s.height();
-		s.cycleW = (opts.fit && opts.width) ? opts.width : $s.width();
-
-		$s.css(opts.cssBefore);
-
-		if (opts.pager || opts.pagerAnchorBuilder)
-			$.fn.cycle.createPagerAnchor(els.length-1, s, $(opts.pager), els, opts);
-
-		if ($.isFunction(opts.onAddSlide))
-			opts.onAddSlide($s);
-		else
-			$s.hide(); // default behavior
-	};
-}
-
-// reset internal state; we do this on every pass in order to support multiple effects
-$.fn.cycle.resetState = function(opts, fx) {
-	fx = fx || opts.fx;
-	opts.before = []; opts.after = [];
-	opts.cssBefore = $.extend({}, opts.original.cssBefore);
-	opts.cssAfter  = $.extend({}, opts.original.cssAfter);
-	opts.animIn	= $.extend({}, opts.original.animIn);
-	opts.animOut   = $.extend({}, opts.original.animOut);
-	opts.fxFn = null;
-	$.each(opts.original.before, function() { opts.before.push(this); });
-	$.each(opts.original.after,  function() { opts.after.push(this); });
-
-	// re-init
-	var init = $.fn.cycle.transitions[fx];
-	if ($.isFunction(init))
-		init(opts.$cont, $(opts.elements), opts);
-};
-
-// this is the main engine fn, it handles the timeouts, callbacks and slide index mgmt
-function go(els, opts, manual, fwd) {
-	var p = opts.$cont[0], curr = els[opts.currSlide], next = els[opts.nextSlide];
-
-	// opts.busy is true if we're in the middle of an animation
-	if (manual && opts.busy && opts.manualTrump) {
-		// let manual transitions requests trump active ones
-		debug('manualTrump in go(), stopping active transition');
-		$(els).stop(true,true);
-		opts.busy = 0;
-		clearTimeout(p.cycleTimeout);
-	}
-
-	// don't begin another timeout-based transition if there is one active
-	if (opts.busy) {
-		debug('transition active, ignoring new tx request');
-		return;
-	}
-
-
-	// stop cycling if we have an outstanding stop request
-	if (p.cycleStop != opts.stopCount || p.cycleTimeout === 0 && !manual)
-		return;
-
-	// check to see if we should stop cycling based on autostop options
-	if (!manual && !p.cyclePause && !opts.bounce &&
-		((opts.autostop && (--opts.countdown <= 0)) ||
-		(opts.nowrap && !opts.random && opts.nextSlide < opts.currSlide))) {
-		if (opts.end)
-			opts.end(opts);
-		return;
-	}
-
-	// if slideshow is paused, only transition on a manual trigger
-	var changed = false;
-	if ((manual || !p.cyclePause) && (opts.nextSlide != opts.currSlide)) {
-		changed = true;
-		var fx = opts.fx;
-		// keep trying to get the slide size if we don't have it yet
-		curr.cycleH = curr.cycleH || $(curr).height();
-		curr.cycleW = curr.cycleW || $(curr).width();
-		next.cycleH = next.cycleH || $(next).height();
-		next.cycleW = next.cycleW || $(next).width();
-
-		// support multiple transition types
-		if (opts.multiFx) {
-			if (fwd && (opts.lastFx === undefined || ++opts.lastFx >= opts.fxs.length))
-				opts.lastFx = 0;
-			else if (!fwd && (opts.lastFx === undefined || --opts.lastFx < 0))
-				opts.lastFx = opts.fxs.length - 1;
-			fx = opts.fxs[opts.lastFx];
-		}
-
-		// one-time fx overrides apply to:  $('div').cycle(3,'zoom');
-		if (opts.oneTimeFx) {
-			fx = opts.oneTimeFx;
-			opts.oneTimeFx = null;
-		}
-
-		$.fn.cycle.resetState(opts, fx);
-
-		// run the before callbacks
-		if (opts.before.length)
-			$.each(opts.before, function(i,o) {
-				if (p.cycleStop != opts.stopCount) return;
-				o.apply(next, [curr, next, opts, fwd]);
-			});
-
-		// stage the after callacks
-		var after = function() {
-			opts.busy = 0;
-			$.each(opts.after, function(i,o) {
-				if (p.cycleStop != opts.stopCount) return;
-				o.apply(next, [curr, next, opts, fwd]);
-			});
-			if (!p.cycleStop) {
-				// queue next transition
-				queueNext();
-			}
-		};
-
-		debug('tx firing('+fx+'); currSlide: ' + opts.currSlide + '; nextSlide: ' + opts.nextSlide);
-		
-		// get ready to perform the transition
-		opts.busy = 1;
-		if (opts.fxFn) // fx function provided?
-			opts.fxFn(curr, next, opts, after, fwd, manual && opts.fastOnEvent);
-		else if ($.isFunction($.fn.cycle[opts.fx])) // fx plugin ?
-			$.fn.cycle[opts.fx](curr, next, opts, after, fwd, manual && opts.fastOnEvent);
-		else
-			$.fn.cycle.custom(curr, next, opts, after, fwd, manual && opts.fastOnEvent);
-	}
-	else {
-		queueNext();
-	}
-
-	if (changed || opts.nextSlide == opts.currSlide) {
-		// calculate the next slide
-		var roll;
-		opts.lastSlide = opts.currSlide;
-		if (opts.random) {
-			opts.currSlide = opts.nextSlide;
-			if (++opts.randomIndex == els.length) {
-				opts.randomIndex = 0;
-				opts.randomMap.sort(function(a,b) {return Math.random() - 0.5;});
-			}
-			opts.nextSlide = opts.randomMap[opts.randomIndex];
-			if (opts.nextSlide == opts.currSlide)
-				opts.nextSlide = (opts.currSlide == opts.slideCount - 1) ? 0 : opts.currSlide + 1;
-		}
-		else if (opts.backwards) {
-			roll = (opts.nextSlide - 1) < 0;
-			if (roll && opts.bounce) {
-				opts.backwards = !opts.backwards;
-				opts.nextSlide = 1;
-				opts.currSlide = 0;
-			}
-			else {
-				opts.nextSlide = roll ? (els.length-1) : opts.nextSlide-1;
-				opts.currSlide = roll ? 0 : opts.nextSlide+1;
-			}
-		}
-		else { // sequence
-			roll = (opts.nextSlide + 1) == els.length;
-			if (roll && opts.bounce) {
-				opts.backwards = !opts.backwards;
-				opts.nextSlide = els.length-2;
-				opts.currSlide = els.length-1;
-			}
-			else {
-				opts.nextSlide = roll ? 0 : opts.nextSlide+1;
-				opts.currSlide = roll ? els.length-1 : opts.nextSlide-1;
-			}
-		}
-	}
-	if (changed && opts.pager)
-		opts.updateActivePagerLink(opts.pager, opts.currSlide, opts.activePagerClass);
-	
-	function queueNext() {
-		// stage the next transition
-		var ms = 0, timeout = opts.timeout;
-		if (opts.timeout && !opts.continuous) {
-			ms = getTimeout(els[opts.currSlide], els[opts.nextSlide], opts, fwd);
-         if (opts.fx == 'shuffle')
-            ms -= opts.speedOut;
-      }
-		else if (opts.continuous && p.cyclePause) // continuous shows work off an after callback, not this timer logic
-			ms = 10;
-		if (ms > 0)
-			p.cycleTimeout = setTimeout(function(){ go(els, opts, 0, !opts.backwards); }, ms);
-	}
-}
-
-// invoked after transition
-$.fn.cycle.updateActivePagerLink = function(pager, currSlide, clsName) {
-   $(pager).each(function() {
-       $(this).children().removeClass(clsName).eq(currSlide).addClass(clsName);
-   });
-};
-
-// calculate timeout value for current transition
-function getTimeout(curr, next, opts, fwd) {
-	if (opts.timeoutFn) {
-		// call user provided calc fn
-		var t = opts.timeoutFn.call(curr,curr,next,opts,fwd);
-		while (opts.fx != 'none' && (t - opts.speed) < 250) // sanitize timeout
-			t += opts.speed;
-		debug('calculated timeout: ' + t + '; speed: ' + opts.speed);
-		if (t !== false)
-			return t;
-	}
-	return opts.timeout;
-}
-
-// expose next/prev function, caller must pass in state
-$.fn.cycle.next = function(opts) { advance(opts,1); };
-$.fn.cycle.prev = function(opts) { advance(opts,0);};
-
-// advance slide forward or back
-function advance(opts, moveForward) {
-	var val = moveForward ? 1 : -1;
-	var els = opts.elements;
-	var p = opts.$cont[0], timeout = p.cycleTimeout;
-	if (timeout) {
-		clearTimeout(timeout);
-		p.cycleTimeout = 0;
-	}
-	if (opts.random && val < 0) {
-		// move back to the previously display slide
-		opts.randomIndex--;
-		if (--opts.randomIndex == -2)
-			opts.randomIndex = els.length-2;
-		else if (opts.randomIndex == -1)
-			opts.randomIndex = els.length-1;
-		opts.nextSlide = opts.randomMap[opts.randomIndex];
-	}
-	else if (opts.random) {
-		opts.nextSlide = opts.randomMap[opts.randomIndex];
-	}
-	else {
-		opts.nextSlide = opts.currSlide + val;
-		if (opts.nextSlide < 0) {
-			if (opts.nowrap) return false;
-			opts.nextSlide = els.length - 1;
-		}
-		else if (opts.nextSlide >= els.length) {
-			if (opts.nowrap) return false;
-			opts.nextSlide = 0;
-		}
-	}
-
-	var cb = opts.onPrevNextEvent || opts.prevNextClick; // prevNextClick is deprecated
-	if ($.isFunction(cb))
-		cb(val > 0, opts.nextSlide, els[opts.nextSlide]);
-	go(els, opts, 1, moveForward);
-	return false;
-}
-
-function buildPager(els, opts) {
-	var $p = $(opts.pager);
-	$.each(els, function(i,o) {
-		$.fn.cycle.createPagerAnchor(i,o,$p,els,opts);
-	});
-	opts.updateActivePagerLink(opts.pager, opts.startingSlide, opts.activePagerClass);
-}
-
-$.fn.cycle.createPagerAnchor = function(i, el, $p, els, opts) {
-	var a;
-	if ($.isFunction(opts.pagerAnchorBuilder)) {
-		a = opts.pagerAnchorBuilder(i,el);
-		debug('pagerAnchorBuilder('+i+', el) returned: ' + a);
-	}
-	else
-		a = '<a href="#">'+(i+1)+'</a>';
-		
-	if (!a)
-		return;
-	var $a = $(a);
-	// don't reparent if anchor is in the dom
-	if ($a.parents('body').length === 0) {
-		var arr = [];
-		if ($p.length > 1) {
-			$p.each(function() {
-				var $clone = $a.clone(true);
-				$(this).append($clone);
-				arr.push($clone[0]);
-			});
-			$a = $(arr);
-		}
-		else {
-			$a.appendTo($p);
-		}
-	}
-
-	opts.pagerAnchors =  opts.pagerAnchors || [];
-	opts.pagerAnchors.push($a);
-	
-	var pagerFn = function(e) {
-		e.preventDefault();
-		opts.nextSlide = i;
-		var p = opts.$cont[0], timeout = p.cycleTimeout;
-		if (timeout) {
-			clearTimeout(timeout);
-			p.cycleTimeout = 0;
-		}
-		var cb = opts.onPagerEvent || opts.pagerClick; // pagerClick is deprecated
-		if ($.isFunction(cb))
-			cb(opts.nextSlide, els[opts.nextSlide]);
-		go(els,opts,1,opts.currSlide < i); // trigger the trans
-//		return false; // <== allow bubble
-	};
-	
-	if ( /mouseenter|mouseover/i.test(opts.pagerEvent) ) {
-		$a.hover(pagerFn, function(){/* no-op */} );
-	}
-	else {
-		$a.bind(opts.pagerEvent, pagerFn);
-	}
-	
-	if ( ! /^click/.test(opts.pagerEvent) && !opts.allowPagerClickBubble)
-		$a.bind('click.cycle', function(){return false;}); // suppress click
-	
-	var cont = opts.$cont[0];
-	var pauseFlag = false; // https://github.com/malsup/cycle/issues/44
-	if (opts.pauseOnPagerHover) {
-		$a.hover(
-			function() { 
-				pauseFlag = true;
-				cont.cyclePause++; 
-				triggerPause(cont,true,true);
-			}, function() { 
-				if (pauseFlag)
-					cont.cyclePause--; 
-				triggerPause(cont,true,true);
-			} 
-		);
-	}
-};
-
-// helper fn to calculate the number of slides between the current and the next
-$.fn.cycle.hopsFromLast = function(opts, fwd) {
-	var hops, l = opts.lastSlide, c = opts.currSlide;
-	if (fwd)
-		hops = c > l ? c - l : opts.slideCount - l;
-	else
-		hops = c < l ? l - c : l + opts.slideCount - c;
-	return hops;
-};
-
-// fix clearType problems in ie6 by setting an explicit bg color
-// (otherwise text slides look horrible during a fade transition)
-function clearTypeFix($slides) {
-	debug('applying clearType background-color hack');
-	function hex(s) {
-		s = parseInt(s,10).toString(16);
-		return s.length < 2 ? '0'+s : s;
-	}
-	function getBg(e) {
-		for ( ; e && e.nodeName.toLowerCase() != 'html'; e = e.parentNode) {
-			var v = $.css(e,'background-color');
-			if (v && v.indexOf('rgb') >= 0 ) {
-				var rgb = v.match(/\d+/g);
-				return '#'+ hex(rgb[0]) + hex(rgb[1]) + hex(rgb[2]);
-			}
-			if (v && v != 'transparent')
-				return v;
-		}
-		return '#ffffff';
-	}
-	$slides.each(function() { $(this).css('background-color', getBg(this)); });
-}
-
-// reset common props before the next transition
-$.fn.cycle.commonReset = function(curr,next,opts,w,h,rev) {
-	$(opts.elements).not(curr).hide();
-	if (typeof opts.cssBefore.opacity == 'undefined')
-		opts.cssBefore.opacity = 1;
-	opts.cssBefore.display = 'block';
-	if (opts.slideResize && w !== false && next.cycleW > 0)
-		opts.cssBefore.width = next.cycleW;
-	if (opts.slideResize && h !== false && next.cycleH > 0)
-		opts.cssBefore.height = next.cycleH;
-	opts.cssAfter = opts.cssAfter || {};
-	opts.cssAfter.display = 'none';
-	$(curr).css('zIndex',opts.slideCount + (rev === true ? 1 : 0));
-	$(next).css('zIndex',opts.slideCount + (rev === true ? 0 : 1));
-};
-
-// the actual fn for effecting a transition
-$.fn.cycle.custom = function(curr, next, opts, cb, fwd, speedOverride) {
-	var $l = $(curr), $n = $(next);
-	var speedIn = opts.speedIn, speedOut = opts.speedOut, easeIn = opts.easeIn, easeOut = opts.easeOut, animInDelay = opts.animInDelay, animOutDelay = opts.animOutDelay;
-	$n.css(opts.cssBefore);
-	if (speedOverride) {
-		if (typeof speedOverride == 'number')
-			speedIn = speedOut = speedOverride;
-		else
-			speedIn = speedOut = 1;
-		easeIn = easeOut = null;
-	}
-	var fn = function() {
-		$n.delay(animInDelay).animate(opts.animIn, speedIn, easeIn, function() {
-			cb();
-		});
-	};
-	$l.delay(animOutDelay).animate(opts.animOut, speedOut, easeOut, function() {
-		$l.css(opts.cssAfter);
-		if (!opts.sync) 
-			fn();
-	});
-	if (opts.sync) fn();
-};
-
-// transition definitions - only fade is defined here, transition pack defines the rest
-$.fn.cycle.transitions = {
-	fade: function($cont, $slides, opts) {
-		$slides.not(':eq('+opts.currSlide+')').css('opacity',0);
-		opts.before.push(function(curr,next,opts) {
-			$.fn.cycle.commonReset(curr,next,opts);
-			opts.cssBefore.opacity = 0;
-		});
-		opts.animIn	   = { opacity: 1 };
-		opts.animOut   = { opacity: 0 };
-		opts.cssBefore = { top: 0, left: 0 };
-	}
-};
-
-$.fn.cycle.ver = function() { return ver; };
-
-// override these globally if you like (they are all optional)
-$.fn.cycle.defaults = {
-    activePagerClass: 'activeSlide', // class name used for the active pager link
-    after:            null,     // transition callback (scope set to element that was shown):  function(currSlideElement, nextSlideElement, options, forwardFlag)
-    allowPagerClickBubble: false, // allows or prevents click event on pager anchors from bubbling
-    animIn:           null,     // properties that define how the slide animates in
-    animInDelay:      0,        // allows delay before next slide transitions in	
-    animOut:          null,     // properties that define how the slide animates out
-    animOutDelay:     0,        // allows delay before current slide transitions out
-    aspect:           false,    // preserve aspect ratio during fit resizing, cropping if necessary (must be used with fit option)
-    autostop:         0,        // true to end slideshow after X transitions (where X == slide count)
-    autostopCount:    0,        // number of transitions (optionally used with autostop to define X)
-    backwards:        false,    // true to start slideshow at last slide and move backwards through the stack
-    before:           null,     // transition callback (scope set to element to be shown):     function(currSlideElement, nextSlideElement, options, forwardFlag)
-    center:           null,     // set to true to have cycle add top/left margin to each slide (use with width and height options)
-    cleartype:        !$.support.opacity,  // true if clearType corrections should be applied (for IE)
-    cleartypeNoBg:    false,    // set to true to disable extra cleartype fixing (leave false to force background color setting on slides)
-    containerResize:  1,        // resize container to fit largest slide
-    containerResizeHeight:  0,  // resize containers height to fit the largest slide but leave the width dynamic
-    continuous:       0,        // true to start next transition immediately after current one completes
-    cssAfter:         null,     // properties that defined the state of the slide after transitioning out
-    cssBefore:        null,     // properties that define the initial state of the slide before transitioning in
-    delay:            0,        // additional delay (in ms) for first transition (hint: can be negative)
-    easeIn:           null,     // easing for "in" transition
-    easeOut:          null,     // easing for "out" transition
-    easing:           null,     // easing method for both in and out transitions
-    end:              null,     // callback invoked when the slideshow terminates (use with autostop or nowrap options): function(options)
-    fastOnEvent:      0,        // force fast transitions when triggered manually (via pager or prev/next); value == time in ms
-    fit:              0,        // force slides to fit container
-    fx:               'fade',   // name of transition effect (or comma separated names, ex: 'fade,scrollUp,shuffle')
-    fxFn:             null,     // function used to control the transition: function(currSlideElement, nextSlideElement, options, afterCalback, forwardFlag)
-    height:           'auto',   // container height (if the 'fit' option is true, the slides will be set to this height as well)
-    manualTrump:      true,     // causes manual transition to stop an active transition instead of being ignored
-    metaAttr:         'cycle',  // data- attribute that holds the option data for the slideshow
-    next:             null,     // element, jQuery object, or jQuery selector string for the element to use as event trigger for next slide
-    nowrap:           0,        // true to prevent slideshow from wrapping
-    onPagerEvent:     null,     // callback fn for pager events: function(zeroBasedSlideIndex, slideElement)
-    onPrevNextEvent:  null,     // callback fn for prev/next events: function(isNext, zeroBasedSlideIndex, slideElement)
-    pager:            null,     // element, jQuery object, or jQuery selector string for the element to use as pager container
-    pagerAnchorBuilder: null,   // callback fn for building anchor links:  function(index, DOMelement)
-    pagerEvent:       'click.cycle', // name of event which drives the pager navigation
-    pause:            0,        // true to enable "pause on hover"
-    pauseOnPagerHover: 0,       // true to pause when hovering over pager link
-    prev:             null,     // element, jQuery object, or jQuery selector string for the element to use as event trigger for previous slide
-    prevNextEvent:    'click.cycle',// event which drives the manual transition to the previous or next slide
-    random:           0,        // true for random, false for sequence (not applicable to shuffle fx)
-    randomizeEffects: 1,        // valid when multiple effects are used; true to make the effect sequence random
-    requeueOnImageNotLoaded: true, // requeue the slideshow if any image slides are not yet loaded
-    requeueTimeout:   250,      // ms delay for requeue
-    rev:              0,        // causes animations to transition in reverse (for effects that support it such as scrollHorz/scrollVert/shuffle)
-    shuffle:          null,     // coords for shuffle animation, ex: { top:15, left: 200 }
-    skipInitializationCallbacks: false, // set to true to disable the first before/after callback that occurs prior to any transition
-    slideExpr:        null,     // expression for selecting slides (if something other than all children is required)
-    slideResize:      1,        // force slide width/height to fixed size before every transition
-    speed:            1000,     // speed of the transition (any valid fx speed value)
-    speedIn:          null,     // speed of the 'in' transition
-    speedOut:         null,     // speed of the 'out' transition
-    startingSlide:    undefined,// zero-based index of the first slide to be displayed
-    sync:             1,        // true if in/out transitions should occur simultaneously
-    timeout:          4000,     // milliseconds between slide transitions (0 to disable auto advance)
-    timeoutFn:        null,     // callback for determining per-slide timeout value:  function(currSlideElement, nextSlideElement, options, forwardFlag)
-    updateActivePagerLink: null,// callback fn invoked to update the active pager link (adds/removes activePagerClass style)
-    width:            null      // container width (if the 'fit' option is true, the slides will be set to this width as well)
-};
-
-})(jQuery);
-
-
-/*!
- * jQuery Cycle Plugin Transition Definitions
- * This script is a plugin for the jQuery Cycle Plugin
- * Examples and documentation at: http://malsup.com/jquery/cycle/
- * Copyright (c) 2007-2010 M. Alsup
- * Version:	 2.73
- * Dual licensed under the MIT and GPL licenses:
- * http://www.opensource.org/licenses/mit-license.php
- * http://www.gnu.org/licenses/gpl.html
- */
-(function($) {
-"use strict";
-
-//
-// These functions define slide initialization and properties for the named
-// transitions. To save file size feel free to remove any of these that you
-// don't need.
-//
-$.fn.cycle.transitions.none = function($cont, $slides, opts) {
-	opts.fxFn = function(curr,next,opts,after){
-		$(next).show();
-		$(curr).hide();
-		after();
-	};
-};
-
-// not a cross-fade, fadeout only fades out the top slide
-$.fn.cycle.transitions.fadeout = function($cont, $slides, opts) {
-	$slides.not(':eq('+opts.currSlide+')').css({ display: 'block', 'opacity': 1 });
-	opts.before.push(function(curr,next,opts,w,h,rev) {
-		$(curr).css('zIndex',opts.slideCount + (rev !== true ? 1 : 0));
-		$(next).css('zIndex',opts.slideCount + (rev !== true ? 0 : 1));
-	});
-	opts.animIn.opacity = 1;
-	opts.animOut.opacity = 0;
-	opts.cssBefore.opacity = 1;
-	opts.cssBefore.display = 'block';
-	opts.cssAfter.zIndex = 0;
-};
-
-// scrollUp/Down/Left/Right
-$.fn.cycle.transitions.scrollUp = function($cont, $slides, opts) {
-	$cont.css('overflow','hidden');
-	opts.before.push($.fn.cycle.commonReset);
-	var h = $cont.height();
-	opts.cssBefore.top = h;
-	opts.cssBefore.left = 0;
-	opts.cssFirst.top = 0;
-	opts.animIn.top = 0;
-	opts.animOut.top = -h;
-};
-$.fn.cycle.transitions.scrollDown = function($cont, $slides, opts) {
-	$cont.css('overflow','hidden');
-	opts.before.push($.fn.cycle.commonReset);
-	var h = $cont.height();
-	opts.cssFirst.top = 0;
-	opts.cssBefore.top = -h;
-	opts.cssBefore.left = 0;
-	opts.animIn.top = 0;
-	opts.animOut.top = h;
-};
-$.fn.cycle.transitions.scrollLeft = function($cont, $slides, opts) {
-	$cont.css('overflow','hidden');
-	opts.before.push($.fn.cycle.commonReset);
-	var w = $cont.width();
-	opts.cssFirst.left = 0;
-	opts.cssBefore.left = w;
-	opts.cssBefore.top = 0;
-	opts.animIn.left = 0;
-	opts.animOut.left = 0-w;
-};
-$.fn.cycle.transitions.scrollRight = function($cont, $slides, opts) {
-	$cont.css('overflow','hidden');
-	opts.before.push($.fn.cycle.commonReset);
-	var w = $cont.width();
-	opts.cssFirst.left = 0;
-	opts.cssBefore.left = -w;
-	opts.cssBefore.top = 0;
-	opts.animIn.left = 0;
-	opts.animOut.left = w;
-};
-$.fn.cycle.transitions.scrollHorz = function($cont, $slides, opts) {
-	$cont.css('overflow','hidden').width();
-	opts.before.push(function(curr, next, opts, fwd) {
-		if (opts.rev)
-			fwd = !fwd;
-		$.fn.cycle.commonReset(curr,next,opts);
-		opts.cssBefore.left = fwd ? (next.cycleW-1) : (1-next.cycleW);
-		opts.animOut.left = fwd ? -curr.cycleW : curr.cycleW;
-	});
-	opts.cssFirst.left = 0;
-	opts.cssBefore.top = 0;
-	opts.animIn.left = 0;
-	opts.animOut.top = 0;
-};
-$.fn.cycle.transitions.scrollVert = function($cont, $slides, opts) {
-	$cont.css('overflow','hidden');
-	opts.before.push(function(curr, next, opts, fwd) {
-		if (opts.rev)
-			fwd = !fwd;
-		$.fn.cycle.commonReset(curr,next,opts);
-		opts.cssBefore.top = fwd ? (1-next.cycleH) : (next.cycleH-1);
-		opts.animOut.top = fwd ? curr.cycleH : -curr.cycleH;
-	});
-	opts.cssFirst.top = 0;
-	opts.cssBefore.left = 0;
-	opts.animIn.top = 0;
-	opts.animOut.left = 0;
-};
-
-// slideX/slideY
-$.fn.cycle.transitions.slideX = function($cont, $slides, opts) {
-	opts.before.push(function(curr, next, opts) {
-		$(opts.elements).not(curr).hide();
-		$.fn.cycle.commonReset(curr,next,opts,false,true);
-		opts.animIn.width = next.cycleW;
-	});
-	opts.cssBefore.left = 0;
-	opts.cssBefore.top = 0;
-	opts.cssBefore.width = 0;
-	opts.animIn.width = 'show';
-	opts.animOut.width = 0;
-};
-$.fn.cycle.transitions.slideY = function($cont, $slides, opts) {
-	opts.before.push(function(curr, next, opts) {
-		$(opts.elements).not(curr).hide();
-		$.fn.cycle.commonReset(curr,next,opts,true,false);
-		opts.animIn.height = next.cycleH;
-	});
-	opts.cssBefore.left = 0;
-	opts.cssBefore.top = 0;
-	opts.cssBefore.height = 0;
-	opts.animIn.height = 'show';
-	opts.animOut.height = 0;
-};
-
-// shuffle
-$.fn.cycle.transitions.shuffle = function($cont, $slides, opts) {
-	var i, w = $cont.css('overflow', 'visible').width();
-	$slides.css({left: 0, top: 0});
-	opts.before.push(function(curr,next,opts) {
-		$.fn.cycle.commonReset(curr,next,opts,true,true,true);
-	});
-	// only adjust speed once!
-	if (!opts.speedAdjusted) {
-		opts.speed = opts.speed / 2; // shuffle has 2 transitions
-		opts.speedAdjusted = true;
-	}
-	opts.random = 0;
-	opts.shuffle = opts.shuffle || {left:-w, top:15};
-	opts.els = [];
-	for (i=0; i < $slides.length; i++)
-		opts.els.push($slides[i]);
-
-	for (i=0; i < opts.currSlide; i++)
-		opts.els.push(opts.els.shift());
-
-	// custom transition fn (hat tip to Benjamin Sterling for this bit of sweetness!)
-	opts.fxFn = function(curr, next, opts, cb, fwd) {
-		if (opts.rev)
-			fwd = !fwd;
-		var $el = fwd ? $(curr) : $(next);
-		$(next).css(opts.cssBefore);
-		var count = opts.slideCount;
-		$el.animate(opts.shuffle, opts.speedIn, opts.easeIn, function() {
-			var hops = $.fn.cycle.hopsFromLast(opts, fwd);
-			for (var k=0; k < hops; k++) {
-				if (fwd)
-					opts.els.push(opts.els.shift());
-				else
-					opts.els.unshift(opts.els.pop());
-			}
-			if (fwd) {
-				for (var i=0, len=opts.els.length; i < len; i++)
-					$(opts.els[i]).css('z-index', len-i+count);
-			}
-			else {
-				var z = $(curr).css('z-index');
-				$el.css('z-index', parseInt(z,10)+1+count);
-			}
-			$el.animate({left:0, top:0}, opts.speedOut, opts.easeOut, function() {
-				$(fwd ? this : curr).hide();
-				if (cb) cb();
-			});
-		});
-	};
-	$.extend(opts.cssBefore, { display: 'block', opacity: 1, top: 0, left: 0 });
-};
-
-// turnUp/Down/Left/Right
-$.fn.cycle.transitions.turnUp = function($cont, $slides, opts) {
-	opts.before.push(function(curr, next, opts) {
-		$.fn.cycle.commonReset(curr,next,opts,true,false);
-		opts.cssBefore.top = next.cycleH;
-		opts.animIn.height = next.cycleH;
-		opts.animOut.width = next.cycleW;
-	});
-	opts.cssFirst.top = 0;
-	opts.cssBefore.left = 0;
-	opts.cssBefore.height = 0;
-	opts.animIn.top = 0;
-	opts.animOut.height = 0;
-};
-$.fn.cycle.transitions.turnDown = function($cont, $slides, opts) {
-	opts.before.push(function(curr, next, opts) {
-		$.fn.cycle.commonReset(curr,next,opts,true,false);
-		opts.animIn.height = next.cycleH;
-		opts.animOut.top   = curr.cycleH;
-	});
-	opts.cssFirst.top = 0;
-	opts.cssBefore.left = 0;
-	opts.cssBefore.top = 0;
-	opts.cssBefore.height = 0;
-	opts.animOut.height = 0;
-};
-$.fn.cycle.transitions.turnLeft = function($cont, $slides, opts) {
-	opts.before.push(function(curr, next, opts) {
-		$.fn.cycle.commonReset(curr,next,opts,false,true);
-		opts.cssBefore.left = next.cycleW;
-		opts.animIn.width = next.cycleW;
-	});
-	opts.cssBefore.top = 0;
-	opts.cssBefore.width = 0;
-	opts.animIn.left = 0;
-	opts.animOut.width = 0;
-};
-$.fn.cycle.transitions.turnRight = function($cont, $slides, opts) {
-	opts.before.push(function(curr, next, opts) {
-		$.fn.cycle.commonReset(curr,next,opts,false,true);
-		opts.animIn.width = next.cycleW;
-		opts.animOut.left = curr.cycleW;
-	});
-	$.extend(opts.cssBefore, { top: 0, left: 0, width: 0 });
-	opts.animIn.left = 0;
-	opts.animOut.width = 0;
-};
-
-// zoom
-$.fn.cycle.transitions.zoom = function($cont, $slides, opts) {
-	opts.before.push(function(curr, next, opts) {
-		$.fn.cycle.commonReset(curr,next,opts,false,false,true);
-		opts.cssBefore.top = next.cycleH/2;
-		opts.cssBefore.left = next.cycleW/2;
-		$.extend(opts.animIn, { top: 0, left: 0, width: next.cycleW, height: next.cycleH });
-		$.extend(opts.animOut, { width: 0, height: 0, top: curr.cycleH/2, left: curr.cycleW/2 });
-	});
-	opts.cssFirst.top = 0;
-	opts.cssFirst.left = 0;
-	opts.cssBefore.width = 0;
-	opts.cssBefore.height = 0;
-};
-
-// fadeZoom
-$.fn.cycle.transitions.fadeZoom = function($cont, $slides, opts) {
-	opts.before.push(function(curr, next, opts) {
-		$.fn.cycle.commonReset(curr,next,opts,false,false);
-		opts.cssBefore.left = next.cycleW/2;
-		opts.cssBefore.top = next.cycleH/2;
-		$.extend(opts.animIn, { top: 0, left: 0, width: next.cycleW, height: next.cycleH });
-	});
-	opts.cssBefore.width = 0;
-	opts.cssBefore.height = 0;
-	opts.animOut.opacity = 0;
-};
-
-// blindX
-$.fn.cycle.transitions.blindX = function($cont, $slides, opts) {
-	var w = $cont.css('overflow','hidden').width();
-	opts.before.push(function(curr, next, opts) {
-		$.fn.cycle.commonReset(curr,next,opts);
-		opts.animIn.width = next.cycleW;
-		opts.animOut.left   = curr.cycleW;
-	});
-	opts.cssBefore.left = w;
-	opts.cssBefore.top = 0;
-	opts.animIn.left = 0;
-	opts.animOut.left = w;
-};
-// blindY
-$.fn.cycle.transitions.blindY = function($cont, $slides, opts) {
-	var h = $cont.css('overflow','hidden').height();
-	opts.before.push(function(curr, next, opts) {
-		$.fn.cycle.commonReset(curr,next,opts);
-		opts.animIn.height = next.cycleH;
-		opts.animOut.top   = curr.cycleH;
-	});
-	opts.cssBefore.top = h;
-	opts.cssBefore.left = 0;
-	opts.animIn.top = 0;
-	opts.animOut.top = h;
-};
-// blindZ
-$.fn.cycle.transitions.blindZ = function($cont, $slides, opts) {
-	var h = $cont.css('overflow','hidden').height();
-	var w = $cont.width();
-	opts.before.push(function(curr, next, opts) {
-		$.fn.cycle.commonReset(curr,next,opts);
-		opts.animIn.height = next.cycleH;
-		opts.animOut.top   = curr.cycleH;
-	});
-	opts.cssBefore.top = h;
-	opts.cssBefore.left = w;
-	opts.animIn.top = 0;
-	opts.animIn.left = 0;
-	opts.animOut.top = h;
-	opts.animOut.left = w;
-};
-
-// growX - grow horizontally from centered 0 width
-$.fn.cycle.transitions.growX = function($cont, $slides, opts) {
-	opts.before.push(function(curr, next, opts) {
-		$.fn.cycle.commonReset(curr,next,opts,false,true);
-		opts.cssBefore.left = this.cycleW/2;
-		opts.animIn.left = 0;
-		opts.animIn.width = this.cycleW;
-		opts.animOut.left = 0;
-	});
-	opts.cssBefore.top = 0;
-	opts.cssBefore.width = 0;
-};
-// growY - grow vertically from centered 0 height
-$.fn.cycle.transitions.growY = function($cont, $slides, opts) {
-	opts.before.push(function(curr, next, opts) {
-		$.fn.cycle.commonReset(curr,next,opts,true,false);
-		opts.cssBefore.top = this.cycleH/2;
-		opts.animIn.top = 0;
-		opts.animIn.height = this.cycleH;
-		opts.animOut.top = 0;
-	});
-	opts.cssBefore.height = 0;
-	opts.cssBefore.left = 0;
-};
-
-// curtainX - squeeze in both edges horizontally
-$.fn.cycle.transitions.curtainX = function($cont, $slides, opts) {
-	opts.before.push(function(curr, next, opts) {
-		$.fn.cycle.commonReset(curr,next,opts,false,true,true);
-		opts.cssBefore.left = next.cycleW/2;
-		opts.animIn.left = 0;
-		opts.animIn.width = this.cycleW;
-		opts.animOut.left = curr.cycleW/2;
-		opts.animOut.width = 0;
-	});
-	opts.cssBefore.top = 0;
-	opts.cssBefore.width = 0;
-};
-// curtainY - squeeze in both edges vertically
-$.fn.cycle.transitions.curtainY = function($cont, $slides, opts) {
-	opts.before.push(function(curr, next, opts) {
-		$.fn.cycle.commonReset(curr,next,opts,true,false,true);
-		opts.cssBefore.top = next.cycleH/2;
-		opts.animIn.top = 0;
-		opts.animIn.height = next.cycleH;
-		opts.animOut.top = curr.cycleH/2;
-		opts.animOut.height = 0;
-	});
-	opts.cssBefore.height = 0;
-	opts.cssBefore.left = 0;
-};
-
-// cover - curr slide covered by next slide
-$.fn.cycle.transitions.cover = function($cont, $slides, opts) {
-	var d = opts.direction || 'left';
-	var w = $cont.css('overflow','hidden').width();
-	var h = $cont.height();
-	opts.before.push(function(curr, next, opts) {
-		$.fn.cycle.commonReset(curr,next,opts);
-		opts.cssAfter.display = '';
-		if (d == 'right')
-			opts.cssBefore.left = -w;
-		else if (d == 'up')
-			opts.cssBefore.top = h;
-		else if (d == 'down')
-			opts.cssBefore.top = -h;
-		else
-			opts.cssBefore.left = w;
-	});
-	opts.animIn.left = 0;
-	opts.animIn.top = 0;
-	opts.cssBefore.top = 0;
-	opts.cssBefore.left = 0;
-};
-
-// uncover - curr slide moves off next slide
-$.fn.cycle.transitions.uncover = function($cont, $slides, opts) {
-	var d = opts.direction || 'left';
-	var w = $cont.css('overflow','hidden').width();
-	var h = $cont.height();
-	opts.before.push(function(curr, next, opts) {
-		$.fn.cycle.commonReset(curr,next,opts,true,true,true);
-		if (d == 'right')
-			opts.animOut.left = w;
-		else if (d == 'up')
-			opts.animOut.top = -h;
-		else if (d == 'down')
-			opts.animOut.top = h;
-		else
-			opts.animOut.left = -w;
-	});
-	opts.animIn.left = 0;
-	opts.animIn.top = 0;
-	opts.cssBefore.top = 0;
-	opts.cssBefore.left = 0;
-};
-
-// toss - move top slide and fade away
-$.fn.cycle.transitions.toss = function($cont, $slides, opts) {
-	var w = $cont.css('overflow','visible').width();
-	var h = $cont.height();
-	opts.before.push(function(curr, next, opts) {
-		$.fn.cycle.commonReset(curr,next,opts,true,true,true);
-		// provide default toss settings if animOut not provided
-		if (!opts.animOut.left && !opts.animOut.top)
-			$.extend(opts.animOut, { left: w*2, top: -h/2, opacity: 0 });
-		else
-			opts.animOut.opacity = 0;
-	});
-	opts.cssBefore.left = 0;
-	opts.cssBefore.top = 0;
-	opts.animIn.left = 0;
-};
-
-// wipe - clip animation
-$.fn.cycle.transitions.wipe = function($cont, $slides, opts) {
-	var w = $cont.css('overflow','hidden').width();
-	var h = $cont.height();
-	opts.cssBefore = opts.cssBefore || {};
-	var clip;
-	if (opts.clip) {
-		if (/l2r/.test(opts.clip))
-			clip = 'rect(0px 0px '+h+'px 0px)';
-		else if (/r2l/.test(opts.clip))
-			clip = 'rect(0px '+w+'px '+h+'px '+w+'px)';
-		else if (/t2b/.test(opts.clip))
-			clip = 'rect(0px '+w+'px 0px 0px)';
-		else if (/b2t/.test(opts.clip))
-			clip = 'rect('+h+'px '+w+'px '+h+'px 0px)';
-		else if (/zoom/.test(opts.clip)) {
-			var top = parseInt(h/2,10);
-			var left = parseInt(w/2,10);
-			clip = 'rect('+top+'px '+left+'px '+top+'px '+left+'px)';
-		}
-	}
-
-	opts.cssBefore.clip = opts.cssBefore.clip || clip || 'rect(0px 0px 0px 0px)';
-
-	var d = opts.cssBefore.clip.match(/(\d+)/g);
-	var t = parseInt(d[0],10), r = parseInt(d[1],10), b = parseInt(d[2],10), l = parseInt(d[3],10);
-
-	opts.before.push(function(curr, next, opts) {
-		if (curr == next) return;
-		var $curr = $(curr), $next = $(next);
-		$.fn.cycle.commonReset(curr,next,opts,true,true,false);
-		opts.cssAfter.display = 'block';
-
-		var step = 1, count = parseInt((opts.speedIn / 13),10) - 1;
-		(function f() {
-			var tt = t ? t - parseInt(step * (t/count),10) : 0;
-			var ll = l ? l - parseInt(step * (l/count),10) : 0;
-			var bb = b < h ? b + parseInt(step * ((h-b)/count || 1),10) : h;
-			var rr = r < w ? r + parseInt(step * ((w-r)/count || 1),10) : w;
-			$next.css({ clip: 'rect('+tt+'px '+rr+'px '+bb+'px '+ll+'px)' });
-			(step++ <= count) ? setTimeout(f, 13) : $curr.css('display', 'none');
-		})();
-	});
-	$.extend(opts.cssBefore, { display: 'block', opacity: 1, top: 0, left: 0 });
-	opts.animIn	   = { left: 0 };
-	opts.animOut   = { left: 0 };
-};
-
-})(jQuery);
diff --git a/web/libraries/jquery.cycle/jquery.cycle.all.js.1 b/web/libraries/jquery.cycle/jquery.cycle.all.js.1
deleted file mode 100644
index dc474ea0cb1da920daef85dfeae13c0ba706daff..0000000000000000000000000000000000000000
--- a/web/libraries/jquery.cycle/jquery.cycle.all.js.1
+++ /dev/null
@@ -1,1543 +0,0 @@
-/*!
- * jQuery Cycle Plugin (with Transition Definitions)
- * Examples and documentation at: http://jquery.malsup.com/cycle/
- * Copyright (c) 2007-2013 M. Alsup
- * Version: 3.0.3 (11-JUL-2013)
- * Dual licensed under the MIT and GPL licenses.
- * http://jquery.malsup.com/license.html
- * Requires: jQuery v1.7.1 or later
- */
-;(function($, undefined) {
-"use strict";
-
-var ver = '3.0.3';
-
-function debug(s) {
-	if ($.fn.cycle.debug)
-		log(s);
-}		
-function log() {
-	/*global console */
-	if (window.console && console.log)
-		console.log('[cycle] ' + Array.prototype.join.call(arguments,' '));
-}
-$.expr[':'].paused = function(el) {
-	return el.cyclePause;
-};
-
-
-// the options arg can be...
-//   a number  - indicates an immediate transition should occur to the given slide index
-//   a string  - 'pause', 'resume', 'toggle', 'next', 'prev', 'stop', 'destroy' or the name of a transition effect (ie, 'fade', 'zoom', etc)
-//   an object - properties to control the slideshow
-//
-// the arg2 arg can be...
-//   the name of an fx (only used in conjunction with a numeric value for 'options')
-//   the value true (only used in first arg == 'resume') and indicates
-//	 that the resume should occur immediately (not wait for next timeout)
-
-$.fn.cycle = function(options, arg2) {
-	var o = { s: this.selector, c: this.context };
-
-	// in 1.3+ we can fix mistakes with the ready state
-	if (this.length === 0 && options != 'stop') {
-		if (!$.isReady && o.s) {
-			log('DOM not ready, queuing slideshow');
-			$(function() {
-				$(o.s,o.c).cycle(options,arg2);
-			});
-			return this;
-		}
-		// is your DOM ready?  http://docs.jquery.com/Tutorials:Introducing_$(document).ready()
-		log('terminating; zero elements found by selector' + ($.isReady ? '' : ' (DOM not ready)'));
-		return this;
-	}
-
-	// iterate the matched nodeset
-	return this.each(function() {
-		var opts = handleArguments(this, options, arg2);
-		if (opts === false)
-			return;
-
-		opts.updateActivePagerLink = opts.updateActivePagerLink || $.fn.cycle.updateActivePagerLink;
-		
-		// stop existing slideshow for this container (if there is one)
-		if (this.cycleTimeout)
-			clearTimeout(this.cycleTimeout);
-		this.cycleTimeout = this.cyclePause = 0;
-		this.cycleStop = 0; // issue #108
-
-		var $cont = $(this);
-		var $slides = opts.slideExpr ? $(opts.slideExpr, this) : $cont.children();
-		var els = $slides.get();
-
-		if (els.length < 2) {
-			log('terminating; too few slides: ' + els.length);
-			return;
-		}
-
-		var opts2 = buildOptions($cont, $slides, els, opts, o);
-		if (opts2 === false)
-			return;
-
-		var startTime = opts2.continuous ? 10 : getTimeout(els[opts2.currSlide], els[opts2.nextSlide], opts2, !opts2.backwards);
-
-		// if it's an auto slideshow, kick it off
-		if (startTime) {
-			startTime += (opts2.delay || 0);
-			if (startTime < 10)
-				startTime = 10;
-			debug('first timeout: ' + startTime);
-			this.cycleTimeout = setTimeout(function(){go(els,opts2,0,!opts.backwards);}, startTime);
-		}
-	});
-};
-
-function triggerPause(cont, byHover, onPager) {
-	var opts = $(cont).data('cycle.opts');
-	if (!opts)
-		return;
-	var paused = !!cont.cyclePause;
-	if (paused && opts.paused)
-		opts.paused(cont, opts, byHover, onPager);
-	else if (!paused && opts.resumed)
-		opts.resumed(cont, opts, byHover, onPager);
-}
-
-// process the args that were passed to the plugin fn
-function handleArguments(cont, options, arg2) {
-	if (cont.cycleStop === undefined)
-		cont.cycleStop = 0;
-	if (options === undefined || options === null)
-		options = {};
-	if (options.constructor == String) {
-		switch(options) {
-		case 'destroy':
-		case 'stop':
-			var opts = $(cont).data('cycle.opts');
-			if (!opts)
-				return false;
-			cont.cycleStop++; // callbacks look for change
-			if (cont.cycleTimeout)
-				clearTimeout(cont.cycleTimeout);
-			cont.cycleTimeout = 0;
-			if (opts.elements)
-				$(opts.elements).stop();
-			$(cont).removeData('cycle.opts');
-			if (options == 'destroy')
-				destroy(cont, opts);
-			return false;
-		case 'toggle':
-			cont.cyclePause = (cont.cyclePause === 1) ? 0 : 1;
-			checkInstantResume(cont.cyclePause, arg2, cont);
-			triggerPause(cont);
-			return false;
-		case 'pause':
-			cont.cyclePause = 1;
-			triggerPause(cont);
-			return false;
-		case 'resume':
-			cont.cyclePause = 0;
-			checkInstantResume(false, arg2, cont);
-			triggerPause(cont);
-			return false;
-		case 'prev':
-		case 'next':
-			opts = $(cont).data('cycle.opts');
-			if (!opts) {
-				log('options not found, "prev/next" ignored');
-				return false;
-			}
-			if (typeof arg2 == 'string') 
-				opts.oneTimeFx = arg2;
-			$.fn.cycle[options](opts);
-			return false;
-		default:
-			options = { fx: options };
-		}
-		return options;
-	}
-	else if (options.constructor == Number) {
-		// go to the requested slide
-		var num = options;
-		options = $(cont).data('cycle.opts');
-		if (!options) {
-			log('options not found, can not advance slide');
-			return false;
-		}
-		if (num < 0 || num >= options.elements.length) {
-			log('invalid slide index: ' + num);
-			return false;
-		}
-		options.nextSlide = num;
-		if (cont.cycleTimeout) {
-			clearTimeout(cont.cycleTimeout);
-			cont.cycleTimeout = 0;
-		}
-		if (typeof arg2 == 'string')
-			options.oneTimeFx = arg2;
-		go(options.elements, options, 1, num >= options.currSlide);
-		return false;
-	}
-	return options;
-	
-	function checkInstantResume(isPaused, arg2, cont) {
-		if (!isPaused && arg2 === true) { // resume now!
-			var options = $(cont).data('cycle.opts');
-			if (!options) {
-				log('options not found, can not resume');
-				return false;
-			}
-			if (cont.cycleTimeout) {
-				clearTimeout(cont.cycleTimeout);
-				cont.cycleTimeout = 0;
-			}
-			go(options.elements, options, 1, !options.backwards);
-		}
-	}
-}
-
-function removeFilter(el, opts) {
-	if (!$.support.opacity && opts.cleartype && el.style.filter) {
-		try { el.style.removeAttribute('filter'); }
-		catch(smother) {} // handle old opera versions
-	}
-}
-
-// unbind event handlers
-function destroy(cont, opts) {
-	if (opts.next)
-		$(opts.next).unbind(opts.prevNextEvent);
-	if (opts.prev)
-		$(opts.prev).unbind(opts.prevNextEvent);
-	
-	if (opts.pager || opts.pagerAnchorBuilder)
-		$.each(opts.pagerAnchors || [], function() {
-			this.unbind().remove();
-		});
-	opts.pagerAnchors = null;
-	$(cont).unbind('mouseenter.cycle mouseleave.cycle');
-	if (opts.destroy) // callback
-		opts.destroy(opts);
-}
-
-// one-time initialization
-function buildOptions($cont, $slides, els, options, o) {
-	var startingSlideSpecified;
-	// support metadata plugin (v1.0 and v2.0)
-	var opts = $.extend({}, $.fn.cycle.defaults, options || {}, $.metadata ? $cont.metadata() : $.meta ? $cont.data() : {});
-	var meta = $.isFunction($cont.data) ? $cont.data(opts.metaAttr) : null;
-	if (meta)
-		opts = $.extend(opts, meta);
-	if (opts.autostop)
-		opts.countdown = opts.autostopCount || els.length;
-
-	var cont = $cont[0];
-	$cont.data('cycle.opts', opts);
-	opts.$cont = $cont;
-	opts.stopCount = cont.cycleStop;
-	opts.elements = els;
-	opts.before = opts.before ? [opts.before] : [];
-	opts.after = opts.after ? [opts.after] : [];
-
-	// push some after callbacks
-	if (!$.support.opacity && opts.cleartype)
-		opts.after.push(function() { removeFilter(this, opts); });
-	if (opts.continuous)
-		opts.after.push(function() { go(els,opts,0,!opts.backwards); });
-
-	saveOriginalOpts(opts);
-
-	// clearType corrections
-	if (!$.support.opacity && opts.cleartype && !opts.cleartypeNoBg)
-		clearTypeFix($slides);
-
-	// container requires non-static position so that slides can be position within
-	if ($cont.css('position') == 'static')
-		$cont.css('position', 'relative');
-	if (opts.width)
-		$cont.width(opts.width);
-	if (opts.height && opts.height != 'auto')
-		$cont.height(opts.height);
-
-	if (opts.startingSlide !== undefined) {
-		opts.startingSlide = parseInt(opts.startingSlide,10);
-		if (opts.startingSlide >= els.length || opts.startSlide < 0)
-			opts.startingSlide = 0; // catch bogus input
-		else 
-			startingSlideSpecified = true;
-	}
-	else if (opts.backwards)
-		opts.startingSlide = els.length - 1;
-	else
-		opts.startingSlide = 0;
-
-	// if random, mix up the slide array
-	if (opts.random) {
-		opts.randomMap = [];
-		for (var i = 0; i < els.length; i++)
-			opts.randomMap.push(i);
-		opts.randomMap.sort(function(a,b) {return Math.random() - 0.5;});
-		if (startingSlideSpecified) {
-			// try to find the specified starting slide and if found set start slide index in the map accordingly
-			for ( var cnt = 0; cnt < els.length; cnt++ ) {
-				if ( opts.startingSlide == opts.randomMap[cnt] ) {
-					opts.randomIndex = cnt;
-				}
-			}
-		}
-		else {
-			opts.randomIndex = 1;
-			opts.startingSlide = opts.randomMap[1];
-		}
-	}
-	else if (opts.startingSlide >= els.length)
-		opts.startingSlide = 0; // catch bogus input
-	opts.currSlide = opts.startingSlide || 0;
-	var first = opts.startingSlide;
-
-	// set position and zIndex on all the slides
-	$slides.css({position: 'absolute', top:0, left:0}).hide().each(function(i) {
-		var z;
-		if (opts.backwards)
-			z = first ? i <= first ? els.length + (i-first) : first-i : els.length-i;
-		else
-			z = first ? i >= first ? els.length - (i-first) : first-i : els.length-i;
-		$(this).css('z-index', z);
-	});
-
-	// make sure first slide is visible
-	$(els[first]).css('opacity',1).show(); // opacity bit needed to handle restart use case
-	removeFilter(els[first], opts);
-
-	// stretch slides
-	if (opts.fit) {
-		if (!opts.aspect) {
-	        if (opts.width)
-	            $slides.width(opts.width);
-	        if (opts.height && opts.height != 'auto')
-	            $slides.height(opts.height);
-		} else {
-			$slides.each(function(){
-				var $slide = $(this);
-				var ratio = (opts.aspect === true) ? $slide.width()/$slide.height() : opts.aspect;
-				if( opts.width && $slide.width() != opts.width ) {
-					$slide.width( opts.width );
-					$slide.height( opts.width / ratio );
-				}
-
-				if( opts.height && $slide.height() < opts.height ) {
-					$slide.height( opts.height );
-					$slide.width( opts.height * ratio );
-				}
-			});
-		}
-	}
-
-	if (opts.center && ((!opts.fit) || opts.aspect)) {
-		$slides.each(function(){
-			var $slide = $(this);
-			$slide.css({
-				"margin-left": opts.width ?
-					((opts.width - $slide.width()) / 2) + "px" :
-					0,
-				"margin-top": opts.height ?
-					((opts.height - $slide.height()) / 2) + "px" :
-					0
-			});
-		});
-	}
-
-	if (opts.center && !opts.fit && !opts.slideResize) {
-		$slides.each(function(){
-			var $slide = $(this);
-			$slide.css({
-				"margin-left": opts.width ? ((opts.width - $slide.width()) / 2) + "px" : 0,
-				"margin-top": opts.height ? ((opts.height - $slide.height()) / 2) + "px" : 0
-			});
-		});
-	}
-		
-	// stretch container
-	var reshape = (opts.containerResize || opts.containerResizeHeight) && $cont.innerHeight() < 1;
-	if (reshape) { // do this only if container has no size http://tinyurl.com/da2oa9
-		var maxw = 0, maxh = 0;
-		for(var j=0; j < els.length; j++) {
-			var $e = $(els[j]), e = $e[0], w = $e.outerWidth(), h = $e.outerHeight();
-			if (!w) w = e.offsetWidth || e.width || $e.attr('width');
-			if (!h) h = e.offsetHeight || e.height || $e.attr('height');
-			maxw = w > maxw ? w : maxw;
-			maxh = h > maxh ? h : maxh;
-		}
-		if (opts.containerResize && maxw > 0 && maxh > 0)
-			$cont.css({width:maxw+'px',height:maxh+'px'});
-		if (opts.containerResizeHeight && maxh > 0)
-			$cont.css({height:maxh+'px'});
-	}
-
-	var pauseFlag = false;  // https://github.com/malsup/cycle/issues/44
-	if (opts.pause)
-		$cont.bind('mouseenter.cycle', function(){
-			pauseFlag = true;
-			this.cyclePause++;
-			triggerPause(cont, true);
-		}).bind('mouseleave.cycle', function(){
-				if (pauseFlag)
-					this.cyclePause--;
-				triggerPause(cont, true);
-		});
-
-	if (supportMultiTransitions(opts) === false)
-		return false;
-
-	// apparently a lot of people use image slideshows without height/width attributes on the images.
-	// Cycle 2.50+ requires the sizing info for every slide; this block tries to deal with that.
-	var requeue = false;
-	options.requeueAttempts = options.requeueAttempts || 0;
-	$slides.each(function() {
-		// try to get height/width of each slide
-		var $el = $(this);
-		this.cycleH = (opts.fit && opts.height) ? opts.height : ($el.height() || this.offsetHeight || this.height || $el.attr('height') || 0);
-		this.cycleW = (opts.fit && opts.width) ? opts.width : ($el.width() || this.offsetWidth || this.width || $el.attr('width') || 0);
-
-		if ( $el.is('img') ) {
-			var loading = (this.cycleH === 0 && this.cycleW === 0 && !this.complete);
-			// don't requeue for images that are still loading but have a valid size
-			if (loading) {
-				if (o.s && opts.requeueOnImageNotLoaded && ++options.requeueAttempts < 100) { // track retry count so we don't loop forever
-					log(options.requeueAttempts,' - img slide not loaded, requeuing slideshow: ', this.src, this.cycleW, this.cycleH);
-					setTimeout(function() {$(o.s,o.c).cycle(options);}, opts.requeueTimeout);
-					requeue = true;
-					return false; // break each loop
-				}
-				else {
-					log('could not determine size of image: '+this.src, this.cycleW, this.cycleH);
-				}
-			}
-		}
-		return true;
-	});
-
-	if (requeue)
-		return false;
-
-	opts.cssBefore = opts.cssBefore || {};
-	opts.cssAfter = opts.cssAfter || {};
-	opts.cssFirst = opts.cssFirst || {};
-	opts.animIn = opts.animIn || {};
-	opts.animOut = opts.animOut || {};
-
-	$slides.not(':eq('+first+')').css(opts.cssBefore);
-	$($slides[first]).css(opts.cssFirst);
-
-	if (opts.timeout) {
-		opts.timeout = parseInt(opts.timeout,10);
-		// ensure that timeout and speed settings are sane
-		if (opts.speed.constructor == String)
-			opts.speed = $.fx.speeds[opts.speed] || parseInt(opts.speed,10);
-		if (!opts.sync)
-			opts.speed = opts.speed / 2;
-		
-		var buffer = opts.fx == 'none' ? 0 : opts.fx == 'shuffle' ? 500 : 250;
-		while((opts.timeout - opts.speed) < buffer) // sanitize timeout
-			opts.timeout += opts.speed;
-	}
-	if (opts.easing)
-		opts.easeIn = opts.easeOut = opts.easing;
-	if (!opts.speedIn)
-		opts.speedIn = opts.speed;
-	if (!opts.speedOut)
-		opts.speedOut = opts.speed;
-
-	opts.slideCount = els.length;
-	opts.currSlide = opts.lastSlide = first;
-	if (opts.random) {
-		if (++opts.randomIndex == els.length)
-			opts.randomIndex = 0;
-		opts.nextSlide = opts.randomMap[opts.randomIndex];
-	}
-	else if (opts.backwards)
-		opts.nextSlide = opts.startingSlide === 0 ? (els.length-1) : opts.startingSlide-1;
-	else
-		opts.nextSlide = opts.startingSlide >= (els.length-1) ? 0 : opts.startingSlide+1;
-
-	// run transition init fn
-	if (!opts.multiFx) {
-		var init = $.fn.cycle.transitions[opts.fx];
-		if ($.isFunction(init))
-			init($cont, $slides, opts);
-		else if (opts.fx != 'custom' && !opts.multiFx) {
-			log('unknown transition: ' + opts.fx,'; slideshow terminating');
-			return false;
-		}
-	}
-
-	// fire artificial events
-	var e0 = $slides[first];
-	if (!opts.skipInitializationCallbacks) {
-		if (opts.before.length)
-			opts.before[0].apply(e0, [e0, e0, opts, true]);
-		if (opts.after.length)
-			opts.after[0].apply(e0, [e0, e0, opts, true]);
-	}
-	if (opts.next)
-		$(opts.next).bind(opts.prevNextEvent,function(){return advance(opts,1);});
-	if (opts.prev)
-		$(opts.prev).bind(opts.prevNextEvent,function(){return advance(opts,0);});
-	if (opts.pager || opts.pagerAnchorBuilder)
-		buildPager(els,opts);
-
-	exposeAddSlide(opts, els);
-
-	return opts;
-}
-
-// save off original opts so we can restore after clearing state
-function saveOriginalOpts(opts) {
-	opts.original = { before: [], after: [] };
-	opts.original.cssBefore = $.extend({}, opts.cssBefore);
-	opts.original.cssAfter  = $.extend({}, opts.cssAfter);
-	opts.original.animIn	= $.extend({}, opts.animIn);
-	opts.original.animOut   = $.extend({}, opts.animOut);
-	$.each(opts.before, function() { opts.original.before.push(this); });
-	$.each(opts.after,  function() { opts.original.after.push(this); });
-}
-
-function supportMultiTransitions(opts) {
-	var i, tx, txs = $.fn.cycle.transitions;
-	// look for multiple effects
-	if (opts.fx.indexOf(',') > 0) {
-		opts.multiFx = true;
-		opts.fxs = opts.fx.replace(/\s*/g,'').split(',');
-		// discard any bogus effect names
-		for (i=0; i < opts.fxs.length; i++) {
-			var fx = opts.fxs[i];
-			tx = txs[fx];
-			if (!tx || !txs.hasOwnProperty(fx) || !$.isFunction(tx)) {
-				log('discarding unknown transition: ',fx);
-				opts.fxs.splice(i,1);
-				i--;
-			}
-		}
-		// if we have an empty list then we threw everything away!
-		if (!opts.fxs.length) {
-			log('No valid transitions named; slideshow terminating.');
-			return false;
-		}
-	}
-	else if (opts.fx == 'all') {  // auto-gen the list of transitions
-		opts.multiFx = true;
-		opts.fxs = [];
-		for (var p in txs) {
-			if (txs.hasOwnProperty(p)) {
-				tx = txs[p];
-				if (txs.hasOwnProperty(p) && $.isFunction(tx))
-					opts.fxs.push(p);
-			}
-		}
-	}
-	if (opts.multiFx && opts.randomizeEffects) {
-		// munge the fxs array to make effect selection random
-		var r1 = Math.floor(Math.random() * 20) + 30;
-		for (i = 0; i < r1; i++) {
-			var r2 = Math.floor(Math.random() * opts.fxs.length);
-			opts.fxs.push(opts.fxs.splice(r2,1)[0]);
-		}
-		debug('randomized fx sequence: ',opts.fxs);
-	}
-	return true;
-}
-
-// provide a mechanism for adding slides after the slideshow has started
-function exposeAddSlide(opts, els) {
-	opts.addSlide = function(newSlide, prepend) {
-		var $s = $(newSlide), s = $s[0];
-		if (!opts.autostopCount)
-			opts.countdown++;
-		els[prepend?'unshift':'push'](s);
-		if (opts.els)
-			opts.els[prepend?'unshift':'push'](s); // shuffle needs this
-		opts.slideCount = els.length;
-
-		// add the slide to the random map and resort
-		if (opts.random) {
-			opts.randomMap.push(opts.slideCount-1);
-			opts.randomMap.sort(function(a,b) {return Math.random() - 0.5;});
-		}
-
-		$s.css('position','absolute');
-		$s[prepend?'prependTo':'appendTo'](opts.$cont);
-
-		if (prepend) {
-			opts.currSlide++;
-			opts.nextSlide++;
-		}
-
-		if (!$.support.opacity && opts.cleartype && !opts.cleartypeNoBg)
-			clearTypeFix($s);
-
-		if (opts.fit && opts.width)
-			$s.width(opts.width);
-		if (opts.fit && opts.height && opts.height != 'auto')
-			$s.height(opts.height);
-		s.cycleH = (opts.fit && opts.height) ? opts.height : $s.height();
-		s.cycleW = (opts.fit && opts.width) ? opts.width : $s.width();
-
-		$s.css(opts.cssBefore);
-
-		if (opts.pager || opts.pagerAnchorBuilder)
-			$.fn.cycle.createPagerAnchor(els.length-1, s, $(opts.pager), els, opts);
-
-		if ($.isFunction(opts.onAddSlide))
-			opts.onAddSlide($s);
-		else
-			$s.hide(); // default behavior
-	};
-}
-
-// reset internal state; we do this on every pass in order to support multiple effects
-$.fn.cycle.resetState = function(opts, fx) {
-	fx = fx || opts.fx;
-	opts.before = []; opts.after = [];
-	opts.cssBefore = $.extend({}, opts.original.cssBefore);
-	opts.cssAfter  = $.extend({}, opts.original.cssAfter);
-	opts.animIn	= $.extend({}, opts.original.animIn);
-	opts.animOut   = $.extend({}, opts.original.animOut);
-	opts.fxFn = null;
-	$.each(opts.original.before, function() { opts.before.push(this); });
-	$.each(opts.original.after,  function() { opts.after.push(this); });
-
-	// re-init
-	var init = $.fn.cycle.transitions[fx];
-	if ($.isFunction(init))
-		init(opts.$cont, $(opts.elements), opts);
-};
-
-// this is the main engine fn, it handles the timeouts, callbacks and slide index mgmt
-function go(els, opts, manual, fwd) {
-	var p = opts.$cont[0], curr = els[opts.currSlide], next = els[opts.nextSlide];
-
-	// opts.busy is true if we're in the middle of an animation
-	if (manual && opts.busy && opts.manualTrump) {
-		// let manual transitions requests trump active ones
-		debug('manualTrump in go(), stopping active transition');
-		$(els).stop(true,true);
-		opts.busy = 0;
-		clearTimeout(p.cycleTimeout);
-	}
-
-	// don't begin another timeout-based transition if there is one active
-	if (opts.busy) {
-		debug('transition active, ignoring new tx request');
-		return;
-	}
-
-
-	// stop cycling if we have an outstanding stop request
-	if (p.cycleStop != opts.stopCount || p.cycleTimeout === 0 && !manual)
-		return;
-
-	// check to see if we should stop cycling based on autostop options
-	if (!manual && !p.cyclePause && !opts.bounce &&
-		((opts.autostop && (--opts.countdown <= 0)) ||
-		(opts.nowrap && !opts.random && opts.nextSlide < opts.currSlide))) {
-		if (opts.end)
-			opts.end(opts);
-		return;
-	}
-
-	// if slideshow is paused, only transition on a manual trigger
-	var changed = false;
-	if ((manual || !p.cyclePause) && (opts.nextSlide != opts.currSlide)) {
-		changed = true;
-		var fx = opts.fx;
-		// keep trying to get the slide size if we don't have it yet
-		curr.cycleH = curr.cycleH || $(curr).height();
-		curr.cycleW = curr.cycleW || $(curr).width();
-		next.cycleH = next.cycleH || $(next).height();
-		next.cycleW = next.cycleW || $(next).width();
-
-		// support multiple transition types
-		if (opts.multiFx) {
-			if (fwd && (opts.lastFx === undefined || ++opts.lastFx >= opts.fxs.length))
-				opts.lastFx = 0;
-			else if (!fwd && (opts.lastFx === undefined || --opts.lastFx < 0))
-				opts.lastFx = opts.fxs.length - 1;
-			fx = opts.fxs[opts.lastFx];
-		}
-
-		// one-time fx overrides apply to:  $('div').cycle(3,'zoom');
-		if (opts.oneTimeFx) {
-			fx = opts.oneTimeFx;
-			opts.oneTimeFx = null;
-		}
-
-		$.fn.cycle.resetState(opts, fx);
-
-		// run the before callbacks
-		if (opts.before.length)
-			$.each(opts.before, function(i,o) {
-				if (p.cycleStop != opts.stopCount) return;
-				o.apply(next, [curr, next, opts, fwd]);
-			});
-
-		// stage the after callacks
-		var after = function() {
-			opts.busy = 0;
-			$.each(opts.after, function(i,o) {
-				if (p.cycleStop != opts.stopCount) return;
-				o.apply(next, [curr, next, opts, fwd]);
-			});
-			if (!p.cycleStop) {
-				// queue next transition
-				queueNext();
-			}
-		};
-
-		debug('tx firing('+fx+'); currSlide: ' + opts.currSlide + '; nextSlide: ' + opts.nextSlide);
-		
-		// get ready to perform the transition
-		opts.busy = 1;
-		if (opts.fxFn) // fx function provided?
-			opts.fxFn(curr, next, opts, after, fwd, manual && opts.fastOnEvent);
-		else if ($.isFunction($.fn.cycle[opts.fx])) // fx plugin ?
-			$.fn.cycle[opts.fx](curr, next, opts, after, fwd, manual && opts.fastOnEvent);
-		else
-			$.fn.cycle.custom(curr, next, opts, after, fwd, manual && opts.fastOnEvent);
-	}
-	else {
-		queueNext();
-	}
-
-	if (changed || opts.nextSlide == opts.currSlide) {
-		// calculate the next slide
-		var roll;
-		opts.lastSlide = opts.currSlide;
-		if (opts.random) {
-			opts.currSlide = opts.nextSlide;
-			if (++opts.randomIndex == els.length) {
-				opts.randomIndex = 0;
-				opts.randomMap.sort(function(a,b) {return Math.random() - 0.5;});
-			}
-			opts.nextSlide = opts.randomMap[opts.randomIndex];
-			if (opts.nextSlide == opts.currSlide)
-				opts.nextSlide = (opts.currSlide == opts.slideCount - 1) ? 0 : opts.currSlide + 1;
-		}
-		else if (opts.backwards) {
-			roll = (opts.nextSlide - 1) < 0;
-			if (roll && opts.bounce) {
-				opts.backwards = !opts.backwards;
-				opts.nextSlide = 1;
-				opts.currSlide = 0;
-			}
-			else {
-				opts.nextSlide = roll ? (els.length-1) : opts.nextSlide-1;
-				opts.currSlide = roll ? 0 : opts.nextSlide+1;
-			}
-		}
-		else { // sequence
-			roll = (opts.nextSlide + 1) == els.length;
-			if (roll && opts.bounce) {
-				opts.backwards = !opts.backwards;
-				opts.nextSlide = els.length-2;
-				opts.currSlide = els.length-1;
-			}
-			else {
-				opts.nextSlide = roll ? 0 : opts.nextSlide+1;
-				opts.currSlide = roll ? els.length-1 : opts.nextSlide-1;
-			}
-		}
-	}
-	if (changed && opts.pager)
-		opts.updateActivePagerLink(opts.pager, opts.currSlide, opts.activePagerClass);
-	
-	function queueNext() {
-		// stage the next transition
-		var ms = 0, timeout = opts.timeout;
-		if (opts.timeout && !opts.continuous) {
-			ms = getTimeout(els[opts.currSlide], els[opts.nextSlide], opts, fwd);
-         if (opts.fx == 'shuffle')
-            ms -= opts.speedOut;
-      }
-		else if (opts.continuous && p.cyclePause) // continuous shows work off an after callback, not this timer logic
-			ms = 10;
-		if (ms > 0)
-			p.cycleTimeout = setTimeout(function(){ go(els, opts, 0, !opts.backwards); }, ms);
-	}
-}
-
-// invoked after transition
-$.fn.cycle.updateActivePagerLink = function(pager, currSlide, clsName) {
-   $(pager).each(function() {
-       $(this).children().removeClass(clsName).eq(currSlide).addClass(clsName);
-   });
-};
-
-// calculate timeout value for current transition
-function getTimeout(curr, next, opts, fwd) {
-	if (opts.timeoutFn) {
-		// call user provided calc fn
-		var t = opts.timeoutFn.call(curr,curr,next,opts,fwd);
-		while (opts.fx != 'none' && (t - opts.speed) < 250) // sanitize timeout
-			t += opts.speed;
-		debug('calculated timeout: ' + t + '; speed: ' + opts.speed);
-		if (t !== false)
-			return t;
-	}
-	return opts.timeout;
-}
-
-// expose next/prev function, caller must pass in state
-$.fn.cycle.next = function(opts) { advance(opts,1); };
-$.fn.cycle.prev = function(opts) { advance(opts,0);};
-
-// advance slide forward or back
-function advance(opts, moveForward) {
-	var val = moveForward ? 1 : -1;
-	var els = opts.elements;
-	var p = opts.$cont[0], timeout = p.cycleTimeout;
-	if (timeout) {
-		clearTimeout(timeout);
-		p.cycleTimeout = 0;
-	}
-	if (opts.random && val < 0) {
-		// move back to the previously display slide
-		opts.randomIndex--;
-		if (--opts.randomIndex == -2)
-			opts.randomIndex = els.length-2;
-		else if (opts.randomIndex == -1)
-			opts.randomIndex = els.length-1;
-		opts.nextSlide = opts.randomMap[opts.randomIndex];
-	}
-	else if (opts.random) {
-		opts.nextSlide = opts.randomMap[opts.randomIndex];
-	}
-	else {
-		opts.nextSlide = opts.currSlide + val;
-		if (opts.nextSlide < 0) {
-			if (opts.nowrap) return false;
-			opts.nextSlide = els.length - 1;
-		}
-		else if (opts.nextSlide >= els.length) {
-			if (opts.nowrap) return false;
-			opts.nextSlide = 0;
-		}
-	}
-
-	var cb = opts.onPrevNextEvent || opts.prevNextClick; // prevNextClick is deprecated
-	if ($.isFunction(cb))
-		cb(val > 0, opts.nextSlide, els[opts.nextSlide]);
-	go(els, opts, 1, moveForward);
-	return false;
-}
-
-function buildPager(els, opts) {
-	var $p = $(opts.pager);
-	$.each(els, function(i,o) {
-		$.fn.cycle.createPagerAnchor(i,o,$p,els,opts);
-	});
-	opts.updateActivePagerLink(opts.pager, opts.startingSlide, opts.activePagerClass);
-}
-
-$.fn.cycle.createPagerAnchor = function(i, el, $p, els, opts) {
-	var a;
-	if ($.isFunction(opts.pagerAnchorBuilder)) {
-		a = opts.pagerAnchorBuilder(i,el);
-		debug('pagerAnchorBuilder('+i+', el) returned: ' + a);
-	}
-	else
-		a = '<a href="#">'+(i+1)+'</a>';
-		
-	if (!a)
-		return;
-	var $a = $(a);
-	// don't reparent if anchor is in the dom
-	if ($a.parents('body').length === 0) {
-		var arr = [];
-		if ($p.length > 1) {
-			$p.each(function() {
-				var $clone = $a.clone(true);
-				$(this).append($clone);
-				arr.push($clone[0]);
-			});
-			$a = $(arr);
-		}
-		else {
-			$a.appendTo($p);
-		}
-	}
-
-	opts.pagerAnchors =  opts.pagerAnchors || [];
-	opts.pagerAnchors.push($a);
-	
-	var pagerFn = function(e) {
-		e.preventDefault();
-		opts.nextSlide = i;
-		var p = opts.$cont[0], timeout = p.cycleTimeout;
-		if (timeout) {
-			clearTimeout(timeout);
-			p.cycleTimeout = 0;
-		}
-		var cb = opts.onPagerEvent || opts.pagerClick; // pagerClick is deprecated
-		if ($.isFunction(cb))
-			cb(opts.nextSlide, els[opts.nextSlide]);
-		go(els,opts,1,opts.currSlide < i); // trigger the trans
-//		return false; // <== allow bubble
-	};
-	
-	if ( /mouseenter|mouseover/i.test(opts.pagerEvent) ) {
-		$a.hover(pagerFn, function(){/* no-op */} );
-	}
-	else {
-		$a.bind(opts.pagerEvent, pagerFn);
-	}
-	
-	if ( ! /^click/.test(opts.pagerEvent) && !opts.allowPagerClickBubble)
-		$a.bind('click.cycle', function(){return false;}); // suppress click
-	
-	var cont = opts.$cont[0];
-	var pauseFlag = false; // https://github.com/malsup/cycle/issues/44
-	if (opts.pauseOnPagerHover) {
-		$a.hover(
-			function() { 
-				pauseFlag = true;
-				cont.cyclePause++; 
-				triggerPause(cont,true,true);
-			}, function() { 
-				if (pauseFlag)
-					cont.cyclePause--; 
-				triggerPause(cont,true,true);
-			} 
-		);
-	}
-};
-
-// helper fn to calculate the number of slides between the current and the next
-$.fn.cycle.hopsFromLast = function(opts, fwd) {
-	var hops, l = opts.lastSlide, c = opts.currSlide;
-	if (fwd)
-		hops = c > l ? c - l : opts.slideCount - l;
-	else
-		hops = c < l ? l - c : l + opts.slideCount - c;
-	return hops;
-};
-
-// fix clearType problems in ie6 by setting an explicit bg color
-// (otherwise text slides look horrible during a fade transition)
-function clearTypeFix($slides) {
-	debug('applying clearType background-color hack');
-	function hex(s) {
-		s = parseInt(s,10).toString(16);
-		return s.length < 2 ? '0'+s : s;
-	}
-	function getBg(e) {
-		for ( ; e && e.nodeName.toLowerCase() != 'html'; e = e.parentNode) {
-			var v = $.css(e,'background-color');
-			if (v && v.indexOf('rgb') >= 0 ) {
-				var rgb = v.match(/\d+/g);
-				return '#'+ hex(rgb[0]) + hex(rgb[1]) + hex(rgb[2]);
-			}
-			if (v && v != 'transparent')
-				return v;
-		}
-		return '#ffffff';
-	}
-	$slides.each(function() { $(this).css('background-color', getBg(this)); });
-}
-
-// reset common props before the next transition
-$.fn.cycle.commonReset = function(curr,next,opts,w,h,rev) {
-	$(opts.elements).not(curr).hide();
-	if (typeof opts.cssBefore.opacity == 'undefined')
-		opts.cssBefore.opacity = 1;
-	opts.cssBefore.display = 'block';
-	if (opts.slideResize && w !== false && next.cycleW > 0)
-		opts.cssBefore.width = next.cycleW;
-	if (opts.slideResize && h !== false && next.cycleH > 0)
-		opts.cssBefore.height = next.cycleH;
-	opts.cssAfter = opts.cssAfter || {};
-	opts.cssAfter.display = 'none';
-	$(curr).css('zIndex',opts.slideCount + (rev === true ? 1 : 0));
-	$(next).css('zIndex',opts.slideCount + (rev === true ? 0 : 1));
-};
-
-// the actual fn for effecting a transition
-$.fn.cycle.custom = function(curr, next, opts, cb, fwd, speedOverride) {
-	var $l = $(curr), $n = $(next);
-	var speedIn = opts.speedIn, speedOut = opts.speedOut, easeIn = opts.easeIn, easeOut = opts.easeOut, animInDelay = opts.animInDelay, animOutDelay = opts.animOutDelay;
-	$n.css(opts.cssBefore);
-	if (speedOverride) {
-		if (typeof speedOverride == 'number')
-			speedIn = speedOut = speedOverride;
-		else
-			speedIn = speedOut = 1;
-		easeIn = easeOut = null;
-	}
-	var fn = function() {
-		$n.delay(animInDelay).animate(opts.animIn, speedIn, easeIn, function() {
-			cb();
-		});
-	};
-	$l.delay(animOutDelay).animate(opts.animOut, speedOut, easeOut, function() {
-		$l.css(opts.cssAfter);
-		if (!opts.sync) 
-			fn();
-	});
-	if (opts.sync) fn();
-};
-
-// transition definitions - only fade is defined here, transition pack defines the rest
-$.fn.cycle.transitions = {
-	fade: function($cont, $slides, opts) {
-		$slides.not(':eq('+opts.currSlide+')').css('opacity',0);
-		opts.before.push(function(curr,next,opts) {
-			$.fn.cycle.commonReset(curr,next,opts);
-			opts.cssBefore.opacity = 0;
-		});
-		opts.animIn	   = { opacity: 1 };
-		opts.animOut   = { opacity: 0 };
-		opts.cssBefore = { top: 0, left: 0 };
-	}
-};
-
-$.fn.cycle.ver = function() { return ver; };
-
-// override these globally if you like (they are all optional)
-$.fn.cycle.defaults = {
-    activePagerClass: 'activeSlide', // class name used for the active pager link
-    after:            null,     // transition callback (scope set to element that was shown):  function(currSlideElement, nextSlideElement, options, forwardFlag)
-    allowPagerClickBubble: false, // allows or prevents click event on pager anchors from bubbling
-    animIn:           null,     // properties that define how the slide animates in
-    animInDelay:      0,        // allows delay before next slide transitions in	
-    animOut:          null,     // properties that define how the slide animates out
-    animOutDelay:     0,        // allows delay before current slide transitions out
-    aspect:           false,    // preserve aspect ratio during fit resizing, cropping if necessary (must be used with fit option)
-    autostop:         0,        // true to end slideshow after X transitions (where X == slide count)
-    autostopCount:    0,        // number of transitions (optionally used with autostop to define X)
-    backwards:        false,    // true to start slideshow at last slide and move backwards through the stack
-    before:           null,     // transition callback (scope set to element to be shown):     function(currSlideElement, nextSlideElement, options, forwardFlag)
-    center:           null,     // set to true to have cycle add top/left margin to each slide (use with width and height options)
-    cleartype:        !$.support.opacity,  // true if clearType corrections should be applied (for IE)
-    cleartypeNoBg:    false,    // set to true to disable extra cleartype fixing (leave false to force background color setting on slides)
-    containerResize:  1,        // resize container to fit largest slide
-    containerResizeHeight:  0,  // resize containers height to fit the largest slide but leave the width dynamic
-    continuous:       0,        // true to start next transition immediately after current one completes
-    cssAfter:         null,     // properties that defined the state of the slide after transitioning out
-    cssBefore:        null,     // properties that define the initial state of the slide before transitioning in
-    delay:            0,        // additional delay (in ms) for first transition (hint: can be negative)
-    easeIn:           null,     // easing for "in" transition
-    easeOut:          null,     // easing for "out" transition
-    easing:           null,     // easing method for both in and out transitions
-    end:              null,     // callback invoked when the slideshow terminates (use with autostop or nowrap options): function(options)
-    fastOnEvent:      0,        // force fast transitions when triggered manually (via pager or prev/next); value == time in ms
-    fit:              0,        // force slides to fit container
-    fx:               'fade',   // name of transition effect (or comma separated names, ex: 'fade,scrollUp,shuffle')
-    fxFn:             null,     // function used to control the transition: function(currSlideElement, nextSlideElement, options, afterCalback, forwardFlag)
-    height:           'auto',   // container height (if the 'fit' option is true, the slides will be set to this height as well)
-    manualTrump:      true,     // causes manual transition to stop an active transition instead of being ignored
-    metaAttr:         'cycle',  // data- attribute that holds the option data for the slideshow
-    next:             null,     // element, jQuery object, or jQuery selector string for the element to use as event trigger for next slide
-    nowrap:           0,        // true to prevent slideshow from wrapping
-    onPagerEvent:     null,     // callback fn for pager events: function(zeroBasedSlideIndex, slideElement)
-    onPrevNextEvent:  null,     // callback fn for prev/next events: function(isNext, zeroBasedSlideIndex, slideElement)
-    pager:            null,     // element, jQuery object, or jQuery selector string for the element to use as pager container
-    pagerAnchorBuilder: null,   // callback fn for building anchor links:  function(index, DOMelement)
-    pagerEvent:       'click.cycle', // name of event which drives the pager navigation
-    pause:            0,        // true to enable "pause on hover"
-    pauseOnPagerHover: 0,       // true to pause when hovering over pager link
-    prev:             null,     // element, jQuery object, or jQuery selector string for the element to use as event trigger for previous slide
-    prevNextEvent:    'click.cycle',// event which drives the manual transition to the previous or next slide
-    random:           0,        // true for random, false for sequence (not applicable to shuffle fx)
-    randomizeEffects: 1,        // valid when multiple effects are used; true to make the effect sequence random
-    requeueOnImageNotLoaded: true, // requeue the slideshow if any image slides are not yet loaded
-    requeueTimeout:   250,      // ms delay for requeue
-    rev:              0,        // causes animations to transition in reverse (for effects that support it such as scrollHorz/scrollVert/shuffle)
-    shuffle:          null,     // coords for shuffle animation, ex: { top:15, left: 200 }
-    skipInitializationCallbacks: false, // set to true to disable the first before/after callback that occurs prior to any transition
-    slideExpr:        null,     // expression for selecting slides (if something other than all children is required)
-    slideResize:      1,        // force slide width/height to fixed size before every transition
-    speed:            1000,     // speed of the transition (any valid fx speed value)
-    speedIn:          null,     // speed of the 'in' transition
-    speedOut:         null,     // speed of the 'out' transition
-    startingSlide:    undefined,// zero-based index of the first slide to be displayed
-    sync:             1,        // true if in/out transitions should occur simultaneously
-    timeout:          4000,     // milliseconds between slide transitions (0 to disable auto advance)
-    timeoutFn:        null,     // callback for determining per-slide timeout value:  function(currSlideElement, nextSlideElement, options, forwardFlag)
-    updateActivePagerLink: null,// callback fn invoked to update the active pager link (adds/removes activePagerClass style)
-    width:            null      // container width (if the 'fit' option is true, the slides will be set to this width as well)
-};
-
-})(jQuery);
-
-
-/*!
- * jQuery Cycle Plugin Transition Definitions
- * This script is a plugin for the jQuery Cycle Plugin
- * Examples and documentation at: http://malsup.com/jquery/cycle/
- * Copyright (c) 2007-2010 M. Alsup
- * Version:	 2.73
- * Dual licensed under the MIT and GPL licenses:
- * http://www.opensource.org/licenses/mit-license.php
- * http://www.gnu.org/licenses/gpl.html
- */
-(function($) {
-"use strict";
-
-//
-// These functions define slide initialization and properties for the named
-// transitions. To save file size feel free to remove any of these that you
-// don't need.
-//
-$.fn.cycle.transitions.none = function($cont, $slides, opts) {
-	opts.fxFn = function(curr,next,opts,after){
-		$(next).show();
-		$(curr).hide();
-		after();
-	};
-};
-
-// not a cross-fade, fadeout only fades out the top slide
-$.fn.cycle.transitions.fadeout = function($cont, $slides, opts) {
-	$slides.not(':eq('+opts.currSlide+')').css({ display: 'block', 'opacity': 1 });
-	opts.before.push(function(curr,next,opts,w,h,rev) {
-		$(curr).css('zIndex',opts.slideCount + (rev !== true ? 1 : 0));
-		$(next).css('zIndex',opts.slideCount + (rev !== true ? 0 : 1));
-	});
-	opts.animIn.opacity = 1;
-	opts.animOut.opacity = 0;
-	opts.cssBefore.opacity = 1;
-	opts.cssBefore.display = 'block';
-	opts.cssAfter.zIndex = 0;
-};
-
-// scrollUp/Down/Left/Right
-$.fn.cycle.transitions.scrollUp = function($cont, $slides, opts) {
-	$cont.css('overflow','hidden');
-	opts.before.push($.fn.cycle.commonReset);
-	var h = $cont.height();
-	opts.cssBefore.top = h;
-	opts.cssBefore.left = 0;
-	opts.cssFirst.top = 0;
-	opts.animIn.top = 0;
-	opts.animOut.top = -h;
-};
-$.fn.cycle.transitions.scrollDown = function($cont, $slides, opts) {
-	$cont.css('overflow','hidden');
-	opts.before.push($.fn.cycle.commonReset);
-	var h = $cont.height();
-	opts.cssFirst.top = 0;
-	opts.cssBefore.top = -h;
-	opts.cssBefore.left = 0;
-	opts.animIn.top = 0;
-	opts.animOut.top = h;
-};
-$.fn.cycle.transitions.scrollLeft = function($cont, $slides, opts) {
-	$cont.css('overflow','hidden');
-	opts.before.push($.fn.cycle.commonReset);
-	var w = $cont.width();
-	opts.cssFirst.left = 0;
-	opts.cssBefore.left = w;
-	opts.cssBefore.top = 0;
-	opts.animIn.left = 0;
-	opts.animOut.left = 0-w;
-};
-$.fn.cycle.transitions.scrollRight = function($cont, $slides, opts) {
-	$cont.css('overflow','hidden');
-	opts.before.push($.fn.cycle.commonReset);
-	var w = $cont.width();
-	opts.cssFirst.left = 0;
-	opts.cssBefore.left = -w;
-	opts.cssBefore.top = 0;
-	opts.animIn.left = 0;
-	opts.animOut.left = w;
-};
-$.fn.cycle.transitions.scrollHorz = function($cont, $slides, opts) {
-	$cont.css('overflow','hidden').width();
-	opts.before.push(function(curr, next, opts, fwd) {
-		if (opts.rev)
-			fwd = !fwd;
-		$.fn.cycle.commonReset(curr,next,opts);
-		opts.cssBefore.left = fwd ? (next.cycleW-1) : (1-next.cycleW);
-		opts.animOut.left = fwd ? -curr.cycleW : curr.cycleW;
-	});
-	opts.cssFirst.left = 0;
-	opts.cssBefore.top = 0;
-	opts.animIn.left = 0;
-	opts.animOut.top = 0;
-};
-$.fn.cycle.transitions.scrollVert = function($cont, $slides, opts) {
-	$cont.css('overflow','hidden');
-	opts.before.push(function(curr, next, opts, fwd) {
-		if (opts.rev)
-			fwd = !fwd;
-		$.fn.cycle.commonReset(curr,next,opts);
-		opts.cssBefore.top = fwd ? (1-next.cycleH) : (next.cycleH-1);
-		opts.animOut.top = fwd ? curr.cycleH : -curr.cycleH;
-	});
-	opts.cssFirst.top = 0;
-	opts.cssBefore.left = 0;
-	opts.animIn.top = 0;
-	opts.animOut.left = 0;
-};
-
-// slideX/slideY
-$.fn.cycle.transitions.slideX = function($cont, $slides, opts) {
-	opts.before.push(function(curr, next, opts) {
-		$(opts.elements).not(curr).hide();
-		$.fn.cycle.commonReset(curr,next,opts,false,true);
-		opts.animIn.width = next.cycleW;
-	});
-	opts.cssBefore.left = 0;
-	opts.cssBefore.top = 0;
-	opts.cssBefore.width = 0;
-	opts.animIn.width = 'show';
-	opts.animOut.width = 0;
-};
-$.fn.cycle.transitions.slideY = function($cont, $slides, opts) {
-	opts.before.push(function(curr, next, opts) {
-		$(opts.elements).not(curr).hide();
-		$.fn.cycle.commonReset(curr,next,opts,true,false);
-		opts.animIn.height = next.cycleH;
-	});
-	opts.cssBefore.left = 0;
-	opts.cssBefore.top = 0;
-	opts.cssBefore.height = 0;
-	opts.animIn.height = 'show';
-	opts.animOut.height = 0;
-};
-
-// shuffle
-$.fn.cycle.transitions.shuffle = function($cont, $slides, opts) {
-	var i, w = $cont.css('overflow', 'visible').width();
-	$slides.css({left: 0, top: 0});
-	opts.before.push(function(curr,next,opts) {
-		$.fn.cycle.commonReset(curr,next,opts,true,true,true);
-	});
-	// only adjust speed once!
-	if (!opts.speedAdjusted) {
-		opts.speed = opts.speed / 2; // shuffle has 2 transitions
-		opts.speedAdjusted = true;
-	}
-	opts.random = 0;
-	opts.shuffle = opts.shuffle || {left:-w, top:15};
-	opts.els = [];
-	for (i=0; i < $slides.length; i++)
-		opts.els.push($slides[i]);
-
-	for (i=0; i < opts.currSlide; i++)
-		opts.els.push(opts.els.shift());
-
-	// custom transition fn (hat tip to Benjamin Sterling for this bit of sweetness!)
-	opts.fxFn = function(curr, next, opts, cb, fwd) {
-		if (opts.rev)
-			fwd = !fwd;
-		var $el = fwd ? $(curr) : $(next);
-		$(next).css(opts.cssBefore);
-		var count = opts.slideCount;
-		$el.animate(opts.shuffle, opts.speedIn, opts.easeIn, function() {
-			var hops = $.fn.cycle.hopsFromLast(opts, fwd);
-			for (var k=0; k < hops; k++) {
-				if (fwd)
-					opts.els.push(opts.els.shift());
-				else
-					opts.els.unshift(opts.els.pop());
-			}
-			if (fwd) {
-				for (var i=0, len=opts.els.length; i < len; i++)
-					$(opts.els[i]).css('z-index', len-i+count);
-			}
-			else {
-				var z = $(curr).css('z-index');
-				$el.css('z-index', parseInt(z,10)+1+count);
-			}
-			$el.animate({left:0, top:0}, opts.speedOut, opts.easeOut, function() {
-				$(fwd ? this : curr).hide();
-				if (cb) cb();
-			});
-		});
-	};
-	$.extend(opts.cssBefore, { display: 'block', opacity: 1, top: 0, left: 0 });
-};
-
-// turnUp/Down/Left/Right
-$.fn.cycle.transitions.turnUp = function($cont, $slides, opts) {
-	opts.before.push(function(curr, next, opts) {
-		$.fn.cycle.commonReset(curr,next,opts,true,false);
-		opts.cssBefore.top = next.cycleH;
-		opts.animIn.height = next.cycleH;
-		opts.animOut.width = next.cycleW;
-	});
-	opts.cssFirst.top = 0;
-	opts.cssBefore.left = 0;
-	opts.cssBefore.height = 0;
-	opts.animIn.top = 0;
-	opts.animOut.height = 0;
-};
-$.fn.cycle.transitions.turnDown = function($cont, $slides, opts) {
-	opts.before.push(function(curr, next, opts) {
-		$.fn.cycle.commonReset(curr,next,opts,true,false);
-		opts.animIn.height = next.cycleH;
-		opts.animOut.top   = curr.cycleH;
-	});
-	opts.cssFirst.top = 0;
-	opts.cssBefore.left = 0;
-	opts.cssBefore.top = 0;
-	opts.cssBefore.height = 0;
-	opts.animOut.height = 0;
-};
-$.fn.cycle.transitions.turnLeft = function($cont, $slides, opts) {
-	opts.before.push(function(curr, next, opts) {
-		$.fn.cycle.commonReset(curr,next,opts,false,true);
-		opts.cssBefore.left = next.cycleW;
-		opts.animIn.width = next.cycleW;
-	});
-	opts.cssBefore.top = 0;
-	opts.cssBefore.width = 0;
-	opts.animIn.left = 0;
-	opts.animOut.width = 0;
-};
-$.fn.cycle.transitions.turnRight = function($cont, $slides, opts) {
-	opts.before.push(function(curr, next, opts) {
-		$.fn.cycle.commonReset(curr,next,opts,false,true);
-		opts.animIn.width = next.cycleW;
-		opts.animOut.left = curr.cycleW;
-	});
-	$.extend(opts.cssBefore, { top: 0, left: 0, width: 0 });
-	opts.animIn.left = 0;
-	opts.animOut.width = 0;
-};
-
-// zoom
-$.fn.cycle.transitions.zoom = function($cont, $slides, opts) {
-	opts.before.push(function(curr, next, opts) {
-		$.fn.cycle.commonReset(curr,next,opts,false,false,true);
-		opts.cssBefore.top = next.cycleH/2;
-		opts.cssBefore.left = next.cycleW/2;
-		$.extend(opts.animIn, { top: 0, left: 0, width: next.cycleW, height: next.cycleH });
-		$.extend(opts.animOut, { width: 0, height: 0, top: curr.cycleH/2, left: curr.cycleW/2 });
-	});
-	opts.cssFirst.top = 0;
-	opts.cssFirst.left = 0;
-	opts.cssBefore.width = 0;
-	opts.cssBefore.height = 0;
-};
-
-// fadeZoom
-$.fn.cycle.transitions.fadeZoom = function($cont, $slides, opts) {
-	opts.before.push(function(curr, next, opts) {
-		$.fn.cycle.commonReset(curr,next,opts,false,false);
-		opts.cssBefore.left = next.cycleW/2;
-		opts.cssBefore.top = next.cycleH/2;
-		$.extend(opts.animIn, { top: 0, left: 0, width: next.cycleW, height: next.cycleH });
-	});
-	opts.cssBefore.width = 0;
-	opts.cssBefore.height = 0;
-	opts.animOut.opacity = 0;
-};
-
-// blindX
-$.fn.cycle.transitions.blindX = function($cont, $slides, opts) {
-	var w = $cont.css('overflow','hidden').width();
-	opts.before.push(function(curr, next, opts) {
-		$.fn.cycle.commonReset(curr,next,opts);
-		opts.animIn.width = next.cycleW;
-		opts.animOut.left   = curr.cycleW;
-	});
-	opts.cssBefore.left = w;
-	opts.cssBefore.top = 0;
-	opts.animIn.left = 0;
-	opts.animOut.left = w;
-};
-// blindY
-$.fn.cycle.transitions.blindY = function($cont, $slides, opts) {
-	var h = $cont.css('overflow','hidden').height();
-	opts.before.push(function(curr, next, opts) {
-		$.fn.cycle.commonReset(curr,next,opts);
-		opts.animIn.height = next.cycleH;
-		opts.animOut.top   = curr.cycleH;
-	});
-	opts.cssBefore.top = h;
-	opts.cssBefore.left = 0;
-	opts.animIn.top = 0;
-	opts.animOut.top = h;
-};
-// blindZ
-$.fn.cycle.transitions.blindZ = function($cont, $slides, opts) {
-	var h = $cont.css('overflow','hidden').height();
-	var w = $cont.width();
-	opts.before.push(function(curr, next, opts) {
-		$.fn.cycle.commonReset(curr,next,opts);
-		opts.animIn.height = next.cycleH;
-		opts.animOut.top   = curr.cycleH;
-	});
-	opts.cssBefore.top = h;
-	opts.cssBefore.left = w;
-	opts.animIn.top = 0;
-	opts.animIn.left = 0;
-	opts.animOut.top = h;
-	opts.animOut.left = w;
-};
-
-// growX - grow horizontally from centered 0 width
-$.fn.cycle.transitions.growX = function($cont, $slides, opts) {
-	opts.before.push(function(curr, next, opts) {
-		$.fn.cycle.commonReset(curr,next,opts,false,true);
-		opts.cssBefore.left = this.cycleW/2;
-		opts.animIn.left = 0;
-		opts.animIn.width = this.cycleW;
-		opts.animOut.left = 0;
-	});
-	opts.cssBefore.top = 0;
-	opts.cssBefore.width = 0;
-};
-// growY - grow vertically from centered 0 height
-$.fn.cycle.transitions.growY = function($cont, $slides, opts) {
-	opts.before.push(function(curr, next, opts) {
-		$.fn.cycle.commonReset(curr,next,opts,true,false);
-		opts.cssBefore.top = this.cycleH/2;
-		opts.animIn.top = 0;
-		opts.animIn.height = this.cycleH;
-		opts.animOut.top = 0;
-	});
-	opts.cssBefore.height = 0;
-	opts.cssBefore.left = 0;
-};
-
-// curtainX - squeeze in both edges horizontally
-$.fn.cycle.transitions.curtainX = function($cont, $slides, opts) {
-	opts.before.push(function(curr, next, opts) {
-		$.fn.cycle.commonReset(curr,next,opts,false,true,true);
-		opts.cssBefore.left = next.cycleW/2;
-		opts.animIn.left = 0;
-		opts.animIn.width = this.cycleW;
-		opts.animOut.left = curr.cycleW/2;
-		opts.animOut.width = 0;
-	});
-	opts.cssBefore.top = 0;
-	opts.cssBefore.width = 0;
-};
-// curtainY - squeeze in both edges vertically
-$.fn.cycle.transitions.curtainY = function($cont, $slides, opts) {
-	opts.before.push(function(curr, next, opts) {
-		$.fn.cycle.commonReset(curr,next,opts,true,false,true);
-		opts.cssBefore.top = next.cycleH/2;
-		opts.animIn.top = 0;
-		opts.animIn.height = next.cycleH;
-		opts.animOut.top = curr.cycleH/2;
-		opts.animOut.height = 0;
-	});
-	opts.cssBefore.height = 0;
-	opts.cssBefore.left = 0;
-};
-
-// cover - curr slide covered by next slide
-$.fn.cycle.transitions.cover = function($cont, $slides, opts) {
-	var d = opts.direction || 'left';
-	var w = $cont.css('overflow','hidden').width();
-	var h = $cont.height();
-	opts.before.push(function(curr, next, opts) {
-		$.fn.cycle.commonReset(curr,next,opts);
-		opts.cssAfter.display = '';
-		if (d == 'right')
-			opts.cssBefore.left = -w;
-		else if (d == 'up')
-			opts.cssBefore.top = h;
-		else if (d == 'down')
-			opts.cssBefore.top = -h;
-		else
-			opts.cssBefore.left = w;
-	});
-	opts.animIn.left = 0;
-	opts.animIn.top = 0;
-	opts.cssBefore.top = 0;
-	opts.cssBefore.left = 0;
-};
-
-// uncover - curr slide moves off next slide
-$.fn.cycle.transitions.uncover = function($cont, $slides, opts) {
-	var d = opts.direction || 'left';
-	var w = $cont.css('overflow','hidden').width();
-	var h = $cont.height();
-	opts.before.push(function(curr, next, opts) {
-		$.fn.cycle.commonReset(curr,next,opts,true,true,true);
-		if (d == 'right')
-			opts.animOut.left = w;
-		else if (d == 'up')
-			opts.animOut.top = -h;
-		else if (d == 'down')
-			opts.animOut.top = h;
-		else
-			opts.animOut.left = -w;
-	});
-	opts.animIn.left = 0;
-	opts.animIn.top = 0;
-	opts.cssBefore.top = 0;
-	opts.cssBefore.left = 0;
-};
-
-// toss - move top slide and fade away
-$.fn.cycle.transitions.toss = function($cont, $slides, opts) {
-	var w = $cont.css('overflow','visible').width();
-	var h = $cont.height();
-	opts.before.push(function(curr, next, opts) {
-		$.fn.cycle.commonReset(curr,next,opts,true,true,true);
-		// provide default toss settings if animOut not provided
-		if (!opts.animOut.left && !opts.animOut.top)
-			$.extend(opts.animOut, { left: w*2, top: -h/2, opacity: 0 });
-		else
-			opts.animOut.opacity = 0;
-	});
-	opts.cssBefore.left = 0;
-	opts.cssBefore.top = 0;
-	opts.animIn.left = 0;
-};
-
-// wipe - clip animation
-$.fn.cycle.transitions.wipe = function($cont, $slides, opts) {
-	var w = $cont.css('overflow','hidden').width();
-	var h = $cont.height();
-	opts.cssBefore = opts.cssBefore || {};
-	var clip;
-	if (opts.clip) {
-		if (/l2r/.test(opts.clip))
-			clip = 'rect(0px 0px '+h+'px 0px)';
-		else if (/r2l/.test(opts.clip))
-			clip = 'rect(0px '+w+'px '+h+'px '+w+'px)';
-		else if (/t2b/.test(opts.clip))
-			clip = 'rect(0px '+w+'px 0px 0px)';
-		else if (/b2t/.test(opts.clip))
-			clip = 'rect('+h+'px '+w+'px '+h+'px 0px)';
-		else if (/zoom/.test(opts.clip)) {
-			var top = parseInt(h/2,10);
-			var left = parseInt(w/2,10);
-			clip = 'rect('+top+'px '+left+'px '+top+'px '+left+'px)';
-		}
-	}
-
-	opts.cssBefore.clip = opts.cssBefore.clip || clip || 'rect(0px 0px 0px 0px)';
-
-	var d = opts.cssBefore.clip.match(/(\d+)/g);
-	var t = parseInt(d[0],10), r = parseInt(d[1],10), b = parseInt(d[2],10), l = parseInt(d[3],10);
-
-	opts.before.push(function(curr, next, opts) {
-		if (curr == next) return;
-		var $curr = $(curr), $next = $(next);
-		$.fn.cycle.commonReset(curr,next,opts,true,true,false);
-		opts.cssAfter.display = 'block';
-
-		var step = 1, count = parseInt((opts.speedIn / 13),10) - 1;
-		(function f() {
-			var tt = t ? t - parseInt(step * (t/count),10) : 0;
-			var ll = l ? l - parseInt(step * (l/count),10) : 0;
-			var bb = b < h ? b + parseInt(step * ((h-b)/count || 1),10) : h;
-			var rr = r < w ? r + parseInt(step * ((w-r)/count || 1),10) : w;
-			$next.css({ clip: 'rect('+tt+'px '+rr+'px '+bb+'px '+ll+'px)' });
-			(step++ <= count) ? setTimeout(f, 13) : $curr.css('display', 'none');
-		})();
-	});
-	$.extend(opts.cssBefore, { display: 'block', opacity: 1, top: 0, left: 0 });
-	opts.animIn	   = { left: 0 };
-	opts.animOut   = { left: 0 };
-};
-
-})(jQuery);
diff --git a/web/libraries/jquery.cycle/jquery.cycle.all.js.2 b/web/libraries/jquery.cycle/jquery.cycle.all.js.2
deleted file mode 100644
index dc474ea0cb1da920daef85dfeae13c0ba706daff..0000000000000000000000000000000000000000
--- a/web/libraries/jquery.cycle/jquery.cycle.all.js.2
+++ /dev/null
@@ -1,1543 +0,0 @@
-/*!
- * jQuery Cycle Plugin (with Transition Definitions)
- * Examples and documentation at: http://jquery.malsup.com/cycle/
- * Copyright (c) 2007-2013 M. Alsup
- * Version: 3.0.3 (11-JUL-2013)
- * Dual licensed under the MIT and GPL licenses.
- * http://jquery.malsup.com/license.html
- * Requires: jQuery v1.7.1 or later
- */
-;(function($, undefined) {
-"use strict";
-
-var ver = '3.0.3';
-
-function debug(s) {
-	if ($.fn.cycle.debug)
-		log(s);
-}		
-function log() {
-	/*global console */
-	if (window.console && console.log)
-		console.log('[cycle] ' + Array.prototype.join.call(arguments,' '));
-}
-$.expr[':'].paused = function(el) {
-	return el.cyclePause;
-};
-
-
-// the options arg can be...
-//   a number  - indicates an immediate transition should occur to the given slide index
-//   a string  - 'pause', 'resume', 'toggle', 'next', 'prev', 'stop', 'destroy' or the name of a transition effect (ie, 'fade', 'zoom', etc)
-//   an object - properties to control the slideshow
-//
-// the arg2 arg can be...
-//   the name of an fx (only used in conjunction with a numeric value for 'options')
-//   the value true (only used in first arg == 'resume') and indicates
-//	 that the resume should occur immediately (not wait for next timeout)
-
-$.fn.cycle = function(options, arg2) {
-	var o = { s: this.selector, c: this.context };
-
-	// in 1.3+ we can fix mistakes with the ready state
-	if (this.length === 0 && options != 'stop') {
-		if (!$.isReady && o.s) {
-			log('DOM not ready, queuing slideshow');
-			$(function() {
-				$(o.s,o.c).cycle(options,arg2);
-			});
-			return this;
-		}
-		// is your DOM ready?  http://docs.jquery.com/Tutorials:Introducing_$(document).ready()
-		log('terminating; zero elements found by selector' + ($.isReady ? '' : ' (DOM not ready)'));
-		return this;
-	}
-
-	// iterate the matched nodeset
-	return this.each(function() {
-		var opts = handleArguments(this, options, arg2);
-		if (opts === false)
-			return;
-
-		opts.updateActivePagerLink = opts.updateActivePagerLink || $.fn.cycle.updateActivePagerLink;
-		
-		// stop existing slideshow for this container (if there is one)
-		if (this.cycleTimeout)
-			clearTimeout(this.cycleTimeout);
-		this.cycleTimeout = this.cyclePause = 0;
-		this.cycleStop = 0; // issue #108
-
-		var $cont = $(this);
-		var $slides = opts.slideExpr ? $(opts.slideExpr, this) : $cont.children();
-		var els = $slides.get();
-
-		if (els.length < 2) {
-			log('terminating; too few slides: ' + els.length);
-			return;
-		}
-
-		var opts2 = buildOptions($cont, $slides, els, opts, o);
-		if (opts2 === false)
-			return;
-
-		var startTime = opts2.continuous ? 10 : getTimeout(els[opts2.currSlide], els[opts2.nextSlide], opts2, !opts2.backwards);
-
-		// if it's an auto slideshow, kick it off
-		if (startTime) {
-			startTime += (opts2.delay || 0);
-			if (startTime < 10)
-				startTime = 10;
-			debug('first timeout: ' + startTime);
-			this.cycleTimeout = setTimeout(function(){go(els,opts2,0,!opts.backwards);}, startTime);
-		}
-	});
-};
-
-function triggerPause(cont, byHover, onPager) {
-	var opts = $(cont).data('cycle.opts');
-	if (!opts)
-		return;
-	var paused = !!cont.cyclePause;
-	if (paused && opts.paused)
-		opts.paused(cont, opts, byHover, onPager);
-	else if (!paused && opts.resumed)
-		opts.resumed(cont, opts, byHover, onPager);
-}
-
-// process the args that were passed to the plugin fn
-function handleArguments(cont, options, arg2) {
-	if (cont.cycleStop === undefined)
-		cont.cycleStop = 0;
-	if (options === undefined || options === null)
-		options = {};
-	if (options.constructor == String) {
-		switch(options) {
-		case 'destroy':
-		case 'stop':
-			var opts = $(cont).data('cycle.opts');
-			if (!opts)
-				return false;
-			cont.cycleStop++; // callbacks look for change
-			if (cont.cycleTimeout)
-				clearTimeout(cont.cycleTimeout);
-			cont.cycleTimeout = 0;
-			if (opts.elements)
-				$(opts.elements).stop();
-			$(cont).removeData('cycle.opts');
-			if (options == 'destroy')
-				destroy(cont, opts);
-			return false;
-		case 'toggle':
-			cont.cyclePause = (cont.cyclePause === 1) ? 0 : 1;
-			checkInstantResume(cont.cyclePause, arg2, cont);
-			triggerPause(cont);
-			return false;
-		case 'pause':
-			cont.cyclePause = 1;
-			triggerPause(cont);
-			return false;
-		case 'resume':
-			cont.cyclePause = 0;
-			checkInstantResume(false, arg2, cont);
-			triggerPause(cont);
-			return false;
-		case 'prev':
-		case 'next':
-			opts = $(cont).data('cycle.opts');
-			if (!opts) {
-				log('options not found, "prev/next" ignored');
-				return false;
-			}
-			if (typeof arg2 == 'string') 
-				opts.oneTimeFx = arg2;
-			$.fn.cycle[options](opts);
-			return false;
-		default:
-			options = { fx: options };
-		}
-		return options;
-	}
-	else if (options.constructor == Number) {
-		// go to the requested slide
-		var num = options;
-		options = $(cont).data('cycle.opts');
-		if (!options) {
-			log('options not found, can not advance slide');
-			return false;
-		}
-		if (num < 0 || num >= options.elements.length) {
-			log('invalid slide index: ' + num);
-			return false;
-		}
-		options.nextSlide = num;
-		if (cont.cycleTimeout) {
-			clearTimeout(cont.cycleTimeout);
-			cont.cycleTimeout = 0;
-		}
-		if (typeof arg2 == 'string')
-			options.oneTimeFx = arg2;
-		go(options.elements, options, 1, num >= options.currSlide);
-		return false;
-	}
-	return options;
-	
-	function checkInstantResume(isPaused, arg2, cont) {
-		if (!isPaused && arg2 === true) { // resume now!
-			var options = $(cont).data('cycle.opts');
-			if (!options) {
-				log('options not found, can not resume');
-				return false;
-			}
-			if (cont.cycleTimeout) {
-				clearTimeout(cont.cycleTimeout);
-				cont.cycleTimeout = 0;
-			}
-			go(options.elements, options, 1, !options.backwards);
-		}
-	}
-}
-
-function removeFilter(el, opts) {
-	if (!$.support.opacity && opts.cleartype && el.style.filter) {
-		try { el.style.removeAttribute('filter'); }
-		catch(smother) {} // handle old opera versions
-	}
-}
-
-// unbind event handlers
-function destroy(cont, opts) {
-	if (opts.next)
-		$(opts.next).unbind(opts.prevNextEvent);
-	if (opts.prev)
-		$(opts.prev).unbind(opts.prevNextEvent);
-	
-	if (opts.pager || opts.pagerAnchorBuilder)
-		$.each(opts.pagerAnchors || [], function() {
-			this.unbind().remove();
-		});
-	opts.pagerAnchors = null;
-	$(cont).unbind('mouseenter.cycle mouseleave.cycle');
-	if (opts.destroy) // callback
-		opts.destroy(opts);
-}
-
-// one-time initialization
-function buildOptions($cont, $slides, els, options, o) {
-	var startingSlideSpecified;
-	// support metadata plugin (v1.0 and v2.0)
-	var opts = $.extend({}, $.fn.cycle.defaults, options || {}, $.metadata ? $cont.metadata() : $.meta ? $cont.data() : {});
-	var meta = $.isFunction($cont.data) ? $cont.data(opts.metaAttr) : null;
-	if (meta)
-		opts = $.extend(opts, meta);
-	if (opts.autostop)
-		opts.countdown = opts.autostopCount || els.length;
-
-	var cont = $cont[0];
-	$cont.data('cycle.opts', opts);
-	opts.$cont = $cont;
-	opts.stopCount = cont.cycleStop;
-	opts.elements = els;
-	opts.before = opts.before ? [opts.before] : [];
-	opts.after = opts.after ? [opts.after] : [];
-
-	// push some after callbacks
-	if (!$.support.opacity && opts.cleartype)
-		opts.after.push(function() { removeFilter(this, opts); });
-	if (opts.continuous)
-		opts.after.push(function() { go(els,opts,0,!opts.backwards); });
-
-	saveOriginalOpts(opts);
-
-	// clearType corrections
-	if (!$.support.opacity && opts.cleartype && !opts.cleartypeNoBg)
-		clearTypeFix($slides);
-
-	// container requires non-static position so that slides can be position within
-	if ($cont.css('position') == 'static')
-		$cont.css('position', 'relative');
-	if (opts.width)
-		$cont.width(opts.width);
-	if (opts.height && opts.height != 'auto')
-		$cont.height(opts.height);
-
-	if (opts.startingSlide !== undefined) {
-		opts.startingSlide = parseInt(opts.startingSlide,10);
-		if (opts.startingSlide >= els.length || opts.startSlide < 0)
-			opts.startingSlide = 0; // catch bogus input
-		else 
-			startingSlideSpecified = true;
-	}
-	else if (opts.backwards)
-		opts.startingSlide = els.length - 1;
-	else
-		opts.startingSlide = 0;
-
-	// if random, mix up the slide array
-	if (opts.random) {
-		opts.randomMap = [];
-		for (var i = 0; i < els.length; i++)
-			opts.randomMap.push(i);
-		opts.randomMap.sort(function(a,b) {return Math.random() - 0.5;});
-		if (startingSlideSpecified) {
-			// try to find the specified starting slide and if found set start slide index in the map accordingly
-			for ( var cnt = 0; cnt < els.length; cnt++ ) {
-				if ( opts.startingSlide == opts.randomMap[cnt] ) {
-					opts.randomIndex = cnt;
-				}
-			}
-		}
-		else {
-			opts.randomIndex = 1;
-			opts.startingSlide = opts.randomMap[1];
-		}
-	}
-	else if (opts.startingSlide >= els.length)
-		opts.startingSlide = 0; // catch bogus input
-	opts.currSlide = opts.startingSlide || 0;
-	var first = opts.startingSlide;
-
-	// set position and zIndex on all the slides
-	$slides.css({position: 'absolute', top:0, left:0}).hide().each(function(i) {
-		var z;
-		if (opts.backwards)
-			z = first ? i <= first ? els.length + (i-first) : first-i : els.length-i;
-		else
-			z = first ? i >= first ? els.length - (i-first) : first-i : els.length-i;
-		$(this).css('z-index', z);
-	});
-
-	// make sure first slide is visible
-	$(els[first]).css('opacity',1).show(); // opacity bit needed to handle restart use case
-	removeFilter(els[first], opts);
-
-	// stretch slides
-	if (opts.fit) {
-		if (!opts.aspect) {
-	        if (opts.width)
-	            $slides.width(opts.width);
-	        if (opts.height && opts.height != 'auto')
-	            $slides.height(opts.height);
-		} else {
-			$slides.each(function(){
-				var $slide = $(this);
-				var ratio = (opts.aspect === true) ? $slide.width()/$slide.height() : opts.aspect;
-				if( opts.width && $slide.width() != opts.width ) {
-					$slide.width( opts.width );
-					$slide.height( opts.width / ratio );
-				}
-
-				if( opts.height && $slide.height() < opts.height ) {
-					$slide.height( opts.height );
-					$slide.width( opts.height * ratio );
-				}
-			});
-		}
-	}
-
-	if (opts.center && ((!opts.fit) || opts.aspect)) {
-		$slides.each(function(){
-			var $slide = $(this);
-			$slide.css({
-				"margin-left": opts.width ?
-					((opts.width - $slide.width()) / 2) + "px" :
-					0,
-				"margin-top": opts.height ?
-					((opts.height - $slide.height()) / 2) + "px" :
-					0
-			});
-		});
-	}
-
-	if (opts.center && !opts.fit && !opts.slideResize) {
-		$slides.each(function(){
-			var $slide = $(this);
-			$slide.css({
-				"margin-left": opts.width ? ((opts.width - $slide.width()) / 2) + "px" : 0,
-				"margin-top": opts.height ? ((opts.height - $slide.height()) / 2) + "px" : 0
-			});
-		});
-	}
-		
-	// stretch container
-	var reshape = (opts.containerResize || opts.containerResizeHeight) && $cont.innerHeight() < 1;
-	if (reshape) { // do this only if container has no size http://tinyurl.com/da2oa9
-		var maxw = 0, maxh = 0;
-		for(var j=0; j < els.length; j++) {
-			var $e = $(els[j]), e = $e[0], w = $e.outerWidth(), h = $e.outerHeight();
-			if (!w) w = e.offsetWidth || e.width || $e.attr('width');
-			if (!h) h = e.offsetHeight || e.height || $e.attr('height');
-			maxw = w > maxw ? w : maxw;
-			maxh = h > maxh ? h : maxh;
-		}
-		if (opts.containerResize && maxw > 0 && maxh > 0)
-			$cont.css({width:maxw+'px',height:maxh+'px'});
-		if (opts.containerResizeHeight && maxh > 0)
-			$cont.css({height:maxh+'px'});
-	}
-
-	var pauseFlag = false;  // https://github.com/malsup/cycle/issues/44
-	if (opts.pause)
-		$cont.bind('mouseenter.cycle', function(){
-			pauseFlag = true;
-			this.cyclePause++;
-			triggerPause(cont, true);
-		}).bind('mouseleave.cycle', function(){
-				if (pauseFlag)
-					this.cyclePause--;
-				triggerPause(cont, true);
-		});
-
-	if (supportMultiTransitions(opts) === false)
-		return false;
-
-	// apparently a lot of people use image slideshows without height/width attributes on the images.
-	// Cycle 2.50+ requires the sizing info for every slide; this block tries to deal with that.
-	var requeue = false;
-	options.requeueAttempts = options.requeueAttempts || 0;
-	$slides.each(function() {
-		// try to get height/width of each slide
-		var $el = $(this);
-		this.cycleH = (opts.fit && opts.height) ? opts.height : ($el.height() || this.offsetHeight || this.height || $el.attr('height') || 0);
-		this.cycleW = (opts.fit && opts.width) ? opts.width : ($el.width() || this.offsetWidth || this.width || $el.attr('width') || 0);
-
-		if ( $el.is('img') ) {
-			var loading = (this.cycleH === 0 && this.cycleW === 0 && !this.complete);
-			// don't requeue for images that are still loading but have a valid size
-			if (loading) {
-				if (o.s && opts.requeueOnImageNotLoaded && ++options.requeueAttempts < 100) { // track retry count so we don't loop forever
-					log(options.requeueAttempts,' - img slide not loaded, requeuing slideshow: ', this.src, this.cycleW, this.cycleH);
-					setTimeout(function() {$(o.s,o.c).cycle(options);}, opts.requeueTimeout);
-					requeue = true;
-					return false; // break each loop
-				}
-				else {
-					log('could not determine size of image: '+this.src, this.cycleW, this.cycleH);
-				}
-			}
-		}
-		return true;
-	});
-
-	if (requeue)
-		return false;
-
-	opts.cssBefore = opts.cssBefore || {};
-	opts.cssAfter = opts.cssAfter || {};
-	opts.cssFirst = opts.cssFirst || {};
-	opts.animIn = opts.animIn || {};
-	opts.animOut = opts.animOut || {};
-
-	$slides.not(':eq('+first+')').css(opts.cssBefore);
-	$($slides[first]).css(opts.cssFirst);
-
-	if (opts.timeout) {
-		opts.timeout = parseInt(opts.timeout,10);
-		// ensure that timeout and speed settings are sane
-		if (opts.speed.constructor == String)
-			opts.speed = $.fx.speeds[opts.speed] || parseInt(opts.speed,10);
-		if (!opts.sync)
-			opts.speed = opts.speed / 2;
-		
-		var buffer = opts.fx == 'none' ? 0 : opts.fx == 'shuffle' ? 500 : 250;
-		while((opts.timeout - opts.speed) < buffer) // sanitize timeout
-			opts.timeout += opts.speed;
-	}
-	if (opts.easing)
-		opts.easeIn = opts.easeOut = opts.easing;
-	if (!opts.speedIn)
-		opts.speedIn = opts.speed;
-	if (!opts.speedOut)
-		opts.speedOut = opts.speed;
-
-	opts.slideCount = els.length;
-	opts.currSlide = opts.lastSlide = first;
-	if (opts.random) {
-		if (++opts.randomIndex == els.length)
-			opts.randomIndex = 0;
-		opts.nextSlide = opts.randomMap[opts.randomIndex];
-	}
-	else if (opts.backwards)
-		opts.nextSlide = opts.startingSlide === 0 ? (els.length-1) : opts.startingSlide-1;
-	else
-		opts.nextSlide = opts.startingSlide >= (els.length-1) ? 0 : opts.startingSlide+1;
-
-	// run transition init fn
-	if (!opts.multiFx) {
-		var init = $.fn.cycle.transitions[opts.fx];
-		if ($.isFunction(init))
-			init($cont, $slides, opts);
-		else if (opts.fx != 'custom' && !opts.multiFx) {
-			log('unknown transition: ' + opts.fx,'; slideshow terminating');
-			return false;
-		}
-	}
-
-	// fire artificial events
-	var e0 = $slides[first];
-	if (!opts.skipInitializationCallbacks) {
-		if (opts.before.length)
-			opts.before[0].apply(e0, [e0, e0, opts, true]);
-		if (opts.after.length)
-			opts.after[0].apply(e0, [e0, e0, opts, true]);
-	}
-	if (opts.next)
-		$(opts.next).bind(opts.prevNextEvent,function(){return advance(opts,1);});
-	if (opts.prev)
-		$(opts.prev).bind(opts.prevNextEvent,function(){return advance(opts,0);});
-	if (opts.pager || opts.pagerAnchorBuilder)
-		buildPager(els,opts);
-
-	exposeAddSlide(opts, els);
-
-	return opts;
-}
-
-// save off original opts so we can restore after clearing state
-function saveOriginalOpts(opts) {
-	opts.original = { before: [], after: [] };
-	opts.original.cssBefore = $.extend({}, opts.cssBefore);
-	opts.original.cssAfter  = $.extend({}, opts.cssAfter);
-	opts.original.animIn	= $.extend({}, opts.animIn);
-	opts.original.animOut   = $.extend({}, opts.animOut);
-	$.each(opts.before, function() { opts.original.before.push(this); });
-	$.each(opts.after,  function() { opts.original.after.push(this); });
-}
-
-function supportMultiTransitions(opts) {
-	var i, tx, txs = $.fn.cycle.transitions;
-	// look for multiple effects
-	if (opts.fx.indexOf(',') > 0) {
-		opts.multiFx = true;
-		opts.fxs = opts.fx.replace(/\s*/g,'').split(',');
-		// discard any bogus effect names
-		for (i=0; i < opts.fxs.length; i++) {
-			var fx = opts.fxs[i];
-			tx = txs[fx];
-			if (!tx || !txs.hasOwnProperty(fx) || !$.isFunction(tx)) {
-				log('discarding unknown transition: ',fx);
-				opts.fxs.splice(i,1);
-				i--;
-			}
-		}
-		// if we have an empty list then we threw everything away!
-		if (!opts.fxs.length) {
-			log('No valid transitions named; slideshow terminating.');
-			return false;
-		}
-	}
-	else if (opts.fx == 'all') {  // auto-gen the list of transitions
-		opts.multiFx = true;
-		opts.fxs = [];
-		for (var p in txs) {
-			if (txs.hasOwnProperty(p)) {
-				tx = txs[p];
-				if (txs.hasOwnProperty(p) && $.isFunction(tx))
-					opts.fxs.push(p);
-			}
-		}
-	}
-	if (opts.multiFx && opts.randomizeEffects) {
-		// munge the fxs array to make effect selection random
-		var r1 = Math.floor(Math.random() * 20) + 30;
-		for (i = 0; i < r1; i++) {
-			var r2 = Math.floor(Math.random() * opts.fxs.length);
-			opts.fxs.push(opts.fxs.splice(r2,1)[0]);
-		}
-		debug('randomized fx sequence: ',opts.fxs);
-	}
-	return true;
-}
-
-// provide a mechanism for adding slides after the slideshow has started
-function exposeAddSlide(opts, els) {
-	opts.addSlide = function(newSlide, prepend) {
-		var $s = $(newSlide), s = $s[0];
-		if (!opts.autostopCount)
-			opts.countdown++;
-		els[prepend?'unshift':'push'](s);
-		if (opts.els)
-			opts.els[prepend?'unshift':'push'](s); // shuffle needs this
-		opts.slideCount = els.length;
-
-		// add the slide to the random map and resort
-		if (opts.random) {
-			opts.randomMap.push(opts.slideCount-1);
-			opts.randomMap.sort(function(a,b) {return Math.random() - 0.5;});
-		}
-
-		$s.css('position','absolute');
-		$s[prepend?'prependTo':'appendTo'](opts.$cont);
-
-		if (prepend) {
-			opts.currSlide++;
-			opts.nextSlide++;
-		}
-
-		if (!$.support.opacity && opts.cleartype && !opts.cleartypeNoBg)
-			clearTypeFix($s);
-
-		if (opts.fit && opts.width)
-			$s.width(opts.width);
-		if (opts.fit && opts.height && opts.height != 'auto')
-			$s.height(opts.height);
-		s.cycleH = (opts.fit && opts.height) ? opts.height : $s.height();
-		s.cycleW = (opts.fit && opts.width) ? opts.width : $s.width();
-
-		$s.css(opts.cssBefore);
-
-		if (opts.pager || opts.pagerAnchorBuilder)
-			$.fn.cycle.createPagerAnchor(els.length-1, s, $(opts.pager), els, opts);
-
-		if ($.isFunction(opts.onAddSlide))
-			opts.onAddSlide($s);
-		else
-			$s.hide(); // default behavior
-	};
-}
-
-// reset internal state; we do this on every pass in order to support multiple effects
-$.fn.cycle.resetState = function(opts, fx) {
-	fx = fx || opts.fx;
-	opts.before = []; opts.after = [];
-	opts.cssBefore = $.extend({}, opts.original.cssBefore);
-	opts.cssAfter  = $.extend({}, opts.original.cssAfter);
-	opts.animIn	= $.extend({}, opts.original.animIn);
-	opts.animOut   = $.extend({}, opts.original.animOut);
-	opts.fxFn = null;
-	$.each(opts.original.before, function() { opts.before.push(this); });
-	$.each(opts.original.after,  function() { opts.after.push(this); });
-
-	// re-init
-	var init = $.fn.cycle.transitions[fx];
-	if ($.isFunction(init))
-		init(opts.$cont, $(opts.elements), opts);
-};
-
-// this is the main engine fn, it handles the timeouts, callbacks and slide index mgmt
-function go(els, opts, manual, fwd) {
-	var p = opts.$cont[0], curr = els[opts.currSlide], next = els[opts.nextSlide];
-
-	// opts.busy is true if we're in the middle of an animation
-	if (manual && opts.busy && opts.manualTrump) {
-		// let manual transitions requests trump active ones
-		debug('manualTrump in go(), stopping active transition');
-		$(els).stop(true,true);
-		opts.busy = 0;
-		clearTimeout(p.cycleTimeout);
-	}
-
-	// don't begin another timeout-based transition if there is one active
-	if (opts.busy) {
-		debug('transition active, ignoring new tx request');
-		return;
-	}
-
-
-	// stop cycling if we have an outstanding stop request
-	if (p.cycleStop != opts.stopCount || p.cycleTimeout === 0 && !manual)
-		return;
-
-	// check to see if we should stop cycling based on autostop options
-	if (!manual && !p.cyclePause && !opts.bounce &&
-		((opts.autostop && (--opts.countdown <= 0)) ||
-		(opts.nowrap && !opts.random && opts.nextSlide < opts.currSlide))) {
-		if (opts.end)
-			opts.end(opts);
-		return;
-	}
-
-	// if slideshow is paused, only transition on a manual trigger
-	var changed = false;
-	if ((manual || !p.cyclePause) && (opts.nextSlide != opts.currSlide)) {
-		changed = true;
-		var fx = opts.fx;
-		// keep trying to get the slide size if we don't have it yet
-		curr.cycleH = curr.cycleH || $(curr).height();
-		curr.cycleW = curr.cycleW || $(curr).width();
-		next.cycleH = next.cycleH || $(next).height();
-		next.cycleW = next.cycleW || $(next).width();
-
-		// support multiple transition types
-		if (opts.multiFx) {
-			if (fwd && (opts.lastFx === undefined || ++opts.lastFx >= opts.fxs.length))
-				opts.lastFx = 0;
-			else if (!fwd && (opts.lastFx === undefined || --opts.lastFx < 0))
-				opts.lastFx = opts.fxs.length - 1;
-			fx = opts.fxs[opts.lastFx];
-		}
-
-		// one-time fx overrides apply to:  $('div').cycle(3,'zoom');
-		if (opts.oneTimeFx) {
-			fx = opts.oneTimeFx;
-			opts.oneTimeFx = null;
-		}
-
-		$.fn.cycle.resetState(opts, fx);
-
-		// run the before callbacks
-		if (opts.before.length)
-			$.each(opts.before, function(i,o) {
-				if (p.cycleStop != opts.stopCount) return;
-				o.apply(next, [curr, next, opts, fwd]);
-			});
-
-		// stage the after callacks
-		var after = function() {
-			opts.busy = 0;
-			$.each(opts.after, function(i,o) {
-				if (p.cycleStop != opts.stopCount) return;
-				o.apply(next, [curr, next, opts, fwd]);
-			});
-			if (!p.cycleStop) {
-				// queue next transition
-				queueNext();
-			}
-		};
-
-		debug('tx firing('+fx+'); currSlide: ' + opts.currSlide + '; nextSlide: ' + opts.nextSlide);
-		
-		// get ready to perform the transition
-		opts.busy = 1;
-		if (opts.fxFn) // fx function provided?
-			opts.fxFn(curr, next, opts, after, fwd, manual && opts.fastOnEvent);
-		else if ($.isFunction($.fn.cycle[opts.fx])) // fx plugin ?
-			$.fn.cycle[opts.fx](curr, next, opts, after, fwd, manual && opts.fastOnEvent);
-		else
-			$.fn.cycle.custom(curr, next, opts, after, fwd, manual && opts.fastOnEvent);
-	}
-	else {
-		queueNext();
-	}
-
-	if (changed || opts.nextSlide == opts.currSlide) {
-		// calculate the next slide
-		var roll;
-		opts.lastSlide = opts.currSlide;
-		if (opts.random) {
-			opts.currSlide = opts.nextSlide;
-			if (++opts.randomIndex == els.length) {
-				opts.randomIndex = 0;
-				opts.randomMap.sort(function(a,b) {return Math.random() - 0.5;});
-			}
-			opts.nextSlide = opts.randomMap[opts.randomIndex];
-			if (opts.nextSlide == opts.currSlide)
-				opts.nextSlide = (opts.currSlide == opts.slideCount - 1) ? 0 : opts.currSlide + 1;
-		}
-		else if (opts.backwards) {
-			roll = (opts.nextSlide - 1) < 0;
-			if (roll && opts.bounce) {
-				opts.backwards = !opts.backwards;
-				opts.nextSlide = 1;
-				opts.currSlide = 0;
-			}
-			else {
-				opts.nextSlide = roll ? (els.length-1) : opts.nextSlide-1;
-				opts.currSlide = roll ? 0 : opts.nextSlide+1;
-			}
-		}
-		else { // sequence
-			roll = (opts.nextSlide + 1) == els.length;
-			if (roll && opts.bounce) {
-				opts.backwards = !opts.backwards;
-				opts.nextSlide = els.length-2;
-				opts.currSlide = els.length-1;
-			}
-			else {
-				opts.nextSlide = roll ? 0 : opts.nextSlide+1;
-				opts.currSlide = roll ? els.length-1 : opts.nextSlide-1;
-			}
-		}
-	}
-	if (changed && opts.pager)
-		opts.updateActivePagerLink(opts.pager, opts.currSlide, opts.activePagerClass);
-	
-	function queueNext() {
-		// stage the next transition
-		var ms = 0, timeout = opts.timeout;
-		if (opts.timeout && !opts.continuous) {
-			ms = getTimeout(els[opts.currSlide], els[opts.nextSlide], opts, fwd);
-         if (opts.fx == 'shuffle')
-            ms -= opts.speedOut;
-      }
-		else if (opts.continuous && p.cyclePause) // continuous shows work off an after callback, not this timer logic
-			ms = 10;
-		if (ms > 0)
-			p.cycleTimeout = setTimeout(function(){ go(els, opts, 0, !opts.backwards); }, ms);
-	}
-}
-
-// invoked after transition
-$.fn.cycle.updateActivePagerLink = function(pager, currSlide, clsName) {
-   $(pager).each(function() {
-       $(this).children().removeClass(clsName).eq(currSlide).addClass(clsName);
-   });
-};
-
-// calculate timeout value for current transition
-function getTimeout(curr, next, opts, fwd) {
-	if (opts.timeoutFn) {
-		// call user provided calc fn
-		var t = opts.timeoutFn.call(curr,curr,next,opts,fwd);
-		while (opts.fx != 'none' && (t - opts.speed) < 250) // sanitize timeout
-			t += opts.speed;
-		debug('calculated timeout: ' + t + '; speed: ' + opts.speed);
-		if (t !== false)
-			return t;
-	}
-	return opts.timeout;
-}
-
-// expose next/prev function, caller must pass in state
-$.fn.cycle.next = function(opts) { advance(opts,1); };
-$.fn.cycle.prev = function(opts) { advance(opts,0);};
-
-// advance slide forward or back
-function advance(opts, moveForward) {
-	var val = moveForward ? 1 : -1;
-	var els = opts.elements;
-	var p = opts.$cont[0], timeout = p.cycleTimeout;
-	if (timeout) {
-		clearTimeout(timeout);
-		p.cycleTimeout = 0;
-	}
-	if (opts.random && val < 0) {
-		// move back to the previously display slide
-		opts.randomIndex--;
-		if (--opts.randomIndex == -2)
-			opts.randomIndex = els.length-2;
-		else if (opts.randomIndex == -1)
-			opts.randomIndex = els.length-1;
-		opts.nextSlide = opts.randomMap[opts.randomIndex];
-	}
-	else if (opts.random) {
-		opts.nextSlide = opts.randomMap[opts.randomIndex];
-	}
-	else {
-		opts.nextSlide = opts.currSlide + val;
-		if (opts.nextSlide < 0) {
-			if (opts.nowrap) return false;
-			opts.nextSlide = els.length - 1;
-		}
-		else if (opts.nextSlide >= els.length) {
-			if (opts.nowrap) return false;
-			opts.nextSlide = 0;
-		}
-	}
-
-	var cb = opts.onPrevNextEvent || opts.prevNextClick; // prevNextClick is deprecated
-	if ($.isFunction(cb))
-		cb(val > 0, opts.nextSlide, els[opts.nextSlide]);
-	go(els, opts, 1, moveForward);
-	return false;
-}
-
-function buildPager(els, opts) {
-	var $p = $(opts.pager);
-	$.each(els, function(i,o) {
-		$.fn.cycle.createPagerAnchor(i,o,$p,els,opts);
-	});
-	opts.updateActivePagerLink(opts.pager, opts.startingSlide, opts.activePagerClass);
-}
-
-$.fn.cycle.createPagerAnchor = function(i, el, $p, els, opts) {
-	var a;
-	if ($.isFunction(opts.pagerAnchorBuilder)) {
-		a = opts.pagerAnchorBuilder(i,el);
-		debug('pagerAnchorBuilder('+i+', el) returned: ' + a);
-	}
-	else
-		a = '<a href="#">'+(i+1)+'</a>';
-		
-	if (!a)
-		return;
-	var $a = $(a);
-	// don't reparent if anchor is in the dom
-	if ($a.parents('body').length === 0) {
-		var arr = [];
-		if ($p.length > 1) {
-			$p.each(function() {
-				var $clone = $a.clone(true);
-				$(this).append($clone);
-				arr.push($clone[0]);
-			});
-			$a = $(arr);
-		}
-		else {
-			$a.appendTo($p);
-		}
-	}
-
-	opts.pagerAnchors =  opts.pagerAnchors || [];
-	opts.pagerAnchors.push($a);
-	
-	var pagerFn = function(e) {
-		e.preventDefault();
-		opts.nextSlide = i;
-		var p = opts.$cont[0], timeout = p.cycleTimeout;
-		if (timeout) {
-			clearTimeout(timeout);
-			p.cycleTimeout = 0;
-		}
-		var cb = opts.onPagerEvent || opts.pagerClick; // pagerClick is deprecated
-		if ($.isFunction(cb))
-			cb(opts.nextSlide, els[opts.nextSlide]);
-		go(els,opts,1,opts.currSlide < i); // trigger the trans
-//		return false; // <== allow bubble
-	};
-	
-	if ( /mouseenter|mouseover/i.test(opts.pagerEvent) ) {
-		$a.hover(pagerFn, function(){/* no-op */} );
-	}
-	else {
-		$a.bind(opts.pagerEvent, pagerFn);
-	}
-	
-	if ( ! /^click/.test(opts.pagerEvent) && !opts.allowPagerClickBubble)
-		$a.bind('click.cycle', function(){return false;}); // suppress click
-	
-	var cont = opts.$cont[0];
-	var pauseFlag = false; // https://github.com/malsup/cycle/issues/44
-	if (opts.pauseOnPagerHover) {
-		$a.hover(
-			function() { 
-				pauseFlag = true;
-				cont.cyclePause++; 
-				triggerPause(cont,true,true);
-			}, function() { 
-				if (pauseFlag)
-					cont.cyclePause--; 
-				triggerPause(cont,true,true);
-			} 
-		);
-	}
-};
-
-// helper fn to calculate the number of slides between the current and the next
-$.fn.cycle.hopsFromLast = function(opts, fwd) {
-	var hops, l = opts.lastSlide, c = opts.currSlide;
-	if (fwd)
-		hops = c > l ? c - l : opts.slideCount - l;
-	else
-		hops = c < l ? l - c : l + opts.slideCount - c;
-	return hops;
-};
-
-// fix clearType problems in ie6 by setting an explicit bg color
-// (otherwise text slides look horrible during a fade transition)
-function clearTypeFix($slides) {
-	debug('applying clearType background-color hack');
-	function hex(s) {
-		s = parseInt(s,10).toString(16);
-		return s.length < 2 ? '0'+s : s;
-	}
-	function getBg(e) {
-		for ( ; e && e.nodeName.toLowerCase() != 'html'; e = e.parentNode) {
-			var v = $.css(e,'background-color');
-			if (v && v.indexOf('rgb') >= 0 ) {
-				var rgb = v.match(/\d+/g);
-				return '#'+ hex(rgb[0]) + hex(rgb[1]) + hex(rgb[2]);
-			}
-			if (v && v != 'transparent')
-				return v;
-		}
-		return '#ffffff';
-	}
-	$slides.each(function() { $(this).css('background-color', getBg(this)); });
-}
-
-// reset common props before the next transition
-$.fn.cycle.commonReset = function(curr,next,opts,w,h,rev) {
-	$(opts.elements).not(curr).hide();
-	if (typeof opts.cssBefore.opacity == 'undefined')
-		opts.cssBefore.opacity = 1;
-	opts.cssBefore.display = 'block';
-	if (opts.slideResize && w !== false && next.cycleW > 0)
-		opts.cssBefore.width = next.cycleW;
-	if (opts.slideResize && h !== false && next.cycleH > 0)
-		opts.cssBefore.height = next.cycleH;
-	opts.cssAfter = opts.cssAfter || {};
-	opts.cssAfter.display = 'none';
-	$(curr).css('zIndex',opts.slideCount + (rev === true ? 1 : 0));
-	$(next).css('zIndex',opts.slideCount + (rev === true ? 0 : 1));
-};
-
-// the actual fn for effecting a transition
-$.fn.cycle.custom = function(curr, next, opts, cb, fwd, speedOverride) {
-	var $l = $(curr), $n = $(next);
-	var speedIn = opts.speedIn, speedOut = opts.speedOut, easeIn = opts.easeIn, easeOut = opts.easeOut, animInDelay = opts.animInDelay, animOutDelay = opts.animOutDelay;
-	$n.css(opts.cssBefore);
-	if (speedOverride) {
-		if (typeof speedOverride == 'number')
-			speedIn = speedOut = speedOverride;
-		else
-			speedIn = speedOut = 1;
-		easeIn = easeOut = null;
-	}
-	var fn = function() {
-		$n.delay(animInDelay).animate(opts.animIn, speedIn, easeIn, function() {
-			cb();
-		});
-	};
-	$l.delay(animOutDelay).animate(opts.animOut, speedOut, easeOut, function() {
-		$l.css(opts.cssAfter);
-		if (!opts.sync) 
-			fn();
-	});
-	if (opts.sync) fn();
-};
-
-// transition definitions - only fade is defined here, transition pack defines the rest
-$.fn.cycle.transitions = {
-	fade: function($cont, $slides, opts) {
-		$slides.not(':eq('+opts.currSlide+')').css('opacity',0);
-		opts.before.push(function(curr,next,opts) {
-			$.fn.cycle.commonReset(curr,next,opts);
-			opts.cssBefore.opacity = 0;
-		});
-		opts.animIn	   = { opacity: 1 };
-		opts.animOut   = { opacity: 0 };
-		opts.cssBefore = { top: 0, left: 0 };
-	}
-};
-
-$.fn.cycle.ver = function() { return ver; };
-
-// override these globally if you like (they are all optional)
-$.fn.cycle.defaults = {
-    activePagerClass: 'activeSlide', // class name used for the active pager link
-    after:            null,     // transition callback (scope set to element that was shown):  function(currSlideElement, nextSlideElement, options, forwardFlag)
-    allowPagerClickBubble: false, // allows or prevents click event on pager anchors from bubbling
-    animIn:           null,     // properties that define how the slide animates in
-    animInDelay:      0,        // allows delay before next slide transitions in	
-    animOut:          null,     // properties that define how the slide animates out
-    animOutDelay:     0,        // allows delay before current slide transitions out
-    aspect:           false,    // preserve aspect ratio during fit resizing, cropping if necessary (must be used with fit option)
-    autostop:         0,        // true to end slideshow after X transitions (where X == slide count)
-    autostopCount:    0,        // number of transitions (optionally used with autostop to define X)
-    backwards:        false,    // true to start slideshow at last slide and move backwards through the stack
-    before:           null,     // transition callback (scope set to element to be shown):     function(currSlideElement, nextSlideElement, options, forwardFlag)
-    center:           null,     // set to true to have cycle add top/left margin to each slide (use with width and height options)
-    cleartype:        !$.support.opacity,  // true if clearType corrections should be applied (for IE)
-    cleartypeNoBg:    false,    // set to true to disable extra cleartype fixing (leave false to force background color setting on slides)
-    containerResize:  1,        // resize container to fit largest slide
-    containerResizeHeight:  0,  // resize containers height to fit the largest slide but leave the width dynamic
-    continuous:       0,        // true to start next transition immediately after current one completes
-    cssAfter:         null,     // properties that defined the state of the slide after transitioning out
-    cssBefore:        null,     // properties that define the initial state of the slide before transitioning in
-    delay:            0,        // additional delay (in ms) for first transition (hint: can be negative)
-    easeIn:           null,     // easing for "in" transition
-    easeOut:          null,     // easing for "out" transition
-    easing:           null,     // easing method for both in and out transitions
-    end:              null,     // callback invoked when the slideshow terminates (use with autostop or nowrap options): function(options)
-    fastOnEvent:      0,        // force fast transitions when triggered manually (via pager or prev/next); value == time in ms
-    fit:              0,        // force slides to fit container
-    fx:               'fade',   // name of transition effect (or comma separated names, ex: 'fade,scrollUp,shuffle')
-    fxFn:             null,     // function used to control the transition: function(currSlideElement, nextSlideElement, options, afterCalback, forwardFlag)
-    height:           'auto',   // container height (if the 'fit' option is true, the slides will be set to this height as well)
-    manualTrump:      true,     // causes manual transition to stop an active transition instead of being ignored
-    metaAttr:         'cycle',  // data- attribute that holds the option data for the slideshow
-    next:             null,     // element, jQuery object, or jQuery selector string for the element to use as event trigger for next slide
-    nowrap:           0,        // true to prevent slideshow from wrapping
-    onPagerEvent:     null,     // callback fn for pager events: function(zeroBasedSlideIndex, slideElement)
-    onPrevNextEvent:  null,     // callback fn for prev/next events: function(isNext, zeroBasedSlideIndex, slideElement)
-    pager:            null,     // element, jQuery object, or jQuery selector string for the element to use as pager container
-    pagerAnchorBuilder: null,   // callback fn for building anchor links:  function(index, DOMelement)
-    pagerEvent:       'click.cycle', // name of event which drives the pager navigation
-    pause:            0,        // true to enable "pause on hover"
-    pauseOnPagerHover: 0,       // true to pause when hovering over pager link
-    prev:             null,     // element, jQuery object, or jQuery selector string for the element to use as event trigger for previous slide
-    prevNextEvent:    'click.cycle',// event which drives the manual transition to the previous or next slide
-    random:           0,        // true for random, false for sequence (not applicable to shuffle fx)
-    randomizeEffects: 1,        // valid when multiple effects are used; true to make the effect sequence random
-    requeueOnImageNotLoaded: true, // requeue the slideshow if any image slides are not yet loaded
-    requeueTimeout:   250,      // ms delay for requeue
-    rev:              0,        // causes animations to transition in reverse (for effects that support it such as scrollHorz/scrollVert/shuffle)
-    shuffle:          null,     // coords for shuffle animation, ex: { top:15, left: 200 }
-    skipInitializationCallbacks: false, // set to true to disable the first before/after callback that occurs prior to any transition
-    slideExpr:        null,     // expression for selecting slides (if something other than all children is required)
-    slideResize:      1,        // force slide width/height to fixed size before every transition
-    speed:            1000,     // speed of the transition (any valid fx speed value)
-    speedIn:          null,     // speed of the 'in' transition
-    speedOut:         null,     // speed of the 'out' transition
-    startingSlide:    undefined,// zero-based index of the first slide to be displayed
-    sync:             1,        // true if in/out transitions should occur simultaneously
-    timeout:          4000,     // milliseconds between slide transitions (0 to disable auto advance)
-    timeoutFn:        null,     // callback for determining per-slide timeout value:  function(currSlideElement, nextSlideElement, options, forwardFlag)
-    updateActivePagerLink: null,// callback fn invoked to update the active pager link (adds/removes activePagerClass style)
-    width:            null      // container width (if the 'fit' option is true, the slides will be set to this width as well)
-};
-
-})(jQuery);
-
-
-/*!
- * jQuery Cycle Plugin Transition Definitions
- * This script is a plugin for the jQuery Cycle Plugin
- * Examples and documentation at: http://malsup.com/jquery/cycle/
- * Copyright (c) 2007-2010 M. Alsup
- * Version:	 2.73
- * Dual licensed under the MIT and GPL licenses:
- * http://www.opensource.org/licenses/mit-license.php
- * http://www.gnu.org/licenses/gpl.html
- */
-(function($) {
-"use strict";
-
-//
-// These functions define slide initialization and properties for the named
-// transitions. To save file size feel free to remove any of these that you
-// don't need.
-//
-$.fn.cycle.transitions.none = function($cont, $slides, opts) {
-	opts.fxFn = function(curr,next,opts,after){
-		$(next).show();
-		$(curr).hide();
-		after();
-	};
-};
-
-// not a cross-fade, fadeout only fades out the top slide
-$.fn.cycle.transitions.fadeout = function($cont, $slides, opts) {
-	$slides.not(':eq('+opts.currSlide+')').css({ display: 'block', 'opacity': 1 });
-	opts.before.push(function(curr,next,opts,w,h,rev) {
-		$(curr).css('zIndex',opts.slideCount + (rev !== true ? 1 : 0));
-		$(next).css('zIndex',opts.slideCount + (rev !== true ? 0 : 1));
-	});
-	opts.animIn.opacity = 1;
-	opts.animOut.opacity = 0;
-	opts.cssBefore.opacity = 1;
-	opts.cssBefore.display = 'block';
-	opts.cssAfter.zIndex = 0;
-};
-
-// scrollUp/Down/Left/Right
-$.fn.cycle.transitions.scrollUp = function($cont, $slides, opts) {
-	$cont.css('overflow','hidden');
-	opts.before.push($.fn.cycle.commonReset);
-	var h = $cont.height();
-	opts.cssBefore.top = h;
-	opts.cssBefore.left = 0;
-	opts.cssFirst.top = 0;
-	opts.animIn.top = 0;
-	opts.animOut.top = -h;
-};
-$.fn.cycle.transitions.scrollDown = function($cont, $slides, opts) {
-	$cont.css('overflow','hidden');
-	opts.before.push($.fn.cycle.commonReset);
-	var h = $cont.height();
-	opts.cssFirst.top = 0;
-	opts.cssBefore.top = -h;
-	opts.cssBefore.left = 0;
-	opts.animIn.top = 0;
-	opts.animOut.top = h;
-};
-$.fn.cycle.transitions.scrollLeft = function($cont, $slides, opts) {
-	$cont.css('overflow','hidden');
-	opts.before.push($.fn.cycle.commonReset);
-	var w = $cont.width();
-	opts.cssFirst.left = 0;
-	opts.cssBefore.left = w;
-	opts.cssBefore.top = 0;
-	opts.animIn.left = 0;
-	opts.animOut.left = 0-w;
-};
-$.fn.cycle.transitions.scrollRight = function($cont, $slides, opts) {
-	$cont.css('overflow','hidden');
-	opts.before.push($.fn.cycle.commonReset);
-	var w = $cont.width();
-	opts.cssFirst.left = 0;
-	opts.cssBefore.left = -w;
-	opts.cssBefore.top = 0;
-	opts.animIn.left = 0;
-	opts.animOut.left = w;
-};
-$.fn.cycle.transitions.scrollHorz = function($cont, $slides, opts) {
-	$cont.css('overflow','hidden').width();
-	opts.before.push(function(curr, next, opts, fwd) {
-		if (opts.rev)
-			fwd = !fwd;
-		$.fn.cycle.commonReset(curr,next,opts);
-		opts.cssBefore.left = fwd ? (next.cycleW-1) : (1-next.cycleW);
-		opts.animOut.left = fwd ? -curr.cycleW : curr.cycleW;
-	});
-	opts.cssFirst.left = 0;
-	opts.cssBefore.top = 0;
-	opts.animIn.left = 0;
-	opts.animOut.top = 0;
-};
-$.fn.cycle.transitions.scrollVert = function($cont, $slides, opts) {
-	$cont.css('overflow','hidden');
-	opts.before.push(function(curr, next, opts, fwd) {
-		if (opts.rev)
-			fwd = !fwd;
-		$.fn.cycle.commonReset(curr,next,opts);
-		opts.cssBefore.top = fwd ? (1-next.cycleH) : (next.cycleH-1);
-		opts.animOut.top = fwd ? curr.cycleH : -curr.cycleH;
-	});
-	opts.cssFirst.top = 0;
-	opts.cssBefore.left = 0;
-	opts.animIn.top = 0;
-	opts.animOut.left = 0;
-};
-
-// slideX/slideY
-$.fn.cycle.transitions.slideX = function($cont, $slides, opts) {
-	opts.before.push(function(curr, next, opts) {
-		$(opts.elements).not(curr).hide();
-		$.fn.cycle.commonReset(curr,next,opts,false,true);
-		opts.animIn.width = next.cycleW;
-	});
-	opts.cssBefore.left = 0;
-	opts.cssBefore.top = 0;
-	opts.cssBefore.width = 0;
-	opts.animIn.width = 'show';
-	opts.animOut.width = 0;
-};
-$.fn.cycle.transitions.slideY = function($cont, $slides, opts) {
-	opts.before.push(function(curr, next, opts) {
-		$(opts.elements).not(curr).hide();
-		$.fn.cycle.commonReset(curr,next,opts,true,false);
-		opts.animIn.height = next.cycleH;
-	});
-	opts.cssBefore.left = 0;
-	opts.cssBefore.top = 0;
-	opts.cssBefore.height = 0;
-	opts.animIn.height = 'show';
-	opts.animOut.height = 0;
-};
-
-// shuffle
-$.fn.cycle.transitions.shuffle = function($cont, $slides, opts) {
-	var i, w = $cont.css('overflow', 'visible').width();
-	$slides.css({left: 0, top: 0});
-	opts.before.push(function(curr,next,opts) {
-		$.fn.cycle.commonReset(curr,next,opts,true,true,true);
-	});
-	// only adjust speed once!
-	if (!opts.speedAdjusted) {
-		opts.speed = opts.speed / 2; // shuffle has 2 transitions
-		opts.speedAdjusted = true;
-	}
-	opts.random = 0;
-	opts.shuffle = opts.shuffle || {left:-w, top:15};
-	opts.els = [];
-	for (i=0; i < $slides.length; i++)
-		opts.els.push($slides[i]);
-
-	for (i=0; i < opts.currSlide; i++)
-		opts.els.push(opts.els.shift());
-
-	// custom transition fn (hat tip to Benjamin Sterling for this bit of sweetness!)
-	opts.fxFn = function(curr, next, opts, cb, fwd) {
-		if (opts.rev)
-			fwd = !fwd;
-		var $el = fwd ? $(curr) : $(next);
-		$(next).css(opts.cssBefore);
-		var count = opts.slideCount;
-		$el.animate(opts.shuffle, opts.speedIn, opts.easeIn, function() {
-			var hops = $.fn.cycle.hopsFromLast(opts, fwd);
-			for (var k=0; k < hops; k++) {
-				if (fwd)
-					opts.els.push(opts.els.shift());
-				else
-					opts.els.unshift(opts.els.pop());
-			}
-			if (fwd) {
-				for (var i=0, len=opts.els.length; i < len; i++)
-					$(opts.els[i]).css('z-index', len-i+count);
-			}
-			else {
-				var z = $(curr).css('z-index');
-				$el.css('z-index', parseInt(z,10)+1+count);
-			}
-			$el.animate({left:0, top:0}, opts.speedOut, opts.easeOut, function() {
-				$(fwd ? this : curr).hide();
-				if (cb) cb();
-			});
-		});
-	};
-	$.extend(opts.cssBefore, { display: 'block', opacity: 1, top: 0, left: 0 });
-};
-
-// turnUp/Down/Left/Right
-$.fn.cycle.transitions.turnUp = function($cont, $slides, opts) {
-	opts.before.push(function(curr, next, opts) {
-		$.fn.cycle.commonReset(curr,next,opts,true,false);
-		opts.cssBefore.top = next.cycleH;
-		opts.animIn.height = next.cycleH;
-		opts.animOut.width = next.cycleW;
-	});
-	opts.cssFirst.top = 0;
-	opts.cssBefore.left = 0;
-	opts.cssBefore.height = 0;
-	opts.animIn.top = 0;
-	opts.animOut.height = 0;
-};
-$.fn.cycle.transitions.turnDown = function($cont, $slides, opts) {
-	opts.before.push(function(curr, next, opts) {
-		$.fn.cycle.commonReset(curr,next,opts,true,false);
-		opts.animIn.height = next.cycleH;
-		opts.animOut.top   = curr.cycleH;
-	});
-	opts.cssFirst.top = 0;
-	opts.cssBefore.left = 0;
-	opts.cssBefore.top = 0;
-	opts.cssBefore.height = 0;
-	opts.animOut.height = 0;
-};
-$.fn.cycle.transitions.turnLeft = function($cont, $slides, opts) {
-	opts.before.push(function(curr, next, opts) {
-		$.fn.cycle.commonReset(curr,next,opts,false,true);
-		opts.cssBefore.left = next.cycleW;
-		opts.animIn.width = next.cycleW;
-	});
-	opts.cssBefore.top = 0;
-	opts.cssBefore.width = 0;
-	opts.animIn.left = 0;
-	opts.animOut.width = 0;
-};
-$.fn.cycle.transitions.turnRight = function($cont, $slides, opts) {
-	opts.before.push(function(curr, next, opts) {
-		$.fn.cycle.commonReset(curr,next,opts,false,true);
-		opts.animIn.width = next.cycleW;
-		opts.animOut.left = curr.cycleW;
-	});
-	$.extend(opts.cssBefore, { top: 0, left: 0, width: 0 });
-	opts.animIn.left = 0;
-	opts.animOut.width = 0;
-};
-
-// zoom
-$.fn.cycle.transitions.zoom = function($cont, $slides, opts) {
-	opts.before.push(function(curr, next, opts) {
-		$.fn.cycle.commonReset(curr,next,opts,false,false,true);
-		opts.cssBefore.top = next.cycleH/2;
-		opts.cssBefore.left = next.cycleW/2;
-		$.extend(opts.animIn, { top: 0, left: 0, width: next.cycleW, height: next.cycleH });
-		$.extend(opts.animOut, { width: 0, height: 0, top: curr.cycleH/2, left: curr.cycleW/2 });
-	});
-	opts.cssFirst.top = 0;
-	opts.cssFirst.left = 0;
-	opts.cssBefore.width = 0;
-	opts.cssBefore.height = 0;
-};
-
-// fadeZoom
-$.fn.cycle.transitions.fadeZoom = function($cont, $slides, opts) {
-	opts.before.push(function(curr, next, opts) {
-		$.fn.cycle.commonReset(curr,next,opts,false,false);
-		opts.cssBefore.left = next.cycleW/2;
-		opts.cssBefore.top = next.cycleH/2;
-		$.extend(opts.animIn, { top: 0, left: 0, width: next.cycleW, height: next.cycleH });
-	});
-	opts.cssBefore.width = 0;
-	opts.cssBefore.height = 0;
-	opts.animOut.opacity = 0;
-};
-
-// blindX
-$.fn.cycle.transitions.blindX = function($cont, $slides, opts) {
-	var w = $cont.css('overflow','hidden').width();
-	opts.before.push(function(curr, next, opts) {
-		$.fn.cycle.commonReset(curr,next,opts);
-		opts.animIn.width = next.cycleW;
-		opts.animOut.left   = curr.cycleW;
-	});
-	opts.cssBefore.left = w;
-	opts.cssBefore.top = 0;
-	opts.animIn.left = 0;
-	opts.animOut.left = w;
-};
-// blindY
-$.fn.cycle.transitions.blindY = function($cont, $slides, opts) {
-	var h = $cont.css('overflow','hidden').height();
-	opts.before.push(function(curr, next, opts) {
-		$.fn.cycle.commonReset(curr,next,opts);
-		opts.animIn.height = next.cycleH;
-		opts.animOut.top   = curr.cycleH;
-	});
-	opts.cssBefore.top = h;
-	opts.cssBefore.left = 0;
-	opts.animIn.top = 0;
-	opts.animOut.top = h;
-};
-// blindZ
-$.fn.cycle.transitions.blindZ = function($cont, $slides, opts) {
-	var h = $cont.css('overflow','hidden').height();
-	var w = $cont.width();
-	opts.before.push(function(curr, next, opts) {
-		$.fn.cycle.commonReset(curr,next,opts);
-		opts.animIn.height = next.cycleH;
-		opts.animOut.top   = curr.cycleH;
-	});
-	opts.cssBefore.top = h;
-	opts.cssBefore.left = w;
-	opts.animIn.top = 0;
-	opts.animIn.left = 0;
-	opts.animOut.top = h;
-	opts.animOut.left = w;
-};
-
-// growX - grow horizontally from centered 0 width
-$.fn.cycle.transitions.growX = function($cont, $slides, opts) {
-	opts.before.push(function(curr, next, opts) {
-		$.fn.cycle.commonReset(curr,next,opts,false,true);
-		opts.cssBefore.left = this.cycleW/2;
-		opts.animIn.left = 0;
-		opts.animIn.width = this.cycleW;
-		opts.animOut.left = 0;
-	});
-	opts.cssBefore.top = 0;
-	opts.cssBefore.width = 0;
-};
-// growY - grow vertically from centered 0 height
-$.fn.cycle.transitions.growY = function($cont, $slides, opts) {
-	opts.before.push(function(curr, next, opts) {
-		$.fn.cycle.commonReset(curr,next,opts,true,false);
-		opts.cssBefore.top = this.cycleH/2;
-		opts.animIn.top = 0;
-		opts.animIn.height = this.cycleH;
-		opts.animOut.top = 0;
-	});
-	opts.cssBefore.height = 0;
-	opts.cssBefore.left = 0;
-};
-
-// curtainX - squeeze in both edges horizontally
-$.fn.cycle.transitions.curtainX = function($cont, $slides, opts) {
-	opts.before.push(function(curr, next, opts) {
-		$.fn.cycle.commonReset(curr,next,opts,false,true,true);
-		opts.cssBefore.left = next.cycleW/2;
-		opts.animIn.left = 0;
-		opts.animIn.width = this.cycleW;
-		opts.animOut.left = curr.cycleW/2;
-		opts.animOut.width = 0;
-	});
-	opts.cssBefore.top = 0;
-	opts.cssBefore.width = 0;
-};
-// curtainY - squeeze in both edges vertically
-$.fn.cycle.transitions.curtainY = function($cont, $slides, opts) {
-	opts.before.push(function(curr, next, opts) {
-		$.fn.cycle.commonReset(curr,next,opts,true,false,true);
-		opts.cssBefore.top = next.cycleH/2;
-		opts.animIn.top = 0;
-		opts.animIn.height = next.cycleH;
-		opts.animOut.top = curr.cycleH/2;
-		opts.animOut.height = 0;
-	});
-	opts.cssBefore.height = 0;
-	opts.cssBefore.left = 0;
-};
-
-// cover - curr slide covered by next slide
-$.fn.cycle.transitions.cover = function($cont, $slides, opts) {
-	var d = opts.direction || 'left';
-	var w = $cont.css('overflow','hidden').width();
-	var h = $cont.height();
-	opts.before.push(function(curr, next, opts) {
-		$.fn.cycle.commonReset(curr,next,opts);
-		opts.cssAfter.display = '';
-		if (d == 'right')
-			opts.cssBefore.left = -w;
-		else if (d == 'up')
-			opts.cssBefore.top = h;
-		else if (d == 'down')
-			opts.cssBefore.top = -h;
-		else
-			opts.cssBefore.left = w;
-	});
-	opts.animIn.left = 0;
-	opts.animIn.top = 0;
-	opts.cssBefore.top = 0;
-	opts.cssBefore.left = 0;
-};
-
-// uncover - curr slide moves off next slide
-$.fn.cycle.transitions.uncover = function($cont, $slides, opts) {
-	var d = opts.direction || 'left';
-	var w = $cont.css('overflow','hidden').width();
-	var h = $cont.height();
-	opts.before.push(function(curr, next, opts) {
-		$.fn.cycle.commonReset(curr,next,opts,true,true,true);
-		if (d == 'right')
-			opts.animOut.left = w;
-		else if (d == 'up')
-			opts.animOut.top = -h;
-		else if (d == 'down')
-			opts.animOut.top = h;
-		else
-			opts.animOut.left = -w;
-	});
-	opts.animIn.left = 0;
-	opts.animIn.top = 0;
-	opts.cssBefore.top = 0;
-	opts.cssBefore.left = 0;
-};
-
-// toss - move top slide and fade away
-$.fn.cycle.transitions.toss = function($cont, $slides, opts) {
-	var w = $cont.css('overflow','visible').width();
-	var h = $cont.height();
-	opts.before.push(function(curr, next, opts) {
-		$.fn.cycle.commonReset(curr,next,opts,true,true,true);
-		// provide default toss settings if animOut not provided
-		if (!opts.animOut.left && !opts.animOut.top)
-			$.extend(opts.animOut, { left: w*2, top: -h/2, opacity: 0 });
-		else
-			opts.animOut.opacity = 0;
-	});
-	opts.cssBefore.left = 0;
-	opts.cssBefore.top = 0;
-	opts.animIn.left = 0;
-};
-
-// wipe - clip animation
-$.fn.cycle.transitions.wipe = function($cont, $slides, opts) {
-	var w = $cont.css('overflow','hidden').width();
-	var h = $cont.height();
-	opts.cssBefore = opts.cssBefore || {};
-	var clip;
-	if (opts.clip) {
-		if (/l2r/.test(opts.clip))
-			clip = 'rect(0px 0px '+h+'px 0px)';
-		else if (/r2l/.test(opts.clip))
-			clip = 'rect(0px '+w+'px '+h+'px '+w+'px)';
-		else if (/t2b/.test(opts.clip))
-			clip = 'rect(0px '+w+'px 0px 0px)';
-		else if (/b2t/.test(opts.clip))
-			clip = 'rect('+h+'px '+w+'px '+h+'px 0px)';
-		else if (/zoom/.test(opts.clip)) {
-			var top = parseInt(h/2,10);
-			var left = parseInt(w/2,10);
-			clip = 'rect('+top+'px '+left+'px '+top+'px '+left+'px)';
-		}
-	}
-
-	opts.cssBefore.clip = opts.cssBefore.clip || clip || 'rect(0px 0px 0px 0px)';
-
-	var d = opts.cssBefore.clip.match(/(\d+)/g);
-	var t = parseInt(d[0],10), r = parseInt(d[1],10), b = parseInt(d[2],10), l = parseInt(d[3],10);
-
-	opts.before.push(function(curr, next, opts) {
-		if (curr == next) return;
-		var $curr = $(curr), $next = $(next);
-		$.fn.cycle.commonReset(curr,next,opts,true,true,false);
-		opts.cssAfter.display = 'block';
-
-		var step = 1, count = parseInt((opts.speedIn / 13),10) - 1;
-		(function f() {
-			var tt = t ? t - parseInt(step * (t/count),10) : 0;
-			var ll = l ? l - parseInt(step * (l/count),10) : 0;
-			var bb = b < h ? b + parseInt(step * ((h-b)/count || 1),10) : h;
-			var rr = r < w ? r + parseInt(step * ((w-r)/count || 1),10) : w;
-			$next.css({ clip: 'rect('+tt+'px '+rr+'px '+bb+'px '+ll+'px)' });
-			(step++ <= count) ? setTimeout(f, 13) : $curr.css('display', 'none');
-		})();
-	});
-	$.extend(opts.cssBefore, { display: 'block', opacity: 1, top: 0, left: 0 });
-	opts.animIn	   = { left: 0 };
-	opts.animOut   = { left: 0 };
-};
-
-})(jQuery);
diff --git a/web/libraries/jquery.hoverIntent/jquery.hoverIntent.js b/web/libraries/jquery.hoverIntent/jquery.hoverIntent.js
deleted file mode 100644
index 311aa86a3bb1476249fedb68dfbca3ae24bc18be..0000000000000000000000000000000000000000
--- a/web/libraries/jquery.hoverIntent/jquery.hoverIntent.js
+++ /dev/null
@@ -1,169 +0,0 @@
-/*!
- * hoverIntent v1.10.1 // 2019.10.05 // jQuery v1.7.0+
- * http://briancherne.github.io/jquery-hoverIntent/
- *
- * You may use hoverIntent under the terms of the MIT license. Basically that
- * means you are free to use hoverIntent as long as this header is left intact.
- * Copyright 2007-2019 Brian Cherne
- */
-
-/**
- * hoverIntent is similar to jQuery's built-in "hover" method except that
- * instead of firing the handlerIn function immediately, hoverIntent checks
- * to see if the user's mouse has slowed down (beneath the sensitivity
- * threshold) before firing the event. The handlerOut function is only
- * called after a matching handlerIn.
- *
- * // basic usage ... just like .hover()
- * .hoverIntent( handlerIn, handlerOut )
- * .hoverIntent( handlerInOut )
- *
- * // basic usage ... with event delegation!
- * .hoverIntent( handlerIn, handlerOut, selector )
- * .hoverIntent( handlerInOut, selector )
- *
- * // using a basic configuration object
- * .hoverIntent( config )
- *
- * @param  handlerIn   function OR configuration object
- * @param  handlerOut  function OR selector for delegation OR undefined
- * @param  selector    selector OR undefined
- * @author Brian Cherne <brian(at)cherne(dot)net>
- */
-
-;(function(factory) {
-    'use strict';
-    if (typeof define === 'function' && define.amd) {
-        define(['jquery'], factory);
-    } else if (typeof module === 'object' && module.exports) {
-        module.exports = factory(require('jquery'));
-    } else if (jQuery && !jQuery.fn.hoverIntent) {
-        factory(jQuery);
-    }
-})(function($) {
-    'use strict';
-
-    // default configuration values
-    var _cfg = {
-        interval: 100,
-        sensitivity: 6,
-        timeout: 0
-    };
-
-    // counter used to generate an ID for each instance
-    var INSTANCE_COUNT = 0;
-
-    // current X and Y position of mouse, updated during mousemove tracking (shared across instances)
-    var cX, cY;
-
-    // saves the current pointer position coordinates based on the given mousemove event
-    var track = function(ev) {
-        cX = ev.pageX;
-        cY = ev.pageY;
-    };
-
-    // compares current and previous mouse positions
-    var compare = function(ev,$el,s,cfg) {
-        // compare mouse positions to see if pointer has slowed enough to trigger `over` function
-        if ( Math.sqrt( (s.pX-cX)*(s.pX-cX) + (s.pY-cY)*(s.pY-cY) ) < cfg.sensitivity ) {
-            $el.off(s.event,track);
-            delete s.timeoutId;
-            // set hoverIntent state as active for this element (permits `out` handler to trigger)
-            s.isActive = true;
-            // overwrite old mouseenter event coordinates with most recent pointer position
-            ev.pageX = cX; ev.pageY = cY;
-            // clear coordinate data from state object
-            delete s.pX; delete s.pY;
-            return cfg.over.apply($el[0],[ev]);
-        } else {
-            // set previous coordinates for next comparison
-            s.pX = cX; s.pY = cY;
-            // use self-calling timeout, guarantees intervals are spaced out properly (avoids JavaScript timer bugs)
-            s.timeoutId = setTimeout( function(){compare(ev, $el, s, cfg);} , cfg.interval );
-        }
-    };
-
-    // triggers given `out` function at configured `timeout` after a mouseleave and clears state
-    var delay = function(ev,$el,s,out) {
-        var data = $el.data('hoverIntent');
-        if (data) {
-            delete data[s.id];
-        }
-        return out.apply($el[0],[ev]);
-    };
-
-    // checks if `value` is a function
-    var isFunction = function (value) {
-        return typeof value === 'function';
-    };
-
-    $.fn.hoverIntent = function(handlerIn,handlerOut,selector) {
-        // instance ID, used as a key to store and retrieve state information on an element
-        var instanceId = INSTANCE_COUNT++;
-
-        // extend the default configuration and parse parameters
-        var cfg = $.extend({}, _cfg);
-        if ( $.isPlainObject(handlerIn) ) {
-            cfg = $.extend(cfg, handlerIn);
-            if ( !isFunction(cfg.out) ) {
-                cfg.out = cfg.over;
-            }
-        } else if ( isFunction(handlerOut) ) {
-            cfg = $.extend(cfg, { over: handlerIn, out: handlerOut, selector: selector } );
-        } else {
-            cfg = $.extend(cfg, { over: handlerIn, out: handlerIn, selector: handlerOut } );
-        }
-
-        // A private function for handling mouse 'hovering'
-        var handleHover = function(e) {
-            // cloned event to pass to handlers (copy required for event object to be passed in IE)
-            var ev = $.extend({},e);
-
-            // the current target of the mouse event, wrapped in a jQuery object
-            var $el = $(this);
-
-            // read hoverIntent data from element (or initialize if not present)
-            var hoverIntentData = $el.data('hoverIntent');
-            if (!hoverIntentData) { $el.data('hoverIntent', (hoverIntentData = {})); }
-
-            // read per-instance state from element (or initialize if not present)
-            var state = hoverIntentData[instanceId];
-            if (!state) { hoverIntentData[instanceId] = state = { id: instanceId }; }
-
-            // state properties:
-            // id = instance ID, used to clean up data
-            // timeoutId = timeout ID, reused for tracking mouse position and delaying "out" handler
-            // isActive = plugin state, true after `over` is called just until `out` is called
-            // pX, pY = previously-measured pointer coordinates, updated at each polling interval
-            // event = string representing the namespaced event used for mouse tracking
-
-            // clear any existing timeout
-            if (state.timeoutId) { state.timeoutId = clearTimeout(state.timeoutId); }
-
-            // namespaced event used to register and unregister mousemove tracking
-            var mousemove = state.event = 'mousemove.hoverIntent.hoverIntent'+instanceId;
-
-            // handle the event, based on its type
-            if (e.type === 'mouseenter') {
-                // do nothing if already active
-                if (state.isActive) { return; }
-                // set "previous" X and Y position based on initial entry point
-                state.pX = ev.pageX; state.pY = ev.pageY;
-                // update "current" X and Y position based on mousemove
-                $el.off(mousemove,track).on(mousemove,track);
-                // start polling interval (self-calling timeout) to compare mouse coordinates over time
-                state.timeoutId = setTimeout( function(){compare(ev,$el,state,cfg);} , cfg.interval );
-            } else { // "mouseleave"
-                // do nothing if not already active
-                if (!state.isActive) { return; }
-                // unbind expensive mousemove event
-                $el.off(mousemove,track);
-                // if hoverIntent state is true, then call the mouseOut function after the specified delay
-                state.timeoutId = setTimeout( function(){delay(ev,$el,state,cfg.out);} , cfg.timeout );
-            }
-        };
-
-        // listen for mouseenter and mouseleave
-        return this.on({'mouseenter.hoverIntent':handleHover,'mouseleave.hoverIntent':handleHover}, cfg.selector);
-    };
-});
diff --git a/web/libraries/jquery.hoverIntent/jquery.hoverIntent.js.1 b/web/libraries/jquery.hoverIntent/jquery.hoverIntent.js.1
deleted file mode 100644
index 311aa86a3bb1476249fedb68dfbca3ae24bc18be..0000000000000000000000000000000000000000
--- a/web/libraries/jquery.hoverIntent/jquery.hoverIntent.js.1
+++ /dev/null
@@ -1,169 +0,0 @@
-/*!
- * hoverIntent v1.10.1 // 2019.10.05 // jQuery v1.7.0+
- * http://briancherne.github.io/jquery-hoverIntent/
- *
- * You may use hoverIntent under the terms of the MIT license. Basically that
- * means you are free to use hoverIntent as long as this header is left intact.
- * Copyright 2007-2019 Brian Cherne
- */
-
-/**
- * hoverIntent is similar to jQuery's built-in "hover" method except that
- * instead of firing the handlerIn function immediately, hoverIntent checks
- * to see if the user's mouse has slowed down (beneath the sensitivity
- * threshold) before firing the event. The handlerOut function is only
- * called after a matching handlerIn.
- *
- * // basic usage ... just like .hover()
- * .hoverIntent( handlerIn, handlerOut )
- * .hoverIntent( handlerInOut )
- *
- * // basic usage ... with event delegation!
- * .hoverIntent( handlerIn, handlerOut, selector )
- * .hoverIntent( handlerInOut, selector )
- *
- * // using a basic configuration object
- * .hoverIntent( config )
- *
- * @param  handlerIn   function OR configuration object
- * @param  handlerOut  function OR selector for delegation OR undefined
- * @param  selector    selector OR undefined
- * @author Brian Cherne <brian(at)cherne(dot)net>
- */
-
-;(function(factory) {
-    'use strict';
-    if (typeof define === 'function' && define.amd) {
-        define(['jquery'], factory);
-    } else if (typeof module === 'object' && module.exports) {
-        module.exports = factory(require('jquery'));
-    } else if (jQuery && !jQuery.fn.hoverIntent) {
-        factory(jQuery);
-    }
-})(function($) {
-    'use strict';
-
-    // default configuration values
-    var _cfg = {
-        interval: 100,
-        sensitivity: 6,
-        timeout: 0
-    };
-
-    // counter used to generate an ID for each instance
-    var INSTANCE_COUNT = 0;
-
-    // current X and Y position of mouse, updated during mousemove tracking (shared across instances)
-    var cX, cY;
-
-    // saves the current pointer position coordinates based on the given mousemove event
-    var track = function(ev) {
-        cX = ev.pageX;
-        cY = ev.pageY;
-    };
-
-    // compares current and previous mouse positions
-    var compare = function(ev,$el,s,cfg) {
-        // compare mouse positions to see if pointer has slowed enough to trigger `over` function
-        if ( Math.sqrt( (s.pX-cX)*(s.pX-cX) + (s.pY-cY)*(s.pY-cY) ) < cfg.sensitivity ) {
-            $el.off(s.event,track);
-            delete s.timeoutId;
-            // set hoverIntent state as active for this element (permits `out` handler to trigger)
-            s.isActive = true;
-            // overwrite old mouseenter event coordinates with most recent pointer position
-            ev.pageX = cX; ev.pageY = cY;
-            // clear coordinate data from state object
-            delete s.pX; delete s.pY;
-            return cfg.over.apply($el[0],[ev]);
-        } else {
-            // set previous coordinates for next comparison
-            s.pX = cX; s.pY = cY;
-            // use self-calling timeout, guarantees intervals are spaced out properly (avoids JavaScript timer bugs)
-            s.timeoutId = setTimeout( function(){compare(ev, $el, s, cfg);} , cfg.interval );
-        }
-    };
-
-    // triggers given `out` function at configured `timeout` after a mouseleave and clears state
-    var delay = function(ev,$el,s,out) {
-        var data = $el.data('hoverIntent');
-        if (data) {
-            delete data[s.id];
-        }
-        return out.apply($el[0],[ev]);
-    };
-
-    // checks if `value` is a function
-    var isFunction = function (value) {
-        return typeof value === 'function';
-    };
-
-    $.fn.hoverIntent = function(handlerIn,handlerOut,selector) {
-        // instance ID, used as a key to store and retrieve state information on an element
-        var instanceId = INSTANCE_COUNT++;
-
-        // extend the default configuration and parse parameters
-        var cfg = $.extend({}, _cfg);
-        if ( $.isPlainObject(handlerIn) ) {
-            cfg = $.extend(cfg, handlerIn);
-            if ( !isFunction(cfg.out) ) {
-                cfg.out = cfg.over;
-            }
-        } else if ( isFunction(handlerOut) ) {
-            cfg = $.extend(cfg, { over: handlerIn, out: handlerOut, selector: selector } );
-        } else {
-            cfg = $.extend(cfg, { over: handlerIn, out: handlerIn, selector: handlerOut } );
-        }
-
-        // A private function for handling mouse 'hovering'
-        var handleHover = function(e) {
-            // cloned event to pass to handlers (copy required for event object to be passed in IE)
-            var ev = $.extend({},e);
-
-            // the current target of the mouse event, wrapped in a jQuery object
-            var $el = $(this);
-
-            // read hoverIntent data from element (or initialize if not present)
-            var hoverIntentData = $el.data('hoverIntent');
-            if (!hoverIntentData) { $el.data('hoverIntent', (hoverIntentData = {})); }
-
-            // read per-instance state from element (or initialize if not present)
-            var state = hoverIntentData[instanceId];
-            if (!state) { hoverIntentData[instanceId] = state = { id: instanceId }; }
-
-            // state properties:
-            // id = instance ID, used to clean up data
-            // timeoutId = timeout ID, reused for tracking mouse position and delaying "out" handler
-            // isActive = plugin state, true after `over` is called just until `out` is called
-            // pX, pY = previously-measured pointer coordinates, updated at each polling interval
-            // event = string representing the namespaced event used for mouse tracking
-
-            // clear any existing timeout
-            if (state.timeoutId) { state.timeoutId = clearTimeout(state.timeoutId); }
-
-            // namespaced event used to register and unregister mousemove tracking
-            var mousemove = state.event = 'mousemove.hoverIntent.hoverIntent'+instanceId;
-
-            // handle the event, based on its type
-            if (e.type === 'mouseenter') {
-                // do nothing if already active
-                if (state.isActive) { return; }
-                // set "previous" X and Y position based on initial entry point
-                state.pX = ev.pageX; state.pY = ev.pageY;
-                // update "current" X and Y position based on mousemove
-                $el.off(mousemove,track).on(mousemove,track);
-                // start polling interval (self-calling timeout) to compare mouse coordinates over time
-                state.timeoutId = setTimeout( function(){compare(ev,$el,state,cfg);} , cfg.interval );
-            } else { // "mouseleave"
-                // do nothing if not already active
-                if (!state.isActive) { return; }
-                // unbind expensive mousemove event
-                $el.off(mousemove,track);
-                // if hoverIntent state is true, then call the mouseOut function after the specified delay
-                state.timeoutId = setTimeout( function(){delay(ev,$el,state,cfg.out);} , cfg.timeout );
-            }
-        };
-
-        // listen for mouseenter and mouseleave
-        return this.on({'mouseenter.hoverIntent':handleHover,'mouseleave.hoverIntent':handleHover}, cfg.selector);
-    };
-});
diff --git a/web/libraries/jquery.hoverIntent/jquery.hoverIntent.js.2 b/web/libraries/jquery.hoverIntent/jquery.hoverIntent.js.2
deleted file mode 100644
index 311aa86a3bb1476249fedb68dfbca3ae24bc18be..0000000000000000000000000000000000000000
--- a/web/libraries/jquery.hoverIntent/jquery.hoverIntent.js.2
+++ /dev/null
@@ -1,169 +0,0 @@
-/*!
- * hoverIntent v1.10.1 // 2019.10.05 // jQuery v1.7.0+
- * http://briancherne.github.io/jquery-hoverIntent/
- *
- * You may use hoverIntent under the terms of the MIT license. Basically that
- * means you are free to use hoverIntent as long as this header is left intact.
- * Copyright 2007-2019 Brian Cherne
- */
-
-/**
- * hoverIntent is similar to jQuery's built-in "hover" method except that
- * instead of firing the handlerIn function immediately, hoverIntent checks
- * to see if the user's mouse has slowed down (beneath the sensitivity
- * threshold) before firing the event. The handlerOut function is only
- * called after a matching handlerIn.
- *
- * // basic usage ... just like .hover()
- * .hoverIntent( handlerIn, handlerOut )
- * .hoverIntent( handlerInOut )
- *
- * // basic usage ... with event delegation!
- * .hoverIntent( handlerIn, handlerOut, selector )
- * .hoverIntent( handlerInOut, selector )
- *
- * // using a basic configuration object
- * .hoverIntent( config )
- *
- * @param  handlerIn   function OR configuration object
- * @param  handlerOut  function OR selector for delegation OR undefined
- * @param  selector    selector OR undefined
- * @author Brian Cherne <brian(at)cherne(dot)net>
- */
-
-;(function(factory) {
-    'use strict';
-    if (typeof define === 'function' && define.amd) {
-        define(['jquery'], factory);
-    } else if (typeof module === 'object' && module.exports) {
-        module.exports = factory(require('jquery'));
-    } else if (jQuery && !jQuery.fn.hoverIntent) {
-        factory(jQuery);
-    }
-})(function($) {
-    'use strict';
-
-    // default configuration values
-    var _cfg = {
-        interval: 100,
-        sensitivity: 6,
-        timeout: 0
-    };
-
-    // counter used to generate an ID for each instance
-    var INSTANCE_COUNT = 0;
-
-    // current X and Y position of mouse, updated during mousemove tracking (shared across instances)
-    var cX, cY;
-
-    // saves the current pointer position coordinates based on the given mousemove event
-    var track = function(ev) {
-        cX = ev.pageX;
-        cY = ev.pageY;
-    };
-
-    // compares current and previous mouse positions
-    var compare = function(ev,$el,s,cfg) {
-        // compare mouse positions to see if pointer has slowed enough to trigger `over` function
-        if ( Math.sqrt( (s.pX-cX)*(s.pX-cX) + (s.pY-cY)*(s.pY-cY) ) < cfg.sensitivity ) {
-            $el.off(s.event,track);
-            delete s.timeoutId;
-            // set hoverIntent state as active for this element (permits `out` handler to trigger)
-            s.isActive = true;
-            // overwrite old mouseenter event coordinates with most recent pointer position
-            ev.pageX = cX; ev.pageY = cY;
-            // clear coordinate data from state object
-            delete s.pX; delete s.pY;
-            return cfg.over.apply($el[0],[ev]);
-        } else {
-            // set previous coordinates for next comparison
-            s.pX = cX; s.pY = cY;
-            // use self-calling timeout, guarantees intervals are spaced out properly (avoids JavaScript timer bugs)
-            s.timeoutId = setTimeout( function(){compare(ev, $el, s, cfg);} , cfg.interval );
-        }
-    };
-
-    // triggers given `out` function at configured `timeout` after a mouseleave and clears state
-    var delay = function(ev,$el,s,out) {
-        var data = $el.data('hoverIntent');
-        if (data) {
-            delete data[s.id];
-        }
-        return out.apply($el[0],[ev]);
-    };
-
-    // checks if `value` is a function
-    var isFunction = function (value) {
-        return typeof value === 'function';
-    };
-
-    $.fn.hoverIntent = function(handlerIn,handlerOut,selector) {
-        // instance ID, used as a key to store and retrieve state information on an element
-        var instanceId = INSTANCE_COUNT++;
-
-        // extend the default configuration and parse parameters
-        var cfg = $.extend({}, _cfg);
-        if ( $.isPlainObject(handlerIn) ) {
-            cfg = $.extend(cfg, handlerIn);
-            if ( !isFunction(cfg.out) ) {
-                cfg.out = cfg.over;
-            }
-        } else if ( isFunction(handlerOut) ) {
-            cfg = $.extend(cfg, { over: handlerIn, out: handlerOut, selector: selector } );
-        } else {
-            cfg = $.extend(cfg, { over: handlerIn, out: handlerIn, selector: handlerOut } );
-        }
-
-        // A private function for handling mouse 'hovering'
-        var handleHover = function(e) {
-            // cloned event to pass to handlers (copy required for event object to be passed in IE)
-            var ev = $.extend({},e);
-
-            // the current target of the mouse event, wrapped in a jQuery object
-            var $el = $(this);
-
-            // read hoverIntent data from element (or initialize if not present)
-            var hoverIntentData = $el.data('hoverIntent');
-            if (!hoverIntentData) { $el.data('hoverIntent', (hoverIntentData = {})); }
-
-            // read per-instance state from element (or initialize if not present)
-            var state = hoverIntentData[instanceId];
-            if (!state) { hoverIntentData[instanceId] = state = { id: instanceId }; }
-
-            // state properties:
-            // id = instance ID, used to clean up data
-            // timeoutId = timeout ID, reused for tracking mouse position and delaying "out" handler
-            // isActive = plugin state, true after `over` is called just until `out` is called
-            // pX, pY = previously-measured pointer coordinates, updated at each polling interval
-            // event = string representing the namespaced event used for mouse tracking
-
-            // clear any existing timeout
-            if (state.timeoutId) { state.timeoutId = clearTimeout(state.timeoutId); }
-
-            // namespaced event used to register and unregister mousemove tracking
-            var mousemove = state.event = 'mousemove.hoverIntent.hoverIntent'+instanceId;
-
-            // handle the event, based on its type
-            if (e.type === 'mouseenter') {
-                // do nothing if already active
-                if (state.isActive) { return; }
-                // set "previous" X and Y position based on initial entry point
-                state.pX = ev.pageX; state.pY = ev.pageY;
-                // update "current" X and Y position based on mousemove
-                $el.off(mousemove,track).on(mousemove,track);
-                // start polling interval (self-calling timeout) to compare mouse coordinates over time
-                state.timeoutId = setTimeout( function(){compare(ev,$el,state,cfg);} , cfg.interval );
-            } else { // "mouseleave"
-                // do nothing if not already active
-                if (!state.isActive) { return; }
-                // unbind expensive mousemove event
-                $el.off(mousemove,track);
-                // if hoverIntent state is true, then call the mouseOut function after the specified delay
-                state.timeoutId = setTimeout( function(){delay(ev,$el,state,cfg.out);} , cfg.timeout );
-            }
-        };
-
-        // listen for mouseenter and mouseleave
-        return this.on({'mouseenter.hoverIntent':handleHover,'mouseleave.hoverIntent':handleHover}, cfg.selector);
-    };
-});
diff --git a/web/libraries/json2/json2.js b/web/libraries/json2/json2.js
deleted file mode 100644
index f6fada687570de82450767a59d605175c3e725c8..0000000000000000000000000000000000000000
--- a/web/libraries/json2/json2.js
+++ /dev/null
@@ -1,530 +0,0 @@
-//  json2.js
-//  2017-06-12
-//  Public Domain.
-//  NO WARRANTY EXPRESSED OR IMPLIED. USE AT YOUR OWN RISK.
-
-//  USE YOUR OWN COPY. IT IS EXTREMELY UNWISE TO LOAD CODE FROM SERVERS YOU DO
-//  NOT CONTROL.
-
-//  This file creates a global JSON object containing two methods: stringify
-//  and parse. This file provides the ES5 JSON capability to ES3 systems.
-//  If a project might run on IE8 or earlier, then this file should be included.
-//  This file does nothing on ES5 systems.
-
-//      JSON.stringify(value, replacer, space)
-//          value       any JavaScript value, usually an object or array.
-//          replacer    an optional parameter that determines how object
-//                      values are stringified for objects. It can be a
-//                      function or an array of strings.
-//          space       an optional parameter that specifies the indentation
-//                      of nested structures. If it is omitted, the text will
-//                      be packed without extra whitespace. If it is a number,
-//                      it will specify the number of spaces to indent at each
-//                      level. If it is a string (such as "\t" or "&nbsp;"),
-//                      it contains the characters used to indent at each level.
-//          This method produces a JSON text from a JavaScript value.
-//          When an object value is found, if the object contains a toJSON
-//          method, its toJSON method will be called and the result will be
-//          stringified. A toJSON method does not serialize: it returns the
-//          value represented by the name/value pair that should be serialized,
-//          or undefined if nothing should be serialized. The toJSON method
-//          will be passed the key associated with the value, and this will be
-//          bound to the value.
-
-//          For example, this would serialize Dates as ISO strings.
-
-//              Date.prototype.toJSON = function (key) {
-//                  function f(n) {
-//                      // Format integers to have at least two digits.
-//                      return (n < 10)
-//                          ? "0" + n
-//                          : n;
-//                  }
-//                  return this.getUTCFullYear()   + "-" +
-//                       f(this.getUTCMonth() + 1) + "-" +
-//                       f(this.getUTCDate())      + "T" +
-//                       f(this.getUTCHours())     + ":" +
-//                       f(this.getUTCMinutes())   + ":" +
-//                       f(this.getUTCSeconds())   + "Z";
-//              };
-
-//          You can provide an optional replacer method. It will be passed the
-//          key and value of each member, with this bound to the containing
-//          object. The value that is returned from your method will be
-//          serialized. If your method returns undefined, then the member will
-//          be excluded from the serialization.
-
-//          If the replacer parameter is an array of strings, then it will be
-//          used to select the members to be serialized. It filters the results
-//          such that only members with keys listed in the replacer array are
-//          stringified.
-
-//          Values that do not have JSON representations, such as undefined or
-//          functions, will not be serialized. Such values in objects will be
-//          dropped; in arrays they will be replaced with null. You can use
-//          a replacer function to replace those with JSON values.
-
-//          JSON.stringify(undefined) returns undefined.
-
-//          The optional space parameter produces a stringification of the
-//          value that is filled with line breaks and indentation to make it
-//          easier to read.
-
-//          If the space parameter is a non-empty string, then that string will
-//          be used for indentation. If the space parameter is a number, then
-//          the indentation will be that many spaces.
-
-//          Example:
-
-//          text = JSON.stringify(["e", {pluribus: "unum"}]);
-//          // text is '["e",{"pluribus":"unum"}]'
-
-//          text = JSON.stringify(["e", {pluribus: "unum"}], null, "\t");
-//          // text is '[\n\t"e",\n\t{\n\t\t"pluribus": "unum"\n\t}\n]'
-
-//          text = JSON.stringify([new Date()], function (key, value) {
-//              return this[key] instanceof Date
-//                  ? "Date(" + this[key] + ")"
-//                  : value;
-//          });
-//          // text is '["Date(---current time---)"]'
-
-//      JSON.parse(text, reviver)
-//          This method parses a JSON text to produce an object or array.
-//          It can throw a SyntaxError exception.
-
-//          The optional reviver parameter is a function that can filter and
-//          transform the results. It receives each of the keys and values,
-//          and its return value is used instead of the original value.
-//          If it returns what it received, then the structure is not modified.
-//          If it returns undefined then the member is deleted.
-
-//          Example:
-
-//          // Parse the text. Values that look like ISO date strings will
-//          // be converted to Date objects.
-
-//          myData = JSON.parse(text, function (key, value) {
-//              var a;
-//              if (typeof value === "string") {
-//                  a =
-//   /^(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2}):(\d{2}(?:\.\d*)?)Z$/.exec(value);
-//                  if (a) {
-//                      return new Date(Date.UTC(
-//                         +a[1], +a[2] - 1, +a[3], +a[4], +a[5], +a[6]
-//                      ));
-//                  }
-//                  return value;
-//              }
-//          });
-
-//          myData = JSON.parse(
-//              "[\"Date(09/09/2001)\"]",
-//              function (key, value) {
-//                  var d;
-//                  if (
-//                      typeof value === "string"
-//                      && value.slice(0, 5) === "Date("
-//                      && value.slice(-1) === ")"
-//                  ) {
-//                      d = new Date(value.slice(5, -1));
-//                      if (d) {
-//                          return d;
-//                      }
-//                  }
-//                  return value;
-//              }
-//          );
-
-//  This is a reference implementation. You are free to copy, modify, or
-//  redistribute.
-
-/*jslint
-    eval, for, this
-*/
-
-/*property
-    JSON, apply, call, charCodeAt, getUTCDate, getUTCFullYear, getUTCHours,
-    getUTCMinutes, getUTCMonth, getUTCSeconds, hasOwnProperty, join,
-    lastIndex, length, parse, prototype, push, replace, slice, stringify,
-    test, toJSON, toString, valueOf
-*/
-
-
-// Create a JSON object only if one does not already exist. We create the
-// methods in a closure to avoid creating global variables.
-
-if (typeof JSON !== "object") {
-    JSON = {};
-}
-
-(function () {
-    "use strict";
-
-    var rx_one = /^[\],:{}\s]*$/;
-    var rx_two = /\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g;
-    var rx_three = /"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g;
-    var rx_four = /(?:^|:|,)(?:\s*\[)+/g;
-    var rx_escapable = /[\\"\u0000-\u001f\u007f-\u009f\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g;
-    var rx_dangerous = /[\u0000\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g;
-
-    function f(n) {
-        // Format integers to have at least two digits.
-        return (n < 10)
-            ? "0" + n
-            : n;
-    }
-
-    function this_value() {
-        return this.valueOf();
-    }
-
-    if (typeof Date.prototype.toJSON !== "function") {
-
-        Date.prototype.toJSON = function () {
-
-            return isFinite(this.valueOf())
-                ? (
-                    this.getUTCFullYear()
-                    + "-"
-                    + f(this.getUTCMonth() + 1)
-                    + "-"
-                    + f(this.getUTCDate())
-                    + "T"
-                    + f(this.getUTCHours())
-                    + ":"
-                    + f(this.getUTCMinutes())
-                    + ":"
-                    + f(this.getUTCSeconds())
-                    + "Z"
-                )
-                : null;
-        };
-
-        Boolean.prototype.toJSON = this_value;
-        Number.prototype.toJSON = this_value;
-        String.prototype.toJSON = this_value;
-    }
-
-    var gap;
-    var indent;
-    var meta;
-    var rep;
-
-
-    function quote(string) {
-
-// If the string contains no control characters, no quote characters, and no
-// backslash characters, then we can safely slap some quotes around it.
-// Otherwise we must also replace the offending characters with safe escape
-// sequences.
-
-        rx_escapable.lastIndex = 0;
-        return rx_escapable.test(string)
-            ? "\"" + string.replace(rx_escapable, function (a) {
-                var c = meta[a];
-                return typeof c === "string"
-                    ? c
-                    : "\\u" + ("0000" + a.charCodeAt(0).toString(16)).slice(-4);
-            }) + "\""
-            : "\"" + string + "\"";
-    }
-
-
-    function str(key, holder) {
-
-// Produce a string from holder[key].
-
-        var i;          // The loop counter.
-        var k;          // The member key.
-        var v;          // The member value.
-        var length;
-        var mind = gap;
-        var partial;
-        var value = holder[key];
-
-// If the value has a toJSON method, call it to obtain a replacement value.
-
-        if (
-            value
-            && typeof value === "object"
-            && typeof value.toJSON === "function"
-        ) {
-            value = value.toJSON(key);
-        }
-
-// If we were called with a replacer function, then call the replacer to
-// obtain a replacement value.
-
-        if (typeof rep === "function") {
-            value = rep.call(holder, key, value);
-        }
-
-// What happens next depends on the value's type.
-
-        switch (typeof value) {
-        case "string":
-            return quote(value);
-
-        case "number":
-
-// JSON numbers must be finite. Encode non-finite numbers as null.
-
-            return (isFinite(value))
-                ? String(value)
-                : "null";
-
-        case "boolean":
-        case "null":
-
-// If the value is a boolean or null, convert it to a string. Note:
-// typeof null does not produce "null". The case is included here in
-// the remote chance that this gets fixed someday.
-
-            return String(value);
-
-// If the type is "object", we might be dealing with an object or an array or
-// null.
-
-        case "object":
-
-// Due to a specification blunder in ECMAScript, typeof null is "object",
-// so watch out for that case.
-
-            if (!value) {
-                return "null";
-            }
-
-// Make an array to hold the partial results of stringifying this object value.
-
-            gap += indent;
-            partial = [];
-
-// Is the value an array?
-
-            if (Object.prototype.toString.apply(value) === "[object Array]") {
-
-// The value is an array. Stringify every element. Use null as a placeholder
-// for non-JSON values.
-
-                length = value.length;
-                for (i = 0; i < length; i += 1) {
-                    partial[i] = str(i, value) || "null";
-                }
-
-// Join all of the elements together, separated with commas, and wrap them in
-// brackets.
-
-                v = partial.length === 0
-                    ? "[]"
-                    : gap
-                        ? (
-                            "[\n"
-                            + gap
-                            + partial.join(",\n" + gap)
-                            + "\n"
-                            + mind
-                            + "]"
-                        )
-                        : "[" + partial.join(",") + "]";
-                gap = mind;
-                return v;
-            }
-
-// If the replacer is an array, use it to select the members to be stringified.
-
-            if (rep && typeof rep === "object") {
-                length = rep.length;
-                for (i = 0; i < length; i += 1) {
-                    if (typeof rep[i] === "string") {
-                        k = rep[i];
-                        v = str(k, value);
-                        if (v) {
-                            partial.push(quote(k) + (
-                                (gap)
-                                    ? ": "
-                                    : ":"
-                            ) + v);
-                        }
-                    }
-                }
-            } else {
-
-// Otherwise, iterate through all of the keys in the object.
-
-                for (k in value) {
-                    if (Object.prototype.hasOwnProperty.call(value, k)) {
-                        v = str(k, value);
-                        if (v) {
-                            partial.push(quote(k) + (
-                                (gap)
-                                    ? ": "
-                                    : ":"
-                            ) + v);
-                        }
-                    }
-                }
-            }
-
-// Join all of the member texts together, separated with commas,
-// and wrap them in braces.
-
-            v = partial.length === 0
-                ? "{}"
-                : gap
-                    ? "{\n" + gap + partial.join(",\n" + gap) + "\n" + mind + "}"
-                    : "{" + partial.join(",") + "}";
-            gap = mind;
-            return v;
-        }
-    }
-
-// If the JSON object does not yet have a stringify method, give it one.
-
-    if (typeof JSON.stringify !== "function") {
-        meta = {    // table of character substitutions
-            "\b": "\\b",
-            "\t": "\\t",
-            "\n": "\\n",
-            "\f": "\\f",
-            "\r": "\\r",
-            "\"": "\\\"",
-            "\\": "\\\\"
-        };
-        JSON.stringify = function (value, replacer, space) {
-
-// The stringify method takes a value and an optional replacer, and an optional
-// space parameter, and returns a JSON text. The replacer can be a function
-// that can replace values, or an array of strings that will select the keys.
-// A default replacer method can be provided. Use of the space parameter can
-// produce text that is more easily readable.
-
-            var i;
-            gap = "";
-            indent = "";
-
-// If the space parameter is a number, make an indent string containing that
-// many spaces.
-
-            if (typeof space === "number") {
-                for (i = 0; i < space; i += 1) {
-                    indent += " ";
-                }
-
-// If the space parameter is a string, it will be used as the indent string.
-
-            } else if (typeof space === "string") {
-                indent = space;
-            }
-
-// If there is a replacer, it must be a function or an array.
-// Otherwise, throw an error.
-
-            rep = replacer;
-            if (replacer && typeof replacer !== "function" && (
-                typeof replacer !== "object"
-                || typeof replacer.length !== "number"
-            )) {
-                throw new Error("JSON.stringify");
-            }
-
-// Make a fake root object containing our value under the key of "".
-// Return the result of stringifying the value.
-
-            return str("", {"": value});
-        };
-    }
-
-
-// If the JSON object does not yet have a parse method, give it one.
-
-    if (typeof JSON.parse !== "function") {
-        JSON.parse = function (text, reviver) {
-
-// The parse method takes a text and an optional reviver function, and returns
-// a JavaScript value if the text is a valid JSON text.
-
-            var j;
-
-            function walk(holder, key) {
-
-// The walk method is used to recursively walk the resulting structure so
-// that modifications can be made.
-
-                var k;
-                var v;
-                var value = holder[key];
-                if (value && typeof value === "object") {
-                    for (k in value) {
-                        if (Object.prototype.hasOwnProperty.call(value, k)) {
-                            v = walk(value, k);
-                            if (v !== undefined) {
-                                value[k] = v;
-                            } else {
-                                delete value[k];
-                            }
-                        }
-                    }
-                }
-                return reviver.call(holder, key, value);
-            }
-
-
-// Parsing happens in four stages. In the first stage, we replace certain
-// Unicode characters with escape sequences. JavaScript handles many characters
-// incorrectly, either silently deleting them, or treating them as line endings.
-
-            text = String(text);
-            rx_dangerous.lastIndex = 0;
-            if (rx_dangerous.test(text)) {
-                text = text.replace(rx_dangerous, function (a) {
-                    return (
-                        "\\u"
-                        + ("0000" + a.charCodeAt(0).toString(16)).slice(-4)
-                    );
-                });
-            }
-
-// In the second stage, we run the text against regular expressions that look
-// for non-JSON patterns. We are especially concerned with "()" and "new"
-// because they can cause invocation, and "=" because it can cause mutation.
-// But just to be safe, we want to reject all unexpected forms.
-
-// We split the second stage into 4 regexp operations in order to work around
-// crippling inefficiencies in IE's and Safari's regexp engines. First we
-// replace the JSON backslash pairs with "@" (a non-JSON character). Second, we
-// replace all simple value tokens with "]" characters. Third, we delete all
-// open brackets that follow a colon or comma or that begin the text. Finally,
-// we look to see that the remaining characters are only whitespace or "]" or
-// "," or ":" or "{" or "}". If that is so, then the text is safe for eval.
-
-            if (
-                rx_one.test(
-                    text
-                        .replace(rx_two, "@")
-                        .replace(rx_three, "]")
-                        .replace(rx_four, "")
-                )
-            ) {
-
-// In the third stage we use the eval function to compile the text into a
-// JavaScript structure. The "{" operator is subject to a syntactic ambiguity
-// in JavaScript: it can begin a block or an object literal. We wrap the text
-// in parens to eliminate the ambiguity.
-
-                j = eval("(" + text + ")");
-
-// In the optional fourth stage, we recursively walk the new structure, passing
-// each name/value pair to a reviver function for possible transformation.
-
-                return (typeof reviver === "function")
-                    ? walk({"": j}, "")
-                    : j;
-            }
-
-// If the text is not JSON parseable, then a SyntaxError is thrown.
-
-            throw new SyntaxError("JSON.parse");
-        };
-    }
-}());
diff --git a/web/libraries/json2/json2.js.1 b/web/libraries/json2/json2.js.1
deleted file mode 100644
index f6fada687570de82450767a59d605175c3e725c8..0000000000000000000000000000000000000000
--- a/web/libraries/json2/json2.js.1
+++ /dev/null
@@ -1,530 +0,0 @@
-//  json2.js
-//  2017-06-12
-//  Public Domain.
-//  NO WARRANTY EXPRESSED OR IMPLIED. USE AT YOUR OWN RISK.
-
-//  USE YOUR OWN COPY. IT IS EXTREMELY UNWISE TO LOAD CODE FROM SERVERS YOU DO
-//  NOT CONTROL.
-
-//  This file creates a global JSON object containing two methods: stringify
-//  and parse. This file provides the ES5 JSON capability to ES3 systems.
-//  If a project might run on IE8 or earlier, then this file should be included.
-//  This file does nothing on ES5 systems.
-
-//      JSON.stringify(value, replacer, space)
-//          value       any JavaScript value, usually an object or array.
-//          replacer    an optional parameter that determines how object
-//                      values are stringified for objects. It can be a
-//                      function or an array of strings.
-//          space       an optional parameter that specifies the indentation
-//                      of nested structures. If it is omitted, the text will
-//                      be packed without extra whitespace. If it is a number,
-//                      it will specify the number of spaces to indent at each
-//                      level. If it is a string (such as "\t" or "&nbsp;"),
-//                      it contains the characters used to indent at each level.
-//          This method produces a JSON text from a JavaScript value.
-//          When an object value is found, if the object contains a toJSON
-//          method, its toJSON method will be called and the result will be
-//          stringified. A toJSON method does not serialize: it returns the
-//          value represented by the name/value pair that should be serialized,
-//          or undefined if nothing should be serialized. The toJSON method
-//          will be passed the key associated with the value, and this will be
-//          bound to the value.
-
-//          For example, this would serialize Dates as ISO strings.
-
-//              Date.prototype.toJSON = function (key) {
-//                  function f(n) {
-//                      // Format integers to have at least two digits.
-//                      return (n < 10)
-//                          ? "0" + n
-//                          : n;
-//                  }
-//                  return this.getUTCFullYear()   + "-" +
-//                       f(this.getUTCMonth() + 1) + "-" +
-//                       f(this.getUTCDate())      + "T" +
-//                       f(this.getUTCHours())     + ":" +
-//                       f(this.getUTCMinutes())   + ":" +
-//                       f(this.getUTCSeconds())   + "Z";
-//              };
-
-//          You can provide an optional replacer method. It will be passed the
-//          key and value of each member, with this bound to the containing
-//          object. The value that is returned from your method will be
-//          serialized. If your method returns undefined, then the member will
-//          be excluded from the serialization.
-
-//          If the replacer parameter is an array of strings, then it will be
-//          used to select the members to be serialized. It filters the results
-//          such that only members with keys listed in the replacer array are
-//          stringified.
-
-//          Values that do not have JSON representations, such as undefined or
-//          functions, will not be serialized. Such values in objects will be
-//          dropped; in arrays they will be replaced with null. You can use
-//          a replacer function to replace those with JSON values.
-
-//          JSON.stringify(undefined) returns undefined.
-
-//          The optional space parameter produces a stringification of the
-//          value that is filled with line breaks and indentation to make it
-//          easier to read.
-
-//          If the space parameter is a non-empty string, then that string will
-//          be used for indentation. If the space parameter is a number, then
-//          the indentation will be that many spaces.
-
-//          Example:
-
-//          text = JSON.stringify(["e", {pluribus: "unum"}]);
-//          // text is '["e",{"pluribus":"unum"}]'
-
-//          text = JSON.stringify(["e", {pluribus: "unum"}], null, "\t");
-//          // text is '[\n\t"e",\n\t{\n\t\t"pluribus": "unum"\n\t}\n]'
-
-//          text = JSON.stringify([new Date()], function (key, value) {
-//              return this[key] instanceof Date
-//                  ? "Date(" + this[key] + ")"
-//                  : value;
-//          });
-//          // text is '["Date(---current time---)"]'
-
-//      JSON.parse(text, reviver)
-//          This method parses a JSON text to produce an object or array.
-//          It can throw a SyntaxError exception.
-
-//          The optional reviver parameter is a function that can filter and
-//          transform the results. It receives each of the keys and values,
-//          and its return value is used instead of the original value.
-//          If it returns what it received, then the structure is not modified.
-//          If it returns undefined then the member is deleted.
-
-//          Example:
-
-//          // Parse the text. Values that look like ISO date strings will
-//          // be converted to Date objects.
-
-//          myData = JSON.parse(text, function (key, value) {
-//              var a;
-//              if (typeof value === "string") {
-//                  a =
-//   /^(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2}):(\d{2}(?:\.\d*)?)Z$/.exec(value);
-//                  if (a) {
-//                      return new Date(Date.UTC(
-//                         +a[1], +a[2] - 1, +a[3], +a[4], +a[5], +a[6]
-//                      ));
-//                  }
-//                  return value;
-//              }
-//          });
-
-//          myData = JSON.parse(
-//              "[\"Date(09/09/2001)\"]",
-//              function (key, value) {
-//                  var d;
-//                  if (
-//                      typeof value === "string"
-//                      && value.slice(0, 5) === "Date("
-//                      && value.slice(-1) === ")"
-//                  ) {
-//                      d = new Date(value.slice(5, -1));
-//                      if (d) {
-//                          return d;
-//                      }
-//                  }
-//                  return value;
-//              }
-//          );
-
-//  This is a reference implementation. You are free to copy, modify, or
-//  redistribute.
-
-/*jslint
-    eval, for, this
-*/
-
-/*property
-    JSON, apply, call, charCodeAt, getUTCDate, getUTCFullYear, getUTCHours,
-    getUTCMinutes, getUTCMonth, getUTCSeconds, hasOwnProperty, join,
-    lastIndex, length, parse, prototype, push, replace, slice, stringify,
-    test, toJSON, toString, valueOf
-*/
-
-
-// Create a JSON object only if one does not already exist. We create the
-// methods in a closure to avoid creating global variables.
-
-if (typeof JSON !== "object") {
-    JSON = {};
-}
-
-(function () {
-    "use strict";
-
-    var rx_one = /^[\],:{}\s]*$/;
-    var rx_two = /\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g;
-    var rx_three = /"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g;
-    var rx_four = /(?:^|:|,)(?:\s*\[)+/g;
-    var rx_escapable = /[\\"\u0000-\u001f\u007f-\u009f\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g;
-    var rx_dangerous = /[\u0000\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g;
-
-    function f(n) {
-        // Format integers to have at least two digits.
-        return (n < 10)
-            ? "0" + n
-            : n;
-    }
-
-    function this_value() {
-        return this.valueOf();
-    }
-
-    if (typeof Date.prototype.toJSON !== "function") {
-
-        Date.prototype.toJSON = function () {
-
-            return isFinite(this.valueOf())
-                ? (
-                    this.getUTCFullYear()
-                    + "-"
-                    + f(this.getUTCMonth() + 1)
-                    + "-"
-                    + f(this.getUTCDate())
-                    + "T"
-                    + f(this.getUTCHours())
-                    + ":"
-                    + f(this.getUTCMinutes())
-                    + ":"
-                    + f(this.getUTCSeconds())
-                    + "Z"
-                )
-                : null;
-        };
-
-        Boolean.prototype.toJSON = this_value;
-        Number.prototype.toJSON = this_value;
-        String.prototype.toJSON = this_value;
-    }
-
-    var gap;
-    var indent;
-    var meta;
-    var rep;
-
-
-    function quote(string) {
-
-// If the string contains no control characters, no quote characters, and no
-// backslash characters, then we can safely slap some quotes around it.
-// Otherwise we must also replace the offending characters with safe escape
-// sequences.
-
-        rx_escapable.lastIndex = 0;
-        return rx_escapable.test(string)
-            ? "\"" + string.replace(rx_escapable, function (a) {
-                var c = meta[a];
-                return typeof c === "string"
-                    ? c
-                    : "\\u" + ("0000" + a.charCodeAt(0).toString(16)).slice(-4);
-            }) + "\""
-            : "\"" + string + "\"";
-    }
-
-
-    function str(key, holder) {
-
-// Produce a string from holder[key].
-
-        var i;          // The loop counter.
-        var k;          // The member key.
-        var v;          // The member value.
-        var length;
-        var mind = gap;
-        var partial;
-        var value = holder[key];
-
-// If the value has a toJSON method, call it to obtain a replacement value.
-
-        if (
-            value
-            && typeof value === "object"
-            && typeof value.toJSON === "function"
-        ) {
-            value = value.toJSON(key);
-        }
-
-// If we were called with a replacer function, then call the replacer to
-// obtain a replacement value.
-
-        if (typeof rep === "function") {
-            value = rep.call(holder, key, value);
-        }
-
-// What happens next depends on the value's type.
-
-        switch (typeof value) {
-        case "string":
-            return quote(value);
-
-        case "number":
-
-// JSON numbers must be finite. Encode non-finite numbers as null.
-
-            return (isFinite(value))
-                ? String(value)
-                : "null";
-
-        case "boolean":
-        case "null":
-
-// If the value is a boolean or null, convert it to a string. Note:
-// typeof null does not produce "null". The case is included here in
-// the remote chance that this gets fixed someday.
-
-            return String(value);
-
-// If the type is "object", we might be dealing with an object or an array or
-// null.
-
-        case "object":
-
-// Due to a specification blunder in ECMAScript, typeof null is "object",
-// so watch out for that case.
-
-            if (!value) {
-                return "null";
-            }
-
-// Make an array to hold the partial results of stringifying this object value.
-
-            gap += indent;
-            partial = [];
-
-// Is the value an array?
-
-            if (Object.prototype.toString.apply(value) === "[object Array]") {
-
-// The value is an array. Stringify every element. Use null as a placeholder
-// for non-JSON values.
-
-                length = value.length;
-                for (i = 0; i < length; i += 1) {
-                    partial[i] = str(i, value) || "null";
-                }
-
-// Join all of the elements together, separated with commas, and wrap them in
-// brackets.
-
-                v = partial.length === 0
-                    ? "[]"
-                    : gap
-                        ? (
-                            "[\n"
-                            + gap
-                            + partial.join(",\n" + gap)
-                            + "\n"
-                            + mind
-                            + "]"
-                        )
-                        : "[" + partial.join(",") + "]";
-                gap = mind;
-                return v;
-            }
-
-// If the replacer is an array, use it to select the members to be stringified.
-
-            if (rep && typeof rep === "object") {
-                length = rep.length;
-                for (i = 0; i < length; i += 1) {
-                    if (typeof rep[i] === "string") {
-                        k = rep[i];
-                        v = str(k, value);
-                        if (v) {
-                            partial.push(quote(k) + (
-                                (gap)
-                                    ? ": "
-                                    : ":"
-                            ) + v);
-                        }
-                    }
-                }
-            } else {
-
-// Otherwise, iterate through all of the keys in the object.
-
-                for (k in value) {
-                    if (Object.prototype.hasOwnProperty.call(value, k)) {
-                        v = str(k, value);
-                        if (v) {
-                            partial.push(quote(k) + (
-                                (gap)
-                                    ? ": "
-                                    : ":"
-                            ) + v);
-                        }
-                    }
-                }
-            }
-
-// Join all of the member texts together, separated with commas,
-// and wrap them in braces.
-
-            v = partial.length === 0
-                ? "{}"
-                : gap
-                    ? "{\n" + gap + partial.join(",\n" + gap) + "\n" + mind + "}"
-                    : "{" + partial.join(",") + "}";
-            gap = mind;
-            return v;
-        }
-    }
-
-// If the JSON object does not yet have a stringify method, give it one.
-
-    if (typeof JSON.stringify !== "function") {
-        meta = {    // table of character substitutions
-            "\b": "\\b",
-            "\t": "\\t",
-            "\n": "\\n",
-            "\f": "\\f",
-            "\r": "\\r",
-            "\"": "\\\"",
-            "\\": "\\\\"
-        };
-        JSON.stringify = function (value, replacer, space) {
-
-// The stringify method takes a value and an optional replacer, and an optional
-// space parameter, and returns a JSON text. The replacer can be a function
-// that can replace values, or an array of strings that will select the keys.
-// A default replacer method can be provided. Use of the space parameter can
-// produce text that is more easily readable.
-
-            var i;
-            gap = "";
-            indent = "";
-
-// If the space parameter is a number, make an indent string containing that
-// many spaces.
-
-            if (typeof space === "number") {
-                for (i = 0; i < space; i += 1) {
-                    indent += " ";
-                }
-
-// If the space parameter is a string, it will be used as the indent string.
-
-            } else if (typeof space === "string") {
-                indent = space;
-            }
-
-// If there is a replacer, it must be a function or an array.
-// Otherwise, throw an error.
-
-            rep = replacer;
-            if (replacer && typeof replacer !== "function" && (
-                typeof replacer !== "object"
-                || typeof replacer.length !== "number"
-            )) {
-                throw new Error("JSON.stringify");
-            }
-
-// Make a fake root object containing our value under the key of "".
-// Return the result of stringifying the value.
-
-            return str("", {"": value});
-        };
-    }
-
-
-// If the JSON object does not yet have a parse method, give it one.
-
-    if (typeof JSON.parse !== "function") {
-        JSON.parse = function (text, reviver) {
-
-// The parse method takes a text and an optional reviver function, and returns
-// a JavaScript value if the text is a valid JSON text.
-
-            var j;
-
-            function walk(holder, key) {
-
-// The walk method is used to recursively walk the resulting structure so
-// that modifications can be made.
-
-                var k;
-                var v;
-                var value = holder[key];
-                if (value && typeof value === "object") {
-                    for (k in value) {
-                        if (Object.prototype.hasOwnProperty.call(value, k)) {
-                            v = walk(value, k);
-                            if (v !== undefined) {
-                                value[k] = v;
-                            } else {
-                                delete value[k];
-                            }
-                        }
-                    }
-                }
-                return reviver.call(holder, key, value);
-            }
-
-
-// Parsing happens in four stages. In the first stage, we replace certain
-// Unicode characters with escape sequences. JavaScript handles many characters
-// incorrectly, either silently deleting them, or treating them as line endings.
-
-            text = String(text);
-            rx_dangerous.lastIndex = 0;
-            if (rx_dangerous.test(text)) {
-                text = text.replace(rx_dangerous, function (a) {
-                    return (
-                        "\\u"
-                        + ("0000" + a.charCodeAt(0).toString(16)).slice(-4)
-                    );
-                });
-            }
-
-// In the second stage, we run the text against regular expressions that look
-// for non-JSON patterns. We are especially concerned with "()" and "new"
-// because they can cause invocation, and "=" because it can cause mutation.
-// But just to be safe, we want to reject all unexpected forms.
-
-// We split the second stage into 4 regexp operations in order to work around
-// crippling inefficiencies in IE's and Safari's regexp engines. First we
-// replace the JSON backslash pairs with "@" (a non-JSON character). Second, we
-// replace all simple value tokens with "]" characters. Third, we delete all
-// open brackets that follow a colon or comma or that begin the text. Finally,
-// we look to see that the remaining characters are only whitespace or "]" or
-// "," or ":" or "{" or "}". If that is so, then the text is safe for eval.
-
-            if (
-                rx_one.test(
-                    text
-                        .replace(rx_two, "@")
-                        .replace(rx_three, "]")
-                        .replace(rx_four, "")
-                )
-            ) {
-
-// In the third stage we use the eval function to compile the text into a
-// JavaScript structure. The "{" operator is subject to a syntactic ambiguity
-// in JavaScript: it can begin a block or an object literal. We wrap the text
-// in parens to eliminate the ambiguity.
-
-                j = eval("(" + text + ")");
-
-// In the optional fourth stage, we recursively walk the new structure, passing
-// each name/value pair to a reviver function for possible transformation.
-
-                return (typeof reviver === "function")
-                    ? walk({"": j}, "")
-                    : j;
-            }
-
-// If the text is not JSON parseable, then a SyntaxError is thrown.
-
-            throw new SyntaxError("JSON.parse");
-        };
-    }
-}());
diff --git a/web/libraries/json2/json2.js.2 b/web/libraries/json2/json2.js.2
deleted file mode 100644
index f6fada687570de82450767a59d605175c3e725c8..0000000000000000000000000000000000000000
--- a/web/libraries/json2/json2.js.2
+++ /dev/null
@@ -1,530 +0,0 @@
-//  json2.js
-//  2017-06-12
-//  Public Domain.
-//  NO WARRANTY EXPRESSED OR IMPLIED. USE AT YOUR OWN RISK.
-
-//  USE YOUR OWN COPY. IT IS EXTREMELY UNWISE TO LOAD CODE FROM SERVERS YOU DO
-//  NOT CONTROL.
-
-//  This file creates a global JSON object containing two methods: stringify
-//  and parse. This file provides the ES5 JSON capability to ES3 systems.
-//  If a project might run on IE8 or earlier, then this file should be included.
-//  This file does nothing on ES5 systems.
-
-//      JSON.stringify(value, replacer, space)
-//          value       any JavaScript value, usually an object or array.
-//          replacer    an optional parameter that determines how object
-//                      values are stringified for objects. It can be a
-//                      function or an array of strings.
-//          space       an optional parameter that specifies the indentation
-//                      of nested structures. If it is omitted, the text will
-//                      be packed without extra whitespace. If it is a number,
-//                      it will specify the number of spaces to indent at each
-//                      level. If it is a string (such as "\t" or "&nbsp;"),
-//                      it contains the characters used to indent at each level.
-//          This method produces a JSON text from a JavaScript value.
-//          When an object value is found, if the object contains a toJSON
-//          method, its toJSON method will be called and the result will be
-//          stringified. A toJSON method does not serialize: it returns the
-//          value represented by the name/value pair that should be serialized,
-//          or undefined if nothing should be serialized. The toJSON method
-//          will be passed the key associated with the value, and this will be
-//          bound to the value.
-
-//          For example, this would serialize Dates as ISO strings.
-
-//              Date.prototype.toJSON = function (key) {
-//                  function f(n) {
-//                      // Format integers to have at least two digits.
-//                      return (n < 10)
-//                          ? "0" + n
-//                          : n;
-//                  }
-//                  return this.getUTCFullYear()   + "-" +
-//                       f(this.getUTCMonth() + 1) + "-" +
-//                       f(this.getUTCDate())      + "T" +
-//                       f(this.getUTCHours())     + ":" +
-//                       f(this.getUTCMinutes())   + ":" +
-//                       f(this.getUTCSeconds())   + "Z";
-//              };
-
-//          You can provide an optional replacer method. It will be passed the
-//          key and value of each member, with this bound to the containing
-//          object. The value that is returned from your method will be
-//          serialized. If your method returns undefined, then the member will
-//          be excluded from the serialization.
-
-//          If the replacer parameter is an array of strings, then it will be
-//          used to select the members to be serialized. It filters the results
-//          such that only members with keys listed in the replacer array are
-//          stringified.
-
-//          Values that do not have JSON representations, such as undefined or
-//          functions, will not be serialized. Such values in objects will be
-//          dropped; in arrays they will be replaced with null. You can use
-//          a replacer function to replace those with JSON values.
-
-//          JSON.stringify(undefined) returns undefined.
-
-//          The optional space parameter produces a stringification of the
-//          value that is filled with line breaks and indentation to make it
-//          easier to read.
-
-//          If the space parameter is a non-empty string, then that string will
-//          be used for indentation. If the space parameter is a number, then
-//          the indentation will be that many spaces.
-
-//          Example:
-
-//          text = JSON.stringify(["e", {pluribus: "unum"}]);
-//          // text is '["e",{"pluribus":"unum"}]'
-
-//          text = JSON.stringify(["e", {pluribus: "unum"}], null, "\t");
-//          // text is '[\n\t"e",\n\t{\n\t\t"pluribus": "unum"\n\t}\n]'
-
-//          text = JSON.stringify([new Date()], function (key, value) {
-//              return this[key] instanceof Date
-//                  ? "Date(" + this[key] + ")"
-//                  : value;
-//          });
-//          // text is '["Date(---current time---)"]'
-
-//      JSON.parse(text, reviver)
-//          This method parses a JSON text to produce an object or array.
-//          It can throw a SyntaxError exception.
-
-//          The optional reviver parameter is a function that can filter and
-//          transform the results. It receives each of the keys and values,
-//          and its return value is used instead of the original value.
-//          If it returns what it received, then the structure is not modified.
-//          If it returns undefined then the member is deleted.
-
-//          Example:
-
-//          // Parse the text. Values that look like ISO date strings will
-//          // be converted to Date objects.
-
-//          myData = JSON.parse(text, function (key, value) {
-//              var a;
-//              if (typeof value === "string") {
-//                  a =
-//   /^(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2}):(\d{2}(?:\.\d*)?)Z$/.exec(value);
-//                  if (a) {
-//                      return new Date(Date.UTC(
-//                         +a[1], +a[2] - 1, +a[3], +a[4], +a[5], +a[6]
-//                      ));
-//                  }
-//                  return value;
-//              }
-//          });
-
-//          myData = JSON.parse(
-//              "[\"Date(09/09/2001)\"]",
-//              function (key, value) {
-//                  var d;
-//                  if (
-//                      typeof value === "string"
-//                      && value.slice(0, 5) === "Date("
-//                      && value.slice(-1) === ")"
-//                  ) {
-//                      d = new Date(value.slice(5, -1));
-//                      if (d) {
-//                          return d;
-//                      }
-//                  }
-//                  return value;
-//              }
-//          );
-
-//  This is a reference implementation. You are free to copy, modify, or
-//  redistribute.
-
-/*jslint
-    eval, for, this
-*/
-
-/*property
-    JSON, apply, call, charCodeAt, getUTCDate, getUTCFullYear, getUTCHours,
-    getUTCMinutes, getUTCMonth, getUTCSeconds, hasOwnProperty, join,
-    lastIndex, length, parse, prototype, push, replace, slice, stringify,
-    test, toJSON, toString, valueOf
-*/
-
-
-// Create a JSON object only if one does not already exist. We create the
-// methods in a closure to avoid creating global variables.
-
-if (typeof JSON !== "object") {
-    JSON = {};
-}
-
-(function () {
-    "use strict";
-
-    var rx_one = /^[\],:{}\s]*$/;
-    var rx_two = /\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g;
-    var rx_three = /"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g;
-    var rx_four = /(?:^|:|,)(?:\s*\[)+/g;
-    var rx_escapable = /[\\"\u0000-\u001f\u007f-\u009f\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g;
-    var rx_dangerous = /[\u0000\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g;
-
-    function f(n) {
-        // Format integers to have at least two digits.
-        return (n < 10)
-            ? "0" + n
-            : n;
-    }
-
-    function this_value() {
-        return this.valueOf();
-    }
-
-    if (typeof Date.prototype.toJSON !== "function") {
-
-        Date.prototype.toJSON = function () {
-
-            return isFinite(this.valueOf())
-                ? (
-                    this.getUTCFullYear()
-                    + "-"
-                    + f(this.getUTCMonth() + 1)
-                    + "-"
-                    + f(this.getUTCDate())
-                    + "T"
-                    + f(this.getUTCHours())
-                    + ":"
-                    + f(this.getUTCMinutes())
-                    + ":"
-                    + f(this.getUTCSeconds())
-                    + "Z"
-                )
-                : null;
-        };
-
-        Boolean.prototype.toJSON = this_value;
-        Number.prototype.toJSON = this_value;
-        String.prototype.toJSON = this_value;
-    }
-
-    var gap;
-    var indent;
-    var meta;
-    var rep;
-
-
-    function quote(string) {
-
-// If the string contains no control characters, no quote characters, and no
-// backslash characters, then we can safely slap some quotes around it.
-// Otherwise we must also replace the offending characters with safe escape
-// sequences.
-
-        rx_escapable.lastIndex = 0;
-        return rx_escapable.test(string)
-            ? "\"" + string.replace(rx_escapable, function (a) {
-                var c = meta[a];
-                return typeof c === "string"
-                    ? c
-                    : "\\u" + ("0000" + a.charCodeAt(0).toString(16)).slice(-4);
-            }) + "\""
-            : "\"" + string + "\"";
-    }
-
-
-    function str(key, holder) {
-
-// Produce a string from holder[key].
-
-        var i;          // The loop counter.
-        var k;          // The member key.
-        var v;          // The member value.
-        var length;
-        var mind = gap;
-        var partial;
-        var value = holder[key];
-
-// If the value has a toJSON method, call it to obtain a replacement value.
-
-        if (
-            value
-            && typeof value === "object"
-            && typeof value.toJSON === "function"
-        ) {
-            value = value.toJSON(key);
-        }
-
-// If we were called with a replacer function, then call the replacer to
-// obtain a replacement value.
-
-        if (typeof rep === "function") {
-            value = rep.call(holder, key, value);
-        }
-
-// What happens next depends on the value's type.
-
-        switch (typeof value) {
-        case "string":
-            return quote(value);
-
-        case "number":
-
-// JSON numbers must be finite. Encode non-finite numbers as null.
-
-            return (isFinite(value))
-                ? String(value)
-                : "null";
-
-        case "boolean":
-        case "null":
-
-// If the value is a boolean or null, convert it to a string. Note:
-// typeof null does not produce "null". The case is included here in
-// the remote chance that this gets fixed someday.
-
-            return String(value);
-
-// If the type is "object", we might be dealing with an object or an array or
-// null.
-
-        case "object":
-
-// Due to a specification blunder in ECMAScript, typeof null is "object",
-// so watch out for that case.
-
-            if (!value) {
-                return "null";
-            }
-
-// Make an array to hold the partial results of stringifying this object value.
-
-            gap += indent;
-            partial = [];
-
-// Is the value an array?
-
-            if (Object.prototype.toString.apply(value) === "[object Array]") {
-
-// The value is an array. Stringify every element. Use null as a placeholder
-// for non-JSON values.
-
-                length = value.length;
-                for (i = 0; i < length; i += 1) {
-                    partial[i] = str(i, value) || "null";
-                }
-
-// Join all of the elements together, separated with commas, and wrap them in
-// brackets.
-
-                v = partial.length === 0
-                    ? "[]"
-                    : gap
-                        ? (
-                            "[\n"
-                            + gap
-                            + partial.join(",\n" + gap)
-                            + "\n"
-                            + mind
-                            + "]"
-                        )
-                        : "[" + partial.join(",") + "]";
-                gap = mind;
-                return v;
-            }
-
-// If the replacer is an array, use it to select the members to be stringified.
-
-            if (rep && typeof rep === "object") {
-                length = rep.length;
-                for (i = 0; i < length; i += 1) {
-                    if (typeof rep[i] === "string") {
-                        k = rep[i];
-                        v = str(k, value);
-                        if (v) {
-                            partial.push(quote(k) + (
-                                (gap)
-                                    ? ": "
-                                    : ":"
-                            ) + v);
-                        }
-                    }
-                }
-            } else {
-
-// Otherwise, iterate through all of the keys in the object.
-
-                for (k in value) {
-                    if (Object.prototype.hasOwnProperty.call(value, k)) {
-                        v = str(k, value);
-                        if (v) {
-                            partial.push(quote(k) + (
-                                (gap)
-                                    ? ": "
-                                    : ":"
-                            ) + v);
-                        }
-                    }
-                }
-            }
-
-// Join all of the member texts together, separated with commas,
-// and wrap them in braces.
-
-            v = partial.length === 0
-                ? "{}"
-                : gap
-                    ? "{\n" + gap + partial.join(",\n" + gap) + "\n" + mind + "}"
-                    : "{" + partial.join(",") + "}";
-            gap = mind;
-            return v;
-        }
-    }
-
-// If the JSON object does not yet have a stringify method, give it one.
-
-    if (typeof JSON.stringify !== "function") {
-        meta = {    // table of character substitutions
-            "\b": "\\b",
-            "\t": "\\t",
-            "\n": "\\n",
-            "\f": "\\f",
-            "\r": "\\r",
-            "\"": "\\\"",
-            "\\": "\\\\"
-        };
-        JSON.stringify = function (value, replacer, space) {
-
-// The stringify method takes a value and an optional replacer, and an optional
-// space parameter, and returns a JSON text. The replacer can be a function
-// that can replace values, or an array of strings that will select the keys.
-// A default replacer method can be provided. Use of the space parameter can
-// produce text that is more easily readable.
-
-            var i;
-            gap = "";
-            indent = "";
-
-// If the space parameter is a number, make an indent string containing that
-// many spaces.
-
-            if (typeof space === "number") {
-                for (i = 0; i < space; i += 1) {
-                    indent += " ";
-                }
-
-// If the space parameter is a string, it will be used as the indent string.
-
-            } else if (typeof space === "string") {
-                indent = space;
-            }
-
-// If there is a replacer, it must be a function or an array.
-// Otherwise, throw an error.
-
-            rep = replacer;
-            if (replacer && typeof replacer !== "function" && (
-                typeof replacer !== "object"
-                || typeof replacer.length !== "number"
-            )) {
-                throw new Error("JSON.stringify");
-            }
-
-// Make a fake root object containing our value under the key of "".
-// Return the result of stringifying the value.
-
-            return str("", {"": value});
-        };
-    }
-
-
-// If the JSON object does not yet have a parse method, give it one.
-
-    if (typeof JSON.parse !== "function") {
-        JSON.parse = function (text, reviver) {
-
-// The parse method takes a text and an optional reviver function, and returns
-// a JavaScript value if the text is a valid JSON text.
-
-            var j;
-
-            function walk(holder, key) {
-
-// The walk method is used to recursively walk the resulting structure so
-// that modifications can be made.
-
-                var k;
-                var v;
-                var value = holder[key];
-                if (value && typeof value === "object") {
-                    for (k in value) {
-                        if (Object.prototype.hasOwnProperty.call(value, k)) {
-                            v = walk(value, k);
-                            if (v !== undefined) {
-                                value[k] = v;
-                            } else {
-                                delete value[k];
-                            }
-                        }
-                    }
-                }
-                return reviver.call(holder, key, value);
-            }
-
-
-// Parsing happens in four stages. In the first stage, we replace certain
-// Unicode characters with escape sequences. JavaScript handles many characters
-// incorrectly, either silently deleting them, or treating them as line endings.
-
-            text = String(text);
-            rx_dangerous.lastIndex = 0;
-            if (rx_dangerous.test(text)) {
-                text = text.replace(rx_dangerous, function (a) {
-                    return (
-                        "\\u"
-                        + ("0000" + a.charCodeAt(0).toString(16)).slice(-4)
-                    );
-                });
-            }
-
-// In the second stage, we run the text against regular expressions that look
-// for non-JSON patterns. We are especially concerned with "()" and "new"
-// because they can cause invocation, and "=" because it can cause mutation.
-// But just to be safe, we want to reject all unexpected forms.
-
-// We split the second stage into 4 regexp operations in order to work around
-// crippling inefficiencies in IE's and Safari's regexp engines. First we
-// replace the JSON backslash pairs with "@" (a non-JSON character). Second, we
-// replace all simple value tokens with "]" characters. Third, we delete all
-// open brackets that follow a colon or comma or that begin the text. Finally,
-// we look to see that the remaining characters are only whitespace or "]" or
-// "," or ":" or "{" or "}". If that is so, then the text is safe for eval.
-
-            if (
-                rx_one.test(
-                    text
-                        .replace(rx_two, "@")
-                        .replace(rx_three, "]")
-                        .replace(rx_four, "")
-                )
-            ) {
-
-// In the third stage we use the eval function to compile the text into a
-// JavaScript structure. The "{" operator is subject to a syntactic ambiguity
-// in JavaScript: it can begin a block or an object literal. We wrap the text
-// in parens to eliminate the ambiguity.
-
-                j = eval("(" + text + ")");
-
-// In the optional fourth stage, we recursively walk the new structure, passing
-// each name/value pair to a reviver function for possible transformation.
-
-                return (typeof reviver === "function")
-                    ? walk({"": j}, "")
-                    : j;
-            }
-
-// If the text is not JSON parseable, then a SyntaxError is thrown.
-
-            throw new SyntaxError("JSON.parse");
-        };
-    }
-}());