Compass-ci
  Threads by month 
                
            - ----- 2025 -----
 - November
 - October
 - September
 - August
 - July
 - June
 - May
 - April
 - March
 - February
 - January
 - ----- 2024 -----
 - December
 - November
 - October
 - September
 - August
 - July
 - June
 - May
 - April
 - March
 - February
 - January
 - ----- 2023 -----
 - December
 - November
 - October
 - September
 - August
 - July
 - June
 - May
 - April
 - March
 - February
 - January
 - ----- 2022 -----
 - December
 - November
 - October
 - September
 - August
 - July
 - June
 - May
 - April
 - March
 - February
 - January
 - ----- 2021 -----
 - December
 - November
 - October
 - September
 - August
 - July
 - June
 - May
 - April
 - March
 - February
 - January
 - ----- 2020 -----
 - December
 - November
 - October
 - September
 
- 5237 discussions
 
                    
                        From: Lu Weitao <luweitaobe(a)163.com>
[Why]
Optimize result page style to make it more modern
[Example]
http://124.90.34.227:11300/result/iperf/2020-12-08/vm-2p8g/openeuler-20.03-…
Signed-off-by: Lu Weitao <luweitaobe(a)163.com>
---
 .../root/etc/nginx/conf.d/default.conf        |   5 +-
 container/srv-http/root/srv/.htaccess         | 165 +++++
 container/srv-http/root/srv/_h5ai/.htaccess   | 165 +++++
 .../srv-http/root/srv/_h5ai/CHANGELOG.md      | 598 ++++++++++++++++++
 container/srv-http/root/srv/_h5ai/README.md   |  72 +++
 .../root/srv/_h5ai/private/cache/README.md    |   9 +
 .../root/srv/_h5ai/private/conf/l10n/af.json  |  18 +
 .../root/srv/_h5ai/private/conf/l10n/bg.json  |  18 +
 .../root/srv/_h5ai/private/conf/l10n/cs.json  |  18 +
 .../root/srv/_h5ai/private/conf/l10n/da.json  |  18 +
 .../root/srv/_h5ai/private/conf/l10n/de.json  |  22 +
 .../root/srv/_h5ai/private/conf/l10n/el.json  |  18 +
 .../root/srv/_h5ai/private/conf/l10n/en.json  |  23 +
 .../root/srv/_h5ai/private/conf/l10n/es.json  |  22 +
 .../root/srv/_h5ai/private/conf/l10n/et.json  |  22 +
 .../root/srv/_h5ai/private/conf/l10n/fi.json  |  18 +
 .../root/srv/_h5ai/private/conf/l10n/fr.json  |  22 +
 .../root/srv/_h5ai/private/conf/l10n/he.json  |  17 +
 .../root/srv/_h5ai/private/conf/l10n/hi.json  |  18 +
 .../root/srv/_h5ai/private/conf/l10n/hr.json  |  18 +
 .../root/srv/_h5ai/private/conf/l10n/hu.json  |  16 +
 .../root/srv/_h5ai/private/conf/l10n/it.json  |  18 +
 .../root/srv/_h5ai/private/conf/l10n/ja.json  |  20 +
 .../root/srv/_h5ai/private/conf/l10n/ko.json  |  22 +
 .../root/srv/_h5ai/private/conf/l10n/lv.json  |  22 +
 .../root/srv/_h5ai/private/conf/l10n/nb.json  |  15 +
 .../root/srv/_h5ai/private/conf/l10n/nl.json  |  22 +
 .../root/srv/_h5ai/private/conf/l10n/pl.json  |  22 +
 .../root/srv/_h5ai/private/conf/l10n/pt.json  |  18 +
 .../root/srv/_h5ai/private/conf/l10n/ro.json  |  15 +
 .../root/srv/_h5ai/private/conf/l10n/ru.json  |  20 +
 .../root/srv/_h5ai/private/conf/l10n/sk.json  |  13 +
 .../root/srv/_h5ai/private/conf/l10n/sl.json  |  18 +
 .../root/srv/_h5ai/private/conf/l10n/sr.json  |  15 +
 .../root/srv/_h5ai/private/conf/l10n/sv.json  |  16 +
 .../root/srv/_h5ai/private/conf/l10n/tr.json  |  14 +
 .../root/srv/_h5ai/private/conf/l10n/uk.json  |  18 +
 .../srv/_h5ai/private/conf/l10n/zh-cn.json    |  23 +
 .../srv/_h5ai/private/conf/l10n/zh-tw.json    |  23 +
 .../root/srv/_h5ai/private/conf/options.json  | 392 ++++++++++++
 .../root/srv/_h5ai/private/conf/types.json    |  76 +++
 .../srv/_h5ai/private/php/class-bootstrap.php |  45 ++
 .../srv/_h5ai/private/php/core/class-api.php  | 109 ++++
 .../_h5ai/private/php/core/class-context.php  | 294 +++++++++
 .../_h5ai/private/php/core/class-fallback.php |  54 ++
 .../_h5ai/private/php/core/class-filesize.php |  96 +++
 .../srv/_h5ai/private/php/core/class-item.php |  91 +++
 .../srv/_h5ai/private/php/core/class-json.php |  65 ++
 .../_h5ai/private/php/core/class-logger.php   |  28 +
 .../_h5ai/private/php/core/class-request.php  |  38 ++
 .../_h5ai/private/php/core/class-session.php  |  20 +
 .../_h5ai/private/php/core/class-setup.php    | 185 ++++++
 .../_h5ai/private/php/core/class-theme.php    |  32 +
 .../srv/_h5ai/private/php/core/class-util.php |  89 +++
 .../_h5ai/private/php/ext/class-archive.php   | 183 ++++++
 .../_h5ai/private/php/ext/class-custom.php    |  65 ++
 .../_h5ai/private/php/ext/class-search.php    |  40 ++
 .../srv/_h5ai/private/php/ext/class-thumb.php | 253 ++++++++
 .../srv/_h5ai/private/php/pages/index.php     |   2 +
 .../root/srv/_h5ai/private/php/pages/info.php |   2 +
 .../srv-http/root/srv/_h5ai/public/.htaccess  |  13 +
 .../root/srv/_h5ai/public/cache/README.md     |   9 +
 .../root/srv/_h5ai/public/css/styles.css      |   2 +
 .../root/srv/_h5ai/public/ext/README.md       |   4 +
 .../srv/_h5ai/public/images/fallback/file.png | Bin 0 -> 118 bytes
 .../public/images/fallback/folder-parent.png  | Bin 0 -> 108 bytes
 .../_h5ai/public/images/fallback/folder.png   | Bin 0 -> 99 bytes
 .../public/images/favicon/favicon-152.png     | Bin 0 -> 219 bytes
 .../public/images/favicon/favicon-16-32.ico   | Bin 0 -> 5430 bytes
 .../public/images/favicon/favicon-16.png      | Bin 0 -> 96 bytes
 .../public/images/favicon/favicon-32.png      | Bin 0 -> 120 bytes
 .../_h5ai/public/images/favicon/favicon.svg   |   3 +
 .../srv/_h5ai/public/images/themes/README.md  |   9 +
 .../public/images/themes/comity/ar-apk.svg    |   3 +
 .../public/images/themes/comity/ar-deb.svg    |  16 +
 .../public/images/themes/comity/ar-rpm.svg    |  11 +
 .../public/images/themes/comity/txt-css.svg   |  13 +
 .../public/images/themes/comity/txt-go.svg    |  29 +
 .../public/images/themes/comity/txt-html.svg  |  10 +
 .../public/images/themes/comity/txt-js.svg    |   3 +
 .../public/images/themes/comity/txt-less.svg  |   8 +
 .../public/images/themes/comity/txt-md.svg    |   3 +
 .../public/images/themes/comity/txt-php.svg   |   3 +
 .../public/images/themes/comity/txt-py.svg    |   8 +
 .../public/images/themes/comity/txt-rb.svg    |   3 +
 .../public/images/themes/comity/txt-rust.svg  |   3 +
 .../images/themes/comity/txt-script.svg       |   3 +
 .../public/images/themes/comity/x-pdf.svg     |   3 +
 .../_h5ai/public/images/themes/default/ar.svg |   3 +
 .../public/images/themes/default/aud.svg      |   3 +
 .../public/images/themes/default/bin.svg      |   3 +
 .../public/images/themes/default/file.svg     |   3 +
 .../images/themes/default/folder-page.svg     |   3 +
 .../images/themes/default/folder-parent.svg   |   3 +
 .../public/images/themes/default/folder.svg   |   3 +
 .../public/images/themes/default/img.svg      |   3 +
 .../public/images/themes/default/txt.svg      |   3 +
 .../public/images/themes/default/vid.svg      |   3 +
 .../_h5ai/public/images/themes/default/x.svg  |   3 +
 .../root/srv/_h5ai/public/images/ui/back.svg  |   3 +
 .../root/srv/_h5ai/public/images/ui/crumb.svg |   3 +
 .../srv/_h5ai/public/images/ui/download.svg   |   3 +
 .../srv/_h5ai/public/images/ui/filter.svg     |   5 +
 .../_h5ai/public/images/ui/info-toggle.svg    |   3 +
 .../srv/_h5ai/public/images/ui/paypal.svg     |   6 +
 .../_h5ai/public/images/ui/preview-close.svg  |   3 +
 .../public/images/ui/preview-fullscreen.svg   |   3 +
 .../_h5ai/public/images/ui/preview-next.svg   |   3 +
 .../images/ui/preview-no-fullscreen.svg       |   3 +
 .../_h5ai/public/images/ui/preview-prev.svg   |   3 +
 .../_h5ai/public/images/ui/preview-raw.svg    |   3 +
 .../srv/_h5ai/public/images/ui/search.svg     |   5 +
 .../srv/_h5ai/public/images/ui/selected.svg   |   3 +
 .../srv/_h5ai/public/images/ui/sidebar.svg    |   3 +
 .../root/srv/_h5ai/public/images/ui/sort.svg  |   3 +
 .../srv/_h5ai/public/images/ui/spinner.svg    |   6 +
 .../_h5ai/public/images/ui/tree-indicator.svg |   3 +
 .../_h5ai/public/images/ui/tree-toggle.svg    |   3 +
 .../_h5ai/public/images/ui/view-details.svg   |   3 +
 .../srv/_h5ai/public/images/ui/view-grid.svg  |   3 +
 .../srv/_h5ai/public/images/ui/view-icons.svg |   3 +
 .../srv-http/root/srv/_h5ai/public/index.php  |  17 +
 .../root/srv/_h5ai/public/js/scripts.js       |   5 +
 123 files changed, 4082 insertions(+), 3 deletions(-)
 create mode 100644 container/srv-http/root/srv/.htaccess
 create mode 100644 container/srv-http/root/srv/_h5ai/.htaccess
 create mode 100644 container/srv-http/root/srv/_h5ai/CHANGELOG.md
 create mode 100644 container/srv-http/root/srv/_h5ai/README.md
 create mode 100755 container/srv-http/root/srv/_h5ai/private/cache/README.md
 create mode 100755 container/srv-http/root/srv/_h5ai/private/conf/l10n/af.json
 create mode 100755 container/srv-http/root/srv/_h5ai/private/conf/l10n/bg.json
 create mode 100755 container/srv-http/root/srv/_h5ai/private/conf/l10n/cs.json
 create mode 100755 container/srv-http/root/srv/_h5ai/private/conf/l10n/da.json
 create mode 100755 container/srv-http/root/srv/_h5ai/private/conf/l10n/de.json
 create mode 100755 container/srv-http/root/srv/_h5ai/private/conf/l10n/el.json
 create mode 100755 container/srv-http/root/srv/_h5ai/private/conf/l10n/en.json
 create mode 100755 container/srv-http/root/srv/_h5ai/private/conf/l10n/es.json
 create mode 100755 container/srv-http/root/srv/_h5ai/private/conf/l10n/et.json
 create mode 100755 container/srv-http/root/srv/_h5ai/private/conf/l10n/fi.json
 create mode 100755 container/srv-http/root/srv/_h5ai/private/conf/l10n/fr.json
 create mode 100755 container/srv-http/root/srv/_h5ai/private/conf/l10n/he.json
 create mode 100755 container/srv-http/root/srv/_h5ai/private/conf/l10n/hi.json
 create mode 100755 container/srv-http/root/srv/_h5ai/private/conf/l10n/hr.json
 create mode 100755 container/srv-http/root/srv/_h5ai/private/conf/l10n/hu.json
 create mode 100755 container/srv-http/root/srv/_h5ai/private/conf/l10n/it.json
 create mode 100755 container/srv-http/root/srv/_h5ai/private/conf/l10n/ja.json
 create mode 100755 container/srv-http/root/srv/_h5ai/private/conf/l10n/ko.json
 create mode 100755 container/srv-http/root/srv/_h5ai/private/conf/l10n/lv.json
 create mode 100755 container/srv-http/root/srv/_h5ai/private/conf/l10n/nb.json
 create mode 100755 container/srv-http/root/srv/_h5ai/private/conf/l10n/nl.json
 create mode 100755 container/srv-http/root/srv/_h5ai/private/conf/l10n/pl.json
 create mode 100755 container/srv-http/root/srv/_h5ai/private/conf/l10n/pt.json
 create mode 100755 container/srv-http/root/srv/_h5ai/private/conf/l10n/ro.json
 create mode 100755 container/srv-http/root/srv/_h5ai/private/conf/l10n/ru.json
 create mode 100755 container/srv-http/root/srv/_h5ai/private/conf/l10n/sk.json
 create mode 100755 container/srv-http/root/srv/_h5ai/private/conf/l10n/sl.json
 create mode 100755 container/srv-http/root/srv/_h5ai/private/conf/l10n/sr.json
 create mode 100755 container/srv-http/root/srv/_h5ai/private/conf/l10n/sv.json
 create mode 100755 container/srv-http/root/srv/_h5ai/private/conf/l10n/tr.json
 create mode 100755 container/srv-http/root/srv/_h5ai/private/conf/l10n/uk.json
 create mode 100755 container/srv-http/root/srv/_h5ai/private/conf/l10n/zh-cn.json
 create mode 100755 container/srv-http/root/srv/_h5ai/private/conf/l10n/zh-tw.json
 create mode 100755 container/srv-http/root/srv/_h5ai/private/conf/options.json
 create mode 100755 container/srv-http/root/srv/_h5ai/private/conf/types.json
 create mode 100755 container/srv-http/root/srv/_h5ai/private/php/class-bootstrap.php
 create mode 100755 container/srv-http/root/srv/_h5ai/private/php/core/class-api.php
 create mode 100755 container/srv-http/root/srv/_h5ai/private/php/core/class-context.php
 create mode 100755 container/srv-http/root/srv/_h5ai/private/php/core/class-fallback.php
 create mode 100755 container/srv-http/root/srv/_h5ai/private/php/core/class-filesize.php
 create mode 100755 container/srv-http/root/srv/_h5ai/private/php/core/class-item.php
 create mode 100755 container/srv-http/root/srv/_h5ai/private/php/core/class-json.php
 create mode 100755 container/srv-http/root/srv/_h5ai/private/php/core/class-logger.php
 create mode 100755 container/srv-http/root/srv/_h5ai/private/php/core/class-request.php
 create mode 100755 container/srv-http/root/srv/_h5ai/private/php/core/class-session.php
 create mode 100755 container/srv-http/root/srv/_h5ai/private/php/core/class-setup.php
 create mode 100755 container/srv-http/root/srv/_h5ai/private/php/core/class-theme.php
 create mode 100755 container/srv-http/root/srv/_h5ai/private/php/core/class-util.php
 create mode 100755 container/srv-http/root/srv/_h5ai/private/php/ext/class-archive.php
 create mode 100755 container/srv-http/root/srv/_h5ai/private/php/ext/class-custom.php
 create mode 100755 container/srv-http/root/srv/_h5ai/private/php/ext/class-search.php
 create mode 100755 container/srv-http/root/srv/_h5ai/private/php/ext/class-thumb.php
 create mode 100755 container/srv-http/root/srv/_h5ai/private/php/pages/index.php
 create mode 100755 container/srv-http/root/srv/_h5ai/private/php/pages/info.php
 create mode 100755 container/srv-http/root/srv/_h5ai/public/.htaccess
 create mode 100755 container/srv-http/root/srv/_h5ai/public/cache/README.md
 create mode 100755 container/srv-http/root/srv/_h5ai/public/css/styles.css
 create mode 100755 container/srv-http/root/srv/_h5ai/public/ext/README.md
 create mode 100755 container/srv-http/root/srv/_h5ai/public/images/fallback/file.png
 create mode 100755 container/srv-http/root/srv/_h5ai/public/images/fallback/folder-parent.png
 create mode 100755 container/srv-http/root/srv/_h5ai/public/images/fallback/folder.png
 create mode 100755 container/srv-http/root/srv/_h5ai/public/images/favicon/favicon-152.png
 create mode 100755 container/srv-http/root/srv/_h5ai/public/images/favicon/favicon-16-32.ico
 create mode 100755 container/srv-http/root/srv/_h5ai/public/images/favicon/favicon-16.png
 create mode 100755 container/srv-http/root/srv/_h5ai/public/images/favicon/favicon-32.png
 create mode 100755 container/srv-http/root/srv/_h5ai/public/images/favicon/favicon.svg
 create mode 100755 container/srv-http/root/srv/_h5ai/public/images/themes/README.md
 create mode 100755 container/srv-http/root/srv/_h5ai/public/images/themes/comity/ar-apk.svg
 create mode 100755 container/srv-http/root/srv/_h5ai/public/images/themes/comity/ar-deb.svg
 create mode 100755 container/srv-http/root/srv/_h5ai/public/images/themes/comity/ar-rpm.svg
 create mode 100755 container/srv-http/root/srv/_h5ai/public/images/themes/comity/txt-css.svg
 create mode 100755 container/srv-http/root/srv/_h5ai/public/images/themes/comity/txt-go.svg
 create mode 100755 container/srv-http/root/srv/_h5ai/public/images/themes/comity/txt-html.svg
 create mode 100755 container/srv-http/root/srv/_h5ai/public/images/themes/comity/txt-js.svg
 create mode 100755 container/srv-http/root/srv/_h5ai/public/images/themes/comity/txt-less.svg
 create mode 100755 container/srv-http/root/srv/_h5ai/public/images/themes/comity/txt-md.svg
 create mode 100755 container/srv-http/root/srv/_h5ai/public/images/themes/comity/txt-php.svg
 create mode 100755 container/srv-http/root/srv/_h5ai/public/images/themes/comity/txt-py.svg
 create mode 100755 container/srv-http/root/srv/_h5ai/public/images/themes/comity/txt-rb.svg
 create mode 100755 container/srv-http/root/srv/_h5ai/public/images/themes/comity/txt-rust.svg
 create mode 100755 container/srv-http/root/srv/_h5ai/public/images/themes/comity/txt-script.svg
 create mode 100755 container/srv-http/root/srv/_h5ai/public/images/themes/comity/x-pdf.svg
 create mode 100755 container/srv-http/root/srv/_h5ai/public/images/themes/default/ar.svg
 create mode 100755 container/srv-http/root/srv/_h5ai/public/images/themes/default/aud.svg
 create mode 100755 container/srv-http/root/srv/_h5ai/public/images/themes/default/bin.svg
 create mode 100755 container/srv-http/root/srv/_h5ai/public/images/themes/default/file.svg
 create mode 100755 container/srv-http/root/srv/_h5ai/public/images/themes/default/folder-page.svg
 create mode 100755 container/srv-http/root/srv/_h5ai/public/images/themes/default/folder-parent.svg
 create mode 100755 container/srv-http/root/srv/_h5ai/public/images/themes/default/folder.svg
 create mode 100755 container/srv-http/root/srv/_h5ai/public/images/themes/default/img.svg
 create mode 100755 container/srv-http/root/srv/_h5ai/public/images/themes/default/txt.svg
 create mode 100755 container/srv-http/root/srv/_h5ai/public/images/themes/default/vid.svg
 create mode 100755 container/srv-http/root/srv/_h5ai/public/images/themes/default/x.svg
 create mode 100755 container/srv-http/root/srv/_h5ai/public/images/ui/back.svg
 create mode 100755 container/srv-http/root/srv/_h5ai/public/images/ui/crumb.svg
 create mode 100755 container/srv-http/root/srv/_h5ai/public/images/ui/download.svg
 create mode 100755 container/srv-http/root/srv/_h5ai/public/images/ui/filter.svg
 create mode 100755 container/srv-http/root/srv/_h5ai/public/images/ui/info-toggle.svg
 create mode 100755 container/srv-http/root/srv/_h5ai/public/images/ui/paypal.svg
 create mode 100755 container/srv-http/root/srv/_h5ai/public/images/ui/preview-close.svg
 create mode 100755 container/srv-http/root/srv/_h5ai/public/images/ui/preview-fullscreen.svg
 create mode 100755 container/srv-http/root/srv/_h5ai/public/images/ui/preview-next.svg
 create mode 100755 container/srv-http/root/srv/_h5ai/public/images/ui/preview-no-fullscreen.svg
 create mode 100755 container/srv-http/root/srv/_h5ai/public/images/ui/preview-prev.svg
 create mode 100755 container/srv-http/root/srv/_h5ai/public/images/ui/preview-raw.svg
 create mode 100755 container/srv-http/root/srv/_h5ai/public/images/ui/search.svg
 create mode 100755 container/srv-http/root/srv/_h5ai/public/images/ui/selected.svg
 create mode 100755 container/srv-http/root/srv/_h5ai/public/images/ui/sidebar.svg
 create mode 100755 container/srv-http/root/srv/_h5ai/public/images/ui/sort.svg
 create mode 100755 container/srv-http/root/srv/_h5ai/public/images/ui/spinner.svg
 create mode 100755 container/srv-http/root/srv/_h5ai/public/images/ui/tree-indicator.svg
 create mode 100755 container/srv-http/root/srv/_h5ai/public/images/ui/tree-toggle.svg
 create mode 100755 container/srv-http/root/srv/_h5ai/public/images/ui/view-details.svg
 create mode 100755 container/srv-http/root/srv/_h5ai/public/images/ui/view-grid.svg
 create mode 100755 container/srv-http/root/srv/_h5ai/public/images/ui/view-icons.svg
 create mode 100755 container/srv-http/root/srv/_h5ai/public/index.php
 create mode 100755 container/srv-http/root/srv/_h5ai/public/js/scripts.js
diff --git a/container/srv-http/root/etc/nginx/conf.d/default.conf b/container/srv-http/root/etc/nginx/conf.d/default.conf
index 676418a..646eee3 100644
--- a/container/srv-http/root/etc/nginx/conf.d/default.conf
+++ b/container/srv-http/root/etc/nginx/conf.d/default.conf
@@ -3,8 +3,8 @@ server {
     server_name "srv-http";
     server_tokens off;
 
-    root /usr/share/nginx/html;
-    index index.html;
+    root /srv;
+    index  index.html  index.php  /_h5ai/public/index.php;
 
     charset utf-8,gbk;
 
@@ -24,7 +24,6 @@ server {
 	autoindex  on;
 	autoindex_localtime on;
 	allow all;
-	root /srv;
         location ~* /[-_a-z]+$ {
 	    add_header Content-Type text/plain;
         }
diff --git a/container/srv-http/root/srv/.htaccess b/container/srv-http/root/srv/.htaccess
new file mode 100644
index 0000000..95e775b
--- /dev/null
+++ b/container/srv-http/root/srv/.htaccess
@@ -0,0 +1,165 @@
+## details here: https://github.com/h5bp/server-configs-apache
+
+
+
+## SECURITY ###################################################################
+
+DirectoryIndex disabled
+FileETag None
+ServerSignature Off
+
+# Apache < 2.3
+<IfModule !mod_authz_core.c>
+    Order allow,deny
+    Deny from all
+    Satisfy All
+</IfModule>
+
+# Apache ≥ 2.3
+<IfModule mod_authz_core.c>
+    Require all denied
+</IfModule>
+
+<IfModule mod_headers.c>
+    Header set X-Content-Type-Options "nosniff"
+    Header unset ETag
+    Header unset X-Powered-By
+</IfModule>
+
+<IfModule mod_autoindex.c>
+    Options -Indexes
+</IfModule>
+
+
+
+## COMPAT #####################################################################
+
+AddDefaultCharset utf-8
+
+<IfModule mod_mime.c>
+    AddCharset utf-8 .css .html .js .json .php .svg
+
+    AddType application/font-woff                       woff
+    AddType application/font-woff2                      woff2
+    AddType application/json                            json
+    AddType application/javascript                      js
+    AddType application/vnd.ms-fontobject               eot
+    AddType application/x-font-ttf                      ttc ttf
+    AddType image/jpeg                                  jpeg jpg
+    AddType image/png                                   png
+    AddType image/svg+xml                               svg svgz
+    AddType image/x-icon                                ico
+    AddType font/opentype                               otf
+    AddType text/css                                    css
+    AddType text/html                                   html
+</IfModule>
+
+
+
+## SPEED ######################################################################
+
+<IfModule mod_expires.c>
+    ExpiresActive on
+    ExpiresDefault                                      "access plus 1 month"
+
+    ExpiresByType application/json                      "access plus 0 seconds"
+
+    ExpiresByType text/html                             "access plus 1 minute"
+
+    ExpiresByType image/x-icon                          "access plus 1 week"
+
+    ExpiresByType application/javascript                "access plus 1 year"
+    ExpiresByType image/jpeg                            "access plus 1 year"
+    ExpiresByType image/png                             "access plus 1 year"
+    ExpiresByType image/svg+xml                         "access plus 1 year"
+    ExpiresByType text/css                              "access plus 1 year"
+</IfModule>
+
+<IfModule mod_deflate.c>
+    <IfModule mod_setenvif.c>
+        <IfModule mod_headers.c>
+            SetEnvIfNoCase ^(Accept-EncodXng|X-cept-Encoding|X{15}|~{15}|-{15})$ ^((gzip|deflate)\s*,?\s*)+|[X~-]{4,13}$ HAVE_Accept-Encoding
+            RequestHeader append Accept-Encoding "gzip,deflate" env=HAVE_Accept-Encoding
+        </IfModule>
+    </IfModule>
+
+    # Apache ≥ 2.3
+    <IfModule mod_authz_core.c>
+        # mod_filter as module only available for Apache ≥ 2.3.7
+        <IfModule mod_filter.c>
+            AddOutputFilterByType DEFLATE "application/atom+xml" \
+                                          "application/javascript" \
+                                          "application/json" \
+                                          "application/ld+json" \
+                                          "application/manifest+json" \
+                                          "application/rdf+xml" \
+                                          "application/rss+xml" \
+                                          "application/schema+json" \
+                                          "application/vnd.geo+json" \
+                                          "application/vnd.ms-fontobject" \
+                                          "application/x-font-ttf" \
+                                          "application/x-javascript" \
+                                          "application/x-web-app-manifest+json" \
+                                          "application/xhtml+xml" \
+                                          "application/xml" \
+                                          "font/eot" \
+                                          "font/opentype" \
+                                          "image/bmp" \
+                                          "image/svg+xml" \
+                                          "image/vnd.microsoft.icon" \
+                                          "image/x-icon" \
+                                          "text/cache-manifest" \
+                                          "text/css" \
+                                          "text/html" \
+                                          "text/javascript" \
+                                          "text/plain" \
+                                          "text/vcard" \
+                                          "text/vnd.rim.location.xloc" \
+                                          "text/vtt" \
+                                          "text/x-component" \
+                                          "text/x-cross-domain-policy" \
+                                          "text/xml"
+        </IfModule>
+    </IfModule>
+
+    # Apache < 2.3
+    <IfModule !mod_authz_core.c>
+            AddOutputFilterByType DEFLATE "application/atom+xml" \
+                                          "application/javascript" \
+                                          "application/json" \
+                                          "application/ld+json" \
+                                          "application/manifest+json" \
+                                          "application/rdf+xml" \
+                                          "application/rss+xml" \
+                                          "application/schema+json" \
+                                          "application/vnd.geo+json" \
+                                          "application/vnd.ms-fontobject" \
+                                          "application/x-font-ttf" \
+                                          "application/x-javascript" \
+                                          "application/x-web-app-manifest+json" \
+                                          "application/xhtml+xml" \
+                                          "application/xml" \
+                                          "font/eot" \
+                                          "font/opentype" \
+                                          "image/bmp" \
+                                          "image/svg+xml" \
+                                          "image/vnd.microsoft.icon" \
+                                          "image/x-icon" \
+                                          "text/cache-manifest" \
+                                          "text/css" \
+                                          "text/html" \
+                                          "text/javascript" \
+                                          "text/plain" \
+                                          "text/vcard" \
+                                          "text/vnd.rim.location.xloc" \
+                                          "text/vtt" \
+                                          "text/x-component" \
+                                          "text/x-cross-domain-policy" \
+                                          "text/xml"
+    </IfModule>
+
+    <IfModule mod_mime.c>
+        AddEncoding gzip              gz
+        AddEncoding gzip              svgz
+    </IfModule>
+</IfModule>
diff --git a/container/srv-http/root/srv/_h5ai/.htaccess b/container/srv-http/root/srv/_h5ai/.htaccess
new file mode 100644
index 0000000..95e775b
--- /dev/null
+++ b/container/srv-http/root/srv/_h5ai/.htaccess
@@ -0,0 +1,165 @@
+## details here: https://github.com/h5bp/server-configs-apache
+
+
+
+## SECURITY ###################################################################
+
+DirectoryIndex disabled
+FileETag None
+ServerSignature Off
+
+# Apache < 2.3
+<IfModule !mod_authz_core.c>
+    Order allow,deny
+    Deny from all
+    Satisfy All
+</IfModule>
+
+# Apache ≥ 2.3
+<IfModule mod_authz_core.c>
+    Require all denied
+</IfModule>
+
+<IfModule mod_headers.c>
+    Header set X-Content-Type-Options "nosniff"
+    Header unset ETag
+    Header unset X-Powered-By
+</IfModule>
+
+<IfModule mod_autoindex.c>
+    Options -Indexes
+</IfModule>
+
+
+
+## COMPAT #####################################################################
+
+AddDefaultCharset utf-8
+
+<IfModule mod_mime.c>
+    AddCharset utf-8 .css .html .js .json .php .svg
+
+    AddType application/font-woff                       woff
+    AddType application/font-woff2                      woff2
+    AddType application/json                            json
+    AddType application/javascript                      js
+    AddType application/vnd.ms-fontobject               eot
+    AddType application/x-font-ttf                      ttc ttf
+    AddType image/jpeg                                  jpeg jpg
+    AddType image/png                                   png
+    AddType image/svg+xml                               svg svgz
+    AddType image/x-icon                                ico
+    AddType font/opentype                               otf
+    AddType text/css                                    css
+    AddType text/html                                   html
+</IfModule>
+
+
+
+## SPEED ######################################################################
+
+<IfModule mod_expires.c>
+    ExpiresActive on
+    ExpiresDefault                                      "access plus 1 month"
+
+    ExpiresByType application/json                      "access plus 0 seconds"
+
+    ExpiresByType text/html                             "access plus 1 minute"
+
+    ExpiresByType image/x-icon                          "access plus 1 week"
+
+    ExpiresByType application/javascript                "access plus 1 year"
+    ExpiresByType image/jpeg                            "access plus 1 year"
+    ExpiresByType image/png                             "access plus 1 year"
+    ExpiresByType image/svg+xml                         "access plus 1 year"
+    ExpiresByType text/css                              "access plus 1 year"
+</IfModule>
+
+<IfModule mod_deflate.c>
+    <IfModule mod_setenvif.c>
+        <IfModule mod_headers.c>
+            SetEnvIfNoCase ^(Accept-EncodXng|X-cept-Encoding|X{15}|~{15}|-{15})$ ^((gzip|deflate)\s*,?\s*)+|[X~-]{4,13}$ HAVE_Accept-Encoding
+            RequestHeader append Accept-Encoding "gzip,deflate" env=HAVE_Accept-Encoding
+        </IfModule>
+    </IfModule>
+
+    # Apache ≥ 2.3
+    <IfModule mod_authz_core.c>
+        # mod_filter as module only available for Apache ≥ 2.3.7
+        <IfModule mod_filter.c>
+            AddOutputFilterByType DEFLATE "application/atom+xml" \
+                                          "application/javascript" \
+                                          "application/json" \
+                                          "application/ld+json" \
+                                          "application/manifest+json" \
+                                          "application/rdf+xml" \
+                                          "application/rss+xml" \
+                                          "application/schema+json" \
+                                          "application/vnd.geo+json" \
+                                          "application/vnd.ms-fontobject" \
+                                          "application/x-font-ttf" \
+                                          "application/x-javascript" \
+                                          "application/x-web-app-manifest+json" \
+                                          "application/xhtml+xml" \
+                                          "application/xml" \
+                                          "font/eot" \
+                                          "font/opentype" \
+                                          "image/bmp" \
+                                          "image/svg+xml" \
+                                          "image/vnd.microsoft.icon" \
+                                          "image/x-icon" \
+                                          "text/cache-manifest" \
+                                          "text/css" \
+                                          "text/html" \
+                                          "text/javascript" \
+                                          "text/plain" \
+                                          "text/vcard" \
+                                          "text/vnd.rim.location.xloc" \
+                                          "text/vtt" \
+                                          "text/x-component" \
+                                          "text/x-cross-domain-policy" \
+                                          "text/xml"
+        </IfModule>
+    </IfModule>
+
+    # Apache < 2.3
+    <IfModule !mod_authz_core.c>
+            AddOutputFilterByType DEFLATE "application/atom+xml" \
+                                          "application/javascript" \
+                                          "application/json" \
+                                          "application/ld+json" \
+                                          "application/manifest+json" \
+                                          "application/rdf+xml" \
+                                          "application/rss+xml" \
+                                          "application/schema+json" \
+                                          "application/vnd.geo+json" \
+                                          "application/vnd.ms-fontobject" \
+                                          "application/x-font-ttf" \
+                                          "application/x-javascript" \
+                                          "application/x-web-app-manifest+json" \
+                                          "application/xhtml+xml" \
+                                          "application/xml" \
+                                          "font/eot" \
+                                          "font/opentype" \
+                                          "image/bmp" \
+                                          "image/svg+xml" \
+                                          "image/vnd.microsoft.icon" \
+                                          "image/x-icon" \
+                                          "text/cache-manifest" \
+                                          "text/css" \
+                                          "text/html" \
+                                          "text/javascript" \
+                                          "text/plain" \
+                                          "text/vcard" \
+                                          "text/vnd.rim.location.xloc" \
+                                          "text/vtt" \
+                                          "text/x-component" \
+                                          "text/x-cross-domain-policy" \
+                                          "text/xml"
+    </IfModule>
+
+    <IfModule mod_mime.c>
+        AddEncoding gzip              gz
+        AddEncoding gzip              svgz
+    </IfModule>
+</IfModule>
diff --git a/container/srv-http/root/srv/_h5ai/CHANGELOG.md b/container/srv-http/root/srv/_h5ai/CHANGELOG.md
new file mode 100644
index 0000000..b575191
--- /dev/null
+++ b/container/srv-http/root/srv/_h5ai/CHANGELOG.md
@@ -0,0 +1,598 @@
+# Changelog
+
+
+## v0.29.2 - *2019-03-22*
+
+* update `babel-loader` to 7.1.1
+* update `eslint` to 5.15.3
+* update `ghu` to 0.13.0
+* update `jsdom` to 14.0.0
+* update `kjua` to 0.2.0
+* update `lolight` to 1.0.0
+* update `scar` to 1.2.0
+
+
+## v0.29.1 - *2019-01-20*
+
+* replace `babel-preset-es2015` with `babel-preset-env`
+* update `eslint` to 5.14.1
+* update `ghu` to 0.12.0
+* update `jsdom` to 9.2.0
+* update `kjua` to 0.1.2
+* update `lolight` to 0.6.0
+* update `marked` to 0.6.1
+* update `normalize.css` to 8.0.1
+* update `scar` to 1.0.0
+
+
+## v0.29.0 - *2016-08-12*
+
+* back to cleaner visual experience
+* add option to disable sidebar
+* add options to filter/search ignore case
+* replace PHP `getenv` calls with `$_SERVER` lookups
+* add `view.fallbackMode` option to generally serve only fallback mode
+* serve fallback mode for text browsers (`curl`, `links`, `lynx`, `w3m`)
+* change type `txt-svg` to `img-svg`, no thumbs but preview
+* fix a tree indentation glitch
+* fix shell command detection on Windows
+* fix Piwik anayltics
+* fix `.htaccess` auth issues
+* fix drag-select on scrollable content
+* fix download-all function
+* fix audio and video preview loading
+* fix thumbnail request issues
+* add `rust` type and icon
+* add `autoplay` option to audio and video preview
+* add `--dereference` to `shell-du` to follow sym links
+* remove *Install* section from `README.md`, causes too much trouble
+* remove peer5 support
+* update build process to use `node 6.0+`, no need for babel now
+* replace `jquery-qrcode` with [`kjua`](https://larsjung.de/kjua/)
+* replace `prism` with [`lolight`](https://larsjung.de/lolight/)
+* move deps to `package.json` (`normalize.css`, `kjua`, `lolight` and `marked`)
+* remove `jQuery`
+* remove `lodash`
+* remove [`modulejs`](https://larsjung.de/modulejs/) for now
+* reduce JS code by 60% (~250kb -> ~100kb)
+* update languages (`et`, `nl`, `pl`)
+
+
+## v0.28.0 - *2015-12-19*
+
+* now require PHP 5.5.0+
+* change index path to `/_h5ai/public/index.php`
+* now only `/_h5ai/public/` needs to be web-accessible
+* add support for custom script and style additions
+* add options to set font families
+* add search
+* add ignorecase sorting option to tree
+* add wide links in tree view
+* add IE edge mode
+* add frontend tests
+* fix some styles in IE10
+* fix preview bottom bar for small screen widths
+* lots of code cleanup and refactorings
+* change API
+* update build process, now uses [`ghu`](https://larsjung.de/ghu/)
+* switch from jshint and jscs to [`eslint`](http://eslint.org/)
+* update `jQuery` to 2.1.4
+* update `lodash` to 3.9.3 (add debounce and trim)
+* update `marked` to 0.3.5
+* update `modulejs` to 1.13.0
+* update `prism` to 2015-12-19
+* update h5bp styles to 5.2.0
+* update `normalize.css` to 3.0.3
+* remove `Moment.js`
+
+
+## v0.27.0 - *2015-04-06*
+
+* new layout
+* add editorconfig
+* drop support for IE9 (gets fallback)
+* update sidebar settings
+* add info sidebar
+* add opt-out for click'n'drag selection
+* add package name option for single selections
+* add initial support for Peer5
+* add option to down-sample images for preview
+* add option for natural sorting in tree sidebar
+* fix problems with files/folders named `0`
+* change font from `Ubuntu` to `Roboto` (smaller footprint, clearer for small sizes)
+* switch back to Google Fonts
+* improve PDF thumbnail quality
+* improve drag-select
+* improve image preview
+* prevent listing `_h5ai` folder and subfolders
+* update build process, now uses [`mkr`](https://larsjung.de/mkr/) and [`fQuery`](https://larsjung.de/fquery/)
+* update `jQuery` to 2.1.3
+* update `jQuery.qrcode` to 0.11.0
+* update `Lo-Dash` to 3.6.0
+* update `Modernizr` to 2.8.3
+* update `modulejs` to 1.4.0
+* update `Moment.js` to 2.9.0
+* update `Prism` to 2015-04-05
+* remove deprecated Google Analytics code
+* remove `jQuery.fracs`
+* remove `jQuery.scrollpanel`
+* remove `jQuery.mousewheel`
+* update languages (`af`, `es`, `ja`, `ko`, `ru`, `zh-cn`)
+
+
+## v0.26.1 - *2014-08-17*
+
+* fix links
+
+
+## v0.26.0 - *2014-08-16*
+
+* remove True Type fonts
+* outsource themes to [h5ai-themes](https://github.com/lrsjng/h5ai-themes)
+* add filesize fallback for large files and 32bit PHP
+* fix server detection
+* add config file tests to info page
+* remove JSON shim
+* add caching of command checks
+* update `jQuery.mousewheel` to 3.1.12
+* update `jQuery.qrcode` to 0.8.0
+* replace `markdown` with [`marked`](https://github.com/chjj/marked) 0.3.2
+* update `modulejs` to 0.4.5
+* update `Moment.js` to 2.8.1
+* replace `underscore` with [`Lo-Dash`](https://github.com/lodash/lodash) 2.4.1
+* replace `SyntaxHighlighter` with [`Prism`](http://prismjs.com) 2014-08-04
+
+
+## v0.25.2 - *2014-07-01*
+
+* add optional info page protection
+* fix `short_open_tag` issues for PHP < 5.4.0
+* fix default folder download (`alwaysVisible` option)
+* minor fixes
+
+
+## v0.25.1 - *2014-06-25*
+
+* fix broken paths for filenames containing '+' characters
+* fix Google Universal Analytics
+* fix file type check
+
+
+## v0.25.0 - *2014-06-22*
+
+* add sidebar
+* add initial theme support
+* add icons from [Evolvere Icon Theme](http://franksouza183.deviantart.com/art/Evolvere-Icon-theme-44071829…
+* add PHP variant to calc folder sizes
+* add scroll position reset on location change (issue [#279](https://github.com/lrsjng/h5ai/issues/279))
+* add option to hide unreadable files
+* add option where to place folders (top, inplace, bottom)
+* add markdown support for custom header and footer files
+* add video and audio preview via HTML5 elements (no fallback, works best in Chrome)
+* add filter reset on location change
+* add option to make download button always visible
+* add Google UA support
+* extend selectable icon sizes (add 128px, 192px, 256px, 384px)
+* improve preview GUI
+* disable thumbs in `cache` folder
+* fix QR code URI origin (issue [#287](https://github.com/lrsjng/h5ai/issues/287))
+* replace PHP backtick operator with `exec`
+* remove server side file manipulation extensions `dropbox`, `delete` and `rename`
+* update `H5BP` to 4.3.0
+* update `jQuery` to 2.1.1
+* update `json2.js` to 2014-02-04
+* update `markdown-js` to 0.5.0
+* update `Modernizr` to 2.8.2
+* update `Moment.js` to 2.6.0
+* update `Underscore.js` to 1.6.0
+* update languages (`bg`, `ko`, `pt`, `sl`, `sv`, `zh-cn`)
+
+
+## v0.24.1 - *2014-04-09*
+
+* security fixes! (issues [#268](https://github.com/lrsjng/h5ai/issues/268), [#269](https://github.com/lrsjng/h5ai/issues/269))
+* fix WinOS command detection
+* update languages (`fi`, `fr`, `hi`, `it`, `zh-tw`)
+
+
+## v0.24.0 - *2013-09-04*
+
+* updates image and text preview
+* adds variable icon sizes
+* adds optional natural sort of items
+* adds optional checkboxes to select items
+* adds text preview modes: none, fixed, markdown
+* optionally hide folders in main view
+* makes use of EXIF thumbnails optional
+* fixes file deletion of multiple files
+* fixes `setParentFolderLabels = false`
+* fixes shell-arg and RegExp escape issues
+* cleans code
+* updates info page `/_h5ai`
+* adds `aiff` to `audio` types
+* adds `da` translation by Ronnie Milbo
+* updates to `pl` translation by Mark
+
+
+## v0.23.0 - *2013-07-21*
+
+* removes `aai` mode!
+* drops support for IE7+8 (simple fallback, same as no javascript)
+* uses History API if available (way faster browsing)
+* faster thumbnail generation if EXIF thumbnails available
+* adds optional custom headers/footers that are propageted to all subfolders
+* optional hide parent folder links
+* some fixes on previews
+* speeds up packaged downloads
+* add line wrap and line highlighting (on hover) to text preview
+* new design (colors, images)
+* now uses scalable images for the interface
+* fixes filter (ignore parent folder, display of `no match`)
+* lots of small fixes
+* updates `H5BP` to 4.2.0
+* updates `jQuery` to 2.0.3
+* updates `jQuery.mousewheel` to 3.1.3
+* updates `Moment.js` to 2.1.0
+* updates `markdown-js` to 0.4.0-9c21acdf08
+* updates `json2.js` to 2013-05-26
+* adds `uk` translation by Viktor Matveenko
+* updates to `pl` translation by Mark
+
+
+## v0.22.1 - *2012-10-16*
+
+* bug fix concerning API requests in PHP mode
+* minor changes in responsive styles
+
+
+## v0.22 - *2012-10-14*
+
+* general changes h5ai directory layout and configuration
+* splits configuration file (`config.json`) into files `options.json`, `types.json` and `langs.json`
+* localization now in separate files
+* adds auto-refresh
+* adds drag'n'drop upload (PHP, experimental)
+* adds file deletion (PHP, experimental)
+* cleans and improves PHP code
+* PHP no longer respects htaccess restrictions (so be careful)
+* PHP ignore patterns might include paths now
+* improves separation between aai and php mode
+* improves performance in aai mode
+* adds optional binary prefixes for file sizes
+* improves filter: autofocus on keypress, clear on `ESC`
+* download packages now packaged relative to current folder
+* download package name changable
+* splits type `js` into `js` and `json`
+* prevents some errors with files > 2GB on 32bit OS
+* adds max subfolder size in tree view
+* adds ctrl-click file selection
+* adds Piwik analytics extension
+* temp download packages are now stored in the `cache`-folder and deleted as soon as possible
+* updates translations
+* adds `he` translation by [Tomer Cohen](https://github.com/tomer)
+* updates 3rd party libs
+
+
+## v0.21 - *2012-08-06*
+
+* fixes misaligned image previews
+* adds no JavaScript fallback to PHP version
+* fixes duplicate tree entries and empty main views
+* adds Google Analytics support (async)
+* improves filter (now ignorecase, now only checks if chars in right order)
+* adds keyboard support to image preview (space, enter, backspace, left, right, up, down, f, esc)
+* adds text file preview and highlighting with [SyntaxHighlighter](http://alexgorbatchev.com/SyntaxHighlighter/) (same keys as img preview)
+* adds Markdown preview with [markdown-js](https://github.com/evilstreak/markdown-js)
+* adds new type `markdown`
+* changes language code `gr` to `el`
+* adds localization for filter placeholder
+* adds `hu` translation by [Rodolffo](https://github.com/Rodolffo)
+* updates to [jQuery.qrcode](https://larsjung.de/qrcode/) 0.2
+* updates to [jQuery.scrollpanel](https://larsjung.de/scrollpanel/) 0.1
+* updates to [modulejs](https://larsjung.de/modulejs/) 0.2
+* updates to [Moment.js](http://momentjs.com) 1.7.0
+* updates to [Underscore.js](http://underscorejs.org) 1.3.3
+
+
+## v0.20 - *2012-05-11*
+
+* adds image preview
+* adds thumbnails for video and pdf
+* adds support for lighttpd, nginx and cherokee and maybe other webservers with PHP
+* adds folder size in PHP version via shell `du`
+* fixes some localization problems
+* updates info page at `/_h5ai/`
+* switches to JSHint
+
+
+## v0.19 - *2012-04-19*
+
+* adds lots of config options
+* changes in `config.js` and `h5ai.htaccess`
+* fixes js problems in IE 7+8
+* hides broken tree view in IE < 9, adds a message to the footer
+* removes hash changes since they break logical browser history
+* fixes thumbnail size for portrait images in icon view
+* fixes problems with file type recognition
+* adds an info page at `/_h5ai/`
+* sort order is preserved while browsing
+* removes PHP error messages on thumbnail generation
+* fixes PHP some problems with packed download
+* adds support for tarred downloads
+* changes crumb image for folders with an index file
+* adds `index.php` to use h5ai in non-Apache environments
+* switches from [Datejs](http://www.datejs.com) to [Moment.js](http://momentjs.com)
+* adds [underscore.js](http://underscorejs.org)
+* fixes mousewheel problems, updates [jQuery.mousewheel](https://github.com/brandonaaron/jquery-mousewheel) to 3.0.6
+* updates `lv` translation
+* adds `ro` translation by [Jakob Cosoroabă](https://github.com/midday)
+* adds `ja` translation by [metasta](https://github.com/metasta)
+* adds `nb` translation by [Sindre Sorhus](https://github.com/sindresorhus)
+* adds `sr` translation by [vBm](https://github.com/vBm)
+* adds `gr` translation by [xhmikosr](https://github.com/xhmikosr)
+
+
+## v0.18 - *2012-02-24*
+
+* adds optional QRCode display
+* adds optional filtering for displayed files and folders
+* updates design
+* improves zipped download
+* adds support for zipped download of htaccess restricted files
+* changes h5ai.htaccess
+* custom headers/footers are now optional and disabled by default
+* fixes problems with folder recognition in the JS version
+* fixes include problems in PHP version
+* fixes path problems on servers running on Windows in PHP version
+* fixes broken links in custom headers/footers while zipped download enabled
+* fixes problems with thumbnails for files with single or double quotes in filename
+* improves url hashes
+* updates year in `LICENSE.TXT`
+* updates es translation
+* adds `zh-tw` translation by [Yao Wei](https://github.com/medicalwei)
+* updates `zh-cn` translation
+
+
+## v0.17 - *2011-11-28*
+
+* h5ai is now located in `_h5ai` to reduce collisions
+* switches from HTML5 Boilerplate reset to normalization
+* adds some style changes for small devices
+* configuration (options, types, translations) now via `config.js`
+* icons for JS version are now configured via `config.js`
+* sort order configuration changed
+* sorting is now done without page reload
+* adds `customHeader` and `customFooter` to `config.js`
+* supports restricted folders to some extent
+* some style changes on tree and language menu
+* fixes total file/folder count in status bar
+* adds support for use with userdir (requires some manual changes)
+
+
+## v0.16 - *2011-11-02*
+
+* sorts translations in `options.js`
+* improves HTML head sections
+* refactors JavaScript and PHP a lot
+* improves/fixes file selection for zipped download
+* fixes scrollbar and header/footer link issues (didn't work when zipped download enabled)
+* adds support for ctrl-select
+* `dateFormat` in `options.js` changed, now affecting JS and PHP version
+* `dateFormat` is localizable by adding it to a translation in `options.js`
+* PHP version is now configurable via `php/config.php` (set custom doc root and other PHP related things)
+* image thumbs and zipped download is disabled by default now, but works fine if PHP is configured
+
+
+## v0.15.2 - *2011-09-18*
+
+* adds `it` translation by [Salvo Gentile](https://github.com/SalvoGentile) and [Marco Patriarca](https://github.com/Fexys)
+* switches build process from scripp to wepp
+
+
+## v0.15.1 - *2011-09-06*
+
+* fixes security issues with the zipped download feature
+* makes zipped download optional (but enabled by default)
+
+
+## v0.15 - *2011-09-04*
+
+* adds zipped download for selected files
+* cleans and refactores
+
+
+## v0.14.1 - *2011-09-01*
+
+* display meta information in bottom bar (icon view)
+* adds `zh-cn` translation by [Dongsheng Cai](https://github.com/dongsheng)
+* adds `pl` translation by Radosław Zając
+* adds `ru` translation by Богдан Илюхин
+
+
+## v0.14 - *2011-08-16*
+
+* adds image thumbnails for PHP version
+* new option `slideTree` to turn off auto slide in
+
+
+## v0.13.2 - *2011-08-12*
+
+* changes in `/h5ai/.htaccess` ... PHP configuration ...
+
+
+## v0.13.1 - *2011-08-12*
+
+* fixes initial tree display
+* adds sort order option
+* adds/fixes some translations
+* adds `lv` translation by Sandis Veinbergs
+
+
+## v0.13 - *2011-08-06*
+
+* adds PHP implementation! (should work with PHP 5.2+)
+* adds new options
+* changes layout of the bottom bar to display status information
+* adds language selector to the bottom bar
+* quotes keys in `options.js` to make it valid json
+* changes value of option `lang` from `undefined` to `null`
+* adds some new keys to `h5aiLangs`
+* adds browser caching rules for css and js
+* adds `pt` translation by [Jonnathan](https://github.com/jonnsl)
+* adds `bg` translation by George Andonov
+
+
+## v0.12.3 - *2011-07-30*
+
+* adds `tr` translation by [Batuhan Icoz](https://github.com/batuhanicoz)
+
+
+## v0.12.2 - *2011-07-30*
+
+* adds `es` translation by Jose David Calderon Serrano
+
+
+## v0.12.1 - *2011-07-29*
+
+* fixes unchecked use of console.log
+
+
+## v0.12 - *2011-07-28*
+
+* improves performance
+
+
+## v0.11 - *2011-07-27*
+
+* changes license to MIT license, see `LICENSE.txt`
+
+
+## v0.10.2 - *2011-07-26*
+
+* improves tree scrollbar
+
+
+## v0.10.1 - *2011-07-24*
+
+* fixes problems with ' in links
+
+
+## v0.10 - *2011-07-24*
+
+* fixes problems with XAMPP on Windows (see `dot.htaccess` comments for instructions)
+* fixes tree fade-in-fade-out effect for small displays ([issue #6](https://github.com/lrsjng/h5ai/issues/6))
+* adds custom scrollbar to tree ([issue #6](https://github.com/lrsjng/h5ai/issues/6))
+* fixes broken links caused by URI encoding/decoding ([issue #9](https://github.com/lrsjng/h5ai/issues/9))
+* adds "empty" to localization (hope Google Translate did a good job here)
+
+
+## v0.9 - *2011-07-18*
+
+* links hover states between crumb, extended view and tree
+* fixes size of tree view (now there's a ugly scrollbar, hopefully will be fixed)
+* refactores js to improve performance and cleaned code
+* adds caching for folder status codes and content
+* adds `fr` translation by [Nicolas](https://github.com/Nicosmos)
+* adds `nl` translation by [Stefan de Konink](https://github.com/skinkie)
+* adds `sv` translation by Oscar Carlsson
+
+
+## v0.8 - *2011-07-08*
+
+* removes slashes from folder labels
+* optionally rename parent folder entries to real folder names, see `options.js`
+* long breadcrumbs (multiple rows) no longer hide content
+* error folder icons are opaque now
+* refactores js a lot (again...)
+
+
+## v0.7 - *2011-07-07*
+
+* removes shadows
+* smarter tree side bar
+
+
+## v0.6 - *2011-07-05*
+
+* refactores js
+* adds localization, see `options.js`
+
+
+## v0.5.3 - *2011-07-04*
+
+* refactores js
+* adds basic options support via `options.js`
+* adds comments to `options.js`
+* adds optional tree sidebar
+
+
+## v0.5.2 - *2011-07-02*
+
+* details view adjusts to window width
+* links icon for *.gz and *.bz2
+
+
+## v0.5.1 - *2011-07-01*
+
+* disables tree sidebar for now, since it had unwanted side effects
+
+
+## v0.5 - *2011-07-01*
+
+* adds tree sidebar
+* some refactorings
+
+
+## v0.4 - *2011-06-27*
+
+* adds better fallback, in case JavaScript is disabled
+* rewrites js, fixed middle-button click etc. problems
+* refactors css
+* sorts, adds and moves icons and images
+* updates dot.access
+
+
+## v0.3.2 - *2011-06-24*
+
+* removes lib versions from file names
+* adds 'empty' indicator for icons view
+
+
+## v0.3.1 - *2011-06-24*
+
+* refactores js
+* adds `folderClick` and `fileClick` callback hooks
+* fixes .emtpy style
+
+
+## v0.3 - *2011-06-23*
+
+* includes build stuff, files previously found in the base directory are now located in folder `target`
+* styles and scripts are now minified
+* adds Modernizr 2.0.4 for future use
+* updates jQuery to version 1.6.1
+
+
+## v0.2.3 - *2011-06-17*
+
+* more refactoring in main.js
+
+
+## v0.2.2 - *2011-06-16*
+
+* refactores a lot, adds some comments
+* includes fixes from [NumEricR](https://github.com/NumEricR)
+* adds top/bottom message support, only basicly styled
+
+
+## v0.2.1 - *2011-06-16*
+
+* fixes croped filenames
+* fixes missing .png extension in header
+* adds some color to the links
+* adds changelog
+
+
+## v0.2 - *2011-06-15*
+
+* adds icon view
diff --git a/container/srv-http/root/srv/_h5ai/README.md b/container/srv-http/root/srv/_h5ai/README.md
new file mode 100644
index 0000000..66eb547
--- /dev/null
+++ b/container/srv-http/root/srv/_h5ai/README.md
@@ -0,0 +1,72 @@
+# h5ai
+
+[![license][license-img]][github] [![web][web-img]][web] [![github][github-img]][github]
+
+A modern HTTP web server index for Apache httpd, lighttpd, nginx and Cherokee.
+
+
+## Important
+
+* Do **not** install any files from the `src` folder, they need to be
+  preprocessed to work correctly!
+* Find a preprocessed package and detailed install instructions on the
+  [project page][web].
+* For bug reports and feature requests please use [issues][github-issues].
+
+
+## Build
+
+There are installation ready packages for the latest [releases][release] and
+[dev builds][develop]. But to build **h5ai** yourself either `git clone` or
+download the repository. From within the root folder run the following
+commands to find a fresh zipball in folder `build` (tested on linux only,
+requires [`node 6.0+`][node] to be installed).
+
+~~~sh
+> npm install
+> npm run build
+~~~
+
+
+## License
+
+The MIT License (MIT)
+
+Copyright (c) 2019 Lars Jung (https://larsjung.de)
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
+
+
+## References
+
+**h5ai** profits from other projects, all of them licensed under the MIT license
+too. Exceptions are some [Material Design icons][material-design-icons] (CC BY 4.0).
+
+
+[web]: https://larsjung.de/h5ai/
+[github]: https://github.com/lrsjng/h5ai
+[github-issues]: https://github.com/lrsjng/h5ai/issues
+[release]: https://release.larsjung.de/h5ai/
+[develop]: https://release.larsjung.de/h5ai/develop/
+[node]: https://nodejs.org
+[material-design-icons]: https://github.com/google/material-design-icons
+
+[license-img]: https://img.shields.io/badge/license-MIT-a0a060.svg?style=flat-square
+[web-img]: https://img.shields.io/badge/web-larsjung.de/h5ai-a0a060.svg?style=flat-squ…
+[github-img]: https://img.shields.io/badge/github-lrsjng/h5ai-a0a060.svg?style=flat-square
diff --git a/container/srv-http/root/srv/_h5ai/private/cache/README.md b/container/srv-http/root/srv/_h5ai/private/cache/README.md
new file mode 100755
index 0000000..60bc416
--- /dev/null
+++ b/container/srv-http/root/srv/_h5ai/private/cache/README.md
@@ -0,0 +1,9 @@
+# Cache
+
+Private cache.
+
+This directory is used for server side caching. To use caching make this
+directory writable for your webserver.
+
+There is no critical data in here. You can savely remove any content. This
+will clear the cache.
diff --git a/container/srv-http/root/srv/_h5ai/private/conf/l10n/af.json b/container/srv-http/root/srv/_h5ai/private/conf/l10n/af.json
new file mode 100755
index 0000000..5150c7b
--- /dev/null
+++ b/container/srv-http/root/srv/_h5ai/private/conf/l10n/af.json
@@ -0,0 +1,18 @@
+{
+    "lang": "afrikaans",
+
+    "dateFormat": "YYYY-MM-DD HH:mm",
+    "details": "besonderhede",
+    "download": "aflaai",
+    "empty": "leeg",
+    "files": "lêers",
+    "filter": "filter",
+    "folders": "gidse",
+    "grid": "rooster",
+    "icons": "ikone",
+    "lastModified": "Laas verander",
+    "name": "Naam",
+    "noMatch": "geen resultaat",
+    "parentDirectory": "Hoër Vlak",
+    "size": "Grootte"
+}
diff --git a/container/srv-http/root/srv/_h5ai/private/conf/l10n/bg.json b/container/srv-http/root/srv/_h5ai/private/conf/l10n/bg.json
new file mode 100755
index 0000000..6808e62
--- /dev/null
+++ b/container/srv-http/root/srv/_h5ai/private/conf/l10n/bg.json
@@ -0,0 +1,18 @@
+{
+    "lang": "български",
+
+    "dateFormat": "DD-MM-YYYY HH:mm",
+    "details": "детайли",
+    "download": "изтегляне",
+    "empty": "празна",
+    "files": "файлове",
+    "filter": "филтър",
+    "folders": "директории",
+    "grid": "мрежа",
+    "icons": "икони",
+    "lastModified": "Последна промяна",
+    "name": "Име",
+    "noMatch": "няма съвпадение",
+    "parentDirectory": "Предходна директория",
+    "size": "Размер"
+}
diff --git a/container/srv-http/root/srv/_h5ai/private/conf/l10n/cs.json b/container/srv-http/root/srv/_h5ai/private/conf/l10n/cs.json
new file mode 100755
index 0000000..1e34e61
--- /dev/null
+++ b/container/srv-http/root/srv/_h5ai/private/conf/l10n/cs.json
@@ -0,0 +1,18 @@
+{
+    "lang": "čeština",
+
+    "dateFormat": "DD.MM.YYYY HH:mm",
+    "details": "Podrobnosti",
+    "download": "Stáhnout",
+    "empty": "Prázdná složka",
+    "files": "souborů",
+    "filter": "Filtr",
+    "folders": "složek",
+    "grid": "Seznam",
+    "icons": "Velké ikony",
+    "lastModified": "Datum změny",
+    "name": "Název",
+    "noMatch": "Žádná shoda",
+    "parentDirectory": "Nadřazený adresář",
+    "size": "Velikost"
+}
diff --git a/container/srv-http/root/srv/_h5ai/private/conf/l10n/da.json b/container/srv-http/root/srv/_h5ai/private/conf/l10n/da.json
new file mode 100755
index 0000000..3b8fa06
--- /dev/null
+++ b/container/srv-http/root/srv/_h5ai/private/conf/l10n/da.json
@@ -0,0 +1,18 @@
+{
+    "lang": "dansk",
+
+    "dateFormat": "DD-MM-YYYY HH:mm",
+    "details": "detaljer",
+    "download": "download",
+    "empty": "tom",
+    "files": "filer",
+    "filter": "filter",
+    "folders": "mapper",
+    "grid": "grid",
+    "icons": "ikoner",
+    "lastModified": "Sidst ændret",
+    "name": "Navn",
+    "noMatch": "ingen match",
+    "parentDirectory": "Overordnet mappe",
+    "size": "Størrelse"
+}
diff --git a/container/srv-http/root/srv/_h5ai/private/conf/l10n/de.json b/container/srv-http/root/srv/_h5ai/private/conf/l10n/de.json
new file mode 100755
index 0000000..6d8c613
--- /dev/null
+++ b/container/srv-http/root/srv/_h5ai/private/conf/l10n/de.json
@@ -0,0 +1,22 @@
+{
+    "lang": "deutsch",
+
+    "dateFormat": "DD.MM.YYYY HH:mm",
+    "details": "Details",
+    "download": "Download",
+    "empty": "leer",
+    "files": "Dateien",
+    "filter": "filtern",
+    "folders": "Ordner",
+    "grid": "Gitter",
+    "icons": "Icons",
+    "language": "Sprache",
+    "lastModified": "Geändert",
+    "name": "Name",
+    "noMatch": "keine Treffer",
+    "parentDirectory": "Übergeordnetes Verzeichnis",
+    "search": "suchen",
+    "size": "Größe",
+    "tree": "Baum",
+    "view": "Ansicht"
+}
diff --git a/container/srv-http/root/srv/_h5ai/private/conf/l10n/el.json b/container/srv-http/root/srv/_h5ai/private/conf/l10n/el.json
new file mode 100755
index 0000000..2d9c00d
--- /dev/null
+++ b/container/srv-http/root/srv/_h5ai/private/conf/l10n/el.json
@@ -0,0 +1,18 @@
+{
+    "lang": "ελληνικά",
+
+    "dateFormat": "DD/MM/YYYY HH:mm",
+    "details": "λεπτομέρειες",
+    "download": "μεταμόρφωση",
+    "empty": "κενό",
+    "files": "αρχεία",
+    "filter": "φίλτρο",
+    "folders": "φάκελοι",
+    "grid": "πλέγμα",
+    "icons": "εικονίδια",
+    "lastModified": "Τελευταία τροποποίηση",
+    "name": "Όνομα",
+    "noMatch": "κανένα αποτέλεσμα",
+    "parentDirectory": "Προηγούμενος Κατάλογος",
+    "size": "Μέγεθος"
+}
diff --git a/container/srv-http/root/srv/_h5ai/private/conf/l10n/en.json b/container/srv-http/root/srv/_h5ai/private/conf/l10n/en.json
new file mode 100755
index 0000000..05e9b4e
--- /dev/null
+++ b/container/srv-http/root/srv/_h5ai/private/conf/l10n/en.json
@@ -0,0 +1,23 @@
+/* only here as a reference, these values are the hardcoded defaults */
+{
+    "lang": "english",
+
+    "dateFormat": "YYYY-MM-DD HH:mm",
+    "details": "details",
+    "download": "download",
+    "empty": "empty",
+    "files": "files",
+    "filter": "filter",
+    "folders": "folders",
+    "grid": "grid",
+    "icons": "icons",
+    "language": "Language",
+    "lastModified": "Last modified",
+    "name": "Name",
+    "noMatch": "no match",
+    "parentDirectory": "Parent Directory",
+    "search": "search",
+    "size": "Size",
+    "tree": "Tree",
+    "view": "View"
+}
diff --git a/container/srv-http/root/srv/_h5ai/private/conf/l10n/es.json b/container/srv-http/root/srv/_h5ai/private/conf/l10n/es.json
new file mode 100755
index 0000000..e42a5b9
--- /dev/null
+++ b/container/srv-http/root/srv/_h5ai/private/conf/l10n/es.json
@@ -0,0 +1,22 @@
+{
+    "lang": "español",
+
+    "dateFormat": "DD/MM/YYYY HH:mm",
+    "details": "Detalles",
+    "download": "Descargar",
+    "empty": "vacío",
+    "files": "Archivos",
+    "filter": "Filtrar",
+    "folders": "Directorios",
+    "grid": "Cuadrícula",
+    "icons": "Íconos",
+    "language": "Idioma",
+    "lastModified": "Última modificación",
+    "name": "Nombre",
+    "noMatch": "Sin coincidencias",
+    "parentDirectory": "Directorio superior",
+    "search": "buscar",
+    "size": "Tamaño",
+    "tree": "Arbol",
+    "view": "Vista"
+}
diff --git a/container/srv-http/root/srv/_h5ai/private/conf/l10n/et.json b/container/srv-http/root/srv/_h5ai/private/conf/l10n/et.json
new file mode 100755
index 0000000..8f3d1dc
--- /dev/null
+++ b/container/srv-http/root/srv/_h5ai/private/conf/l10n/et.json
@@ -0,0 +1,22 @@
+{
+    "lang": "estonian",
+
+    "dateFormat": "DD-MM-YYYY HH.mm",
+    "details": "täpsem info",
+    "download": "laadi alla",
+    "empty": "tühi",
+    "files": "failid",
+    "filter": "filter",
+    "folders": "kataloogid",
+    "grid": "võre",
+    "icons": "ikoonid",
+    "language": "Keel",
+    "lastModified": "Viimati muudetud",
+    "name": "Nimi",
+    "noMatch": "ei leitud sobivat",
+    "parentDirectory": "Emakataloog",
+    "search": "otsi",
+    "size": "Suurus",
+    "tree": "Puu",
+    "view": "Vaade"
+}
diff --git a/container/srv-http/root/srv/_h5ai/private/conf/l10n/fi.json b/container/srv-http/root/srv/_h5ai/private/conf/l10n/fi.json
new file mode 100755
index 0000000..c19c0ed
--- /dev/null
+++ b/container/srv-http/root/srv/_h5ai/private/conf/l10n/fi.json
@@ -0,0 +1,18 @@
+{
+    "lang": "finnish",
+
+    "dateFormat": "DD.MM.YYYY HH:mm",
+    "details": "tiedot",
+    "download": "lataa",
+    "empty": "tyhjä",
+    "files": "tiedostoa",
+    "filter": "suodata",
+    "folders": "hakemistoa",
+    "grid": "ruudukko",
+    "icons": "ikonit",
+    "lastModified": "Viimeksi muokattu",
+    "name": "Nimi",
+    "noMatch": "ei osumia",
+    "parentDirectory": "Ylähakemisto",
+    "size": "Koko"
+}
diff --git a/container/srv-http/root/srv/_h5ai/private/conf/l10n/fr.json b/container/srv-http/root/srv/_h5ai/private/conf/l10n/fr.json
new file mode 100755
index 0000000..9a4ac45
--- /dev/null
+++ b/container/srv-http/root/srv/_h5ai/private/conf/l10n/fr.json
@@ -0,0 +1,22 @@
+{
+    "lang": "français",
+
+    "dateFormat": "DD/MM/YYYY HH:mm",
+    "details": "détails",
+    "download": "télécharger",
+    "empty": "vide",
+    "files": "Fichiers",
+    "filter": "filtrer",
+    "folders": "Répertoires",
+    "grid": "grille",
+    "icons": "icônes",
+    "language": "Langue",
+    "lastModified": "Dernière modification",
+    "name": "Nom",
+    "noMatch": "rien trouvé",
+    "parentDirectory": "Dossier parent",
+    "search": "rechercher",
+    "size": "Taille",
+    "tree": "Arborescence",
+    "view": "Disposition"
+}
diff --git a/container/srv-http/root/srv/_h5ai/private/conf/l10n/he.json b/container/srv-http/root/srv/_h5ai/private/conf/l10n/he.json
new file mode 100755
index 0000000..bb37f7f
--- /dev/null
+++ b/container/srv-http/root/srv/_h5ai/private/conf/l10n/he.json
@@ -0,0 +1,17 @@
+{
+    "lang": "עברית",
+
+    "dateFormat": "DD.MM.YYYY HH:mm",
+    "details": "פרטים",
+    "download": "הורדה",
+    "empty": "ריק",
+    "files": "קבצים",
+    "filter": "סינון",
+    "folders": "תיקיות",
+    "icons": "צלמיות",
+    "lastModified": "שינוי אחרון",
+    "name": "שם",
+    "noMatch": "אין תוצאות",
+    "parentDirectory": "תיקיית הורה",
+    "size": "גודל"
+}
diff --git a/container/srv-http/root/srv/_h5ai/private/conf/l10n/hi.json b/container/srv-http/root/srv/_h5ai/private/conf/l10n/hi.json
new file mode 100755
index 0000000..5941733
--- /dev/null
+++ b/container/srv-http/root/srv/_h5ai/private/conf/l10n/hi.json
@@ -0,0 +1,18 @@
+{
+    "lang": "हिंदी",
+
+    "dateFormat": "DD.MM.YYYY HH:mm",
+    "details": "विस्तार",
+    "download": "डाउनलोड",
+    "empty": "खाली",
+    "files": "फ़ाइलें",
+    "filter": "फ़िल्टर",
+    "folders": "फोल्डर",
+    "grid": "ग्रिड",
+    "icons": "आइकॉन",
+    "lastModified": "पिछला परिवर्तन",
+    "name": "नाम",
+    "noMatch": "कोई समानता नहीं",
+    "parentDirectory": "मूल डायरेक्टरी",
+    "size": "माप"
+}
diff --git a/container/srv-http/root/srv/_h5ai/private/conf/l10n/hr.json b/container/srv-http/root/srv/_h5ai/private/conf/l10n/hr.json
new file mode 100755
index 0000000..c044db4
--- /dev/null
+++ b/container/srv-http/root/srv/_h5ai/private/conf/l10n/hr.json
@@ -0,0 +1,18 @@
+{
+    "lang": "hrvatski",
+
+    "dateFormat": "YYYY-MM-DD HH:mm",
+    "details": "detalji",
+    "download": "preuzmi",
+    "empty": "prazno",
+    "files": "datoteka",
+    "filter": "filter",
+    "folders": "direktorij(a)",
+    "grid": "mreža",
+    "icons": "ikone",
+    "lastModified": "Posljednja izmjena",
+    "name": "Naziv",
+    "noMatch": "nema rezultata",
+    "parentDirectory": "Natrag",
+    "size": "Veličina"
+}
diff --git a/container/srv-http/root/srv/_h5ai/private/conf/l10n/hu.json b/container/srv-http/root/srv/_h5ai/private/conf/l10n/hu.json
new file mode 100755
index 0000000..b2c1b34
--- /dev/null
+++ b/container/srv-http/root/srv/_h5ai/private/conf/l10n/hu.json
@@ -0,0 +1,16 @@
+{
+    "lang": "magyar",
+
+    "dateFormat": "YYYY-MM-DD HH:mm",
+    "details": "részletek",
+    "download": "letöltés",
+    "empty": "üres",
+    "files": "fájlok",
+    "folders": "mappák",
+    "icons": "ikonok",
+    "lastModified": "Utoljára módosítva",
+    "name": "Név",
+    "noMatch": "nincs találat",
+    "parentDirectory": "Szülő könyvtár",
+    "size": "Méret"
+}
diff --git a/container/srv-http/root/srv/_h5ai/private/conf/l10n/it.json b/container/srv-http/root/srv/_h5ai/private/conf/l10n/it.json
new file mode 100755
index 0000000..cd83337
--- /dev/null
+++ b/container/srv-http/root/srv/_h5ai/private/conf/l10n/it.json
@@ -0,0 +1,18 @@
+{
+    "lang": "italiano",
+
+    "dateFormat": "DD-MM-YYYY HH:mm",
+    "details": "dettagli",
+    "download": "download",
+    "empty": "vuota",
+    "files": "file",
+    "filter": "filtra",
+    "folders": "cartelle",
+    "grid": "griglia",
+    "icons": "icone",
+    "lastModified": "Ultima modifica",
+    "name": "Nome",
+    "noMatch": "nessun risultato",
+    "parentDirectory": "Cartella Superiore",
+    "size": "Dimensione"
+}
diff --git a/container/srv-http/root/srv/_h5ai/private/conf/l10n/ja.json b/container/srv-http/root/srv/_h5ai/private/conf/l10n/ja.json
new file mode 100755
index 0000000..88266e7
--- /dev/null
+++ b/container/srv-http/root/srv/_h5ai/private/conf/l10n/ja.json
@@ -0,0 +1,20 @@
+{
+    "lang": "日本語",
+
+    "dateFormat": "YYYY-MM-DD HH:mm",
+    "details": "詳細",
+    "download": "ダウンロード",
+    "empty": "(空)",
+    "files": "ファイル",
+    "filter": "フィルター",
+    "folders": "フォルダー",
+    "grid": "グリッド",
+    "icons": "アイコン",
+    "language": "言語",
+    "lastModified": "最終変更日時",
+    "name": "名前",
+    "noMatch": "一致する項目が見つかりません",
+    "parentDirectory": "親ディレクトリへ",
+    "size": "サイズ",
+    "view": "ビュー"
+}
diff --git a/container/srv-http/root/srv/_h5ai/private/conf/l10n/ko.json b/container/srv-http/root/srv/_h5ai/private/conf/l10n/ko.json
new file mode 100755
index 0000000..8c48cdb
--- /dev/null
+++ b/container/srv-http/root/srv/_h5ai/private/conf/l10n/ko.json
@@ -0,0 +1,22 @@
+{
+    "lang": "한국어",
+
+    "dateFormat": "YYYY-MM-DD HH:mm",
+    "details": "자세히",
+    "download": "다운로드",
+    "empty": "빈 폴더",
+    "files": "파일",
+    "filter": "필터",
+    "folders": "폴더",
+    "grid": "그리드",
+    "icons": "아이콘",
+    "language": "언어",
+    "lastModified": "최근 수정일",
+    "name": "파일명",
+    "noMatch": "해당파일이 없습니다.",
+    "parentDirectory": "상위폴더",
+    "search": "검색",
+    "size": "크기",
+    "tree": "트리",
+    "view": "보기"
+}
diff --git a/container/srv-http/root/srv/_h5ai/private/conf/l10n/lv.json b/container/srv-http/root/srv/_h5ai/private/conf/l10n/lv.json
new file mode 100755
index 0000000..fa672ce
--- /dev/null
+++ b/container/srv-http/root/srv/_h5ai/private/conf/l10n/lv.json
@@ -0,0 +1,22 @@
+{
+    "lang": "latviešu",
+
+    "dateFormat": "YYYY-MM-DD HH:mm",
+    "details": "detaļas",
+    "download": "lejupielādēt",
+    "empty": "tukšs",
+    "files": "faili",
+    "filter": "filtrēt",
+    "folders": "mapes",
+    "grid": "režģis",
+    "icons": "ikonas",
+    "language": "Valoda",
+    "lastModified": "Pēdējoreiz modificēts",
+    "name": "Nosaukums",
+    "noMatch": "nav sakritības",
+    "parentDirectory": "Vecākdirektorijs",
+    "search": "meklēt",
+    "size": "Izmērs",
+    "tree": "Koks",
+    "view": "Skats"
+}
diff --git a/container/srv-http/root/srv/_h5ai/private/conf/l10n/nb.json b/container/srv-http/root/srv/_h5ai/private/conf/l10n/nb.json
new file mode 100755
index 0000000..44a1797
--- /dev/null
+++ b/container/srv-http/root/srv/_h5ai/private/conf/l10n/nb.json
@@ -0,0 +1,15 @@
+{
+    "lang": "norwegian",
+
+    "details": "detaljer",
+    "download": "last ned",
+    "empty": "tom",
+    "files": "filer",
+    "folders": "mapper",
+    "icons": "ikoner",
+    "lastModified": "Sist endret",
+    "name": "Navn",
+    "noMatch": "ingen treff",
+    "parentDirectory": "Overordnet mappe",
+    "size": "Størrelse"
+}
diff --git a/container/srv-http/root/srv/_h5ai/private/conf/l10n/nl.json b/container/srv-http/root/srv/_h5ai/private/conf/l10n/nl.json
new file mode 100755
index 0000000..8310f05
--- /dev/null
+++ b/container/srv-http/root/srv/_h5ai/private/conf/l10n/nl.json
@@ -0,0 +1,22 @@
+{
+    "lang": "nederlands",
+
+    "dateFormat": "YYYY-MM-DD HH:mm",
+    "details": "details",
+    "download": "download",
+    "empty": "leeg",
+    "files": "bestanden",
+    "filter": "filter",
+    "folders": "mappen",
+    "grid": "grid",
+    "icons": "iconen",
+    "language": "Taal",
+    "lastModified": "Laatste wijziging",
+    "name": "Naam",
+    "noMatch": "geen overeenkomst",
+    "parentDirectory": "Bovenliggende map",
+    "search": "zoeken",
+    "size": "Grootte",
+    "tree": "Boom",
+    "view": "Bekijk"
+}
diff --git a/container/srv-http/root/srv/_h5ai/private/conf/l10n/pl.json b/container/srv-http/root/srv/_h5ai/private/conf/l10n/pl.json
new file mode 100755
index 0000000..da56967
--- /dev/null
+++ b/container/srv-http/root/srv/_h5ai/private/conf/l10n/pl.json
@@ -0,0 +1,22 @@
+{
+    "lang": "polski",
+
+    "dateFormat": "YYYY-MM-DD HH:mm",
+    "details": "szczegóły",
+    "download": "pobierz",
+    "empty": "pusty",
+    "files": "plików",
+    "filter": "filtr",
+    "folders": "folderów",
+    "grid": "kafelki",
+    "icons": "ikony",
+    "language": "Język",
+    "lastModified": "Ostatnia modyfikacja",
+    "name": "Nazwa",
+    "noMatch": "nie znaleziono",
+    "parentDirectory": "Katalog nadrzędny",
+    "search": "szukaj",
+    "size": "Rozmiar",
+    "tree": "Drzewo",
+    "view": "Układ"
+}
diff --git a/container/srv-http/root/srv/_h5ai/private/conf/l10n/pt.json b/container/srv-http/root/srv/_h5ai/private/conf/l10n/pt.json
new file mode 100755
index 0000000..acd7fea
--- /dev/null
+++ b/container/srv-http/root/srv/_h5ai/private/conf/l10n/pt.json
@@ -0,0 +1,18 @@
+{
+    "lang": "português",
+
+    "dateFormat": "DD-MM-YYYY HH:mm",
+    "details": "detalhes",
+    "download": "descarregar",
+    "empty": "vazio",
+    "files": "arquivos",
+    "filter": "filtro",
+    "folders": "pastas",
+    "grid": "grelha",
+    "icons": "ícones",
+    "lastModified": "última modificação",
+    "name": "Nome",
+    "noMatch": "sem resultados",
+    "parentDirectory": "diretório acima",
+    "size": "Tamanho"
+}
diff --git a/container/srv-http/root/srv/_h5ai/private/conf/l10n/ro.json b/container/srv-http/root/srv/_h5ai/private/conf/l10n/ro.json
new file mode 100755
index 0000000..4981dfe
--- /dev/null
+++ b/container/srv-http/root/srv/_h5ai/private/conf/l10n/ro.json
@@ -0,0 +1,15 @@
+{
+    "lang": "română",
+
+    "details": "detalii",
+    "download": "descarcă",
+    "empty": "gol",
+    "files": "fişiere",
+    "folders": "dosar",
+    "icons": "pictograme",
+    "lastModified": "ultima modificare",
+    "name": "nume",
+    "noMatch": "0 rezultate",
+    "parentDirectory": "dosar părinte",
+    "size": "mărime"
+}
diff --git a/container/srv-http/root/srv/_h5ai/private/conf/l10n/ru.json b/container/srv-http/root/srv/_h5ai/private/conf/l10n/ru.json
new file mode 100755
index 0000000..8056a0d
--- /dev/null
+++ b/container/srv-http/root/srv/_h5ai/private/conf/l10n/ru.json
@@ -0,0 +1,20 @@
+{
+    "lang": "русский",
+
+    "dateFormat": "YYYY-MM-DD HH:mm",
+    "details": "Детали",
+    "download": "Скачать",
+    "empty": "Пусто",
+    "files": "Файлы",
+    "filter": "Фильтр",
+    "folders": "Папки",
+    "grid": "Сетка",
+    "icons": "Иконки",
+    "language": "Язык",
+    "lastModified": "Последние изменения",
+    "name": "Имя",
+    "noMatch": "Нет совпадений",
+    "parentDirectory": "Главная директория",
+    "size": "Размер",
+    "view": "Вид"
+}
diff --git a/container/srv-http/root/srv/_h5ai/private/conf/l10n/sk.json b/container/srv-http/root/srv/_h5ai/private/conf/l10n/sk.json
new file mode 100755
index 0000000..cfc9e45
--- /dev/null
+++ b/container/srv-http/root/srv/_h5ai/private/conf/l10n/sk.json
@@ -0,0 +1,13 @@
+{
+    "lang": "slovenčina",
+
+    "details": "podrobnosti",
+    "empty": "prázdny",
+    "files": "súborov",
+    "folders": "priečinkov",
+    "icons": "ikony",
+    "lastModified": "Upravené",
+    "name": "Názov",
+    "parentDirectory": "Nadriadený priečinok",
+    "size": "Velkosť"
+}
diff --git a/container/srv-http/root/srv/_h5ai/private/conf/l10n/sl.json b/container/srv-http/root/srv/_h5ai/private/conf/l10n/sl.json
new file mode 100755
index 0000000..5cdda21
--- /dev/null
+++ b/container/srv-http/root/srv/_h5ai/private/conf/l10n/sl.json
@@ -0,0 +1,18 @@
+{
+    "lang": "slovenščina",
+
+    "dateFormat": "DD. MM. YYYY HH:mm",
+    "details": "podrobnosti",
+    "download": "prenesi",
+    "empty": "prazno",
+    "files": "datoteke",
+    "filter": "filter",
+    "folders": "mape",
+    "grid": "mreža",
+    "icons": "ikone",
+    "lastModified": "Zadnja sprememba",
+    "name": "Ime",
+    "noMatch": "ni zadetkov",
+    "parentDirectory": "Nadrejena mapa",
+    "size": "Velikost"
+}
diff --git a/container/srv-http/root/srv/_h5ai/private/conf/l10n/sr.json b/container/srv-http/root/srv/_h5ai/private/conf/l10n/sr.json
new file mode 100755
index 0000000..845eeab
--- /dev/null
+++ b/container/srv-http/root/srv/_h5ai/private/conf/l10n/sr.json
@@ -0,0 +1,15 @@
+{
+    "lang": "srpski",
+
+    "details": "detalji",
+    "download": "download",
+    "empty": "prazno",
+    "files": "fajlovi",
+    "folders": "direktorijum",
+    "icons": "ikone",
+    "lastModified": "Poslednja modifikacija",
+    "name": "Ime",
+    "noMatch": "bez poklapanja",
+    "parentDirectory": "Roditeljski direktorijum",
+    "size": "Veličina"
+}
diff --git a/container/srv-http/root/srv/_h5ai/private/conf/l10n/sv.json b/container/srv-http/root/srv/_h5ai/private/conf/l10n/sv.json
new file mode 100755
index 0000000..75638e5
--- /dev/null
+++ b/container/srv-http/root/srv/_h5ai/private/conf/l10n/sv.json
@@ -0,0 +1,16 @@
+{
+    "lang": "svenska",
+
+    "details": "detaljerad",
+    "download": "ladda ner",
+    "empty": "tom",
+    "files": "filer",
+    "folders": "kataloger",
+    "grid": "rutnät",
+    "icons": "ikoner",
+    "lastModified": "Senast ändrad",
+    "name": "Filnamn",
+    "noMatch": "ingen matchning",
+    "parentDirectory": "Till överordnad mapp",
+    "size": "Filstorlek"
+}
diff --git a/container/srv-http/root/srv/_h5ai/private/conf/l10n/tr.json b/container/srv-http/root/srv/_h5ai/private/conf/l10n/tr.json
new file mode 100755
index 0000000..45cfc92
--- /dev/null
+++ b/container/srv-http/root/srv/_h5ai/private/conf/l10n/tr.json
@@ -0,0 +1,14 @@
+{
+    "lang": "türkçe",
+
+    "details": "detaylar",
+    "download": "indir",
+    "empty": "boş",
+    "files": "dosyalar",
+    "folders": "klasörler",
+    "icons": "ikonlar",
+    "lastModified": "Son Düzenleme",
+    "name": "İsim",
+    "parentDirectory": "Üst Dizin",
+    "size": "Boyut"
+}
diff --git a/container/srv-http/root/srv/_h5ai/private/conf/l10n/uk.json b/container/srv-http/root/srv/_h5ai/private/conf/l10n/uk.json
new file mode 100755
index 0000000..62908f5
--- /dev/null
+++ b/container/srv-http/root/srv/_h5ai/private/conf/l10n/uk.json
@@ -0,0 +1,18 @@
+{
+    "lang": "українська",
+
+    "dateFormat": "YYYY-MM-DD HH:mm",
+    "details": "Деталі",
+    "download": "Завантажити",
+    "empty": "Порожньо",
+    "files": "Файли(ів)",
+    "filter": "Фільтр",
+    "folders": "Тек(и)",
+    "grid": "Гратка",
+    "icons": "Піктограми",
+    "lastModified": "Останні зміни",
+    "name": "Ім'я",
+    "noMatch": "Немає співпадінь",
+    "parentDirectory": "Головна тека",
+    "size": "Розмір"
+}
diff --git a/container/srv-http/root/srv/_h5ai/private/conf/l10n/zh-cn.json b/container/srv-http/root/srv/_h5ai/private/conf/l10n/zh-cn.json
new file mode 100755
index 0000000..7cdba51
--- /dev/null
+++ b/container/srv-http/root/srv/_h5ai/private/conf/l10n/zh-cn.json
@@ -0,0 +1,23 @@
+{
+    "lang": "简体中文",
+
+    "dateFormat": "YYYY-MM-DD HH:mm",
+    "details": "详情",
+    "download": "下载",
+    "empty": "空文件夹",
+    "files": "文件",
+    "filter": "过滤",
+    "folders": "文件夹",
+    "grid": "网格",
+    "icons": "图标",
+    "language": "语言",
+    "lastModified": "修改时间",
+    "name": "文件名",
+    "noMatch": "无匹配项",
+    "parentDirectory": "父文件夹",
+    "search": "搜索",
+    "size": "大小",
+    "tree": "树形目录",
+    "view": "视图",
+    "info": "信息"
+}
diff --git a/container/srv-http/root/srv/_h5ai/private/conf/l10n/zh-tw.json b/container/srv-http/root/srv/_h5ai/private/conf/l10n/zh-tw.json
new file mode 100755
index 0000000..7567f0d
--- /dev/null
+++ b/container/srv-http/root/srv/_h5ai/private/conf/l10n/zh-tw.json
@@ -0,0 +1,23 @@
+{
+    "lang": "正體中文",
+
+    "dateFormat": "YYYY-MM-DD HH:mm",
+    "details": "詳細資料",
+    "download": "下載",
+    "empty": "空資料夾",
+    "files": "檔案",
+    "filter": "過濾",
+    "folders": "資料夾",
+    "grid": "網格",
+    "icons": "圖示",
+    "language": "語言",
+    "lastModified": "上次修改",
+    "name": "檔名",
+    "noMatch": "沒有符合的檔案",
+    "parentDirectory": "上層目錄",
+    "search": "搜尋",
+    "size": "大小",
+    "tree": "樹形目錄",
+    "view": "檢視",
+    "info": "資訊"
+}
diff --git a/container/srv-http/root/srv/_h5ai/private/conf/options.json b/container/srv-http/root/srv/_h5ai/private/conf/options.json
new file mode 100755
index 0000000..69a7add
--- /dev/null
+++ b/container/srv-http/root/srv/_h5ai/private/conf/options.json
@@ -0,0 +1,392 @@
+/* h5ai v0.29.2 - https://larsjung.de/h5ai/ */
+{
+    /*
+    Password hash.
+
+    SHA512 hash of the info page password, the preset password is the empty string.
+    Online hash generator: http://md5hashing.net/hashing/sha512
+    */
+    "passhash": "cf83e1357eefb8bdf1542850d66d8007d620e4050b5715dc83f4a921d36ce9ce47d0d13c5d85f2b0ff8318d2877eec2f63b931bd47417a81a538327af927da3e",
+
+
+
+    /*
+    Resources.
+
+    Additional script and style tags added to all pages. Paths not beginning
+    with "http://", "https://" or "/" will be looked up relative to
+    "_h5ai/public/ext/" (no check for existence).
+
+    - scripts: array of strings
+    - styles: array of strings
+    */
+    "resources": {
+        "scripts": [],
+        "styles": [
+            "//fonts.googleapis.com/css?family=Ubuntu:300,400,700%7CUbuntu+Mono:400,700"
+        ]
+    },
+
+
+
+    /*
+    General view options.
+
+    - binaryPrefix: boolean, set to true uses 1024B=1KiB when formatting file sizes (see http://en.wikipedia.org/wiki/Binary_prefix)
+    - disableSidebar: boolean, hides sidebar and toggle button
+    - fallbackMode: boolean, serve fallback mode
+    - fastBrowsing: boolean, use History API if available (no need to reload the whole page)
+    - fonts: array of strings, fonts to use in regular context
+    - fontsMono: array of strings, fonts to use in monopspaced context
+    - hidden: array of strings, don't list items matching these regular expressions
+    - hideFolders: boolean, hide all folders in the main view
+    - hideIf403: boolean, hide files and folders that are not readable by the server
+    - hideParentFolder: boolean, hide parent folder links in the main view
+    - maxIconSize: number, max size for icons in the main view
+    - modes: array of strings, subset of ["details", "grid", "icons"]
+        the first value indicates the default view mode. If only one value
+        is given the view mode is fixed and the selector buttons are hidden.
+        The user selected view mode is also stored local in modern browsers
+        so that it will be persistent.
+    - modeToggle: boolean, show a view mode toggle in the toolbar, or "next"
+    - setParentFolderLabels: boolean, set parent folder labels to real folder names
+    - sizes: array of numbers
+        the first value indicates the default view size. If only one value
+        is given the view size is fixed and the selector buttons are hidden.
+        The user selected view size is also stored local in modern browsers
+        so that it will be persistent.
+    - theme: string, name of one of the folders in "_h5ai/images/themes", defaults to "default"
+    - unmanaged: array of strings, don't manage folders containing one of those files
+    - unmanagedInNewWindow: boolean, open unmanaged links in new window/tab
+    */
+    "view": {
+        "binaryPrefix": false,
+        "disableSidebar": false,
+        "fallbackMode": false,
+        "fastBrowsing": true,
+        "fonts": ["Ubuntu", "Roboto", "Helvetica", "Arial", "sans-serif"],
+        "fontsMono": ["Ubuntu Mono", "Monaco", "Lucida Sans Typewriter", "monospace"],
+        "hidden": ["^\\.", "^_h5ai"],
+        "hideFolders": false,
+        "hideIf403": true,
+        "hideParentFolder": false,
+        "maxIconSize": 40,
+        "modes": ["details", "grid", "icons"],
+        "modeToggle": false,
+        "setParentFolderLabels": true,
+        "sizes": [20, 40, 60, 80, 100, 140, 180, 220, 260, 300],
+        "theme": "comity",
+        "unmanaged": ["index.html", "index.htm", "index.php"],
+        "unmanagedInNewWindow": false
+    },
+
+
+
+    /*** Extensions (in alphabetical order) ***/
+
+    /*
+    Watch and update current folder content.
+
+    - interval: number, update interval in milliseconds, at least 1000
+    */
+    "autorefresh": {
+        "enabled": false,
+        "interval": 5000
+    },
+
+    /*
+    Show a clickable breadcrumb.
+    */
+    "crumb": {
+        "enabled": true
+    },
+
+    /*
+    Allow customized header and footer files.
+    First checks for files "_h5ai.header.html" and "_h5ai.footer.html" in the current directory.
+    If not successful it checks all parent directories (starting in the current directory) for
+    files "_h5ai.headers.html" and "_h5ai.footers.html".
+    Note the different filenames: "header" (only current) - "headers" (current and sub directories)!
+    The file's content will be placed inside a <div/> tag above/below the main content.
+    If a file's extension is ".md" instead of ".html" its content will be interpreted as markdown.
+    */
+    "custom": {
+        "enabled": true
+    },
+
+    /*
+    Enable packaged download of selected entries.
+    To select files the "select"-extension needs to be enabled.
+
+    - type: string, "php-tar", "shell-tar" or "shell-zip"
+    - packageName: string, basename of the download package, null for current filename or foldername
+    - alwaysVisible: boolean, always show download button (defaults to download the current folder)
+    */
+    "download": {
+        "enabled": true,
+        "type": "php-tar",
+        "packageName": null,
+        "alwaysVisible": false
+    },
+
+    /*
+    Allow filtering the displayed files and folders in current folder.
+    Checks for substrings.
+
+    If advanced is enabled it checks entries for right order of characters,
+    i.e. "ab" matches "ab", "axb", "xaxbx" but not "ba". Space separated
+    sequences get OR-ed. Searches will be treated as JavaScript regular
+    expressions if you prefix them with "re:".
+
+    - advanced: boolean, use advanced pattern parsing
+    - debounceTime: number, debounce wait time in milliseconds
+    - ignorecase: boolean, ignore case
+    */
+    "filter": {
+        "enabled": false,
+        "advanced": true,
+        "debounceTime": 100,
+        "ignorecase": true
+    },
+
+    /*
+    Calc the size of folders.
+    This operation is real slow. The calculated sizes differ slightly for both
+    calculation types since "php" only adds the file size, while "shell-du"
+    also adds the sizes for the actual folder files.
+
+    - type: string, "php" (sloooow) or "shell-du" (sloow)
+    */
+    "foldersize": {
+        "enabled": true,
+        "type": "php"
+    },
+
+    /*
+    Adds Google Universial Analytics asynchronous tracking code.
+    see: https://developers.google.com/analytics/devguides/collection/analyticsjs/
+
+    - id: string, account ID
+    */
+    "google-analytics-ua": {
+        "enabled": false,
+        "id": "UA-000000-0"
+    },
+
+    /*
+    Enable a generic info side bar.
+
+    - show: boolean, initial visible to first time users
+    - qrcode: boolean, show a QR-Code
+    - qrColor: string, QR-Code fill color
+    */
+    "info": {
+        "enabled": true,
+        "show": false,
+        "qrcode": true,
+        "qrFill": "#999",
+        "qrBack": "#fff"
+    },
+
+    /*
+    Localization, for example "en", "de" etc. - see "_h5ai/conf/l10n" folder for
+    possible values. Adjust it to your needs. If lang is not found
+    it defaults to "en".
+
+    - lang: string, default language
+    - useBroserLang: boolean, try to use browser language
+    */
+    "l10n": {
+        "enabled": true,
+        "lang": "en",
+        "useBrowserLang": true
+    },
+
+    /*
+    Adds Piwik tracker javascript code.
+
+    - baseURL: string, do not include the protocol, e.g. "mydomain.tld/piwik"
+    - idSite: number
+    */
+    "piwik-analytics": {
+        "enabled": false,
+        "baseURL": "some/url",
+        "idSite": 1
+    },
+
+    /*
+    Play a audio preview on click.
+
+    - autoplay: start playing as soon as ready
+    - types: array of strings
+    */
+    "preview-aud": {
+        "enabled": true,
+        "autoplay": true,
+        "types": ["aud"]
+    },
+
+    /*
+    Show an image preview on click.
+
+    - types: array of strings
+    - size: number, sample size, or false for original size
+    */
+    "preview-img": {
+        "enabled": true,
+        "size": false,
+        "types": ["img", "img-bmp", "img-gif", "img-ico", "img-jpg", "img-png", "img-raw", "img-svg"]
+    },
+
+    /*
+    Show text file preview on click.
+
+    Available styles are:
+      0: floating text
+      1: fixed width text
+      2: markdown
+      3: syntax highlighting
+
+    - styles: dict string to int, maps types to styles
+    */
+    "preview-txt": {
+        "enabled": true,
+        "styles": {
+            "txt": 1,
+            "txt-authors": 1,
+            "txt-c": 3,
+            "txt-cpp": 3,
+            "txt-css": 3,
+            "txt-diff": 1,
+            "txt-go": 3,
+            "txt-h": 3,
+            "txt-hpp": 3,
+            "txt-install": 1,
+            "txt-js": 3,
+            "txt-json": 3,
+            "txt-less": 3,
+            "txt-license": 1,
+            "txt-log": 1,
+            "txt-makefile": 1,
+            "txt-md": 2,
+            "txt-py": 3,
+            "txt-rb": 3,
+            "txt-readme": 1,
+            "txt-rtf": 1,
+            "txt-rust": 3,
+            "txt-script": 3,
+            "txt-xml": 1
+        }
+    },
+
+    /*
+    Play a video preview on click.
+
+    - autoplay: start playing as soon as ready
+    - types: array of strings
+    */
+    "preview-vid": {
+        "enabled": true,
+        "autoplay": true,
+        "types": ["vid-avi", "vid-flv", "vid-mkv", "vid-mov", "vid-mp4", "vid-mpg", "vid-webm"]
+    },
+
+    /*
+    Allow searching files and folders in and below current folder.
+    Checks for substrings.
+
+    If advanced is enabled it checks entries for right order of characters,
+    i.e. "ab" matches "ab", "axb", "xaxbx" but not "ba". Space separated
+    sequences get OR-ed. Searches will be treated as JavaScript regular
+    expressions if you prefix them with "re:".
+
+    - advanced: boolean, use advanced pattern parsing
+    - debounceTime: number, debounce wait time in milliseconds
+    - ignorecase: boolean, ignore case
+    */
+    "search": {
+        "enabled": false,
+        "advanced": true,
+        "debounceTime": 300,
+        "ignorecase": true
+    },
+
+    /*
+    Make entries selectable.
+    At the moment only needed for packaged download.
+
+    - clickndrag: boolean, allow first mouse button + drag selection
+    - checkboxes: boolean, show a checkbox on mouse over item
+    */
+    "select": {
+        "enabled": true,
+        "clickndrag": true,
+        "checkboxes": true
+    },
+
+    /*
+    Default sort order.
+    "column" and "reverse" are locally stored.
+
+    - column: number, 0 for "Name", 1 for "Date", 2 for "Size"
+    - reverse: boolean, false for ascending, true for descending
+    - ignorecase: boolean, compare ignorecase
+    - natural: boolean, use natural sort order
+    - folders: number, where to place folders, 0 for "top", 1 for "in place", 2 for "bottom"
+    */
+    "sort": {
+        "enabled": true,
+        "column": 0,
+        "reverse": false,
+        "ignorecase": true,
+        "natural": true,
+        "folders": 0
+    },
+
+    /*
+    Show thumbnails for image files. Needs the "/_h5ai/cache" folder to be
+    writable for the web Server.
+
+    - img: array of strings
+    - mov: array of strings
+    - doc: array of strings
+    - delay: number, delay in milliseconds after "dom-ready" before thumb-requesting starts
+    - size: number, size in pixel of the generated thumbnails
+    - exif: boolean, use included EXIF thumbs if possible
+    - chunksize: int, number of thumbs per request
+    */
+    "thumbnails": {
+        "enabled": true,
+        "img": ["img-bmp", "img-gif", "img-ico", "img-jpg", "img-png"],
+        "mov": ["vid-avi", "vid-flv", "vid-mkv", "vid-mov", "vid-mp4", "vid-mpg", "vid-webm"],
+        "doc": ["x-pdf", "x-ps"],
+        "delay": 1,
+        "size": 240,
+        "exif": false,
+        "chunksize": 20
+    },
+
+    /*
+    Replace window title with current breadcrumb.
+    */
+    "title": {
+        "enabled": true
+    },
+
+    /*
+    Show a folder tree.
+    Note that this might affect performance significantly.
+
+    - show: boolean, initial visible to first time users
+    - maxSubfolders: number, max number of subfolders to show in tree
+    - naturalSort: boolean, use natural sort order for folders
+    - ignorecase: boolean, sort ignorecase
+    */
+    "tree": {
+        "enabled": true,
+        "show": true,
+        "maxSubfolders": 50,
+        "naturalSort": true,
+        "ignorecase": true
+    }
+}
diff --git a/container/srv-http/root/srv/_h5ai/private/conf/types.json b/container/srv-http/root/srv/_h5ai/private/conf/types.json
new file mode 100755
index 0000000..0b83a3e
--- /dev/null
+++ b/container/srv-http/root/srv/_h5ai/private/conf/types.json
@@ -0,0 +1,76 @@
+/* h5ai v0.29.2 - https://larsjung.de/h5ai/ */
+{
+    "ar":               ["*.tar.bz2", "*.crx"],
+    "ar-apk":           ["*.apk"],
+    "ar-deb":           ["*.deb"],
+    "ar-gz":            ["*.gz", "*.tar.gz", "*.tgz"],
+    "ar-rar":           ["*.rar"],
+    "ar-rpm":           ["*.rpm"],
+    "ar-tar":           ["*.tar"],
+    "ar-zip":           ["*.7z", "*.bz2", "*.jar", "*.lzma", "*.war", "*.z", "*.Z", "*.zip"],
+    "aud":              ["*.aif", "*.aiff", "*.flac", "*.m4a", "*.mid", "*.mp3", "*.mpa", "*.ra", "*.ogg", "*.wav", "*.wma"],
+    "aud-pls":          ["*.m3u", "*.m3u8", "*.pls"],
+    "bin":              ["*.class", "*.o", "*.so"],
+    "bin-exe":          ["*.bat", "*.cmd", "*.exe"],
+    "img":              ["*.xpm"],
+    "img-bmp":          ["*.bmp"],
+    "img-gif":          ["*.gif"],
+    "img-ico":          ["*.ico"],
+    "img-jpg":          ["*.jpg", "*.jpeg"],
+    "img-png":          ["*.png"],
+    "img-raw":          ["*.cr2", "*.nef"],
+    "img-svg":          ["*.svg"],
+    "img-tiff":         ["*.tiff"],
+    "txt":              ["*.text", "*.txt"],
+    "txt-build":        ["*.pom", "build.xml", "pom.xml"],
+    "txt-c":            ["*.c"],
+    "txt-cpp":          ["*.cpp"],
+    "txt-css":          ["*.css"],
+    "txt-diff":         ["*.diff", "*.patch"],
+    "txt-go":           ["*.go"],
+    "txt-h":            ["*.h"],
+    "txt-html":         ["*.htm", "*.html", "*.shtml", "*.xhtml"],
+    "txt-hpp":          ["*.hpp"],
+    "txt-java":         ["*.java"],
+    "txt-scala":        ["*.scala"],
+    "txt-js":           ["*.js"],
+    "txt-json":         ["*.json"],
+    "txt-less":         ["*.less"],
+    "txt-log":          ["*.log", "changelog*"],
+    "txt-md":           ["*.markdown", "*.md"],
+    "txt-php":          ["*.php"],
+    "txt-py":           ["*.py"],
+    "txt-rb":           ["*.rb"],
+    "txt-rss":          ["*.rss"],
+    "txt-rtf":          ["*.rtf"],
+    "txt-rust":         ["*.rs", "*.rlib"],
+    "txt-script":       ["*.conf", "*.bsh", "*.csh", "*.ini", "*.ksh", "*.sh", "*.shar", "*.tcl", "*.zsh"],
+    "txt-source":       [],
+    "txt-tex":          ["*.tex"],
+    "txt-vcal":         ["*.vcal"],
+    "txt-xml":          ["*.xml"],
+    "vid":              [],
+    "vid-avi":          ["*.avi"],
+    "vid-flv":          ["*.flv"],
+    "vid-mkv":          ["*.mkv"],
+    "vid-mov":          ["*.mov"],
+    "vid-mp4":          ["*.mp4", "*.m4v"],
+    "vid-mpg":          ["*.mpg"],
+    "vid-rm":           ["*.rm"],
+    "vid-swf":          ["*.swf"],
+    "vid-ts":           ["*.ts"],
+    "vid-vob":          ["*.vob"],
+    "vid-webm":         ["*.webm"],
+    "vid-wmv":          ["*.wmv"],
+    "x":                [],
+    "x-bak":            ["*.bak", "*~"],
+    "x-calc":           ["*.ods", "*.ots", "*.xlr", "*.xls", "*.xlsx"],
+    "x-disc":           ["*.cue", "*.iso"],
+    "x-doc":            ["*.doc", "*.docx", "*.odm", "*.odt", "*.ott"],
+    "x-draw":           ["*.drw"],
+    "x-eps":            ["*.eps"],
+    "x-pdf":            ["*.pdf"],
+    "x-pres":           ["*.odp", "*.otp", "*.pps", "*.ppt", "*.pptx"],
+    "x-ps":             ["*.ps"],
+    "x-psd":            ["*.psd"]
+}
diff --git a/container/srv-http/root/srv/_h5ai/private/php/class-bootstrap.php b/container/srv-http/root/srv/_h5ai/private/php/class-bootstrap.php
new file mode 100755
index 0000000..4356523
--- /dev/null
+++ b/container/srv-http/root/srv/_h5ai/private/php/class-bootstrap.php
@@ -0,0 +1,45 @@
+<?php
+
+class Bootstrap {
+    private static $autopaths = ['core', 'ext'];
+
+    public static function run() {
+        spl_autoload_register(['Bootstrap', 'autoload']);
+        putenv('LANG=en_US.UTF-8');
+        setlocale(LC_CTYPE, 'en_US.UTF-8');
+        date_default_timezone_set(@date_default_timezone_get());
+        session_start();
+
+        $session = new Session($_SESSION);
+        $request = new Request($_REQUEST, file_get_contents('php://input'));
+        $setup = new Setup($request->query_boolean('refresh', false));
+        $context = new Context($session, $request, $setup);
+
+        if ($context->is_api_request()) {
+            (new Api($context))->apply();
+        } elseif ($context->is_info_request()) {
+            $public_href = $setup->get('PUBLIC_HREF');
+            $x_head_tags = $context->get_x_head_html();
+            $fallback_mode = false;
+            require __DIR__ . '/pages/info.php';
+        } else {
+            $public_href = $setup->get('PUBLIC_HREF');
+            $x_head_tags = $context->get_x_head_html();
+            $fallback_mode = $context->is_fallback_mode();
+            $fallback_html = (new Fallback($context))->get_html();
+            require __DIR__ . '/pages/index.php';
+        }
+    }
+
+    public static function autoload($class_name) {
+        $filename = 'class-' . strtolower($class_name) . '.php';
+
+        foreach (Bootstrap::$autopaths as $path) {
+            $file = __DIR__  . '/' . $path . '/' . $filename;
+            if (file_exists($file)) {
+                require_once $file;
+                return true;
+            }
+        }
+    }
+}
diff --git a/container/srv-http/root/srv/_h5ai/private/php/core/class-api.php b/container/srv-http/root/srv/_h5ai/private/php/core/class-api.php
new file mode 100755
index 0000000..30eadd1
--- /dev/null
+++ b/container/srv-http/root/srv/_h5ai/private/php/core/class-api.php
@@ -0,0 +1,109 @@
+<?php
+
+class Api {
+    private $context;
+    private $request;
+    private $setup;
+
+    public function __construct($context) {
+        $this->context = $context;
+        $this->request = $context->get_request();
+        $this->setup = $context->get_setup();
+    }
+
+    public function apply() {
+        $action = $this->request->query('action');
+        $supported = ['download', 'get', 'login', 'logout'];
+        Util::json_fail(Util::ERR_UNSUPPORTED, 'unsupported action', !in_array($action, $supported));
+
+        $methodname = 'on_' . $action;
+        $this->$methodname();
+    }
+
+    private function on_download() {
+        Util::json_fail(Util::ERR_DISABLED, 'download disabled', !$this->context->query_option('download.enabled', false));
+
+        $as = $this->request->query('as');
+        $type = $this->request->query('type');
+        $base_href = $this->request->query('baseHref');
+        $hrefs = $this->request->query('hrefs', '');
+
+        $archive = new Archive($this->context);
+
+        set_time_limit(0);
+        header('Content-Type: application/octet-stream');
+        header('Content-Disposition: attachment; filename="' . $as . '"');
+        header('Connection: close');
+        $ok = $archive->output($type, $base_href, $hrefs);
+
+        Util::json_fail(Util::ERR_FAILED, 'packaging failed', !$ok);
+        exit;
+    }
+
+    private function on_get() {
+        $response = [];
+
+        foreach (['langs', 'options', 'types'] as $name) {
+            if ($this->request->query_boolean($name, false)) {
+                $methodname = 'get_' . $name;
+                $response[$name] = $this->context->$methodname();
+            }
+        }
+
+        if ($this->request->query_boolean('setup', false)) {
+            $response['setup'] = $this->setup->to_jsono($this->context->is_admin());
+        }
+
+        if ($this->request->query_boolean('theme', false)) {
+            $theme = new Theme($this->context);
+            $response['theme'] = $theme->get_icons();
+        }
+
+        if ($this->request->query('items', false)) {
+            $href = $this->request->query('items.href');
+            $what = $this->request->query_numeric('items.what');
+            $response['items'] = $this->context->get_items($href, $what);
+        }
+
+        if ($this->request->query('custom', false)) {
+            Util::json_fail(Util::ERR_DISABLED, 'custom disabled', !$this->context->query_option('custom.enabled', false));
+            $href = $this->request->query('custom');
+            $custom = new Custom($this->context);
+            $response['custom'] = $custom->get_customizations($href);
+        }
+
+        if ($this->request->query('l10n', false)) {
+            Util::json_fail(Util::ERR_DISABLED, 'l10n disabled', !$this->context->query_option('l10n.enabled', false));
+            $iso_codes = $this->request->query_array('l10n');
+            $iso_codes = array_filter($iso_codes);
+            $response['l10n'] = $this->context->get_l10n($iso_codes);
+        }
+
+        if ($this->request->query('search', false)) {
+            Util::json_fail(Util::ERR_DISABLED, 'search disabled', !$this->context->query_option('search.enabled', false));
+            $href = $this->request->query('search.href');
+            $pattern = $this->request->query('search.pattern');
+            $ignorecase = $this->request->query_boolean('search.ignorecase', false);
+            $search = new Search($this->context);
+            $response['search'] = $search->get_items($href, $pattern, $ignorecase);
+        }
+
+        if ($this->request->query('thumbs', false)) {
+            Util::json_fail(Util::ERR_DISABLED, 'thumbnails disabled', !$this->context->query_option('thumbnails.enabled', false));
+            Util::json_fail(Util::ERR_UNSUPPORTED, 'thumbnails not supported', !$this->setup->get('HAS_PHP_JPEG'));
+            $thumbs = $this->request->query_array('thumbs');
+            $response['thumbs'] = $this->context->get_thumbs($thumbs);
+        }
+
+        Util::json_exit($response);
+    }
+
+    private function on_login() {
+        $pass = $this->request->query('pass');
+        Util::json_exit(['asAdmin' => $this->context->login_admin($pass)]);
+    }
+
+    private function on_logout() {
+        Util::json_exit(['asAdmin' => $this->context->logout_admin()]);
+    }
+}
diff --git a/container/srv-http/root/srv/_h5ai/private/php/core/class-context.php b/container/srv-http/root/srv/_h5ai/private/php/core/class-context.php
new file mode 100755
index 0000000..5484f8f
--- /dev/null
+++ b/container/srv-http/root/srv/_h5ai/private/php/core/class-context.php
@@ -0,0 +1,294 @@
+<?php
+
+class Context {
+    private static $DEFAULT_PASSHASH = 'cf83e1357eefb8bdf1542850d66d8007d620e4050b5715dc83f4a921d36ce9ce47d0d13c5d85f2b0ff8318d2877eec2f63b931bd47417a81a538327af927da3e';
+    private static $AS_ADMIN_SESSION_KEY = 'AS_ADMIN';
+
+    private $session;
+    private $request;
+    private $setup;
+    private $options;
+    private $passhash;
+
+    public function __construct($session, $request, $setup) {
+        $this->session = $session;
+        $this->request = $request;
+        $this->setup = $setup;
+
+        $this->options = Json::load($this->setup->get('CONF_PATH') . '/options.json');
+
+        $this->passhash = $this->query_option('passhash', '');
+        $this->options['hasCustomPasshash'] = strcasecmp($this->passhash, Context::$DEFAULT_PASSHASH) !== 0;
+        unset($this->options['passhash']);
+    }
+
+    public function get_session() {
+        return $this->session;
+    }
+
+    public function get_request() {
+        return $this->request;
+    }
+
+    public function get_setup() {
+        return $this->setup;
+    }
+
+    public function get_options() {
+        return $this->options;
+    }
+
+    public function query_option($keypath = '', $default = null) {
+        return Util::array_query($this->options, $keypath, $default);
+    }
+
+    public function get_types() {
+        return Json::load($this->setup->get('CONF_PATH') . '/types.json');
+    }
+
+    public function login_admin($pass) {
+        $this->session->set(Context::$AS_ADMIN_SESSION_KEY, strcasecmp(hash('sha512', $pass), $this->passhash) === 0);
+        return $this->session->get(Context::$AS_ADMIN_SESSION_KEY);
+    }
+
+    public function logout_admin() {
+        $this->session->set(Context::$AS_ADMIN_SESSION_KEY, false);
+        return $this->session->get(Context::$AS_ADMIN_SESSION_KEY);
+    }
+
+    public function is_admin() {
+        return $this->session->get(Context::$AS_ADMIN_SESSION_KEY);
+    }
+
+    public function is_api_request() {
+        return strtolower($this->setup->get('REQUEST_METHOD')) === 'post';
+    }
+
+    public function is_info_request() {
+        return Util::starts_with($this->setup->get('REQUEST_HREF') . '/', $this->setup->get('PUBLIC_HREF'));
+    }
+
+    public function is_text_browser() {
+        return preg_match('/curl|links|lynx|w3m/i', $this->setup->get('HTTP_USER_AGENT')) === 1;
+    }
+
+    public function is_fallback_mode() {
+        return $this->query_option('view.fallbackMode', false) || $this->is_text_browser();
+    }
+
+    public function to_href($path, $trailing_slash = true) {
+        $rel_path = substr($path, strlen($this->setup->get('ROOT_PATH')));
+        $parts = explode('/', $rel_path);
+        $encoded_parts = [];
+        foreach ($parts as $part) {
+            if ($part != '') {
+                $encoded_parts[] = rawurlencode($part);
+            }
+        }
+
+        return Util::normalize_path($this->setup->get('ROOT_HREF') . implode('/', $encoded_parts), $trailing_slash);
+    }
+
+    public function to_path($href) {
+        $rel_href = substr($href, strlen($this->setup->get('ROOT_HREF')));
+        return Util::normalize_path($this->setup->get('ROOT_PATH') . '/' . rawurldecode($rel_href));
+    }
+
+    public function is_hidden($name) {
+        // always hide
+        if ($name === '.' || $name === '..') {
+            return true;
+        }
+
+        foreach ($this->query_option('view.hidden', []) as $re) {
+            $re = Util::wrap_pattern($re);
+            if (preg_match($re, $name)) {
+                return true;
+            }
+        }
+
+        return false;
+    }
+
+    public function read_dir($path) {
+        $names = [];
+        if (is_dir($path)) {
+            foreach (scandir($path) as $name) {
+                if (
+                    $this->is_hidden($name)
+                    || $this->is_hidden($this->to_href($path) . $name)
+                    || (!is_readable($path . '/' . $name) && $this->query_option('view.hideIf403', false))
+                ) {
+                    continue;
+                }
+                $names[] = $name;
+            }
+        }
+        return $names;
+    }
+
+    public function is_managed_href($href) {
+        return $this->is_managed_path($this->to_path($href));
+    }
+
+    public function is_managed_path($path) {
+        if (!is_dir($path) || strpos($path, '../') !== false || strpos($path, '/..') !== false || $path === '..') {
+            return false;
+        }
+
+        if (strpos($path, $this->setup->get('PUBLIC_PATH')) === 0) {
+            return false;
+        }
+
+        if (strpos($path, $this->setup->get('PRIVATE_PATH')) === 0) {
+            return false;
+        }
+
+        foreach ($this->query_option('view.unmanaged', []) as $name) {
+            if (file_exists($path . '/' . $name)) {
+                return false;
+            }
+        }
+
+        while ($path !== $this->setup->get('ROOT_PATH')) {
+            if (@is_dir($path . '/_h5ai/private/conf')) {
+                return false;
+            }
+            $parent_path = Util::normalize_path(dirname($path));
+            if ($parent_path === $path) {
+                return false;
+            }
+            $path = $parent_path;
+        }
+        return true;
+    }
+
+    public function get_current_path() {
+        $current_href = Util::normalize_path($this->setup->get('REQUEST_HREF'), true);
+        $current_path = $this->to_path($current_href);
+
+        if (!is_dir($current_path)) {
+            $current_path = Util::normalize_path(dirname($current_path), false);
+        }
+
+        return $current_path;
+    }
+
+    public function get_items($href, $what) {
+        if (!$this->is_managed_href($href)) {
+            return [];
+        }
+
+        $cache = [];
+        $folder = Item::get($this, $this->to_path($href), $cache);
+
+        // add content of subfolders
+        if ($what >= 2 && $folder !== null) {
+            foreach ($folder->get_content($cache) as $item) {
+                $item->get_content($cache);
+            }
+            $folder = $folder->get_parent($cache);
+        }
+
+        // add content of this folder and all parent folders
+        while ($what >= 1 && $folder !== null) {
+            $folder->get_content($cache);
+            $folder = $folder->get_parent($cache);
+        }
+
+        uasort($cache, ['Item', 'cmp']);
+        $result = [];
+        foreach ($cache as $p => $item) {
+            $result[] = $item->to_json_object();
+        }
+
+        return $result;
+    }
+
+    public function get_langs() {
+        $langs = [];
+        $l10n_path = $this->setup->get('CONF_PATH') . '/l10n';
+        if (is_dir($l10n_path)) {
+            if ($dir = opendir($l10n_path)) {
+                while (($file = readdir($dir)) !== false) {
+                    if (Util::ends_with($file, '.json')) {
+                        $translations = Json::load($l10n_path . '/' . $file);
+                        $langs[basename($file, '.json')] = $translations['lang'];
+                    }
+                }
+                closedir($dir);
+            }
+        }
+        ksort($langs);
+        return $langs;
+    }
+
+    public function get_l10n($iso_codes) {
+        $results = [];
+
+        foreach ($iso_codes as $iso_code) {
+            $file = $this->setup->get('CONF_PATH') . '/l10n/' . $iso_code . '.json';
+            $results[$iso_code] = Json::load($file);
+            $results[$iso_code]['isoCode'] = $iso_code;
+        }
+
+        return $results;
+    }
+
+    public function get_thumbs($requests) {
+        $hrefs = [];
+
+        foreach ($requests as $req) {
+            $thumb = new Thumb($this);
+            $hrefs[] = $thumb->thumb($req['type'], $req['href'], $req['width'], $req['height']);
+        }
+
+        return $hrefs;
+    }
+
+    private function prefix_x_head_href($href) {
+        if (preg_match('@^(https?://|/)@i', $href)) {
+            return $href;
+        }
+
+        return $this->setup->get('PUBLIC_HREF') . 'ext/' . $href;
+    }
+
+    private function get_fonts_html() {
+        $fonts = $this->query_option('view.fonts', []);
+        $fonts_mono = $this->query_option('view.fontsMono', []);
+
+        $html = '<style class="x-head">';
+
+        if (sizeof($fonts) > 0) {
+            $html .= '#root,input,select{font-family:"' . implode('","', $fonts) . '"!important}';
+        }
+
+        if (sizeof($fonts_mono) > 0) {
+            $html .= 'pre,code{font-family:"' . implode('","', $fonts_mono) . '"!important}';
+        }
+
+        $html .= '</style>';
+
+        return $html;
+    }
+
+    public function get_x_head_html() {
+        $scripts = $this->query_option('resources.scripts', []);
+        $styles = $this->query_option('resources.styles', []);
+
+        $html = '';
+
+        foreach ($styles as $href) {
+            $html .= '<link rel="stylesheet" href="' . $this->prefix_x_head_href($href) . '" class="x-head">';
+        }
+
+        foreach ($scripts as $href) {
+            $html .= '<script src="' . $this->prefix_x_head_href($href) . '" class="x-head"></script>';
+        }
+
+        $html .= $this->get_fonts_html();
+
+        return $html;
+    }
+}
diff --git a/container/srv-http/root/srv/_h5ai/private/php/core/class-fallback.php b/container/srv-http/root/srv/_h5ai/private/php/core/class-fallback.php
new file mode 100755
index 0000000..7bd317f
--- /dev/null
+++ b/container/srv-http/root/srv/_h5ai/private/php/core/class-fallback.php
@@ -0,0 +1,54 @@
+<?php
+
+class Fallback {
+    private $context;
+
+    public function __construct($context) {
+        $this->context = $context;
+    }
+
+    public function get_html($path = null) {
+        if (!$path) {
+            $path = $this->context->get_current_path();
+        }
+        $fallback_images_href = $this->context->get_setup()->get('PUBLIC_HREF') . 'images/fallback/';
+
+        $cache = [];
+        $folder = Item::get($this->context, $path, $cache);
+        $items = $folder->get_content($cache);
+        uasort($items, ['Item', 'cmp']);
+
+        $html = '<table>';
+
+        $html .= '<tr>';
+        $html .= '<th class="fb-i"></th>';
+        $html .= '<th class="fb-n"><span>Name</span></th>';
+        $html .= '<th class="fb-d"><span>Last modified</span></th>';
+        $html .= '<th class="fb-s"><span>Size</span></th>';
+        $html .= '</tr>';
+
+        if ($folder->get_parent($cache)) {
+            $html .= '<tr>';
+            $html .= '<td class="fb-i"><img src="' . $fallback_images_href . 'folder-parent.png" alt="folder-parent"/></td>';
+            $html .= '<td class="fb-n"><a href="..">Parent Directory</a></td>';
+            $html .= '<td class="fb-d"></td>';
+            $html .= '<td class="fb-s"></td>';
+            $html .= '</tr>';
+        }
+
+        foreach ($items as $item) {
+            $type = $item->is_folder ? 'folder' : 'file';
+
+            $html .= '<tr>';
+            $html .= '<td class="fb-i"><img src="' . $fallback_images_href . $type . '.png" alt="' . $type . '"/></td>';
+            $html .= '<td class="fb-n"><a href="' . $item->href . '">' . basename($item->path) . '</a></td>';
+            $html .= '<td class="fb-d">' . date('Y-m-d H:i', $item->date) . '</td>';
+            $html .= '<td class="fb-s">' . ($item->size !== null ? intval($item->size / 1000) . ' KB' : '' ) . '</td>';
+            $html .= '</tr>';
+        }
+
+        $html .= '</table>';
+
+        return $html;
+    }
+}
diff --git a/container/srv-http/root/srv/_h5ai/private/php/core/class-filesize.php b/container/srv-http/root/srv/_h5ai/private/php/core/class-filesize.php
new file mode 100755
index 0000000..477f9e2
--- /dev/null
+++ b/container/srv-http/root/srv/_h5ai/private/php/core/class-filesize.php
@@ -0,0 +1,96 @@
+<?php
+
+class Filesize {
+    private static $cache = [];
+
+    public static function getSize($path, $withFoldersize, $withDu) {
+        $fs = new Filesize();
+        return $fs->size($path, $withFoldersize, $withDu);
+    }
+
+    public static function getCachedSize($path, $withFoldersize, $withDu) {
+        if (array_key_exists($path, Filesize::$cache)) {
+            return Filesize::$cache[$path];
+        }
+
+        $size = Filesize::getSize($path, $withFoldersize, $withDu);
+
+        Filesize::$cache[$path] = $size;
+        return $size;
+    }
+
+
+    private function __construct() {}
+
+    private function read_dir($path) {
+        $paths = [];
+        if (is_dir($path)) {
+            foreach (scandir($path) as $name) {
+                if ($name !== '.' && $name !== '..') {
+                    $paths[] = $path . '/' . $name;
+                }
+            }
+        }
+        return $paths;
+    }
+
+    private function php_filesize($path, $recursive = false) {
+        // if (PHP_INT_SIZE < 8) {
+        // }
+        $size = @filesize($path);
+
+        if (!is_dir($path) || !$recursive) {
+            return $size;
+        }
+
+        foreach ($this->read_dir($path) as $p) {
+            $size += $this->php_filesize($p, true);
+        }
+        return $size;
+    }
+
+
+    private function exec($cmdv) {
+        $cmd = implode(' ', array_map('escapeshellarg', $cmdv));
+        $lines = [];
+        $rc = null;
+        exec($cmd, $lines, $rc);
+        return $lines;
+    }
+
+    private function exec_du_all($paths) {
+        $cmdv = array_merge(['du', '-sbL'], $paths);
+        $lines = $this->exec($cmdv);
+
+        $sizes = [];
+        foreach ($lines as $line) {
+            $parts = preg_split('/[\s]+/', $line, 2);
+            $size = intval($parts[0], 10);
+            $path = $parts[1];
+            $sizes[$path] = $size;
+        }
+        return $sizes;
+    }
+
+    private function exec_du($path) {
+        $sizes = $this->exec_du_all([$path]);
+        return $sizes[$path];
+    }
+
+
+    private function size($path, $withFoldersize = false, $withDu = false) {
+        if (is_file($path)) {
+            return $this->php_filesize($path);
+        }
+
+        if (is_dir($path) && $withFoldersize) {
+            if ($withDu) {
+                return $this->exec_du($path);
+            }
+
+            return $this->php_filesize($path, true);
+        }
+
+        return null;
+    }
+}
diff --git a/container/srv-http/root/srv/_h5ai/private/php/core/class-item.php b/container/srv-http/root/srv/_h5ai/private/php/core/class-item.php
new file mode 100755
index 0000000..2b9ce34
--- /dev/null
+++ b/container/srv-http/root/srv/_h5ai/private/php/core/class-item.php
@@ -0,0 +1,91 @@
+<?php
+
+class Item {
+    public static function cmp($item1, $item2) {
+        if ($item1->is_folder && !$item2->is_folder) {
+            return -1;
+        }
+        if (!$item1->is_folder && $item2->is_folder) {
+            return 1;
+        }
+
+        return strcasecmp($item1->path, $item2->path);
+    }
+
+    public static function get($context, $path, &$cache) {
+        if (!Util::starts_with($path, $context->get_setup()->get('ROOT_PATH'))) {
+            return null;
+        }
+
+        if (is_array($cache) && array_key_exists($path, $cache)) {
+            return $cache[$path];
+        }
+
+        $item = new Item($context, $path);
+
+        if (is_array($cache)) {
+            $cache[$path] = $item;
+        }
+        return $item;
+    }
+
+    public $context;
+    public $path;
+    public $href;
+    public $date;
+    public $size;
+    public $is_folder;
+    public $is_content_fetched;
+
+    private function __construct($context, $path) {
+        $this->context = $context;
+
+        $this->path = Util::normalize_path($path, false);
+        $this->is_folder = is_dir($this->path);
+        $this->href = $context->to_href($this->path, $this->is_folder);
+        $this->date = @filemtime($this->path);
+        $this->size = Util::filesize($context, $this->path);
+        $this->is_content_fetched = false;
+    }
+
+    public function to_json_object() {
+        $obj = [
+            'href' => $this->href,
+            'time' => $this->date * 1000, // seconds (PHP) to milliseconds (JavaScript)
+            'size' => $this->size
+        ];
+
+        if ($this->is_folder) {
+            $obj['managed'] = $this->context->is_managed_href($this->href);
+            $obj['fetched'] = $this->is_content_fetched;
+        }
+
+        return $obj;
+    }
+
+    public function get_parent(&$cache) {
+        $parent_path = Util::normalize_path(dirname($this->path), false);
+        if ($parent_path !== $this->path && Util::starts_with($parent_path, $this->context->get_setup()->get('ROOT_PATH'))) {
+            return Item::get($this->context, $parent_path, $cache);
+        }
+        return null;
+    }
+
+    public function get_content(&$cache) {
+        $items = [];
+
+        if (!$this->context->is_managed_href($this->href)) {
+            return $items;
+        }
+
+        $files = $this->context->read_dir($this->path);
+        foreach ($files as $file) {
+            $item = Item::get($this->context, $this->path . '/' . $file, $cache);
+            $items[$item->path] = $item;
+        }
+
+        $this->is_content_fetched = true;
+
+        return $items;
+    }
+}
diff --git a/container/srv-http/root/srv/_h5ai/private/php/core/class-json.php b/container/srv-http/root/srv/_h5ai/private/php/core/class-json.php
new file mode 100755
index 0000000..f662b9f
--- /dev/null
+++ b/container/srv-http/root/srv/_h5ai/private/php/core/class-json.php
@@ -0,0 +1,65 @@
+<?php
+
+class Json {
+    const SINGLE = 1;
+    const MULTI = 2;
+
+    public static function load($path) {
+        if (!is_readable($path)) {
+            return [];
+        }
+
+        $json = file_get_contents($path);
+        return Json::decode($json);
+    }
+
+    public static function save($path, $obj) {
+        $json = json_encode($obj);
+        return file_put_contents($path, $json) !== false;
+    }
+
+    private static function decode($json) {
+        $json = Json::strip($json);
+        return json_decode($json, true);
+    }
+
+    private static function strip($commented_json) {
+        $insideString = false;
+        $insideComment = false;
+        $json = '';
+
+        for ($i = 0, $len = strlen($commented_json); $i < $len; $i += 1) {
+            $char = $commented_json[$i];
+            $charchar = $char . @$commented_json[$i + 1];
+            $prevChar = @$commented_json[$i - 1];
+
+            if (!$insideComment && $char === '"' && $prevChar !== "\\") {
+                $insideString = !$insideString;
+            }
+
+            if ($insideString) {
+                $json .= $char;
+            } elseif (!$insideComment && $charchar === '//') {
+                $insideComment = Json::SINGLE;
+                $i += 1;
+            } elseif (!$insideComment && $charchar === '/*') {
+                $insideComment = Json::MULTI;
+                $i += 1;
+            } elseif (!$insideComment) {
+                $json .= $char;
+            } elseif ($insideComment === Json::SINGLE && $charchar === "\r\n") {
+                $insideComment = false;
+                $json .= $charchar;
+                $i += 1;
+            } elseif ($insideComment === Json::SINGLE && $char === "\n") {
+                $insideComment = false;
+                $json .= $char;
+            } elseif ($insideComment === Json::MULTI && $charchar === '*/') {
+                $insideComment = false;
+                $i += 1;
+            }
+        }
+
+        return $json;
+    }
+}
diff --git a/container/srv-http/root/srv/_h5ai/private/php/core/class-logger.php b/container/srv-http/root/srv/_h5ai/private/php/core/class-logger.php
new file mode 100755
index 0000000..504bb3c
--- /dev/null
+++ b/container/srv-http/root/srv/_h5ai/private/php/core/class-logger.php
@@ -0,0 +1,28 @@
+<?php
+
+class Logger {
+    private static $start;
+    private static $prev;
+
+    private static function time() {
+        return microtime(true) * 1000; // sec * 1000 = ms
+    }
+
+    public static function init() {
+        self::$start = self::time();
+        self::$prev = self::$start;
+        register_shutdown_function(function () { Logger::log('shutdown'); });
+        Logger::log('--------------------------------');
+    }
+
+    public static function log($message=null, $obj=null) {
+        $now = self::time();
+        $message = number_format($now - self::$start, 3) . ' ' . number_format($now - self::$prev, 3) . ' ' . $message;
+
+        @error_log($message . ' ' . var_export($obj, true));
+
+        self::$prev = $now;
+    }
+}
+
+Logger::init();
diff --git a/container/srv-http/root/srv/_h5ai/private/php/core/class-request.php b/container/srv-http/root/srv/_h5ai/private/php/core/class-request.php
new file mode 100755
index 0000000..95bae09
--- /dev/null
+++ b/container/srv-http/root/srv/_h5ai/private/php/core/class-request.php
@@ -0,0 +1,38 @@
+<?php
+
+class Request {
+    private $params;
+
+    public function __construct($params, $body) {
+        $data = json_decode($body, true);
+        $this->params = $data !== null ? $data : $params;
+    }
+
+    public function query($keypath = '', $default = Util::NO_DEFAULT) {
+        $value = Util::array_query($this->params, $keypath, Util::NO_DEFAULT);
+
+        if ($value === Util::NO_DEFAULT) {
+            Util::json_fail(Util::ERR_MISSING_PARAM, 'parameter \'' . $keypath . '\' is missing', $default === Util::NO_DEFAULT);
+            return $default;
+        }
+
+        return $value;
+    }
+
+    public function query_boolean($keypath = '', $default = Util::NO_DEFAULT) {
+        $value = $this->query($keypath, $default);
+        return filter_var($value, FILTER_VALIDATE_BOOLEAN);
+    }
+
+    public function query_numeric($keypath = '', $default = Util::NO_DEFAULT) {
+        $value = $this->query($keypath, $default);
+        Util::json_fail(Util::ERR_ILLIGAL_PARAM, 'parameter \'' . $keypath . '\' is not numeric', !is_numeric($value));
+        return intval($value, 10);
+    }
+
+    public function query_array($keypath = '', $default = Util::NO_DEFAULT) {
+        $value = $this->query($keypath, $default);
+        Util::json_fail(Util::ERR_ILLIGAL_PARAM, 'parameter \'' . $keypath . '\' is no array', !is_array($value));
+        return $value;
+    }
+}
diff --git a/container/srv-http/root/srv/_h5ai/private/php/core/class-session.php b/container/srv-http/root/srv/_h5ai/private/php/core/class-session.php
new file mode 100755
index 0000000..630d78f
--- /dev/null
+++ b/container/srv-http/root/srv/_h5ai/private/php/core/class-session.php
@@ -0,0 +1,20 @@
+<?php
+
+class Session {
+    private static $KEY_PREFIX = '__H5AI__';
+    private $store;
+
+    public function __construct(&$store) {
+        $this->store = &$store;
+    }
+
+    public function set($key, $value) {
+        $key = Session::$KEY_PREFIX . $key;
+        $this->store[$key] = $value;
+    }
+
+    public function get($key, $default = null) {
+        $key = Session::$KEY_PREFIX . $key;
+        return array_key_exists($key, $this->store) ? $this->store[$key] : $default;
+    }
+}
diff --git a/container/srv-http/root/srv/_h5ai/private/php/core/class-setup.php b/container/srv-http/root/srv/_h5ai/private/php/core/class-setup.php
new file mode 100755
index 0000000..d0c3fb2
--- /dev/null
+++ b/container/srv-http/root/srv/_h5ai/private/php/core/class-setup.php
@@ -0,0 +1,185 @@
+<?php
+
+class Setup {
+    private $store;
+    private $refresh;
+
+    public function __construct($refresh = false) {
+        $this->store = [];
+        $this->refresh = $refresh;
+
+        $this->add_globals_and_envs();
+        $this->add_php_checks();
+        $this->add_app_metadata();
+        $this->add_server_metadata_and_check();
+        $this->add_paths();
+        $this->add_sys_cmd_checks();
+    }
+
+    private function set($key, $value) {
+        if (array_key_exists($key, $this->store)) {
+            Logger::log('setup key already taken', [
+                'key' => $key,
+                'value' => $value,
+                'found' => $this->store[$key]
+            ]);
+            exit;
+        }
+        if (!is_string($value) && !is_bool($value)) {
+            Logger::log('setup value neither string nor boolean', [
+                'key' => $key,
+                'value' => $value
+            ]);
+            exit;
+        }
+
+        $this->store[$key] = $value;
+    }
+
+    public function get($key) {
+        if (!array_key_exists($key, $this->store)) {
+            Logger::log('setup key not found', ['key' => $key]);
+            exit;
+        }
+
+        return $this->store[$key];
+    }
+
+    private function add_globals_and_envs() {
+        $this->set('PHP_VERSION', PHP_VERSION);
+        $this->set('MIN_PHP_VERSION', MIN_PHP_VERSION);
+        $this->set('PHP_ARCH', (PHP_INT_SIZE * 8) . '-bit');
+
+        $this->set('REQUEST_METHOD', $_SERVER['REQUEST_METHOD']);
+        $this->set('REQUEST_HREF', parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH));
+        $this->set('SCRIPT_NAME', $_SERVER['SCRIPT_NAME']);
+        $this->set('SERVER_SOFTWARE', $_SERVER['SERVER_SOFTWARE']);
+        $this->set('HTTP_USER_AGENT', $_SERVER['HTTP_USER_AGENT']);
+    }
+
+    private function add_php_checks() {
+        $this->set('HAS_PHP_EXIF', function_exists('exif_thumbnail'));
+
+        $has_php_jpeg = false;
+        if (function_exists('gd_info')) {
+            $infos = gd_info();
+            $has_php_jpeg = array_key_exists('JPEG Support', $infos) && $infos['JPEG Support'];
+        }
+        $this->set('HAS_PHP_JPEG', $has_php_jpeg);
+    }
+
+    private function add_app_metadata() {
+        $this->set('NAME', 'h5ai');
+        $this->set('VERSION', H5AI_VERSION);
+        $this->set('FILE_PREFIX', '_h5ai');
+    }
+
+    private function add_server_metadata_and_check() {
+        $server_software = $this->get('SERVER_SOFTWARE');
+        $server_name = null;
+        $server_version = null;
+
+        if ($server_software && preg_match('#^(.*?)(?:/(.*?))?(?: |$)#', strtolower($server_software), $matches)) {
+            $server_name = $matches[1];
+            $server_version = count($matches) > 2 ? $matches[2] : '';
+        }
+
+        $this->set('SERVER_NAME', $server_name);
+        $this->set('SERVER_VERSION', $server_version);
+        $this->set('HAS_SERVER', in_array($server_name, ['apache', 'lighttpd', 'nginx', 'cherokee']));
+    }
+
+    private function add_paths() {
+        $script_name = $this->get('SCRIPT_NAME');
+        if ($this->get('SERVER_NAME') === 'lighttpd') {
+            $script_name = preg_replace('#^.*?//#', '/', $script_name);
+        }
+
+        $this->set('H5AI_HREF', Util::normalize_path(dirname(dirname($script_name)), true));
+        $this->set('H5AI_PATH', Util::normalize_path(dirname(dirname(dirname(dirname(__FILE__)))), false));
+
+        $this->set('ROOT_HREF', Util::normalize_path(dirname($this->get('H5AI_HREF')), true));
+        $this->set('ROOT_PATH', Util::normalize_path(dirname($this->get('H5AI_PATH')), false));
+
+        $this->set('PUBLIC_HREF', Util::normalize_path($this->get('H5AI_HREF') . '/public/', true));
+        $this->set('PUBLIC_PATH', Util::normalize_path($this->get('H5AI_PATH') . '/public/', false));
+
+        $this->set('INDEX_HREF', Util::normalize_path($this->get('PUBLIC_HREF') . '/index.php', false));
+        $this->set('CACHE_PUB_HREF', Util::normalize_path($this->get('PUBLIC_HREF') . '/cache', true));
+        $this->set('CACHE_PUB_PATH', Util::normalize_path($this->get('PUBLIC_PATH') . '/cache', false));
+        $this->set('HAS_WRITABLE_CACHE_PUB', @is_writable($this->get('CACHE_PUB_PATH')));
+
+        $this->set('PRIVATE_PATH', Util::normalize_path($this->get('H5AI_PATH') . '/private', false));
+        $this->set('CONF_PATH', Util::normalize_path($this->get('PRIVATE_PATH') . '/conf', false));
+        $this->set('CACHE_PRV_PATH', Util::normalize_path($this->get('PRIVATE_PATH') . '/cache', false));
+        $this->set('HAS_WRITABLE_CACHE_PRV', @is_writable($this->get('CACHE_PRV_PATH')));
+    }
+
+    private function add_sys_cmd_checks() {
+        $cmds_cache_path = Util::normalize_path($this->get('CACHE_PRV_PATH') . '/cmds.json', false);
+
+        $cmds = Json::load($cmds_cache_path);
+        if (sizeof($cmds) === 0 || $this->refresh) {
+            $cmds['command'] = Util::exec_0('command -v command');
+            $cmds['which'] = Util::exec_0('which which') || Util::exec_0('which which.exe');
+
+            $cmd = false;
+            if ($cmds['command']) {
+                $cmd = 'command -v';
+            } elseif ($cmds['which']) {
+                $cmd = 'which';
+            }
+
+            foreach (['avconv', 'convert', 'du', 'ffmpeg', 'gm', 'tar', 'zip'] as $c) {
+                $cmds[$c] = ($cmd !== false) && (Util::exec_0($cmd . ' ' . $c) || Util::exec_0($cmd . ' ' . $c . '.exe'));
+            }
+
+            Json::save($cmds_cache_path, $cmds);
+        }
+        foreach ($cmds as $c => $has) {
+            $this->set('HAS_CMD_' . strtoupper($c), $has);
+        }
+    }
+
+    public function to_jsono($as_admin = false) {
+        $keys = [
+            'PUBLIC_HREF',
+            'ROOT_HREF'
+        ];
+
+        if ($as_admin) {
+            $keys = array_merge($keys, [
+                'VERSION',
+
+                'PHP_VERSION',
+                'MIN_PHP_VERSION',
+                'PHP_ARCH',
+                'HAS_PHP_EXIF',
+                'HAS_PHP_JPEG',
+
+                'SERVER_NAME',
+                'SERVER_VERSION',
+                'HAS_SERVER',
+
+                'INDEX_HREF',
+
+                'HAS_WRITABLE_CACHE_PUB',
+                'HAS_WRITABLE_CACHE_PRV',
+
+                'HAS_CMD_AVCONV',
+                'HAS_CMD_CONVERT',
+                'HAS_CMD_DU',
+                'HAS_CMD_FFMPEG',
+                'HAS_CMD_GM',
+                'HAS_CMD_TAR',
+                'HAS_CMD_ZIP'
+            ]);
+        }
+
+        $jsono = ['AS_ADMIN' => $as_admin];
+        foreach ($keys as $key) {
+            $jsono[$key] = $this->get($key);
+        }
+        return $jsono;
+    }
+}
diff --git a/container/srv-http/root/srv/_h5ai/private/php/core/class-theme.php b/container/srv-http/root/srv/_h5ai/private/php/core/class-theme.php
new file mode 100755
index 0000000..8fcaddd
--- /dev/null
+++ b/container/srv-http/root/srv/_h5ai/private/php/core/class-theme.php
@@ -0,0 +1,32 @@
+<?php
+
+class Theme {
+    private static $EXTENSIONS = ['svg', 'png', 'jpg'];
+    private $context;
+
+    public function __construct($context) {
+        $this->context = $context;
+    }
+
+    public function get_icons() {
+        $public_path = $this->context->get_setup()->get('PUBLIC_PATH');
+        $theme = $this->context->query_option('view.theme', '-NONE-');
+        $theme_path = $public_path . '/images/themes/' . $theme;
+
+        $icons = [];
+
+        if (is_dir($theme_path)) {
+            if ($dir = opendir($theme_path)) {
+                while (($name = readdir($dir)) !== false) {
+                    $path_parts = pathinfo($name);
+                    if (in_array(@$path_parts['extension'], Theme::$EXTENSIONS)) {
+                        $icons[$path_parts['filename']] = $theme . '/' . $name;
+                    }
+                }
+                closedir($dir);
+            }
+        }
+
+        return $icons;
+    }
+}
diff --git a/container/srv-http/root/srv/_h5ai/private/php/core/class-util.php b/container/srv-http/root/srv/_h5ai/private/php/core/class-util.php
new file mode 100755
index 0000000..ce6c802
--- /dev/null
+++ b/container/srv-http/root/srv/_h5ai/private/php/core/class-util.php
@@ -0,0 +1,89 @@
+<?php
+
+class Util {
+    const ERR_MISSING_PARAM = 'ERR_MISSING_PARAM';
+    const ERR_ILLIGAL_PARAM = 'ERR_ILLIGAL_PARAM';
+    const ERR_FAILED = 'ERR_FAILED';
+    const ERR_DISABLED = 'ERR_DISABLED';
+    const ERR_UNSUPPORTED = 'ERR_UNSUPPORTED';
+    const NO_DEFAULT = 'NO_*@+#?!_DEFAULT';
+    const RE_DELIMITER = '@';
+
+    public static function normalize_path($path, $trailing_slash = false) {
+        $path = preg_replace('#[\\\\/]+#', '/', $path);
+        return preg_match('#^(\w:)?/$#', $path) ? $path : (rtrim($path, '/') . ($trailing_slash ? '/' : ''));
+    }
+
+    public static function json_exit($obj = []) {
+        header('Content-type: application/json;charset=utf-8');
+        echo json_encode($obj);
+        exit;
+    }
+
+    public static function json_fail($err, $msg = '', $cond = true) {
+        if ($cond) {
+            Util::json_exit(['err' => $err, 'msg' => $msg]);
+        }
+    }
+
+    public static function array_query($array, $keypath = '', $default = Util::NO_DEFAULT) {
+        $value = $array;
+
+        $keys = array_filter(explode('.', $keypath));
+        foreach ($keys as $key) {
+            if (!is_array($value) || !array_key_exists($key, $value)) {
+                return $default;
+            }
+            $value = $value[$key];
+        }
+
+        return $value;
+    }
+
+    public static function starts_with($sequence, $head) {
+        return substr($sequence, 0, strlen($head)) === $head;
+    }
+
+    public static function ends_with($sequence, $tail) {
+        $len = strlen($tail);
+        return $len === 0 ? true : substr($sequence, -$len) === $tail;
+    }
+
+    public static function wrap_pattern($pattern) {
+        return Util::RE_DELIMITER . str_replace(Util::RE_DELIMITER, '\\' . Util::RE_DELIMITER, $pattern) . Util::RE_DELIMITER;
+    }
+
+    public static function passthru_cmd($cmd) {
+        $rc = null;
+        passthru($cmd, $rc);
+        return $rc;
+    }
+
+    public static function exec_cmdv($cmdv) {
+        if (!is_array($cmdv)) {
+            $cmdv = func_get_args();
+        }
+        $cmd = implode(' ', array_map('escapeshellarg', $cmdv));
+
+        $lines = [];
+        $rc = null;
+        exec($cmd, $lines, $rc);
+        return implode("\n", $lines);
+    }
+
+    public static function exec_0($cmd) {
+        $lines = [];
+        $rc = null;
+        try {
+            @exec($cmd, $lines, $rc);
+            return $rc === 0;
+        } catch (Exception $e) {}
+        return false;
+    }
+
+    public static function filesize($context, $path) {
+        $withFoldersize = $context->query_option('foldersize.enabled', false);
+        $withDu = $context->get_setup()->get('HAS_CMD_DU') && $context->query_option('foldersize.type', null) === 'shell-du';
+        return Filesize::getCachedSize($path, $withFoldersize, $withDu);
+    }
+}
diff --git a/container/srv-http/root/srv/_h5ai/private/php/ext/class-archive.php b/container/srv-http/root/srv/_h5ai/private/php/ext/class-archive.php
new file mode 100755
index 0000000..fec07de
--- /dev/null
+++ b/container/srv-http/root/srv/_h5ai/private/php/ext/class-archive.php
@@ -0,0 +1,183 @@
+<?php
+
+class Archive {
+    const NULL_BYTE = "\0";
+
+    private static $SEGMENT_SIZE = 16777216;  // 1024 * 1024 * 16 = 16MiB
+    private static $TAR_PASSTHRU_CMD = 'cd [ROOTDIR] && tar --no-recursion -c -- [DIRS] [FILES]';
+    private static $ZIP_PASSTHRU_CMD = 'cd [ROOTDIR] && zip - -- [FILES]';
+
+    private $context;
+    private $base_path;
+    private $dirs;
+    private $files;
+
+    public function __construct($context) {
+        $this->context = $context;
+    }
+
+    public function output($type, $base_href, $hrefs) {
+        $this->base_path = $this->context->to_path($base_href);
+        if (!$this->context->is_managed_path($this->base_path)) {
+            return false;
+        }
+
+        $this->dirs = [];
+        $this->files = [];
+
+        $this->add_hrefs($hrefs);
+
+        if (count($this->dirs) === 0 && count($this->files) === 0) {
+            if ($type === 'php-tar') {
+                $this->add_dir($this->base_path, '/');
+            } else {
+                $this->add_dir($this->base_path, '.');
+            }
+        }
+
+        if ($type === 'php-tar') {
+            return $this->php_tar($this->dirs, $this->files);
+        } elseif ($type === 'shell-tar') {
+            return $this->shell_cmd(Archive::$TAR_PASSTHRU_CMD);
+        } elseif ($type === 'shell-zip') {
+            return $this->shell_cmd(Archive::$ZIP_PASSTHRU_CMD);
+        }
+        return false;
+    }
+
+    private function shell_cmd($cmd) {
+        $cmd = str_replace('[ROOTDIR]', escapeshellarg($this->base_path), $cmd);
+        $cmd = str_replace('[DIRS]', count($this->dirs) ? implode(' ', array_map('escapeshellarg', $this->dirs)) : '', $cmd);
+        $cmd = str_replace('[FILES]', count($this->files) ? implode(' ', array_map('escapeshellarg', $this->files)) : '', $cmd);
+        try {
+            Util::passthru_cmd($cmd);
+        } catch (Exeption $err) {
+            return false;
+        }
+        return true;
+    }
+
+    private function php_tar($dirs, $files) {
+        $filesizes = [];
+        $total_size = 512 * count($dirs);
+        foreach (array_keys($files) as $real_file) {
+            $size = filesize($real_file);
+
+            $filesizes[$real_file] = $size;
+            $total_size += 512 + $size;
+            if ($size % 512 != 0) {
+                $total_size += 512 - ($size % 512);
+            }
+        }
+
+        header('Content-Length: ' . $total_size);
+
+        foreach ($dirs as $real_dir => $archived_dir) {
+            echo $this->php_tar_header($archived_dir, 0, @filemtime($real_dir . DIRECTORY_SEPARATOR . '.'), 5);
+        }
+
+        foreach ($files as $real_file => $archived_file) {
+            $size = $filesizes[$real_file];
+
+            echo $this->php_tar_header($archived_file, $size, @filemtime($real_file), 0);
+            $this->print_file($real_file);
+
+            if ($size % 512 != 0) {
+                echo str_repeat(Archive::NULL_BYTE, 512 - ($size % 512));
+            }
+        }
+
+        return true;
+    }
+
+    private function php_tar_header($filename, $size, $mtime, $type) {
+        $name = substr(basename($filename), -99);
+        $prefix = substr(Util::normalize_path(dirname($filename)), -154);
+        if ($prefix === '.') {
+            $prefix = '';
+        }
+
+        $header =
+            str_pad($name, 100, Archive::NULL_BYTE)  // filename [100]
+            . '0000755' . Archive::NULL_BYTE  // file mode [8]
+            . '0000000' . Archive::NULL_BYTE  // uid [8]
+            . '0000000' . Archive::NULL_BYTE  // gid [8]
+            . str_pad(decoct($size), 11, '0', STR_PAD_LEFT) . Archive::NULL_BYTE  // file size [12]
+            . str_pad(decoct($mtime), 11, '0', STR_PAD_LEFT) . Archive::NULL_BYTE  // file modification time [12]
+            . '        '  // checksum [8]
+            . str_pad($type, 1)  // file type [1]
+            . str_repeat(Archive::NULL_BYTE, 100)  // linkname [100]
+            . 'ustar' . Archive::NULL_BYTE  // magic [6]
+            . '00'  // version [2]
+            . str_repeat(Archive::NULL_BYTE, 80)  // uname, gname, defmajor, devminor [32 + 32 + 8 + 8]
+            . str_pad($prefix, 155, Archive::NULL_BYTE)  // filename [155]
+            . str_repeat(Archive::NULL_BYTE, 12);  // fill [12]
+        assert(strlen($header) === 512);
+
+        // checksum
+        $checksum = array_sum(array_map('ord', str_split($header)));
+        $checksum = str_pad(decoct($checksum), 6, '0', STR_PAD_LEFT) . Archive::NULL_BYTE . ' ';
+        $header = substr_replace($header, $checksum, 148, 8);
+
+        return $header;
+    }
+
+    private function print_file($file) {
+        // Send file content in segments to not hit PHP's memory limit (default: 128M)
+        if ($fd = fopen($file, 'rb')) {
+            while (!feof($fd)) {
+                print fread($fd, Archive::$SEGMENT_SIZE);
+                @ob_flush();
+                @flush();
+            }
+            fclose($fd);
+        }
+    }
+
+    private function add_hrefs($hrefs) {
+        foreach ($hrefs as $href) {
+            if (trim($href) === '') {
+                continue;
+            }
+
+            $d = Util::normalize_path(dirname($href), true);
+            $n = basename($href);
+
+            if ($this->context->is_managed_href($d) && !$this->context->is_hidden($n)) {
+
+                $real_file = $this->context->to_path($href);
+                $archived_file = preg_replace('!^' . preg_quote(Util::normalize_path($this->base_path, true)) . '!', '', $real_file);
+
+                if (is_dir($real_file)) {
+                    $this->add_dir($real_file, $archived_file);
+                } else {
+                    $this->add_file($real_file, $archived_file);
+                }
+            }
+        }
+    }
+
+    private function add_file($real_file, $archived_file) {
+        if (is_readable($real_file)) {
+            $this->files[$real_file] = $archived_file;
+        }
+    }
+
+    private function add_dir($real_dir, $archived_dir) {
+        if ($this->context->is_managed_path($real_dir)) {
+            $this->dirs[$real_dir] = $archived_dir;
+
+            $files = $this->context->read_dir($real_dir);
+            foreach ($files as $file) {
+                $real_file = $real_dir . '/' . $file;
+                $archived_file = $archived_dir . '/' . $file;
+
+                if (is_dir($real_file)) {
+                    $this->add_dir($real_file, $archived_file);
+                } else {
+                    $this->add_file($real_file, $archived_file);
+                }
+            }
+        }
+    }
+}
diff --git a/container/srv-http/root/srv/_h5ai/private/php/ext/class-custom.php b/container/srv-http/root/srv/_h5ai/private/php/ext/class-custom.php
new file mode 100755
index 0000000..ab1628e
--- /dev/null
+++ b/container/srv-http/root/srv/_h5ai/private/php/ext/class-custom.php
@@ -0,0 +1,65 @@
+<?php
+
+class Custom {
+    private static $EXTENSIONS = ['html', 'md'];
+    private $context;
+
+    public function __construct($context) {
+        $this->context = $context;
+    }
+
+    private function read_custom_file($path, $name, &$content, &$type) {
+        $file_prefix = $this->context->get_setup()->get('FILE_PREFIX');
+
+        foreach (Custom::$EXTENSIONS as $ext) {
+            $file = $path . '/' . $file_prefix . '.' . $name . '.' . $ext;
+            if (is_readable($file)) {
+                $content = file_get_contents($file);
+                $type = $ext;
+                return;
+            }
+        }
+    }
+
+    public function get_customizations($href) {
+        if (!$this->context->query_option('custom.enabled', false)) {
+            return [
+                'header' => ['content' => null, 'type' => null],
+                'footer' => ['content' => null, 'type' => null]
+            ];
+        }
+
+        $root_path = $this->context->get_setup()->get('FILE_PREFIX');
+        $path = $this->context->to_path($href);
+
+        $header = null;
+        $header_type = null;
+        $footer = null;
+        $footer_type = null;
+
+        $this->read_custom_file($path, 'header', $header, $header_type);
+        $this->read_custom_file($path, 'footer', $footer, $footer_type);
+
+        while ($header === null || $footer === null) {
+            if ($header === null) {
+                $this->read_custom_file($path, 'headers', $header, $header_type);
+            }
+            if ($footer === null) {
+                $this->read_custom_file($path, 'footers', $footer, $footer_type);
+            }
+            if ($path === $root_path) {
+                break;
+            }
+            $parent_path = Util::normalize_path(dirname($path));
+            if ($parent_path === $path) {
+                break;
+            }
+            $path = $parent_path;
+        }
+
+        return [
+            'header' => ['content' => $header, 'type' => $header_type],
+            'footer' => ['content' => $footer, 'type' => $footer_type]
+        ];
+    }
+}
diff --git a/container/srv-http/root/srv/_h5ai/private/php/ext/class-search.php b/container/srv-http/root/srv/_h5ai/private/php/ext/class-search.php
new file mode 100755
index 0000000..124954d
--- /dev/null
+++ b/container/srv-http/root/srv/_h5ai/private/php/ext/class-search.php
@@ -0,0 +1,40 @@
+<?php
+
+class Search {
+    private $context;
+
+    public function __construct($context) {
+        $this->context = $context;
+    }
+
+    public function get_paths($root, $pattern = null, $ignorecase = false) {
+        $paths = [];
+        if ($pattern && $this->context->is_managed_path($root)) {
+            $re = Util::wrap_pattern($pattern);
+            if ($ignorecase) {
+                $re .= 'i';
+            }
+            $names = $this->context->read_dir($root);
+            foreach ($names as $name) {
+                $path = $root . '/' . $name;
+                if (preg_match($re, @basename($path))) {
+                    $paths[] = $path;
+                }
+                if (@is_dir($path)) {
+                    $paths = array_merge($paths, $this->get_paths($path, $pattern, $ignorecase));
+                }
+            }
+        }
+        return $paths;
+    }
+
+    public function get_items($href, $pattern = null, $ignorecase = false) {
+        $cache = [];
+        $root = $this->context->to_path($href);
+        $paths = $this->get_paths($root, $pattern, $ignorecase);
+        $items = array_map(function ($path) {
+            return Item::get($this->context, $path, $cache)->to_json_object();
+        }, $paths);
+        return $items;
+    }
+}
diff --git a/container/srv-http/root/srv/_h5ai/private/php/ext/class-thumb.php b/container/srv-http/root/srv/_h5ai/private/php/ext/class-thumb.php
new file mode 100755
index 0000000..d52d3e8
--- /dev/null
+++ b/container/srv-http/root/srv/_h5ai/private/php/ext/class-thumb.php
@@ -0,0 +1,253 @@
+<?php
+
+class Thumb {
+    private static $FFMPEG_CMDV = ['ffmpeg', '-ss', '0:00:10', '-i', '[SRC]', '-an', '-vframes', '1', '[DEST]'];
+    private static $AVCONV_CMDV = ['avconv', '-ss', '0:00:10', '-i', '[SRC]', '-an', '-vframes', '1', '[DEST]'];
+    private static $CONVERT_CMDV = ['convert', '-density', '200', '-quality', '100', '-strip', '[SRC][0]', '[DEST]'];
+    private static $GM_CONVERT_CMDV = ['gm', 'convert', '-density', '200', '-quality', '100', '[SRC][0]', '[DEST]'];
+    private static $THUMB_CACHE = 'thumbs';
+
+    private $context;
+    private $setup;
+    private $thumbs_path;
+    private $thumbs_href;
+
+    public function __construct($context) {
+        $this->context = $context;
+        $this->setup = $context->get_setup();
+        $this->thumbs_path = $this->setup->get('CACHE_PUB_PATH') . '/' . Thumb::$THUMB_CACHE;
+        $this->thumbs_href = $this->setup->get('CACHE_PUB_HREF') . Thumb::$THUMB_CACHE;
+
+        if (!is_dir($this->thumbs_path)) {
+            @mkdir($this->thumbs_path, 0755, true);
+        }
+    }
+
+    public function thumb($type, $source_href, $width, $height) {
+        $source_path = $this->context->to_path($source_href);
+        if (!file_exists($source_path) || Util::starts_with($source_path, $this->setup->get('CACHE_PUB_PATH'))) {
+            return null;
+        }
+
+        $capture_path = $source_path;
+        if ($type === 'img') {
+            $capture_path = $source_path;
+        } elseif ($type === 'mov') {
+            if ($this->setup->get('HAS_CMD_AVCONV')) {
+                $capture_path = $this->capture(Thumb::$AVCONV_CMDV, $source_path);
+            } elseif ($this->setup->get('HAS_CMD_FFMPEG')) {
+                $capture_path = $this->capture(Thumb::$FFMPEG_CMDV, $source_path);
+            }
+        } elseif ($type === 'doc') {
+            if ($this->setup->get('HAS_CMD_CONVERT')) {
+                $capture_path = $this->capture(Thumb::$CONVERT_CMDV, $source_path);
+            } elseif ($this->setup->get('HAS_CMD_GM')) {
+                $capture_path = $this->capture(Thumb::$GM_CONVERT_CMDV, $source_path);
+            }
+        }
+
+        return $this->thumb_href($capture_path, $width, $height);
+    }
+
+    private function thumb_href($source_path, $width, $height) {
+        if (!file_exists($source_path)) {
+            return null;
+        }
+
+        $name = 'thumb-' . sha1($source_path) . '-' . $width . 'x' . $height . '.jpg';
+        $thumb_path = $this->thumbs_path . '/' . $name;
+        $thumb_href = $this->thumbs_href . '/' . $name;
+
+        if (!file_exists($thumb_path) || filemtime($source_path) >= filemtime($thumb_path)) {
+            $image = new Image();
+
+            $et = false;
+            if ($this->setup->get('HAS_PHP_EXIF') && $this->context->query_option('thumbnails.exif', false) === true && $height != 0) {
+                $et = @exif_thumbnail($source_path);
+            }
+            if($et !== false) {
+                file_put_contents($thumb_path, $et);
+                $image->set_source($thumb_path);
+                $image->normalize_exif_orientation($source_path);
+            } else {
+                $image->set_source($source_path);
+            }
+
+            $image->thumb($width, $height);
+            $image->save_dest_jpeg($thumb_path, 80);
+        }
+
+        return file_exists($thumb_path) ? $thumb_href : null;
+    }
+
+    private function capture($cmdv, $source_path) {
+        if (!file_exists($source_path)) {
+            return null;
+        }
+
+        $capture_path = $this->thumbs_path . '/capture-' . sha1($source_path) . '.jpg';
+
+        if (!file_exists($capture_path) || filemtime($source_path) >= filemtime($capture_path)) {
+            foreach ($cmdv as &$arg) {
+                $arg = str_replace('[SRC]', $source_path, $arg);
+                $arg = str_replace('[DEST]', $capture_path, $arg);
+            }
+
+            Util::exec_cmdv($cmdv);
+        }
+
+        return file_exists($capture_path) ? $capture_path : null;
+    }
+}
+
+class Image {
+    private $source_file;
+    private $source;
+    private $width;
+    private $height;
+    private $type;
+    private $dest;
+
+    public function __construct($filename = null) {
+        $this->source_file = null;
+        $this->source = null;
+        $this->width = null;
+        $this->height = null;
+        $this->type = null;
+
+        $this->dest = null;
+
+        $this->set_source($filename);
+    }
+
+    public function __destruct() {
+        $this->release_source();
+        $this->release_dest();
+    }
+
+    public function set_source($filename) {
+        $this->release_source();
+        $this->release_dest();
+
+        if (is_null($filename)) {
+            return;
+        }
+
+        $this->source_file = $filename;
+
+        list($this->width, $this->height, $this->type) = @getimagesize($this->source_file);
+
+        if (!$this->width || !$this->height) {
+            $this->source_file = null;
+            $this->width = null;
+            $this->height = null;
+            $this->type = null;
+            return;
+        }
+
+        $this->source = imagecreatefromstring(file_get_contents($this->source_file));
+    }
+
+    public function save_dest_jpeg($filename, $quality = 80) {
+        if (!is_null($this->dest)) {
+            @imagejpeg($this->dest, $filename, $quality);
+            @chmod($filename, 0775);
+        }
+    }
+
+    public function release_dest() {
+        if (!is_null($this->dest)) {
+            @imagedestroy($this->dest);
+            $this->dest = null;
+        }
+    }
+
+    public function release_source() {
+        if (!is_null($this->source)) {
+            @imagedestroy($this->source);
+            $this->source_file = null;
+            $this->source = null;
+            $this->width = null;
+            $this->height = null;
+            $this->type = null;
+        }
+    }
+
+    public function thumb($width, $height) {
+        if (is_null($this->source)) {
+            return;
+        }
+
+        $src_r = 1.0 * $this->width / $this->height;
+
+        if ($height == 0) {
+            if ($src_r >= 1) {
+                $height = 1.0 * $width / $src_r;
+            } else {
+                $height = $width;
+                $width = 1.0 * $height * $src_r;
+            }
+            if ($width > $this->width) {
+                $width = $this->width;
+                $height = $this->height;
+            }
+        }
+
+        $ratio = 1.0 * $width / $height;
+
+        if ($src_r <= $ratio) {
+            $src_w = $this->width;
+            $src_h = $src_w / $ratio;
+            $src_x = 0;
+        } else {
+            $src_h = $this->height;
+            $src_w = $src_h * $ratio;
+            $src_x = 0.5 * ($this->width - $src_w);
+        }
+
+        $width = intval($width);
+        $height = intval($height);
+        $src_x = intval($src_x);
+        $src_w = intval($src_w);
+        $src_h = intval($src_h);
+
+        $this->dest = imagecreatetruecolor($width, $height);
+        $icol = imagecolorallocate($this->dest, 255, 255, 255);
+        imagefill($this->dest, 0, 0, $icol);
+        imagecopyresampled($this->dest, $this->source, 0, 0, $src_x, 0, $width, $height, $src_w, $src_h);
+    }
+
+    public function rotate($angle) {
+        if (is_null($this->source) || ($angle !== 90 && $angle !== 180 && $angle !== 270)) {
+            return;
+        }
+
+        $this->source = imagerotate($this->source, $angle, 0);
+        if ( $angle === 90 || $angle === 270 ) {
+            list($this->width, $this->height) = [$this->height, $this->width];
+        }
+    }
+
+    public function normalize_exif_orientation($exif_source_file = null) {
+        if (is_null($this->source) || !function_exists('exif_read_data')) {
+            return;
+        }
+
+        if ($exif_source_file === null) {
+            $exif_source_file = $this->source_file;
+        }
+
+        $exif = exif_read_data($exif_source_file);
+        switch (@$exif['Orientation']) {
+            case 3:
+                $this->rotate(180);
+                break;
+            case 6:
+                $this->rotate(270);
+                break;
+            case 8:
+                $this->rotate(90);
+                break;
+        }
+    }
+}
diff --git a/container/srv-http/root/srv/_h5ai/private/php/pages/index.php b/container/srv-http/root/srv/_h5ai/private/php/pages/index.php
new file mode 100755
index 0000000..7885a87
--- /dev/null
+++ b/container/srv-http/root/srv/_h5ai/private/php/pages/index.php
@@ -0,0 +1,2 @@
+<?php header('Content-type: text/html;charset=utf-8'); ?><!DOCTYPE html><html class="no-js" lang="en"><head><meta charset="utf-8"><meta http-equiv="x-ua-compatible" content="ie=edge"><title>index - powered by h5ai v0.29.2 (https://larsjung.de/h5ai/)</title><meta name="description" content="index - powered by h5ai v0.29.2 (https://larsjung.de/h5ai/)"><meta name="viewport" content="width=device-width, initial-scale=1"><link rel="shortcut icon" href="<?= $public_href; ?>images/favicon/favicon-16-32.ico"><link rel="apple-touch-icon-precomposed" type="image/png" href="<?= $public_href; ?>images/favicon/favicon-152.png"><link rel="stylesheet" href="<?= $public_href; ?>css/styles.css"><?php if (!$fallback_mode) { ?><script src="<?= $public_href; ?>js/scripts.js" data-module="index"></script><?php } ?>
+<?= $x_head_tags; ?></head><body class="index" id="root"><div id="fallback-hints"><?php if (!$fallback_mode) { ?><span class="noJsMsg">Works best with JavaScript enabled!</span><span class="noBrowserMsg">Works best in <a href="http://browsehappy.com">modern browsers</a>!</span><?php } ?><span class="backlink"><a href="https://larsjung.de/h5ai/" title="h5ai v0.29.2 - Modern HTTP web server index.">powered by h5ai</a></span></div><div id="fallback"><?= $fallback_html; ?></div></body></html><!-- h5ai v0.29.2 - https://larsjung.de/h5ai/ -->
\ No newline at end of file
diff --git a/container/srv-http/root/srv/_h5ai/private/php/pages/info.php b/container/srv-http/root/srv/_h5ai/private/php/pages/info.php
new file mode 100755
index 0000000..59a8e08
--- /dev/null
+++ b/container/srv-http/root/srv/_h5ai/private/php/pages/info.php
@@ -0,0 +1,2 @@
+<?php header('Content-type: text/html;charset=utf-8'); ?><!DOCTYPE html><html class="no-js" lang="en"><head><meta charset="utf-8"><meta http-equiv="x-ua-compatible" content="ie=edge"><title>h5ai info page - v0.29.2</title><meta name="description" content="h5ai info page - v0.29.2"><meta name="viewport" content="width=device-width, initial-scale=1"><link rel="shortcut icon" href="<?= $public_href; ?>images/favicon/favicon-16-32.ico"><link rel="apple-touch-icon-precomposed" type="image/png" href="<?= $public_href; ?>images/favicon/favicon-152.png"><link rel="stylesheet" href="<?= $public_href; ?>css/styles.css"><?php if (!$fallback_mode) { ?><script src="<?= $public_href; ?>js/scripts.js" data-module="info"></script><?php } ?>
+<?= $x_head_tags; ?></head><body class="info" id="root"><div id="fallback-hints"><?php if (!$fallback_mode) { ?><span class="noJsMsg">Works best with JavaScript enabled!</span><span class="noBrowserMsg">Works best in <a href="http://browsehappy.com">modern browsers</a>!</span><?php } ?><span class="backlink"><a href="https://larsjung.de/h5ai/" title="h5ai v0.29.2 - Modern HTTP web server index.">powered by h5ai</a></span></div><div id="content"><h1 id="header"><a href="https://larsjung.de/h5ai/">h5ai</a></h1></div></body></html><!-- h5ai v0.29.2 - https://larsjung.de/h5ai/ -->
\ No newline at end of file
diff --git a/container/srv-http/root/srv/_h5ai/public/.htaccess b/container/srv-http/root/srv/_h5ai/public/.htaccess
new file mode 100755
index 0000000..3f14990
--- /dev/null
+++ b/container/srv-http/root/srv/_h5ai/public/.htaccess
@@ -0,0 +1,13 @@
+## make this folder accessible
+
+# Apache < 2.3
+<IfModule !mod_authz_core.c>
+    Order allow,deny
+    Allow from all
+    Satisfy All
+</IfModule>
+
+# Apache ≥ 2.3
+<IfModule mod_authz_core.c>
+    Require all granted
+</IfModule>
diff --git a/container/srv-http/root/srv/_h5ai/public/cache/README.md b/container/srv-http/root/srv/_h5ai/public/cache/README.md
new file mode 100755
index 0000000..fd2974c
--- /dev/null
+++ b/container/srv-http/root/srv/_h5ai/public/cache/README.md
@@ -0,0 +1,9 @@
+# Cache
+
+Public cache.
+
+This directory is used for server side caching. To use caching make this
+directory writable for your webserver.
+
+There is no critical data in here. You can savely remove any content. This
+will clear the cache.
diff --git a/container/srv-http/root/srv/_h5ai/public/css/styles.css b/container/srv-http/root/srv/_h5ai/public/css/styles.css
new file mode 100755
index 0000000..87bf906
--- /dev/null
+++ b/container/srv-http/root/srv/_h5ai/public/css/styles.css
@@ -0,0 +1,2 @@
+/* h5ai v0.29.2 - https://larsjung.de/h5ai/ */
+@charset "utf-8";/*! normalize.css v8.0.1 | MIT License | github.com/necolas/normalize.css */html{line-height:1.15;-webkit-text-size-adjust:100%}body{margin:0}main{display:block}h1{font-size:2em;margin:.67em 0}hr{box-sizing:content-box;height:0;overflow:visible}pre{font-family:monospace,monospace;font-size:1em}a{background-color:transparent}abbr[title]{border-bottom:0;text-decoration:underline;-webkit-text-decoration:underline dotted;text-decoration:underline dotted}b,strong{font-weight:bolder}code,kbd,samp{font-family:monospace,monospace;font-size:1em}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-0.25em}sup{top:-0.5em}img{border-style:none}button,input,optgroup,select,textarea{font-family:inherit;font-size:100%;line-height:1.15;margin:0}button,input{overflow:visible}button,select{text-transform:none}button,[type="button"],[type="reset"],[type="submit"]{-webkit-appearance:button}button::-moz-focus-inner,[type="button"]::-moz-focus-inner,[type="reset"]::-moz-focus-inner,[type="submit"]::-moz-focus-inner{border-style:none;padding:0}button:-moz-focusring,[type="button"]:-moz-focusring,[type="reset"]:-moz-focusring,[type="submit"]:-moz-focusring{outline:1px dotted ButtonText}fieldset{padding:.35em .75em .625em}legend{box-sizing:border-box;color:inherit;display:table;max-width:100%;padding:0;white-space:normal}progress{vertical-align:baseline}textarea{overflow:auto}[type="checkbox"],[type="radio"]{box-sizing:border-box;padding:0}[type="number"]::-webkit-inner-spin-button,[type="number"]::-webkit-outer-spin-button{height:auto}[type="search"]{-webkit-appearance:textfield;outline-offset:-2px}[type="search"]::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}details{display:block}summary{display:list-item}template{display:none}[hidden]{display:none}::-moz-selection{color:#fff;background:#ff4081;text-shadow:none}::selection{color:#fff;background:#ff4081;text-shadow:none}*:focus{outline:0}code,pre{font-family:"Ubuntu Mono","Monaco","Lucida Sans Typewriter","monospace";font-size:15px;font-weight:normal;color:rgba(0,0,0,0.87)}audio,canvas,iframe,img,svg,video{vertical-align:middle}textarea{resize:vertical}.hidden{display:none!important}.invisible{visibility:hidden}.clearfix:before,.clearfix:after{content:" ";display:table}.clearfix:after{clear:both}.raised{box-shadow:0 1px 10px 0 rgba(0,0,0,0.5)}.popup{box-shadow:0 1px 20px 0 rgba(0,0,0,0.5)}.rounded{border-radius:2px}.clear-appearance{-moz-appearance:none;-ms-appearance:none;-webkit-appearance:none}.eased-transition{transition:all .2s ease-in-out}.flex-base{display:flex;flex-wrap:nowrap;justify-content:flex-start;align-content:flex-start;align-items:stretch}.flex-column{display:flex;flex-wrap:nowrap;justify-content:flex-start;align-content:flex-start;align-items:stretch;flex-direction:column}.flex-row{display:flex;flex-wrap:nowrap;justify-content:flex-start;align-content:flex-start;align-items:stretch;flex-direction:row}.el-button{border-radius:2px;transition:all .2s ease-in-out;color:#fff;background:#42a5f5;cursor:pointer;text-decoration:none}.el-button:hover{box-shadow:0 1px 10px 0 rgba(0,0,0,0.5)}.el-input{border-radius:2px;-moz-appearance:none;-ms-appearance:none;-webkit-appearance:none;background:#fff;border:0;outline:0;background:#fafafa;border:1px solid rgba(0,0,0,0.05)}#cm-overlay{position:fixed;left:0;top:0;right:0;bottom:0;overflow:hidden;z-index:200}#cm-overlay .cm-panel{box-shadow:0 1px 20px 0 rgba(0,0,0,0.5);border-radius:2px;display:block;position:absolute;left:100px;top:100px;color:rgba(0,0,0,0.87);background:#fff;z-index:10;overflow:auto;min-width:200px}#cm-overlay .cm-panel ul{margin:0;padding:0;list-style:none;text-align:left}#cm-overlay .cm-label{padding:8px 16px;white-space:nowrap;font-weight:bold}#cm-overlay .cm-entry{padding:8px 16px;white-space:nowrap;cursor:pointer}#cm-overlay .cm-entry:hover{color:#42a5f5;background:rgba(0,0,0,0.03)}#cm-overlay .cm-icon{position:relative;top:-2px}#cm-overlay .cm-icon img{width:20px;height:20px}#cm-overlay .cm-icon.no-icon{opacity:0}#cm-overlay .cm-text{margin:0 0 0 12px}#cm-overlay .cm-sep{height:1px;margin:8px 0;padding:0;border-top:1px solid rgba(0,0,0,0.08)}#crumbbar{overflow:hidden;height:48px;font-size:16px;padding:0 8px}#crumbbar a,#crumbbar a:active,#crumbbar a:visited{color:rgba(0,0,0,0.87);cursor:pointer;text-decoration:none}#crumbbar a.active,#crumbbar a:active.active,#crumbbar a:visited.active{font-weight:bold}#crumbbar a:hover,#crumbbar a:active:hover,#crumbbar a:visited:hover{color:#42a5f5}#crumbbar a:focus,#crumbbar a:active:focus,#crumbbar a:visited:focus{outline:0}#crumbbar .crumb{transition:all .2s ease-in-out;display:inline-block}#crumbbar .sep{width:24px;height:24px;padding:12px 0;line-height:48px;display:inline-block;vertical-align:top}#crumbbar .crumb:first-of-type .sep{width:0}#crumbbar .label{line-height:48px;display:inline-block;vertical-align:top;padding:0 8px}#crumbbar .hint{width:20px;height:20px;padding:16px 0 0 0;line-height:48px;display:inline-block;vertical-align:top;position:relative;top:-2px}#content-header,#content-footer{margin:16px;padding:8px;color:rgba(0,0,0,0.87)}#content-header a,#content-footer a,#content-header a:active,#content-footer a:active,#content-header a:visited,#content-footer a:visited{color:#42a5f5;text-decoration:none;cursor:pointer}#content-header a:hover,#content-footer a:hover,#content-header a:active:hover,#content-footer a:active:hover,#content-header a:visited:hover,#content-footer a:visited:hover{color:#212121}#content-header h1,#content-footer h1,#content-header h2,#content-footer h2,#content-header h3,#content-footer h3,#content-header h4,#content-footer h4,#content-header h5,#content-footer h5,#content-header h6,#content-footer h6,#content-header p,#content-footer p{margin:.1em 0}#filter input{display:none;border:0;font-size:16px;color:rgba(0,0,0,0.87);background:transparent;outline:0;width:160px;padding:0 12px 0 4px;line-height:48px;vertical-align:top}#filter.active input{display:inline-block}#filter.pending input{color:rgba(0,0,0,0.26)}#info{overflow:auto;flex:0 0 auto;order:99;padding:32px 32px 32px 48px;white-space:nowrap;overflow-x:hidden;width:240px}#info .icon{width:240px;height:180px}#info .icon img{border-radius:2px;display:block;overflow:hidden;margin:0 auto;width:180px;height:180px}#info .icon .thumb{width:240px}#info .block{border-top:1px solid rgba(0,0,0,0.05);border-bottom:1px solid rgba(0,0,0,0.05);margin:0 0 24px 0;padding:24px 0}#info .label{font-size:16px;margin-bottom:16px}#info .time,#info .size,#info .content{line-height:20px;height:20px}#info .qrcode{margin:0 auto;width:200px}#info .qrcode img{display:block}#pv-content-aud{box-shadow:0 1px 10px 0 rgba(0,0,0,0.5);position:absolute;max-width:100%;max-height:100%}#pv-content-img{box-shadow:0 1px 10px 0 rgba(0,0,0,0.5);position:absolute;max-width:100%;max-height:100%;background-color:#f8f8f8;background-image:-webkit-linear-gradient(45deg,#e8e8e8 25%,transparent 25%,transparent 75%,#e8e8e8 75%,#e8e8e8),-webkit-linear-gradient(45deg,#e8e8e8 25%,transparent 25%,transparent 75%,#e8e8e8 75%,#e8e8e8);background-size:60px 60px;background-position:0 0,30px 30px}#pv-content-img.loading{opacity:.5;margin-top:32px;width:240px;height:240px;border-radius:1000px;overflow:hidden}#pv-content-txt{box-shadow:0 1px 10px 0 rgba(0,0,0,0.5);box-sizing:border-box;max-width:960px;text-align:left;background:#fff;margin:0 auto;padding:8px;overflow:auto}#pv-content-txt a,#pv-content-txt a:active,#pv-content-txt a:visited{color:#2080ff;text-decoration:none;cursor:pointer}#pv-content-txt a:hover,#pv-content-txt a:active:hover,#pv-content-txt a:visited:hover{color:#68a9ff}pre#pv-content-txt code{line-height:1.2em}div#pv-content-txt{font-size:1.1em;padding:8px 24px}div#pv-content-txt code{color:#008200}#pv-content-vid{box-shadow:0 1px 10px 0 rgba(0,0,0,0.5);position:absolute;max-width:100%;max-height:100%}#pv-content-vid:-webkit-full-screen{top:auto!important;left:auto!important}#pv-overlay{position:fixed;left:0;top:0;right:0;bottom:0;z-index:100;background:rgba(0,0,0,0.5);transition:background-color .3s ease-in-out;text-align:center}#pv-overlay.fullscreen{background:#212121}#pv-container{position:absolute}#pv-spinner{position:absolute}#pv-spinner .back{width:240px;height:240px;margin:-120px -120px;border-radius:120px;opacity:.5;overflow:hidden}#pv-spinner .spinner{width:100px;height:100px;margin:-50px -50px}#pv-prev-area,#pv-next-area{position:absolute;top:50%;cursor:pointer}#pv-prev-area img,#pv-next-area img{transition:all .2s ease-in-out;display:block;width:48px;height:48px;margin:-36px 0;padding:12px;opacity:.5}#pv-prev-area:hover img,#pv-next-area:hover img{box-shadow:0 1px 10px 0 rgba(0,0,0,0.5);opacity:1;background:rgba(27,27,27,0.8)}#pv-prev-area{left:0}#pv-prev-area img{border-radius:0 8px 8px 0;padding-left:48px}#pv-next-area{right:0}#pv-next-area img{border-radius:8px 0 0 8px;padding-right:48px}#pv-buttons{list-style:none;list-style-image:none;margin:0;padding:0}#pv-buttons img{position:relative;width:24px;height:24px;padding:12px}#pv-buttons .bar-label{transition:all .2s ease-in-out;display:block;color:#fff;height:48px;line-height:48px;padding:0 12px;opacity:.7}#pv-buttons .bar-button{transition:all .2s ease-in-out;display:block;line-height:48px;opacity:.7;cursor:pointer}#pv-buttons .bar-button:hover{opacity:1;background:rgba(255,255,255,0.1)}#pv-buttons .bar-left{float:left}#pv-buttons .bar-right{float:right}#pv-bottombar{box-shadow:0 1px 10px 0 rgba(0,0,0,0.5);position:fixed;z-index:5;left:0;right:0;bottom:0;background:#1b1b1b;height:48px}#pv-overlay.fullscreen #pv-bottombar{opacity:.5}@media only screen and (max-width:700px){#pv-prev-area,#pv-next-area{display:none!important}}#search input{display:none;border:0;font-size:16px;color:rgba(0,0,0,0.87);background:transparent;outline:0;width:160px;padding:0 12px 0 4px;line-height:48px;vertical-align:top}#search.active input{display:inline-block}#search.pending input{color:rgba(0,0,0,0.26)}#selection-rect{position:absolute;left:0;top:0;z-index:2;border:1px dashed rgba(0,0,0,0.15);background:rgba(0,0,0,0.1)}html.drag-select,html.drag-select *{cursor:move!important;-webkit-touch-callout:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}html.drag-select #view .item:hover,html.drag-select * #view .item:hover{box-shadow:none!important}#view .selector{display:none;position:absolute;left:0;top:0;width:22px;height:22px;background:#42a5f5;cursor:pointer;border-radius:0 0 2px 0;opacity:.6}#view .selector:hover{opacity:.8}#view .selector img{width:100%;height:100%}#view .item:hover .selector{display:block}#view .item.selected:not(.selecting),#view .item.selecting:not(.selected){color:#fff;background:#42a5f5}#view .item.selected:not(.selecting) .selector,#view .item.selecting:not(.selected) .selector{display:block;opacity:1}#view .item.selected:not(.selecting):hover,#view .item.selecting:not(.selected):hover{color:#fff;background:#42a5f5}#view .no-match{display:none;margin-top:36px;text-align:center;color:rgba(0,0,0,0.05);font-size:5em;font-weight:bold}#tree{overflow:auto;flex:0 0 auto;order:1;padding:32px 32px 32px 16px;white-space:nowrap;max-width:250px;overflow-x:hidden}#tree a,#tree a:active,#tree a.visited{display:block;margin-left:20px;padding:3px 0;text-decoration:none;color:rgba(0,0,0,0.87)}#tree a:hover,#tree a:active:hover,#tree a.visited:hover{color:#42a5f5}#tree .active>a{font-weight:bold}#tree .indicator{display:block;float:left;padding:3px 0;position:relative;top:-2px;cursor:pointer}#tree .indicator img{width:20px;height:20px;zoom:1}#tree .item{clear:left}#tree .item.open>.indicator img{-webkit-transform:rotate(90deg);transform:rotate(90deg)}#tree .item.unknown>.indicator{opacity:.3}#tree .item.none>.indicator{opacity:0;cursor:inherit}#tree .item.unknown>.content,#tree .item.none>.content,#tree .item.closed>.content{display:none}#tree .icon{position:relative;top:-2px}#tree .icon img{width:20px;height:20px}#tree .label{margin:0 0 0 4px}#tree .content{margin:0;padding:0 0 0 20px}#tree .summary{color:rgba(0,0,0,0.26);padding:0 0 0 8px}#root.info #content{flex:1 1 auto;order:50;color:rgba(0,0,0,0.87);text-align:center}#root.info code{margin:0 .2em;padding:2px 4px;border-radius:4px;letter-spacing:.05em;background:#fafafa;border:1px solid rgba(0,0,0,0.05);font-size:.9em}#root.info #header a{transition:all .2s ease-in-out;font-size:4em;font-weight:300;margin:.8em 0 0 0;color:rgba(0,0,0,0.87);text-decoration:none}#root.info #header a:hover{color:#42a5f5}#root.info #support{margin:24px auto;padding:18px 0 6px 0;width:292px;background:#fafafa;border:1px solid rgba(0,0,0,0.05);border-radius:4px}#root.info #support input[type="image"]{border:0;width:100px;padding:12px 48px}#root.info #pass{border-radius:2px;-moz-appearance:none;-ms-appearance:none;-webkit-appearance:none;background:#fff;border:0;outline:0;background:#fafafa;border:1px solid rgba(0,0,0,0.05);display:inline-block;margin:8px;padding:0 12px;line-height:28px;width:200px;vertical-align:top}#root.info #login,#root.info #logout{border-radius:2px;transition:all .2s ease-in-out;color:#fff;background:#42a5f5;cursor:pointer;text-decoration:none;display:inline-block;margin:8px;padding:0 12px;line-height:28px;vertical-align:top}#root.info #login:hover,#root.info #logout:hover{box-shadow:0 1px 10px 0 rgba(0,0,0,0.5)}#root.info #hint{margin:12px auto;width:320px}#root.info #tests{display:inline-block;text-align:left;list-style-type:none;margin:48px 0;padding:0}#root.info #tests .test{background:#fff;margin:12px 0 0 0;padding:8px 12px 12px 12px;border-bottom:1px solid rgba(0,0,0,0.05)}#root.info #tests .label{display:inline-block;width:250px;font-size:1.4em}#root.info #tests .result{display:inline-block;width:250px;text-align:right;font-size:1.4em;font-weight:bold}#root.info #tests .result.passed{color:#4caf50}#root.info #tests .result.failed{color:#f44336}#root.info #tests .info{margin:4px 0 0 0}#content{overflow:auto;flex:1 1 auto;order:50;position:relative}#fallback{display:none;max-width:960px;margin:16px auto;padding:32px 16px}#fallback table{display:block;width:100%;border-collapse:collapse;background:#fff}#fallback th,#fallback td{padding:6px;text-align:left;border:0;border-bottom:1px solid #f0f0f0}#fallback th{color:#aaa;font-weight:normal;line-height:36px}#fallback td{overflow:hidden;white-space:nowrap}#fallback a,#fallback a:active,#fallback a:visited{display:block;color:inherit;text-decoration:none;cursor:pointer}#fallback a:hover,#fallback a:active:hover,#fallback a:visited:hover{color:#42a5f5}#fallback .fb-i{width:20px;padding-left:12px}#fallback .fb-i img{width:20px;height:20px;position:relative;top:-1px}#fallback .fb-n{width:682px;max-width:682px}#fallback .fb-d{text-align:right;width:160px;min-width:160px}#fallback .fb-s{text-align:right;width:70px;min-width:70px;padding-right:12px}#fallback-hints{display:none;overflow:hidden;text-align:right;background:#fafafa;border-bottom:1px solid rgba(0,0,0,0.05)}#fallback-hints a,#fallback-hints a:active,#fallback-hints a:visited{transition:all .2s ease-in-out;display:inline-block;line-height:48px;color:rgba(0,0,0,0.54);text-decoration:none;outline:0}#fallback-hints a:hover,#fallback-hints a:active:hover,#fallback-hints a:visited:hover{color:#42a5f5}#fallback-hints .backlink{margin:0 16px}#fallback-hints .noJsMsg,#fallback-hints .noBrowserMsg{display:none;margin:0 16px;color:#f44336}html.no-js #root,html.no-browser #root{position:static;overflow:auto}html.no-js #fallback,html.no-browser #fallback,html.no-js #fallback-hints,html.no-browser #fallback-hints{display:block}html.no-js .noJsMsg{display:inline!important}html.no-browser .noBrowserMsg{display:inline!important}#mainrow{display:flex;flex-wrap:nowrap;justify-content:flex-start;align-content:flex-start;align-items:stretch;flex-direction:row;flex:1 1 auto;order:50;height:0}#notification{position:fixed;left:50%;width:200px;margin-left:-100px;z-index:100;padding:3px 6px 6px 6px;color:#fff;background:rgba(0,0,0,0.2);border-radius:0 0 4px 4px;text-align:center;overflow:hidden}#root{display:flex;flex-wrap:nowrap;justify-content:flex-start;align-content:flex-start;align-items:stretch;flex-direction:column;position:absolute;left:0;top:0;right:0;bottom:0;overflow:hidden;background:#fff;line-height:1.4}#root,input,select{font-family:"Ubuntu","Roboto","Helvetica","Arial","sans-serif";font-size:13px;font-weight:normal;color:rgba(0,0,0,0.87)}#sidebar{overflow-x:hidden;overflow-y:auto;flex:0 0 auto;order:0;background:#fafafa;border-right:1px solid rgba(0,0,0,0.05);padding:16px;position:absolute;top:48px;min-height:100%;z-index:1}#sidebar .block{display:block;margin:0 0 24px 0;width:168px}#sidebar .block h1{font-size:1em;margin:2px 0 6px 0}#sidebar .button{border-radius:2px;transition:all .2s ease-in-out;display:inline-block;margin:4px;color:rgba(0,0,0,0.87);cursor:pointer}#sidebar .button:hover{background:rgba(0,0,0,0.03)}#sidebar .button.active{background:rgba(0,0,0,0.03);box-shadow:inset 0 0 4px 0 rgba(0,0,0,0.4)}#sidebar .button img{width:24px;height:24px;padding:12px}#sidebar .select{border-radius:2px;background:transparent;overflow:hidden;outline:0;width:160px;margin:4px;line-height:48px}#sidebar input,#sidebar select{-moz-appearance:none;-ms-appearance:none;-webkit-appearance:none;background:transparent;width:100%;border:0 solid #000;cursor:pointer;outline:0}#sidebar input:hover,#sidebar select:hover{background:rgba(0,0,0,0.03)}#sidebar select{width:187px;padding:0 8px;height:48px;line-height:48px}#sidebar input[type='range']{border-radius:2px;width:144px;margin:4px;padding:8px;vertical-align:middle;height:32px;line-height:32px}#sidebar .range-track{-moz-appearance:none;-ms-appearance:none;-webkit-appearance:none;border-width:0;border-radius:20px;background:#e0e0e0;height:6px}#sidebar .range-thumb{-moz-appearance:none;-ms-appearance:none;-webkit-appearance:none;border-width:0;border-radius:20px;background:#616161;width:16px;height:16px}#sidebar input[type='range']::-webkit-slider-runnable-track{-moz-appearance:none;-ms-appearance:none;-webkit-appearance:none;border-width:0;border-radius:20px;background:#e0e0e0;height:6px}#sidebar input[type='range']::-moz-range-track{-moz-appearance:none;-ms-appearance:none;-webkit-appearance:none;border-width:0;border-radius:20px;background:#e0e0e0;height:6px}#sidebar input[type='range']::-ms-track{-moz-appearance:none;-ms-appearance:none;-webkit-appearance:none;border-width:0;border-radius:20px;background:#e0e0e0;height:6px}#sidebar input[type='range']::-ms-fill-lower{-moz-appearance:none;-ms-appearance:none;-webkit-appearance:none;border-width:0;border-radius:20px;background:#e0e0e0;height:6px}#sidebar input[type='range']::-ms-fill-upper{-moz-appearance:none;-ms-appearance:none;-webkit-appearance:none;border-width:0;border-radius:20px;background:#e0e0e0;height:6px}#sidebar input[type='range']::-webkit-slider-thumb{-moz-appearance:none;-ms-appearance:none;-webkit-appearance:none;border-width:0;border-radius:20px;background:#616161;width:16px;height:16px;margin-top:-5px}#sidebar input[type='range']::-moz-range-thumb{-moz-appearance:none;-ms-appearance:none;-webkit-appearance:none;border-width:0;border-radius:20px;background:#616161;width:16px;height:16px}#sidebar input[type='range']::-ms-thumb{-moz-appearance:none;-ms-appearance:none;-webkit-appearance:none;border-width:0;border-radius:20px;background:#616161;width:16px;height:16px}#sidebar #view-size{display:block}#topbar{display:flex;flex-wrap:nowrap;justify-content:flex-start;align-content:flex-start;align-items:stretch;flex-direction:row;overflow:hidden;flex:0 0 auto;order:1;background:#fafafa;border-bottom:1px solid rgba(0,0,0,0.05);z-index:1}#toolbar{overflow:hidden;flex:0 0 auto;order:1;height:48px}#toolbar .tool{transition:all .2s ease-in-out;display:inline-block;cursor:pointer}#toolbar .tool img{display:inline-block;width:24px;height:24px;padding:12px}#toolbar .tool:hover{background:rgba(0,0,0,0.03)}#flowbar{overflow:hidden;flex:1 1 auto;order:2;height:48px}#backlink{transition:all .2s ease-in-out;display:block;flex:0 0 auto;order:99;text-align:center;padding:6px 12px;overflow:hidden;height:36px}#backlink,#backlink:active,#backlink:visited{color:rgba(0,0,0,0.26);cursor:pointer;text-decoration:none}#backlink:hover{color:#42a5f5;background:rgba(0,0,0,0.03)}#backlink:focus{outline:0}#backlink div{line-height:18px;white-space:nowrap}#view.view-details{margin:32px}#view.view-details .header{position:relative;white-space:nowrap;display:list-item;border-bottom:1px solid rgba(0,0,0,0.07);border-radius:2px 2px 0 0}#view.view-details .header .label,#view.view-details .header .date,#view.view-details .header .size{transition:all .2s ease-in-out;line-height:24px;padding:0 8px 16px 8px;opacity:.4;outline:0}#view.view-details .header .label:hover,#view.view-details .header .date:hover,#view.view-details .header .size:hover{opacity:1;color:#42a5f5}#view.view-details .header .sort{display:none;position:relative;top:-2px;width:20px;height:20px;padding:0 4px}#view.view-details .header .ascending .sort{display:inline}#view.view-details .header .descending .sort{display:inline;-webkit-transform:rotate(180deg);transform:rotate(180deg);zoom:1}#view.view-details .item{overflow:hidden;border-bottom:1px solid rgba(0,0,0,0.07)}#view.view-details .item:hover{box-shadow:0 1px 10px 0 rgba(0,0,0,0.5);z-index:1}#view.view-details .item:last-child{border-radius:0 0 2px 2px}#view.view-details .square{display:inline-block;position:absolute;left:16px;top:-1px;padding:8px}#view.view-details .square .thumb{border-radius:2px;box-shadow:0 0 1px 0 rgba(0,0,0,0.2)}#view.view-details .label,#view.view-details .date,#view.view-details .size{padding:0 8px}#view.view-details .date{position:absolute;right:116px;top:0}#view.view-details .size{position:absolute;right:16px;top:0}#view.view-details .item .label,#view.view-details .item .date,#view.view-details .item .size{line-height:30px}#view.view-details .square{width:16px;height:16px}#view.view-details .square img{width:16px;height:16px}#view.view-details .label{margin:0 246px 0 48px}#view.view-details.width-0 .label{margin-right:4px}#view.view-details.width-0 .date{display:none}#view.view-details.width-0 .size{display:none}#view.view-details.width-1 .label{margin-right:64px}#view.view-details.width-1 .date{display:none}#view.view-grid{margin:28px}#view.view-grid .item{border-radius:2px;overflow:hidden;float:left;margin:8px}#view.view-grid .item:hover{box-shadow:0 1px 10px 0 rgba(0,0,0,0.5)}#view.view-grid .square{display:inline-block;vertical-align:top}#view.view-grid .label{display:inline-block;vertical-align:top;width:180px;padding:0 8px}#view.view-grid .date,#view.view-grid .size{display:none}#view.view-grid .label{line-height:48px}#view.view-grid .square{width:48px;height:48px}#view.view-grid .square img{width:48px;height:48px}#view.view-icons{margin:28px}#view.view-icons .item{border-radius:2px;overflow:hidden;float:left;margin:8px}#view.view-icons .item:hover{box-shadow:0 1px 10px 0 rgba(0,0,0,0.5)}#view.view-icons .landscape{display:block;background:#fafafa}#view.view-icons .label{padding:0 6px;line-height:24px;text-align:center}#view.view-icons .date,#view.view-icons .size{display:none}#view.view-icons .item{width:128px}#view.view-icons .landscape{width:128px;height:96px}#view.view-icons .landscape img{width:96px;height:96px}#view.view-icons .landscape .thumb{width:128px}#view a,#view a:active,#view a:visited{display:block;color:inherit;cursor:pointer;text-decoration:none}#view ul{margin:0;padding:0;list-style:none}#view .header{display:none}#view .item{position:relative;white-space:nowrap;background:#fff}#view .item:hover{color:#42a5f5;background:#fafafa}#view .folder-parent .date,#view .folder-parent .size{display:none}#view .icon{display:none;text-align:center}#view .icon img{position:relative;top:50%;-webkit-transform:translateY(-50%);transform:translateY(-50%)}#view .icon .thumb{max-width:none;max-height:none}#view .label{display:block;overflow:hidden;text-align:left;text-overflow:ellipsis}#view .date{text-align:right;width:130px}#view .size{text-align:right;width:80px}#view #view-hint{display:block;margin-top:36px;text-align:center;color:rgba(0,0,0,0.05);font-size:5em;font-weight:bold}@media only screen and (max-width:700px){#crumbbar .crumb:not(.active){display:none}#crumbbar .crumb.active .sep{width:0}#tree,#info{display:none!important}}@media print{*,*:before,*:after,*:first-letter ,*:first-line {background:transparent!important;color:#000!important;box-shadow:none!important;text-shadow:none!important}#toolbar,#sidebar,#tree,#info{display:none!important}}
\ No newline at end of file
diff --git a/container/srv-http/root/srv/_h5ai/public/ext/README.md b/container/srv-http/root/srv/_h5ai/public/ext/README.md
new file mode 100755
index 0000000..7f9460c
--- /dev/null
+++ b/container/srv-http/root/srv/_h5ai/public/ext/README.md
@@ -0,0 +1,4 @@
+# Extensions
+
+This directory is used for additional script and style files. You have to add
+them manualy to the `resources` section in `_h5ai/private/conf/options.json`.
diff --git a/container/srv-http/root/srv/_h5ai/public/images/fallback/file.png b/container/srv-http/root/srv/_h5ai/public/images/fallback/file.png
new file mode 100755
index 0000000000000000000000000000000000000000..c796a825dc0d1f519a95280ea35fa9202b11b3bf
GIT binary patch
literal 118
zcmeAS@N?(olHy`uVBq!ia0vp^A|TAc1|)ksWqE;=t*47)NCo5DGuFHe20TYDOxSZ+
z_?d3=DewOqpL{(U>zS2u`=n!`NVDOIGA5A*237@U#uK|ZbT&Br<NDBK^}P7>*$E2I
R*8&Y<@O1TaS?83{1OS-LCuslx
literal 0
HcmV?d00001
diff --git a/container/srv-http/root/srv/_h5ai/public/images/fallback/folder-parent.png b/container/srv-http/root/srv/_h5ai/public/images/fallback/folder-parent.png
new file mode 100755
index 0000000000000000000000000000000000000000..38da20dc9262f05651d048f7bbeabf65c50a917f
GIT binary patch
literal 108
zcmeAS@N?(olHy`uVBq!ia0vp^A|TAc1|)ksWqE;=v8Rh;NCji^0$T~z#Kc5i1s~JH
zPR`E%oi~b^@^VW)Yn#~gGEw1aoZP;)tU&YE7kPV_7+x9Y3kGj{{|cy`!PC{xWt~$(
F696kY9+Ch6
literal 0
HcmV?d00001
diff --git a/container/srv-http/root/srv/_h5ai/public/images/fallback/folder.png b/container/srv-http/root/srv/_h5ai/public/images/fallback/folder.png
new file mode 100755
index 0000000000000000000000000000000000000000..d4722e788e8e965c019daf82408d6b77f43def6f
GIT binary patch
literal 99
zcmeAS@N?(olHy`uVBq!ia0vp^A|TAc1|)ksWqE;=mZytjNCjiE#6blUlP~sWGGb!a
w9A-97k?t~>AY@~})+c3=^<YJ#vN!|7p(V4c9yRbW0d+BWy85}Sb4q9e0QU|UrvLx|
literal 0
HcmV?d00001
diff --git a/container/srv-http/root/srv/_h5ai/public/images/favicon/favicon-152.png b/container/srv-http/root/srv/_h5ai/public/images/favicon/favicon-152.png
new file mode 100755
index 0000000000000000000000000000000000000000..3666dfce1609fa22c165921b6c7c04c29333174a
GIT binary patch
literal 219
zcmeAS@N?(olHy`uVBq!ia0vp^GeDSy8A!f*V=Dxt_yc@GT!C~b65u!G*8>W%mIV0)
zGc^2vpzvi^xHC|o%+tj&q=ND78E;0W03K$?f`+y$PApgUYl(dDJ6-R7AV$SA{`sut
zNjG(7EKM=vPSc!uwkgspZF9mjoI+(K#z>(0z!_BFGwF-&J4?=amST}JZGkRe@O1Ta
JS?83{1OUMlPdESo
literal 0
HcmV?d00001
diff --git a/container/srv-http/root/srv/_h5ai/public/images/favicon/favicon-16-32.ico b/container/srv-http/root/srv/_h5ai/public/images/favicon/favicon-16-32.ico
new file mode 100755
index 0000000000000000000000000000000000000000..be172231b6902c8f86a2695285a78e4b0f745e6c
GIT binary patch
literal 5430
zcmeH~;SGX7422)+0E}?Ij9cguFoRpj1kT|YY<9ki{3xOELaxTdUeX-*a_xhUatT0#
z9oiP06Rro~2q2|t{h)rQcA~~h?wE8=0QFxSUDxF;F+a<eT*-<2i9qnP`>*f&VeS)a
zw)mCgS~b6=XMP0|LsJ+x?tAA*o}4p@abd`L^cr&T#0UZ_1gvkxOJClCmycC9{51iK
zlb5dD0WTk`Zun~g7AG%VyT|+Y;%wCo{+fWr$xGMn(f?kYt-8Tq6R<dy=r#VQN_^J#
p)bJJ(YqdXVwY<0Z*Ywt%5UYP8kQZYF_I2Z&N8A`WkIll2%O}^3O?3bO
literal 0
HcmV?d00001
diff --git a/container/srv-http/root/srv/_h5ai/public/images/favicon/favicon-16.png b/container/srv-http/root/srv/_h5ai/public/images/favicon/favicon-16.png
new file mode 100755
index 0000000000000000000000000000000000000000..d7dd0f9a7a2b31f352fdcd9dc472f68e832a0275
GIT binary patch
literal 96
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`>Ygr+Ar*|t5;6)VCSUB$WW>a-
tIc#ARkz@+;;9E9}aWPwul)(oEhHuWskKC<%qk&o&JYD@<);T3K0RX3>7Rvwt
literal 0
HcmV?d00001
diff --git a/container/srv-http/root/srv/_h5ai/public/images/favicon/favicon-32.png b/container/srv-http/root/srv/_h5ai/public/images/favicon/favicon-32.png
new file mode 100755
index 0000000000000000000000000000000000000000..2f97d12e445524bb2af5951cf17593dd823938c3
GIT binary patch
literal 120
zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdzdrud~kP61P=e7$nDDWH&n6~A4
zV)2SP|GrCee~EWYnYnb<UE4fXj*X%UN5UEeq8W9Wftnz|g3VzH<Np0;D<4_gzXu6<
My85}Sb4q9e0Glo&W&i*H
literal 0
HcmV?d00001
diff --git a/container/srv-http/root/srv/_h5ai/public/images/favicon/favicon.svg b/container/srv-http/root/srv/_h5ai/public/images/favicon/favicon.svg
new file mode 100755
index 0000000..489efbe
--- /dev/null
+++ b/container/srv-http/root/srv/_h5ai/public/images/favicon/favicon.svg
@@ -0,0 +1,3 @@
+<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 16 16">
+  <path fill="#555" d="M 1,2 1,14 15,14 15,4 9,4 7,2 z"/>
+</svg>
\ No newline at end of file
diff --git a/container/srv-http/root/srv/_h5ai/public/images/themes/README.md b/container/srv-http/root/srv/_h5ai/public/images/themes/README.md
new file mode 100755
index 0000000..650e0f7
--- /dev/null
+++ b/container/srv-http/root/srv/_h5ai/public/images/themes/README.md
@@ -0,0 +1,9 @@
+# Themes
+
+This directory will contain any themes you add. At the moment there are only
+icon themes supported. The folder structure is: `<theme-name>/<type>.<ext>`,
+with `<ext>` one of `svg`, `png` or `jpg`.
+
+To select a theme use the option `view > theme` in file `conf/options.json`.
+
+You will find the previously included icon themes [here](https://github.com/lrsjng/h5ai-themes).
diff --git a/container/srv-http/root/srv/_h5ai/public/images/themes/comity/ar-apk.svg b/container/srv-http/root/srv/_h5ai/public/images/themes/comity/ar-apk.svg
new file mode 100755
index 0000000..a7cc5cd
--- /dev/null
+++ b/container/srv-http/root/srv/_h5ai/public/images/themes/comity/ar-apk.svg
@@ -0,0 +1,3 @@
+<svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 20 20">
+    <path fill="#a4c639" d="M14.5 3.2C14.4 3.2 14.2 3.3 14.1 3.5L13.3 5C12.3 4.4 11.2 4 10 4 8.8 4 7.7 4.3 6.8 4.9L5.9 3.5C5.8 3.3 5.6 3.2 5.5 3.3 5.4 3.3 5.4 3.2 5.3 3.3L5.2 3.3C5 3.5 4.9 3.8 5.1 4L6 5.6C4.8 6.7 4 8.2 4 10L16 10C16 8.3 15.3 6.7 14.1 5.6L15 4C15.1 3.8 15 3.5 14.8 3.3L14.7 3.3C14.7 3.2 14.6 3.2 14.5 3.2zM7.3 7C7.8 7 8.2 7.4 8.2 7.9 8.2 8.4 7.8 8.8 7.3 8.8 6.8 8.8 6.4 8.4 6.4 7.9 6.4 7.4 6.8 7 7.3 7zM12.7 7C13.2 7 13.6 7.4 13.6 7.9 13.6 8.4 13.2 8.8 12.7 8.8 12.2 8.8 11.8 8.4 11.8 7.9 11.8 7.4 12.2 7 12.7 7zM4 10.5L4 16 16 16 16 10.5 4 10.5z"/>
+</svg>
\ No newline at end of file
diff --git a/container/srv-http/root/srv/_h5ai/public/images/themes/comity/ar-deb.svg b/container/srv-http/root/srv/_h5ai/public/images/themes/comity/ar-deb.svg
new file mode 100755
index 0000000..f1efae9
--- /dev/null
+++ b/container/srv-http/root/srv/_h5ai/public/images/themes/comity/ar-deb.svg
@@ -0,0 +1,16 @@
+<svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="-60 -75 20 20">
+  <g fill="#d70751" transform="matrix(0.06427071,0,0,0.06427071,-52.892053,-68.534728)">
+    <path d="m 64.525,62.053 c -4.125,0.058 0.78,2.125 6.165,2.954 1.488,-1.161 2.838,-2.336 4.04,-3.479 -3.354,0.821 -6.765,0.838 -10.205,0.525"/>
+    <path d="m 86.665,56.533 c 2.457,-3.389 4.246,-7.102 4.878,-10.939 -0.551,2.736 -2.035,5.099 -3.435,7.592 -7.711,4.854 -0.726,-2.883 -0.004,-5.824 -8.29,10.436 -1.138,6.257 -1.439,9.171"/>
+    <path d="m 94.839,35.268 c 0.497,-7.428 -1.462,-5.08 -2.121,-2.245 0.766,0.4 1.377,5.237 2.121,2.245"/>
+    <path d="m 48.883,-66.264 c 2.201,0.395 4.757,0.698 4.398,1.224 2.407,-0.528 2.954,-1.015 -4.398,-1.224"/>
+    <path d="m 53.281,-65.04 -1.556,0.32 1.448,-0.127 0.108,-0.193"/>
+    <path d="m 121.93,38.085 c 0.247,6.671 -1.95,9.907 -3.932,15.637 l -3.564,1.781 c -2.919,5.666 0.282,3.598 -1.807,8.105 -4.556,4.049 -13.823,12.67 -16.789,13.457 -2.163,-0.047 1.469,-2.554 1.943,-3.537 -6.097,4.188 -4.894,6.285 -14.217,8.83 L 83.291,81.751 C 60.29,92.569 28.344,71.129 28.765,41.875 28.519,43.732 28.067,43.268 27.557,44.019 26.371,28.967 34.509,13.849 48.232,7.676 61.659,1.03 77.395,3.758 87.012,12.72 81.73,5.8 71.217,-1.534 58.757,-0.848 46.549,-0.655 35.132,7.102 31.321,15.521 c -6.253,3.938 -6.979,15.177 -9.704,17.233 -3.665,26.943 6.896,38.583 24.762,52.275 2.812,1.896 0.792,2.184 1.173,3.627 C 41.616,85.877 36.18,81.68 31.711,76.542 c 2.372,3.473 4.931,6.847 8.239,9.499 -5.596,-1.897 -13.074,-13.563 -15.256,-14.038 9.647,17.274 39.142,30.295 54.587,23.836 -7.146,0.263 -16.226,0.146 -24.256,-2.822 -3.371,-1.734 -7.958,-5.331 -7.14,-6.003 21.079,7.875 42.854,5.965 61.09,-8.655 4.641,-3.614 9.709,-9.761 11.173,-9.846 -2.206,3.317 0.377,1.596 -1.318,4.523 4.625,-7.456 -2.008,-3.035 4.779,-12.877 l 2.507,3.453 c -0.931,-6.188 7.687,-13.704 6.813,-23.492 1.975,-2.994 2.206,3.22 0.107,10.107 2.912,-7.64 0.767,-8.867 1.516,-15.171 0.81,2.118 1.867,4.37 2.412,6.606 -1.895,-7.382 1.948,-12.433 2.898,-16.724 -0.937,-0.415 -2.928,3.264 -3.383,-5.457 0.065,-3.788 1.054,-1.985 1.435,-2.917 -0.744,-0.427 -2.694,-3.33 -3.88,-8.9 0.86,-1.308 2.3,3.393 3.47,3.586 -0.753,-4.429 -2.049,-7.805 -2.103,-11.202 -3.421,-7.149 -1.211,0.953 -3.985,-3.069 -3.641,-11.357 3.021,-2.637 3.47,-7.796 5.52,7.995 8.667,20.387 10.11,25.519 -1.103,-6.258 -2.883,-12.32 -5.058,-18.185 1.677,0.705 -2.699,-12.875 2.18,-3.882 -5.21,-19.172 -22.302,-37.087 -38.025,-45.493 1.924,1.76 4.354,3.971 3.481,4.317 -7.819,-4.656 -6.444,-5.018 -7.565,-6.985 -6.369,-2.591 -6.788,0.208 -11.007,0.004 -12.005,-6.368 -14.318,-5.69 -25.368,-9.681 l 0.502,2.349 c -7.953,-2.649 -9.265,1.005 -17.862,0.009 -0.523,-0.409 2.753,-1.479 5.452,-1.871 -7.69,1.015 -7.329,-1.515 -14.854,0.279 1.855,-1.301 3.815,-2.162 5.793,-3.269 -6.271,0.381 -14.971,3.649 -12.286,0.677 -10.235,4.569 -28.403,10.976 -38.597,20.535 l -0.321,-2.142 c -4.672,5.608 -20.371,16.748 -21.622,24.011 l -1.249,0.291 c -2.431,4.116 -4.004,8.781 -5.932,13.016 -3.18,5.417 -4.661,2.085 -4.208,2.934 -6.253,12.679 -9.359,23.332 -12.043,32.069 1.912,2.858 0.046,17.206 0.769,28.688 -3.141,56.709 39.8,111.77 86.737,124.48 6.88,2.459 17.11,2.364 25.813,2.618 -10.268,-2.937 -11.595,-1.556 -21.595,-5.044 -7.215,-3.398 -8.797,-7.277 -13.907,-11.711 l 2.022,3.573 c -10.021,-3.547 -5.829,-4.39 -13.982,-6.972 l 2.16,-2.82 C 11.175,156.251 5.82,151.022 4.355,148.126 l -3.553,0.14 c -4.27,-5.269 -6.545,-9.063 -6.379,-12.005 l -1.148,2.047 c -1.301,-2.235 -15.709,-19.759 -8.234,-15.679 -1.389,-1.271 -3.235,-2.067 -5.237,-5.703 l 1.522,-1.739 c -3.597,-4.627 -6.621,-10.562 -6.391,-12.536 1.919,2.592 3.25,3.075 4.568,3.52 -9.083,-22.539 -9.593,-1.242 -16.474,-22.942 l 1.456,-0.116 c -1.116,-1.682 -1.793,-3.506 -2.69,-5.298 l 0.633,-6.313 C -44.113,63.94 -39.401,39.351 -38.459,25.865 -37.804,20.38 -33,14.543 -29.345,5.388 l -2.227,-0.384 c 4.256,-7.423 24.301,-29.814 33.583,-28.662 4.499,-5.649 -0.892,-0.02 -1.772,-1.443 9.878,-10.223 12.984,-7.222 19.65,-9.061 7.19,-4.268 -6.17,1.664 -2.761,-1.628 12.427,-3.174 8.808,-7.216 25.021,-8.828 1.71,0.973 -3.969,1.503 -5.395,2.766 10.354,-5.066 32.769,-3.914 47.326,2.811 16.895,7.896 35.873,31.232 36.622,53.189 l 0.852,0.229 c -0.431,8.729 1.336,18.822 -1.727,28.094 l 2.1,-4.385"/>
+    <path d="m 19.5,67.715 -0.578,2.893 c 2.71,3.683 4.861,7.673 8.323,10.552 -2.49,-4.863 -4.341,-6.872 -7.745,-13.445"/>
+    <path d="m 25.909,67.464 c -1.435,-1.587 -2.284,-3.497 -3.235,-5.4 0.909,3.345 2.771,6.219 4.504,9.143 l -1.269,-3.743"/>
+    <path d="m 139.32,42.814 -0.605,1.52 c -1.111,7.892 -3.511,15.701 -7.189,22.941 4.06,-7.639 6.69,-15.995 7.79,-24.461"/>
+    <path d="m 49.698,-68.243 c 2.789,-1.022 6.855,-0.56 9.814,-1.233 -3.855,0.324 -7.693,0.517 -11.484,1.005 l 1.67,0.228"/>
+    <path d="m -48.219,-16.176 c 0.642,5.951 -4.477,8.26 1.134,4.337 3.007,-6.773 -1.175,-1.87 -1.134,-4.337"/>
+    <path d="m -54.812,11.362 c 1.292,-3.967 1.526,-6.349 2.02,-8.645 -3.571,4.566 -1.643,5.539 -2.02,8.645"/>
+  </g>
+</svg>
\ No newline at end of file
diff --git a/container/srv-http/root/srv/_h5ai/public/images/themes/comity/ar-rpm.svg b/container/srv-http/root/srv/_h5ai/public/images/themes/comity/ar-rpm.svg
new file mode 100755
index 0000000..4146098
--- /dev/null
+++ b/container/srv-http/root/srv/_h5ai/public/images/themes/comity/ar-rpm.svg
@@ -0,0 +1,11 @@
+<svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 13.913043 15.22257">
+  <g fill="#000" transform="matrix(0.01974442,0,0,0.01974442,0.59799609,3.692127)">
+    <path d="m 242.1304,26.136154 c 12.57375,-1.931991 25.25548,-3.344345 37.9671,-4.013656 2.25826,-0.538041 4.59412,-0.428086 6.90119,-0.510544 18.03637,-0.575318 36.09759,-0.549286 54.12636,0.262939 32.54014,2.301468 64.91549,7.707276 96.30586,16.718582 l -0.13292,0.17627 c -4.60202,6.223907 -9.21752,12.438019 -13.73035,18.725891 -1.35219,0.249481 -2.53581,-0.605759 -3.74014,-1.036484 -23.8157,-9.827469 -49.16701,-15.53215 -74.68315,-18.619186 -41.97006,-4.297928 -84.93817,-0.844666 -125.2014,12.070068 -29.64401,9.587738 -58.27112,24.371842 -80.37665,46.666519 -15.66559,16.020307 -27.69327,36.744737 -29.32584,59.451997 -1.51913,10.82149 1.07187,21.62427 3.36382,32.12558 L 14.185699,205.68005 C 13.945419,188.13843 18.523071,170.78329 25.80806,154.91394 40.297989,124.01501 65.424713,99.327652 93.421997,80.42572 112.35318,67.714981 132.81692,57.345383 154.07152,49.122925 182.38751,38.052567 212.05559,30.488739 242.1304,26.136154 z"/>
+    <path d="m 301.70334,148.63515 c 1.94578,-3.16858 5.37183,-5.69597 9.26865,-5.22687 4.4046,0.11267 7.79878,3.75244 8.71124,7.87158 l 310.75082,55.27789 -1.03752,5.20607 -310.68332,-54.48095 c -2.47844,4.31216 -8.22775,6.5392 -12.74457,3.9928 -3.13145,-1.36889 -4.19975,-4.71973 -5.61303,-7.53113 l -19.12972,-3.06511 0.87691,-5.38129 19.60054,3.33701 z"/>
+    <path d="m 13.649231,221.30466 c 18.262405,-0.12262 36.52626,-0.0226 54.789398,-0.051 0.01808,0.6767 0.05426,2.03008 0.07234,2.70677 13.269959,-2.88977 26.908417,-4.11874 40.480651,-3.36956 9.88256,0.90474 18.95615,5.13992 27.79413,9.3441 -9.96293,6.16172 -20.10092,12.09585 -29.82344,18.61522 -10.834169,-8.36657 -25.559114,-8.37398 -38.193818,-4.71335 -0.157685,1.35187 -0.305954,2.70839 -0.319413,4.07715 0.0064,31.4396 0.01517,62.87977 -0.0037,94.32 -18.255799,-0.006 -36.511368,0.0168 -54.767029,-0.0115 -0.0388,-40.30612 0.01926,-80.61204 -0.02911,-120.91781 z"/>
+    <path d="m 155.75305,221.30997 c 16.07997,-0.13549 32.16204,-0.0238 48.2433,-0.0572 23.83194,-0.13529 48.05416,2.93651 70.20328,12.1031 13.75632,5.82483 27.06233,14.43199 35.03758,27.39059 6.05672,10.0663 8.17432,22.99054 3.41974,34.00478 -5.58125,13.21376 -17.53407,22.37564 -29.70006,29.22304 -22.30197,11.93273 -47.08825,18.27707 -72.31572,19.34199 l -0.0437,24.93099 -54.85077,7.52423 0.006,-154.46153 z"/>
+    <path d="m 350.73776,221.33231 c 62.75727,-0.19167 125.51848,-0.0234 188.27761,-0.0843 18.36058,0.076 37.02661,0.1922 54.8872,4.94194 5.14029,1.69319 11.99558,3.70666 13.34763,9.68171 0.13403,35.45186 0.05,70.91191 0.0409,106.36713 -18.26615,-0.004 -36.53138,-0.0113 -54.79609,0.004 -0.004,-35.17893 -0.0756,-70.3591 0.0357,-105.53679 -3.31824,-2.87891 -8.04874,-2.75609 -12.16869,-3.25885 -11.26521,-0.29326 -22.53945,-0.084 -33.80654,-0.11576 0.002,36.30307 0.0406,72.60642 -0.0191,108.90969 -18.292,-0.0171 -36.58319,0.005 -54.87403,-0.0112 -0.0542,-29.07907 -0.008,-58.15799 -0.0231,-87.23671 -0.14635,-6.3542 0.31845,-12.73225 -0.27677,-19.06588 -5.14636,-2.16309 -10.78398,-2.58689 -16.30214,-2.61335 -9.79776,-0.0158 -19.5944,0.007 -29.39029,-0.01 -0.048,36.31536 0.0591,72.63149 -0.0537,108.94673 -17.22348,-0.022 -34.44665,-0.0339 -51.66902,0.007 l -3.31752,-0.0131 c 0.28336,-40.07539 0.0678,-80.83315 0.108,-120.91222 z"/>
+    <path fill="#d72123" d="m 423.56764,57.495636 c 4.51283,-6.287872 9.12833,-12.501984 13.73035,-18.725891 42.14722,12.344238 82.84823,31.836792 116.09491,60.881943 13.59442,12.173292 25.88991,25.944912 35.33316,41.613512 11.1826,18.43936 18.26884,39.55612 19.02705,61.19006 -33.0565,-5.77759 -66.1038,-11.60446 -99.1558,-17.40172 4.06793,-12.93818 4.10266,-27.0249 1.31704,-40.22806 -5.16264,-22.81849 -19.7915,-42.41004 -37.43728,-57.282084 C 457.76711,75.165924 440.98531,65.246307 423.20515,57.986771 l 0.36249,-0.491135 z"/>
+    <path fill="#fff" d="m 210.67975,234.60013 c 14.04689,1.40957 26.7447,9.34711 36.33964,19.39103 8.27451,8.70258 14.12349,20.84611 12.10276,33.07682 -2.20877,12.25284 -10.73442,22.20633 -20.32152,29.61572 -8.32672,6.11266 -17.74312,11.38919 -28.12337,12.77234 -0.0358,-31.61874 -0.0407,-63.2376 0.002,-94.85591 z"/>
+  </g>
+</svg>
\ No newline at end of file
diff --git a/container/srv-http/root/srv/_h5ai/public/images/themes/comity/txt-css.svg b/container/srv-http/root/srv/_h5ai/public/images/themes/comity/txt-css.svg
new file mode 100755
index 0000000..487a535
--- /dev/null
+++ b/container/srv-http/root/srv/_h5ai/public/images/themes/comity/txt-css.svg
@@ -0,0 +1,13 @@
+<svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 20 20">
+  <g transform="matrix(0.04742975,0,0,0.04742975,2.9426429,-1.9210171)">
+    <path fill="#1572b6" d="M 27.142,386.29 0.071,82.67 l 297.45,0 -27.096,303.571 -121.811,33.77 L 27.142,386.29 z m 0,0"/>
+    <path fill="#33a9dc" d="m 148.798,394.199 98.427,-27.288 23.157,-259.415 -121.584,0 0,286.703 z m 0,0"/>
+    <g transform="translate(55,142)">
+      <path fill="#ffffff" d="m 93.797,75.496 49.275,0 3.403,-38.132 -52.678,0 0,-37.239 0.129,0 93.246,0 -0.893,9.991 -9.152,102.616 -83.33,0 0,-37.236 z m 0,0"/>
+      <path fill="#ebebeb" d="m 94.02,172.204 -0.163,0.046 -41.472,-11.199 -2.652,-29.698 -20.151,0 -17.228,0 5.216,58.467 76.278,21.176 0.172,-0.048 0,-38.744 z m 0,0"/>
+      <path fill="#ffffff" d="m 139.907,111.156 -4.484,49.87 -41.532,11.21 0,38.742 76.339,-21.158 0.56,-6.29 6.478,-72.374 -37.361,0 z m 0,0"/>
+      <path fill="#ebebeb" d="m 93.926,0.125 0,23.128 0,14.019 0,0.092 -89.828,0 -0.119,0 -0.747,-8.37 -1.697,-18.878 -0.89,-9.991 93.281,0 z m 0,0"/>
+      <path fill="#ebebeb" d="m 93.797,75.5 0,23.129 0,14.017 0,0.092 -40.828,0 -0.119,0 -0.746,-8.369 -1.698,-18.878 -0.89,-9.991 44.281,0 z m 0,0"/>
+    </g>
+  </g>
+</svg>
\ No newline at end of file
diff --git a/container/srv-http/root/srv/_h5ai/public/images/themes/comity/txt-go.svg b/container/srv-http/root/srv/_h5ai/public/images/themes/comity/txt-go.svg
new file mode 100755
index 0000000..0d21bb0
--- /dev/null
+++ b/container/srv-http/root/srv/_h5ai/public/images/themes/comity/txt-go.svg
@@ -0,0 +1,29 @@
+<svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 20 20">
+  <path fill="#f6d2a2" fill-rule="evenodd" stroke="#000" stroke-width="3" d="m 10.634,-238.979 c 0.764,15.751 16.499,8.463 23.626,3.539 6.765,-4.675 8.743,-0.789 9.337,-10.015 0.389,-6.064 1.088,-12.128 0.744,-18.216 -10.23,-0.927 -21.357,1.509 -29.744,7.602 -4.32,3.139 -12.42,13.158 -3.963,17.09" clip-rule="evenodd" stroke-linecap="round" transform="matrix(.03 0 0 .03 3.959 17.82)"/>
+  <path fill="#c6b198" fill-rule="evenodd" stroke="#000" stroke-width="3" d="m 10.634,-238.979 c 2.29,-0.852 4.717,-1.457 6.271,-3.528" clip-rule="evenodd" stroke-linecap="round" transform="matrix(.03 0 0 .03 3.959 17.82)"/>
+  <path fill="#6ad7e5" fill-rule="evenodd" stroke="#000" stroke-width="3" d="M46.997-426.619c-60.297-16.956-15.461-93.664 32.959-62.113l-32.959 62.113zM314.895-494.488c47.727-33.523 90.856 42.111 35.388 61.141l-35.388-61.141z" clip-rule="evenodd" stroke-linecap="round" transform="matrix(.03 0 0 .03 3.959 17.82)"/>
+  <path fill="#f6d2a2" fill-rule="evenodd" stroke="#000" stroke-width="3" d="m 325.161,-45.128999 c 12.123,7.501 34.282,30.182 16.096,41.1799995 -17.474,15.9990005 -27.254,-17.5609995 -42.591,-22.2109995 6.605,-8.97 14.977,-17.149 26.495,-18.969 z" clip-rule="evenodd" stroke-linecap="round" transform="matrix(.03 0 0 .03 3.959 17.82)"/>
+  <path fill="none" stroke="#000" stroke-width="3" d="m 341.257,-3.9499995 c -2.696,-5.361 -3.601,-11.6179995 -8.102,-15.9389995" clip-rule="evenodd" stroke-linecap="round" transform="matrix(.03 0 0 .03 3.959 17.82)"/>
+  <path fill="#f6d2a2" fill-rule="evenodd" stroke="#000" stroke-width="3" d="m 108.579,-19.496999 c -14.229,2.202 -22.238,15.0389995 -34.1,21.5579995 -11.178,6.665 -15.454,-2.13399996 -16.461,-3.92 -1.752,-0.799 -1.605,0.744 -4.309,-1.979 -10.362,-16.3539995 10.797,-28.3079995 21.815,-36.4319995 15.346,-3.102 24.963,10.202 33.055,20.773 z" clip-rule="evenodd" stroke-linecap="round" transform="matrix(.03 0 0 .03 3.959 17.82)"/>
+  <path fill="none" stroke="#000" stroke-width="3" d="m 58.019,-1.8599995 c 0.542,-6.233 5.484,-10.4069995 7.838,-15.6769995" clip-rule="evenodd" stroke-linecap="round" transform="matrix(.03 0 0 .03 3.959 17.82)"/>
+  <path fill-rule="evenodd" d="M49.513-447.805c-7.955-4.208-13.791-9.923-8.925-19.124 4.505-8.518 12.874-7.593 20.83-3.385l-11.905 22.509zM337.716-455.805c7.955-4.208 13.791-9.923 8.925-19.124-4.505-8.518-12.874-7.593-20.83-3.385l11.905 22.509z" clip-rule="evenodd" transform="matrix(.03 0 0 .03 3.959 17.82)"/>
+  <path fill="#f6d2a2" fill-rule="evenodd" stroke="#000" stroke-width="3" d="m 392.475,-240.979 c -0.764,15.751 -16.499,8.463 -23.626,3.539 -6.765,-4.675 -8.743,-0.789 -9.337,-10.015 -0.389,-6.064 -1.088,-12.128 -0.744,-18.216 10.23,-0.927 21.357,1.509 29.744,7.602 4.319,3.139 12.42,13.158 3.963,17.09" clip-rule="evenodd" stroke-linecap="round" transform="matrix(.03 0 0 .03 3.959 17.82)"/>
+  <path fill="#c6b198" fill-rule="evenodd" stroke="#000" stroke-width="3" d="m 392.475,-240.979 c -2.29,-0.852 -4.717,-1.457 -6.271,-3.528" clip-rule="evenodd" stroke-linecap="round" transform="matrix(.03 0 0 .03 3.959 17.82)"/>
+  <path fill="#6ad7e5" fill-rule="evenodd" stroke="#000" stroke-width="3" d="m 195.512,13.124 c 60.365,0 116.953,8.633 146.452,66.629 26.478,65.006 17.062,135.104 21.1,203.806 3.468,58.992 11.157,127.145 -16.21,181.812 -28.79,57.514 -100.73,71.982 -160,69.863 C 140.299,533.568 84.06,518.38 57.785,475.845 26.959,425.945 41.553,351.747 43.792,296.223 46.444,230.452 25.977,164.481 47.584,100.122 69.999,33.359 130.451,18.271 195.512,13.124" clip-rule="evenodd" stroke-linecap="round" transform="matrix(.03 0 0 .03 3.959 1.636)"/>
+  <path fill="#fff" fill-rule="evenodd" stroke="#000" stroke-width="2.908" d="m 206.169,-445.312 c 10.838,63.003 113.822,46.345 99.03,-17.197 -13.264,-56.98 -102.632,-41.208 -99.03,17.197" clip-rule="evenodd" stroke-linecap="round" transform="matrix(.03 0 0 .03 3.959 17.82)"/>
+  <path fill="#fff" fill-rule="evenodd" stroke="#000" stroke-width="2.821" d="m 83.103,-435.122 c 14.047,54.85 101.864,40.807 98.554,-14.213 -3.966,-65.895 -111.984,-53.18 -98.554,14.213" clip-rule="evenodd" stroke-linecap="round" transform="matrix(.03 0 0 .03 3.959 17.82)"/>
+  <path fill="#fff" fill-rule="evenodd" stroke="#000" stroke-width="3" d="m 218.594,-369.71 c 0.046,8.191 1.861,17.387 0.312,26.101 -2.091,3.952 -6.193,4.37 -9.729,5.967 -4.89,-0.767 -9.002,-3.978 -10.963,-8.552 -1.255,-9.946 0.468,-19.576 0.785,-29.526 l 19.595,6.01 z" clip-rule="evenodd" stroke-linecap="round" transform="matrix(.03 0 0 .03 3.959 17.82)"/>
+  <g fill-rule="evenodd" transform="matrix(.03 0 0 .03 3.959 1.636)" clip-rule="evenodd">
+    <ellipse cx="107.324" cy="95.404" ry="16.062" rx="14.829"/>
+    <ellipse cx="114.069" cy="99.029" fill="#fff" ry="4.082" rx="3.496"/>
+  </g>
+  <g fill-rule="evenodd" transform="matrix(.03 0 0 .03 3.959 1.636)" clip-rule="evenodd">
+    <ellipse cx="231.571" cy="91.404" ry="16.062" rx="14.582"/>
+    <ellipse cx="238.204" cy="95.029" fill="#fff" ry="4.082" rx="3.438"/>
+  </g>
+  <path fill="#fff" fill-rule="evenodd" stroke="#000" stroke-width="3" d="m 176.217,-370.602 c -6.47,15.68 3.608,47.035 21.163,23.908 -1.255,-9.946 0.468,-19.576 0.785,-29.526 l -21.948,5.618 z" clip-rule="evenodd" stroke-linecap="round" transform="matrix(.03 0 0 .03 3.959 17.82)"/>
+  <g fill-rule="evenodd" clip-rule="evenodd">
+    <path fill="#f6d2a2" stroke="#231f20" stroke-width="3" d="m 178.431,138.673 c -12.059,1.028 -21.916,15.366 -15.646,26.709 8.303,15.024 26.836,-1.329 38.379,0.203 13.285,0.272 24.17,14.047 34.84,2.49 11.867,-12.854 -5.109,-25.373 -18.377,-30.97 l -39.196,1.568 z" stroke-linecap="round" transform="matrix(.03 0 0 .03 3.959 1.636)"/>
+    <path d="m 176.913,138.045 c -0.893,-20.891 38.938,-23.503 43.642,-6.016 4.692,17.446 -41.681,21.498 -43.642,6.016 -1.565,-12.363 0,0 0,0 z" transform="matrix(.03 0 0 .03 3.959 1.636)"/>
+  </g>
+</svg>
\ No newline at end of file
diff --git a/container/srv-http/root/srv/_h5ai/public/images/themes/comity/txt-html.svg b/container/srv-http/root/srv/_h5ai/public/images/themes/comity/txt-html.svg
new file mode 100755
index 0000000..356e855
--- /dev/null
+++ b/container/srv-http/root/srv/_h5ai/public/images/themes/comity/txt-html.svg
@@ -0,0 +1,10 @@
+<svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 20 20">
+  <g transform="matrix(0.03889348,0,0,0.03889348,0.04326912,-1.9134619)">
+    <polygon fill="#e44d26" points="437.367,100.62 404.321,470.819 255.778,512 107.644,470.877 74.633,100.62"/>
+    <polygon fill="#f16529" points="256,130.894 256,480.523 376.03,447.246 404.27,130.894"/>
+    <polygon fill="#ebebeb" points="143.219,188.488 154.38,313.627 256,313.627 256,268.217 195.91,268.217 191.76,221.716 256,221.716 256,176.305 255.843,176.305 142.132,176.305"/>
+    <polygon fill="#ebebeb" points="256,386.153 255.801,386.206 205.227,372.55 201.994,336.333 177.419,336.333 156.409,336.333 162.771,407.634 255.791,433.457 256,433.399"/>
+    <polygon fill="#ffffff" points="255.843,433.435 348.937,407.634 349.62,399.962 360.291,280.411 361.399,268.217 349.162,268.217 255.843,268.217 255.843,313.627 311.761,313.627 306.49,372.521 255.843,386.191"/>
+    <polygon fill="#ffffff" points="366.442,211.509 368.511,188.488 369.597,176.305 255.843,176.305 255.843,204.509 255.843,221.605 255.843,221.716 365.385,221.716 365.385,221.716 365.531,221.716"/>
+  </g>
+</svg>
\ No newline at end of file
diff --git a/container/srv-http/root/srv/_h5ai/public/images/themes/comity/txt-js.svg b/container/srv-http/root/srv/_h5ai/public/images/themes/comity/txt-js.svg
new file mode 100755
index 0000000..91a3279
--- /dev/null
+++ b/container/srv-http/root/srv/_h5ai/public/images/themes/comity/txt-js.svg
@@ -0,0 +1,3 @@
+<svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 20 20">
+  <path fill="#fbc02d" stroke="#fbc02d" stroke-width="1" d="M 14.1875 4.6875 C 13.09018 4.6875104 12.199333 4.9405471 11.5625 5.46875 C 10.925664 5.9871904 10.624999 6.7055265 10.625 7.625 C 10.624999 8.0651846 10.696787 8.4682415 10.84375 8.78125 C 11.000508 9.0942712 11.192562 9.3375261 11.4375 9.5625 C 11.692232 9.7874849 11.989182 9.9997477 12.3125 10.15625 C 12.645612 10.302981 12.991037 10.435342 13.34375 10.5625 C 13.696455 10.679886 14.006917 10.810341 14.28125 10.9375 C 14.555575 11.054885 14.782593 11.165778 14.96875 11.3125 C 15.164694 11.449448 15.308271 11.605183 15.40625 11.78125 C 15.514016 11.957323 15.562494 12.16171 15.5625 12.40625 C 15.562494 12.817085 15.428715 13.150022 15.125 13.375 C 14.821273 13.599981 14.322474 13.718751 13.65625 13.71875 C 13.019412 13.718751 12.481931 13.646727 12.03125 13.5 C 11.580565 13.353276 11.23328 13.209228 10.96875 13.0625 L 10.40625 14.5625 C 10.52382 14.630973 10.679049 14.724461 10.875 14.8125 C 11.070949 14.890754 11.297967 14.952993 11.5625 15.03125 C 11.836828 15.109504 12.157087 15.169839 12.5 15.21875 C 12.852707 15.277443 13.234955 15.3125 13.65625 15.3125 C 14.910321 15.3125 15.853361 15.061368 16.5 14.5625 C 17.156424 14.053851 17.499993 13.325734 17.5 12.40625 C 17.499993 11.92695 17.418407 11.551332 17.28125 11.21875 C 17.144079 10.876394 16.952025 10.557047 16.6875 10.3125 C 16.432759 10.058181 16.132095 9.8635762 15.75 9.6875 C 15.377691 9.5016528 14.948821 9.3010768 14.46875 9.125 C 14.194416 9.0271889 13.922635 8.9201051 13.6875 8.8125 C 13.462155 8.7049074 13.270101 8.5959189 13.09375 8.46875 C 12.92719 8.3415943 12.785469 8.2190145 12.6875 8.0625 C 12.599319 7.896218 12.562497 7.693737 12.5625 7.46875 C 12.562497 7.0970525 12.694418 6.7991744 12.96875 6.59375 C 13.252873 6.3883426 13.656575 6.2812588 14.15625 6.28125 C 14.577537 6.2812588 14.983096 6.3396915 15.375 6.4375 C 15.776691 6.5353258 16.13563 6.6891556 16.46875 6.875 L 17.03125 5.375 C 16.747117 5.2087206 16.374665 5.0432042 15.875 4.90625 C 15.385121 4.7595342 14.82433 4.6875104 14.1875 4.6875 z M 6.9375 4.9375 L 6.9375 11.625 C 6.9374954 12.387977 6.8153722 12.936987 6.53125 13.25 C 6.2471196 13.563017 5.7832845 13.718751 5.15625 13.71875 C 4.7839439 13.718751 4.4250043 13.646727 4.0625 13.5 C 3.7097899 13.343494 3.4011857 13.166291 3.15625 13 L 2.5 14.46875 C 2.7547338 14.674167 3.1234709 14.876648 3.59375 15.0625 C 4.0738243 15.238567 4.6346149 15.3125 5.28125 15.3125 C 5.9768667 15.3125 6.5493124 15.217103 7 15.03125 C 7.460476 14.845398 7.829213 14.604047 8.09375 14.28125 C 8.3680731 13.958455 8.5484718 13.555398 8.65625 13.125 C 8.7640159 12.694607 8.8124936 12.248871 8.8125 11.75 L 8.8125 4.9375 L 6.9375 4.9375 z"/>
+</svg>
\ No newline at end of file
diff --git a/container/srv-http/root/srv/_h5ai/public/images/themes/comity/txt-less.svg b/container/srv-http/root/srv/_h5ai/public/images/themes/comity/txt-less.svg
new file mode 100755
index 0000000..fd15b02
--- /dev/null
+++ b/container/srv-http/root/srv/_h5ai/public/images/themes/comity/txt-less.svg
@@ -0,0 +1,8 @@
+<svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 20 20">
+  <g fill="#5c6bc0" transform="matrix(0.02460339,0,0,0.02460339,1.0508613,-2.0358995)">
+    <path d="m 635.0385,526.8108 c 35.909,12.563 53.856,34.088 53.856,64.543 0,20.046 -7.443,35.957 -22.296,47.725 -14.838,11.776 -36.005,19.084 -63.557,19.084 -27.552,0 -53.037,-7.983 -76.51,-21.088 0.254,-6.95 2.091,-14.575 5.463,-22.852 3.372,-8.277 7.363,-14.853 11.936,-19.656 21.573,11.211 40.346,16.826 56.281,16.826 7.531,0 13.358,-1.264 17.414,-3.809 4.063,-2.536 6.083,-5.94 6.083,-10.217 0,-8.039 -6.226,-14.051 -18.638,-18.058 l -22.296,-8.421 c -33.73,-12.293 -50.596,-32.323 -50.596,-60.146 0,-20.316 7.085,-36.418 21.255,-48.33 14.17,-11.895 33.269,-22.137 57.283,-22.137 11.88,0 24.96,1.67 39.272,5.01 14.297,3.348 26.042,11.594 35.218,16.125 0.541,7.49 -0.962,15.712 -4.452,24.665 -3.515,8.961 -7.824,15.306 -12.969,19.052 -22.685,-10.162 -41.562,-15.243 -56.686,-15.243 -5.415,0 -9.494,1.201 -12.357,3.618 -2.831,2.41 -4.223,5.478 -4.223,9.224 0,6.417 5.121,11.49 15.386,15.235 l 25.133,8.85 z"/>
+    <path d="m 455.6835,526.8108 c 35.909,12.563 53.848,34.088 53.848,64.543 0,20.046 -7.443,35.957 -22.272,47.725 -14.853,11.776 -36.028,19.084 -63.572,19.084 -27.528,0 -53.045,-7.983 -76.51,-21.088 0.254,-6.95 2.091,-14.575 5.47,-22.852 3.372,-8.277 7.347,-14.853 11.936,-19.656 21.597,11.211 40.362,16.826 56.289,16.826 7.538,0 13.366,-1.264 17.406,-3.809 4.048,-2.536 6.083,-5.94 6.083,-10.217 0,-8.039 -6.226,-14.051 -18.638,-18.058 l -22.281,-8.421 c -33.738,-12.293 -50.611,-32.323 -50.611,-60.146 0,-20.316 7.085,-36.418 21.27,-48.33 14.162,-11.895 33.253,-22.137 57.267,-22.137 11.872,0 24.984,1.67 39.265,5.01 14.313,3.348 26.042,11.594 35.225,16.125 0.541,7.49 -0.962,15.712 -4.452,24.665 -3.507,8.961 -7.824,15.306 -12.961,19.052 -22.694,-10.162 -41.571,-15.243 -56.702,-15.243 -5.407,0 -9.502,1.201 -12.349,3.618 -2.823,2.41 -4.23,5.478 -4.23,9.224 0,6.417 5.128,11.49 15.394,15.235 l 25.125,8.85 z"/>
+    <path d="m 324.8885,529.6408 c 0,-12.293 -1.956,-23.656 -5.868,-34.089 -3.904,-10.432 -9.51,-19.378 -16.794,-26.868 -7.292,-7.49 -16.126,-13.367 -26.511,-17.645 -10.401,-4.27 -22.074,-10.711 -35.027,-10.711 -15.387,0 -28.816,6.966 -40.282,12.317 -11.466,5.344 -20.913,12.691 -28.332,22.05 -7.435,9.366 -12.969,20.388 -16.611,33.086 -3.642,12.699 -5.463,26.534 -5.463,41.499 0,15.49 1.479,29.818 4.453,42.914 2.966,13.08 8.03,24.435 15.18,34.073 7.156,9.621 16.467,17.104 27.941,22.439 11.474,5.344 25.715,9.447 42.716,9.447 31.305,0 57.752,-9.065 79.348,-24.292 -2.139,-15.49 -7.657,-27.807 -16.523,-36.896 -11.029,4.142 -20.786,7.108 -29.246,8.93 -8.468,1.798 -15.935,2.704 -22.383,2.704 -12.906,0 -22.193,-3.284 -27.83,-9.915 -5.631,-6.608 -8.72,-14.424 -9.267,-26.296 h 105.265 c 3.477,-11.243 5.234,-26.438 5.234,-42.747 z m -110.9,2.776 c 0.802,-13.645 3.292,-28.244 7.435,-34.255 4.151,-6.019 10.504,-9.025 19.083,-9.025 8.835,0 15.466,3.197 19.879,9.614 4.422,6.417 6.631,19.346 6.631,29.237 l 0.008,4.429 h -53.036 l 0,0 z"/>
+    <path d="m 129.3525,604.6078 h -10.933 c -11.887,0 -16.364,-6.25 -16.364,-18.805 V 355.05779 c 0,-13.875 -4.007,-23.616 -9.137,-29.229 -5.129,-5.598 -14.034,-5.542 -26.717,-5.542 h -24.69 l -2.91,-0.056 v 0.238 l -0.024,34.343 V 596.9678 c 0,19.258 4.326,33.349 12.022,42.318 7.705,8.953 20.722,13.422 39.074,13.422 12.691,0 27.131,-1.336 43.32,-4.016 0.811,-2.704 1.217,-8.492 1.217,-17.374 0,-8.906 -1.621,-17.788 -4.858,-26.71 z"/>
+  </g>
+</svg>
\ No newline at end of file
diff --git a/container/srv-http/root/srv/_h5ai/public/images/themes/comity/txt-md.svg b/container/srv-http/root/srv/_h5ai/public/images/themes/comity/txt-md.svg
new file mode 100755
index 0000000..a2fba14
--- /dev/null
+++ b/container/srv-http/root/srv/_h5ai/public/images/themes/comity/txt-md.svg
@@ -0,0 +1,3 @@
+<svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 20 20">
+  <path fill="#ad1457" d="M12.078 10h2.3V6.007h2.32V10H19l-3.46 3.993zM1 13.993V6.007h2.32l2.355 2.917L8.03 6.007h2.32v7.986H8.03V9.398l-2.355 2.887L3.32 9.398v4.595z"/>
+</svg>
\ No newline at end of file
diff --git a/container/srv-http/root/srv/_h5ai/public/images/themes/comity/txt-php.svg b/container/srv-http/root/srv/_h5ai/public/images/themes/comity/txt-php.svg
new file mode 100755
index 0000000..84e1e22
--- /dev/null
+++ b/container/srv-http/root/srv/_h5ai/public/images/themes/comity/txt-php.svg
@@ -0,0 +1,3 @@
+<svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 20 20">
+  <path fill="#6c7eb7" fill-rule="evenodd" d="M 8.625 5.65625 L 7.25 12.6875 L 8.90625 12.6875 L 9.6875 8.78125 L 11 8.78125 C 11.609 8.78125 11.587 9.03375 11.5 9.46875 L 10.90625 12.6875 L 12.65625 12.6875 L 13.25 9.125 C 13.424 8.255 12.892 7.55575 11.5 7.46875 L 9.9375 7.46875 L 10.28125 5.65625 L 8.625 5.65625 z M 2.34375 7.46875 L 0.9375 14.53125 L 2.59375 14.53125 L 2.9375 12.6875 L 4.5 12.6875 C 5.979 12.7745 7.65625 11.55675 7.65625 9.46875 C 7.65625 8.25075 6.9545 7.55575 5.5625 7.46875 L 2.34375 7.46875 z M 13.84375 7.46875 L 12.4375 14.5 L 14.09375 14.5 L 14.4375 12.6875 L 16 12.6875 C 17.47899 12.7745 19.125 11.556754 19.125 9.46875 C 19.125 8.2507462 18.454491 7.55575 17.0625 7.46875 L 13.84375 7.46875 z M 15.21875 8.75 L 16.34375 8.75 C 16.952746 8.75 17.40625 9.0092466 17.40625 9.53125 C 17.31925 11.010253 16.626745 11.288 15.84375 11.375 L 14.78125 11.375 L 15.21875 8.75 z M 3.71875 8.78125 L 4.875 8.78125 C 5.484 8.78125 5.90625 9.0405 5.90625 9.5625 C 5.81925 11.0415 5.12675 11.31925 4.34375 11.40625 L 3.28125 11.40625 L 3.71875 8.78125 z"/>
+</svg>
\ No newline at end of file
diff --git a/container/srv-http/root/srv/_h5ai/public/images/themes/comity/txt-py.svg b/container/srv-http/root/srv/_h5ai/public/images/themes/comity/txt-py.svg
new file mode 100755
index 0000000..d5dc003
--- /dev/null
+++ b/container/srv-http/root/srv/_h5ai/public/images/themes/comity/txt-py.svg
@@ -0,0 +1,8 @@
+<svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 20 20">
+  <g transform="translate(-473.36088,-341.57095)">
+    <g transform="matrix(0.14489978,0,0,0.14489978,468.84945,333.83641)">
+      <path fill="#387eb8" d="M 99.75,67.46875 C 71.718268,67.468752 73.46875,79.625 73.46875,79.625 L 73.5,92.21875 l 26.75,0 0,3.78125 -37.375,0 c 0,0 -17.9375,-2.034276 -17.9375,26.25 -2e-6,28.28427 15.65625,27.28125 15.65625,27.28125 l 9.34375,0 0,-13.125 c 0,0 -0.503652,-15.65625 15.40625,-15.65625 15.9099,0 26.53125,0 26.53125,0 0,0 14.90625,0.24096 14.90625,-14.40625 0,-14.647206 0,-24.21875 0,-24.21875 0,-2e-6 2.26318,-14.65625 -27.03125,-14.65625 z M 85,75.9375 c 2.661429,-2e-6 4.8125,2.151071 4.8125,4.8125 2e-6,2.661429 -2.151071,4.8125 -4.8125,4.8125 -2.661429,2e-6 -4.8125,-2.151071 -4.8125,-4.8125 -2e-6,-2.661429 2.151071,-4.8125 4.8125,-4.8125 z"/>
+      <path fill="#ffe052" d="m 100.5461,177.31485 c 28.03174,0 26.28125,-12.15625 26.28125,-12.15625 l -0.0312,-12.59375 -26.75,0 0,-3.78125 37.375,0 c 0,0 17.9375,2.03427 17.9375,-26.25001 10e-6,-28.284267 -15.65625,-27.281247 -15.65625,-27.281247 l -9.34375,0 0,13.124997 c 0,0 0.50366,15.65625 -15.40625,15.65625 -15.909902,0 -26.531252,0 -26.531252,0 0,0 -14.90625,-0.24096 -14.90625,14.40626 0,14.6472 0,24.21875 0,24.21875 0,0 -2.26318,14.65625 27.031252,14.65625 z m 14.75,-8.46875 c -2.66143,0 -4.8125,-2.15107 -4.8125,-4.8125 0,-2.66143 2.15107,-4.8125 4.8125,-4.8125 2.66143,0 4.8125,2.15107 4.8125,4.8125 1e-5,2.66143 -2.15107,4.8125 -4.8125,4.8125 z"/>
+    </g>
+  </g>
+</svg>
\ No newline at end of file
diff --git a/container/srv-http/root/srv/_h5ai/public/images/themes/comity/txt-rb.svg b/container/srv-http/root/srv/_h5ai/public/images/themes/comity/txt-rb.svg
new file mode 100755
index 0000000..a642dc2
--- /dev/null
+++ b/container/srv-http/root/srv/_h5ai/public/images/themes/comity/txt-rb.svg
@@ -0,0 +1,3 @@
+<svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 20 20">
+  <path fill="#e53935" d="M 10.707376,3.0220971 12.625,4.28125 11.5,7.90625 7.4375,11.6875 3.90625,12.46875 3.1875,10.46875 3,14.15625 c 0.07668,2.758421 2.05851,2.788289 2.90625,2.8125 L 5.875,17 16.96875,16.90625 17.0625,5.8125 C 17.122609,4.2480709 15.364825,3.0014165 14.375,3 z M 5.8700983,5.9390704 C 3.7805688,8.0101404 3.256183,9.918237 4.289943,10.960517 5.3229925,12.003507 7.2816787,11.165285 9.3712087,9.09421 11.460739,7.0231401 12.097651,5.0845033 11.06453,4.0415133 9.4255397,2.6480655 6.9773962,4.7208064 5.8700983,5.9390704 z"/>
+</svg>
\ No newline at end of file
diff --git a/container/srv-http/root/srv/_h5ai/public/images/themes/comity/txt-rust.svg b/container/srv-http/root/srv/_h5ai/public/images/themes/comity/txt-rust.svg
new file mode 100755
index 0000000..0a71e77
--- /dev/null
+++ b/container/srv-http/root/srv/_h5ai/public/images/themes/comity/txt-rust.svg
@@ -0,0 +1,3 @@
+<svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 20 20">
+    <path fill="#795548" d="M18 9.9 17.3 9.5c0 0 0-0.1 0-0.1L17.9 8.8C17.9 8.8 18 8.6 18 8.5 18 8.4 17.9 8.4 17.9 8.4L17.1 8.1c0 0 0-0.1 0-0.1l0.4-0.7c0 0 0-0.1 0-0.3 0-0.1-0.1-0.1-0.1-0.1L16.5 6.7c0 0 0-0.1-0.1-0.1l0.3-0.7c0-0.1 0-0.1 0-0.3 0 0-0.1-0.1-0.1-0.1l-0.8 0c0 0-0.1-0.1-0.1-0.1L15.7 4.6c0-0.1 0-0.1 0-0.3 0 0-0.1-0.1-0.3 0l-0.8 0.1c0 0-0.1-0.1-0.1-0.1l0-0.8c0-0.1 0-0.1-0.1-0.1 0 0-0.1 0-0.3 0l-0.7 0.3c0 0-0.1 0-0.1-0.1L13.1 2.7c0-0.1 0-0.1-0.1-0.1-0.1 0-0.1 0-0.3 0l-0.7 0.4c0 0-0.1 0-0.1 0L11.6 2.3c0-0.1-0.1-0.1-0.1-0.1-0.1 0-0.1 0-0.3 0.1l-0.5 0.5c0 0-0.1 0-0.1 0L10.1 2.1C10.1 2 10 2 10 2 9.9 2 9.9 2 9.9 2.1l-0.4 0.7c0 0-0.1 0-0.1 0L8.8 2.3c0 0-0.1-0.1-0.3-0.1-0.1 0-0.1 0.1-0.1 0.1L8.1 2.9c0 0-0.1 0-0.1 0L7.3 2.5c0 0-0.1 0-0.3 0-0.1 0-0.1 0.1-0.1 0.1L6.7 3.5c0 0-0.1 0-0.1 0.1L5.9 3.4c-0.1 0-0.1 0-0.3 0 0 0-0.1 0.1-0.1 0.1l0 0.8c0 0-0.1 0.1-0.1 0.1L4.6 4.3c-0.1 0-0.1 0-0.3 0 0 0-0.1 0.1 0 0.3l0.1 0.8c0 0-0.1 0.1-0.1 0.1l-0.8 0c-0.1 0-0.1 0-0.1 0.1 0 0 0 0.1 0 0.3l0.3 0.7c0 0 0 0.1-0.1 0.1L2.7 6.9c-0.1 0-0.1 0-0.1 0.1 0 0.1 0 0.1 0 0.3l0.4 0.7c0 0 0 0.1 0 0.1L2.3 8.4c-0.1 0-0.1 0.1-0.1 0.1 0 0.1 0 0.1 0.1 0.3l0.5 0.5c0 0 0 0.1 0 0.1L2.1 9.9C2 9.9 2 10 2 10c0 0.1 0 0.1 0.1 0.1l0.7 0.4c0 0 0 0.1 0 0.1l-0.5 0.5c0 0-0.1 0.1-0.1 0.3 0 0.1 0.1 0.1 0.1 0.1l0.7 0.3c0 0 0 0.1 0 0.1l-0.4 0.7c0 0 0 0.1 0 0.3 0 0.1 0.1 0.1 0.1 0.1l0.8 0.1c0 0 0 0.1 0.1 0.1l-0.3 0.7c0 0.1 0 0.1 0 0.3 0 0 0.1 0.1 0.1 0.1l0.8 0c0 0 0.1 0.1 0.1 0.1l-0.1 0.8c0 0.1 0 0.1 0 0.3 0 0 0.1 0.1 0.3 0l0.8-0.1c0 0 0.1 0.1 0.1 0.1l0 0.8c0 0.1 0 0.1 0.1 0.1 0 0 0.1 0 0.3 0l0.7-0.3c0 0 0.1 0 0.1 0.1l0.1 0.8c0 0.1 0 0.1 0.1 0.1 0.1 0 0.1 0 0.3 0l0.7-0.4c0 0 0.1 0 0.1 0l0.3 0.7c0 0.1 0.1 0.1 0.1 0.1 0.1 0 0.1 0 0.3-0.1l0.5-0.5c0 0 0.1 0 0.1 0l0.4 0.7C9.9 17.9 10 18 10 18c0.1 0 0.1 0 0.1-0.1l0.4-0.7c0 0 0.1 0 0.1 0l0.5 0.5c0 0 0.1 0.1 0.3 0.1 0.1 0 0.1-0.1 0.1-0.1l0.3-0.7c0 0 0.1 0 0.1 0l0.7 0.4c0 0 0.1 0 0.3 0 0.1 0 0.1-0.1 0.1-0.1l0.1-0.8c0 0 0.1 0 0.1-0.1l0.7 0.3c0.1 0 0.1 0 0.3 0 0 0 0.1-0.1 0.1-0.1l0-0.8c0 0 0.1-0.1 0.1-0.1l0.8 0.1c0.1 0 0.1 0 0.3 0 0 0 0.1-0.1 0-0.3l-0.1-0.8c0 0 0.1-0.1 0.1-0.1l0.8 0c0.1 0 0.1 0 0.1-0.1 0 0 0-0.1 0-0.3l-0.3-0.7c0 0 0-0.1 0.1-0.1l0.8-0.1c0.1 0 0.1 0 0.1-0.1 0-0.1 0-0.1 0-0.3l-0.4-0.7c0 0 0-0.1 0-0.1l0.7-0.3c0.1 0 0.1-0.1 0.1-0.1 0-0.1 0-0.1-0.1-0.3l-0.5-0.5c0 0 0-0.1 0-0.1l0.7-0.4C18 10.1 18 10 18 10 18 9.9 18 9.9 17.9 9.9zm-4.5 5.6c-0.3 0-0.4-0.3-0.4-0.5 0-0.3 0.3-0.4 0.5-0.4 0.3 0 0.4 0.3 0.4 0.5 0 0.3-0.3 0.4-0.5 0.4zm-0.3-1.5c-0.3 0-0.4 0.1-0.5 0.3l-0.3 1.1C11.8 15.6 10.9 15.8 10 15.8c-0.8 0-1.8-0.1-2.4-0.5L7.3 14.2c0-0.3-0.3-0.4-0.5-0.3L5.8 14.2C5.7 13.9 5.5 13.7 5.4 13.5l4.7 0c0 0 0.1 0 0.1 0l0-1.6c0 0 0 0-0.1 0l-1.4 0 0-1.1 1.5 0c0.1 0 0.7 0 0.9 0.8 0 0.3 0.1 0.9 0.3 1.2 0.1 0.3 0.4 0.8 0.8 0.8l2.4 0c0 0 0 0 0.1 0-0.1 0.3-0.4 0.4-0.5 0.7l-1.1-0.4zm-6.6 1.5c-0.3 0-0.5-0.1-0.5-0.4 0-0.3 0.1-0.5 0.4-0.5 0.3 0 0.5 0.1 0.5 0.4 0 0.3-0.1 0.5-0.4 0.5zM4.8 8.1c0.1 0.3 0 0.5-0.3 0.7-0.3 0.1-0.5 0-0.7-0.3-0.1-0.3 0-0.5 0.3-0.7 0.3-0.1 0.5 0 0.7 0.3zM4.3 9.5 5.4 9.1C5.7 8.9 5.7 8.6 5.7 8.5l-0.3-0.5 0.8 0 0 3.8-1.6 0C4.4 11.2 4.3 10.7 4.3 10.1c0-0.3 0-0.4 0-0.7zm4.5-0.4 0-1.1 2 0c0.1 0 0.7 0.1 0.7 0.5 0 0.4-0.4 0.5-0.8 0.5l-1.8 0zM16 10c0 0.1 0 0.3 0 0.4l-0.5 0c0 0-0.1 0-0.1 0.1l0 0.3c0 0.7-0.4 0.8-0.7 0.8-0.3 0-0.7-0.1-0.7-0.3-0.1-0.9-0.5-1.2-0.9-1.6 0.5-0.4 1.2-0.9 1.2-1.6 0-0.8-0.5-1.4-0.9-1.5C12.7 6.2 12.2 6.2 12 6.2l-6.2 0C6.6 5.3 7.8 4.6 9.1 4.3l0.7 0.8c0.1 0.1 0.4 0.1 0.7 0l0.8-0.8c1.8 0.3 3.1 1.4 3.9 2.8l-0.5 1.2c-0.1 0.3 0 0.4 0.3 0.5l1.1 0.5c0 0.1 0 0.4 0 0.5zM9.7 3.6c0.1-0.1 0.5-0.1 0.7 0 0.1 0.1 0.1 0.5 0 0.7-0.1 0.1-0.5 0.1-0.7 0-0.1-0.1-0.1-0.5 0-0.7zm5.6 4.5C15.4 7.8 15.7 7.7 16 7.8 16.2 8 16.4 8.2 16.2 8.5 16.1 8.8 15.8 8.9 15.6 8.8 15.3 8.6 15.2 8.4 15.3 8.1z"/>
+</svg>
\ No newline at end of file
diff --git a/container/srv-http/root/srv/_h5ai/public/images/themes/comity/txt-script.svg b/container/srv-http/root/srv/_h5ai/public/images/themes/comity/txt-script.svg
new file mode 100755
index 0000000..f8704e8
--- /dev/null
+++ b/container/srv-http/root/srv/_h5ai/public/images/themes/comity/txt-script.svg
@@ -0,0 +1,3 @@
+<svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 20 20">
+  <path fill="#1976d2" d="M 8.59375 3 L 8 5.09375 L 6.84375 5.8125 L 4.625 5.34375 L 3.21875 7.65625 L 4.84375 9.3125 L 4.84375 10.6875 L 3.21875 12.34375 L 4.625 14.65625 L 6.84375 14.1875 L 8 14.90625 L 8.59375 17 L 11.40625 17 L 12.09375 14.90625 L 13.15625 14.1875 L 15.375 14.65625 L 16.78125 12.34375 L 15.25 10.6875 L 15.25 9.3125 L 16.78125 7.65625 L 15.375 5.34375 L 13.15625 5.8125 L 12.09375 5.09375 L 11.40625 3 L 8.59375 3 z M 10 7.5 C 11.380712 7.5 12.5 8.6192881 12.5 10 C 12.5 11.380712 11.380712 12.5 10 12.5 C 8.6192881 12.5 7.5 11.380712 7.5 10 C 7.5 8.6192881 8.6192881 7.5 10 7.5 z"/>
+</svg>
\ No newline at end of file
diff --git a/container/srv-http/root/srv/_h5ai/public/images/themes/comity/x-pdf.svg b/container/srv-http/root/srv/_h5ai/public/images/themes/comity/x-pdf.svg
new file mode 100755
index 0000000..5266630
--- /dev/null
+++ b/container/srv-http/root/srv/_h5ai/public/images/themes/comity/x-pdf.svg
@@ -0,0 +1,3 @@
+<svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 20 20">
+  <path fill="#e33" d="M 7.1837924,11.307953 C 7.6707878,10.353408 8.2243075,9.2777656 8.6673693,8.1977207 l 0,0 0.1750865,-0.4261233 C 8.2638361,5.5694562 7.9167872,3.8015945 8.2268175,2.65879 l 0,0 C 8.3103144,2.3606956 8.6554508,2.1799563 9.0244582,2.1799563 l 0,0 0.2246724,0.0031 0.041496,0 c 0.5051971,-0.00754 0.7430344,0.6351036 0.7700294,0.8848773 l 0,0 c 0.04457,0.4160895 -0.1480415,1.1202107 -0.1480415,1.1202107 l 0,0 c 0,-0.2842813 0.011293,-0.7436667 -0.1681885,-1.1402846 l 0,0 C 9.5354439,2.5891118 9.3358716,2.3148707 9.1570283,2.2715686 l 0,0 C 9.0667026,2.3318431 8.9787995,2.4566961 8.9486794,2.69706 l 0,0 c -0.062153,0.337009 -0.080934,0.7625005 -0.080934,0.9815213 l 0,0 c 0,0.7750507 0.1524795,1.7973568 0.4524699,2.8516732 l 0,0 C 9.376732,6.3670176 9.4262491,6.2102008 9.4658631,6.0633393 l 0,0 C 9.5273333,5.831768 9.9183329,4.2967327 9.9183329,4.2967327 l 0,0 c 0,0 -0.098522,2.0433649 -0.2359592,2.6615218 l 0,0 c -0.029539,0.130453 -0.062152,0.2598125 -0.095963,0.3922291 l 0,0 c 0.4945263,1.3812802 1.2909033,2.613824 2.2410503,3.5012084 l 0,0 c 0.374662,0.350187 0.847839,0.632591 1.295924,0.889897 l 0,0 c 0.977747,-0.140017 1.878312,-0.205837 2.629514,-0.197674 l 0,0 c 0.996584,0.01322 1.728324,0.160674 2.024539,0.452468 l 0,0 c 0.144967,0.141893 0.203958,0.313158 0.222161,0.505196 l 0,0 c 0.0046,0.07457 -0.03192,0.250406 -0.04265,0.294341 l 0,0 c 0.01063,-0.0533 0.01063,-0.315665 -0.789481,-0.571091 l 0,0 c -0.630087,-0.201452 -1.809285,-0.195167 -3.224454,-0.04454 l 0,0 c 1.636707,0.800785 3.231353,1.198664 3.736549,0.960177 l 0,0 c 0.123621,-0.06024 0.273628,-0.265462 0.273628,-0.265462 l 0,0 c 0,0 -0.08911,0.404778 -0.153163,0.505805 l 0,0 c -0.08162,0.109794 -0.241612,0.229069 -0.393496,0.26923 l 0,0 c -0.79828,0.212748 -2.875529,-0.279901 -4.686694,-1.314763 l 0,0 C 10.696554,12.63337 8.4743315,13.183748 6.69329,13.768015 l 0,0 c -1.7505467,3.067553 -3.0665588,4.476442 -4.1371905,3.940501 l 0,0 -0.3934914,-0.197673 C 2.0026124,17.419141 1.9780925,17.196419 2.0150773,17.015058 l 0,0 C 2.139895,16.40444 2.9055885,15.484427 4.443769,14.566287 l 0,0 c 0.1656275,-0.100408 0.9030766,-0.490141 0.9030766,-0.490141 l 0,0 c 0,0 -0.5459891,0.528424 -0.6740006,0.631965 l 0,0 c -1.2275229,1.005988 -2.1337362,2.2718 -2.1111425,2.762564 l 0,0 0.00437,0.04265 c 1.0430672,-0.148719 2.6069697,-2.271187 4.6177021,-6.205417 m 0.6369822,0.326336 C 7.4850166,12.266842 7.156801,12.852992 6.8536863,13.391448 l 0,0 C 8.5299255,12.689213 10.33419,12.239865 12.051848,11.920429 l 0,0 c -0.23094,-0.159484 -0.454977,-0.328215 -0.665855,-0.506443 l 0,0 C 10.440248,10.613209 9.7191732,9.6141206 9.196409,8.562942 l 0,0 C 8.8650521,9.4559636 8.4709445,10.40486 7.8207804,11.634266"/>
+</svg>
\ No newline at end of file
diff --git a/container/srv-http/root/srv/_h5ai/public/images/themes/default/ar.svg b/container/srv-http/root/srv/_h5ai/public/images/themes/default/ar.svg
new file mode 100755
index 0000000..e25cded
--- /dev/null
+++ b/container/srv-http/root/srv/_h5ai/public/images/themes/default/ar.svg
@@ -0,0 +1,3 @@
+<svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 20 20">
+  <path fill="#555" d="M3 3v14h14V6l-3-3zm2 2h4v3h2V5h2l2 2v8H5z"/>
+</svg>
\ No newline at end of file
diff --git a/container/srv-http/root/srv/_h5ai/public/images/themes/default/aud.svg b/container/srv-http/root/srv/_h5ai/public/images/themes/default/aud.svg
new file mode 100755
index 0000000..dd955fc
--- /dev/null
+++ b/container/srv-http/root/srv/_h5ai/public/images/themes/default/aud.svg
@@ -0,0 +1,3 @@
+<svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 20 20">
+  <path fill="#555" d="M6 4l9 6-9 6z"/>
+</svg>
\ No newline at end of file
diff --git a/container/srv-http/root/srv/_h5ai/public/images/themes/default/bin.svg b/container/srv-http/root/srv/_h5ai/public/images/themes/default/bin.svg
new file mode 100755
index 0000000..34f1f45
--- /dev/null
+++ b/container/srv-http/root/srv/_h5ai/public/images/themes/default/bin.svg
@@ -0,0 +1,3 @@
+<svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 20 20">
+  <path fill="#555" d="M 8.59375 3 L 8 5.09375 L 6.84375 5.8125 L 4.625 5.34375 L 3.21875 7.65625 L 4.84375 9.3125 L 4.84375 10.6875 L 3.21875 12.34375 L 4.625 14.65625 L 6.84375 14.1875 L 8 14.90625 L 8.59375 17 L 11.40625 17 L 12.09375 14.90625 L 13.15625 14.1875 L 15.375 14.65625 L 16.78125 12.34375 L 15.25 10.6875 L 15.25 9.3125 L 16.78125 7.65625 L 15.375 5.34375 L 13.15625 5.8125 L 12.09375 5.09375 L 11.40625 3 L 8.59375 3 z M 10 7.5 C 11.380712 7.5 12.5 8.6192881 12.5 10 C 12.5 11.380712 11.380712 12.5 10 12.5 C 8.6192881 12.5 7.5 11.380712 7.5 10 C 7.5 8.6192881 8.6192881 7.5 10 7.5 z"/>
+</svg>
\ No newline at end of file
diff --git a/container/srv-http/root/srv/_h5ai/public/images/themes/default/file.svg b/container/srv-http/root/srv/_h5ai/public/images/themes/default/file.svg
new file mode 100755
index 0000000..66bcac7
--- /dev/null
+++ b/container/srv-http/root/srv/_h5ai/public/images/themes/default/file.svg
@@ -0,0 +1,3 @@
+<svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 20 20">
+  <path fill="#555" d="M3 2v16h14V6l-4-4zm2 2h7l3 3v9H5z"/>
+</svg>
\ No newline at end of file
diff --git a/container/srv-http/root/srv/_h5ai/public/images/themes/default/folder-page.svg b/container/srv-http/root/srv/_h5ai/public/images/themes/default/folder-page.svg
new file mode 100755
index 0000000..4ca3ec2
--- /dev/null
+++ b/container/srv-http/root/srv/_h5ai/public/images/themes/default/folder-page.svg
@@ -0,0 +1,3 @@
+<svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 20 20">
+  <path fill="#555" d="M2 3v14h16V5h-8L8 3H2zm14 4v8H8l8-8z"/>
+</svg>
\ No newline at end of file
diff --git a/container/srv-http/root/srv/_h5ai/public/images/themes/default/folder-parent.svg b/container/srv-http/root/srv/_h5ai/public/images/themes/default/folder-parent.svg
new file mode 100755
index 0000000..e114689
--- /dev/null
+++ b/container/srv-http/root/srv/_h5ai/public/images/themes/default/folder-parent.svg
@@ -0,0 +1,3 @@
+<svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 20 20">
+  <path fill="#555" d="M9 4l-6 6 6 6 1.4-1.4L6.8 11H16V9H6.8l3.6-3.6z"/>
+</svg>
\ No newline at end of file
diff --git a/container/srv-http/root/srv/_h5ai/public/images/themes/default/folder.svg b/container/srv-http/root/srv/_h5ai/public/images/themes/default/folder.svg
new file mode 100755
index 0000000..3e971cf
--- /dev/null
+++ b/container/srv-http/root/srv/_h5ai/public/images/themes/default/folder.svg
@@ -0,0 +1,3 @@
+<svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 20 20">
+  <path fill="#555" d="M2 3v14h16V5h-8L8 3z"/>
+</svg>
\ No newline at end of file
diff --git a/container/srv-http/root/srv/_h5ai/public/images/themes/default/img.svg b/container/srv-http/root/srv/_h5ai/public/images/themes/default/img.svg
new file mode 100755
index 0000000..e754e82
--- /dev/null
+++ b/container/srv-http/root/srv/_h5ai/public/images/themes/default/img.svg
@@ -0,0 +1,3 @@
+<svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 20 20">
+  <path fill="#555" d="M8 8l3 4.712L13 11l4 5H3zm8-2a2 2 0 1 1-4 0 2 2 0 1 1 4 0z"/>
+</svg>
\ No newline at end of file
diff --git a/container/srv-http/root/srv/_h5ai/public/images/themes/default/txt.svg b/container/srv-http/root/srv/_h5ai/public/images/themes/default/txt.svg
new file mode 100755
index 0000000..d5c0dc9
--- /dev/null
+++ b/container/srv-http/root/srv/_h5ai/public/images/themes/default/txt.svg
@@ -0,0 +1,3 @@
+<svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 20 20">
+  <path fill="#555" d="M4 3v2h12V3zm0 4v2h8V7zm0 4v2h12v-2zm0 4v2h6v-2z"/>
+</svg>
\ No newline at end of file
diff --git a/container/srv-http/root/srv/_h5ai/public/images/themes/default/vid.svg b/container/srv-http/root/srv/_h5ai/public/images/themes/default/vid.svg
new file mode 100755
index 0000000..dd955fc
--- /dev/null
+++ b/container/srv-http/root/srv/_h5ai/public/images/themes/default/vid.svg
@@ -0,0 +1,3 @@
+<svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 20 20">
+  <path fill="#555" d="M6 4l9 6-9 6z"/>
+</svg>
\ No newline at end of file
diff --git a/container/srv-http/root/srv/_h5ai/public/images/themes/default/x.svg b/container/srv-http/root/srv/_h5ai/public/images/themes/default/x.svg
new file mode 100755
index 0000000..66bcac7
--- /dev/null
+++ b/container/srv-http/root/srv/_h5ai/public/images/themes/default/x.svg
@@ -0,0 +1,3 @@
+<svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 20 20">
+  <path fill="#555" d="M3 2v16h14V6l-4-4zm2 2h7l3 3v9H5z"/>
+</svg>
\ No newline at end of file
diff --git a/container/srv-http/root/srv/_h5ai/public/images/ui/back.svg b/container/srv-http/root/srv/_h5ai/public/images/ui/back.svg
new file mode 100755
index 0000000..3275e21
--- /dev/null
+++ b/container/srv-http/root/srv/_h5ai/public/images/ui/back.svg
@@ -0,0 +1,3 @@
+<svg xmlns:svg="http://www.w3.org/2000/svg" xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" version="1.1">
+  <path d="M20 11h-12.17l5.59-5.59-1.42-1.41-8 8 8 8 1.41-1.41-5.58-5.59h12.17v-2z" fill="#555"/>
+</svg>
\ No newline at end of file
diff --git a/container/srv-http/root/srv/_h5ai/public/images/ui/crumb.svg b/container/srv-http/root/srv/_h5ai/public/images/ui/crumb.svg
new file mode 100755
index 0000000..8dfd404
--- /dev/null
+++ b/container/srv-http/root/srv/_h5ai/public/images/ui/crumb.svg
@@ -0,0 +1,3 @@
+<svg xmlns:svg="http://www.w3.org/2000/svg" xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" version="1.1">
+  <path d="M10 6l-1.4 1.4 4.6 4.6-4.6 4.6 1.4 1.4 6-6z" fill="#555"/>
+</svg>
\ No newline at end of file
diff --git a/container/srv-http/root/srv/_h5ai/public/images/ui/download.svg b/container/srv-http/root/srv/_h5ai/public/images/ui/download.svg
new file mode 100755
index 0000000..5721c4e
--- /dev/null
+++ b/container/srv-http/root/srv/_h5ai/public/images/ui/download.svg
@@ -0,0 +1,3 @@
+<svg xmlns:svg="http://www.w3.org/2000/svg" xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" version="1.1">
+  <path d="M19 9h-4v-6h-6v6h-4l7 7 7-7zm-14 9v2h14v-2h-14z" fill="#555"/>
+</svg>
\ No newline at end of file
diff --git a/container/srv-http/root/srv/_h5ai/public/images/ui/filter.svg b/container/srv-http/root/srv/_h5ai/public/images/ui/filter.svg
new file mode 100755
index 0000000..d6d4c78
--- /dev/null
+++ b/container/srv-http/root/srv/_h5ai/public/images/ui/filter.svg
@@ -0,0 +1,5 @@
+<svg xmlns:svg="http://www.w3.org/2000/svg" xmlns="http://www.w3.org/2000/svg" width="24" height="24" version="1.1">
+  <g transform="translate(0,-8)">
+    <path d="m15.8 22.3h-0.8l-0.3-0.3c1-1.1 1.6-2.6 1.6-4.2 0-3.6-2.9-6.5-6.5-6.5-3.6 0-6.5 2.9-6.5 6.5 0 3.6 2.9 6.5 6.5 6.5 1.6 0 3.1-0.6 4.2-1.6l0.3 0.3v0.8l5 5 1.5-1.5-5-5zm-6 0c-2.5 0-4.5-2-4.5-4.5 0-2.5 2-4.5 4.5-4.5 2.5 0 4.5 2 4.5 4.5 0 2.5-2 4.5-4.5 4.5z" fill="#555"/>
+  </g>
+</svg>
\ No newline at end of file
diff --git a/container/srv-http/root/srv/_h5ai/public/images/ui/info-toggle.svg b/container/srv-http/root/srv/_h5ai/public/images/ui/info-toggle.svg
new file mode 100755
index 0000000..ebc0e5c
--- /dev/null
+++ b/container/srv-http/root/srv/_h5ai/public/images/ui/info-toggle.svg
@@ -0,0 +1,3 @@
+<svg xmlns:svg="http://www.w3.org/2000/svg" xmlns="http://www.w3.org/2000/svg" width="24" height="24" version="1.1">
+  <path d="M 12 2 C 6.48 2 2 6.48 2 12 C 2 17.52 6.48 22 12 22 C 17.52 22 22 17.52 22 12 C 22 6.48 17.52 2 12 2 z M 11 7 L 13 7 L 13 9 L 11 9 L 11 7 z M 11 11 L 13 11 L 13 17 L 11 17 L 11 11 z" fill="#555"/>
+</svg>
\ No newline at end of file
diff --git a/container/srv-http/root/srv/_h5ai/public/images/ui/paypal.svg b/container/srv-http/root/srv/_h5ai/public/images/ui/paypal.svg
new file mode 100755
index 0000000..a17415e
--- /dev/null
+++ b/container/srv-http/root/srv/_h5ai/public/images/ui/paypal.svg
@@ -0,0 +1,6 @@
+<svg xmlns:svg="http://www.w3.org/2000/svg" xmlns="http://www.w3.org/2000/svg" width="296" height="76" version="1.1">
+  <g transform="translate(782.29881,-654.4062)">
+    <path d="m-618.9 654.6c-1.8 0-3.5 1.4-3.9 3.1L-634.2 707.6c-0.4 1.7 0.7 3.1 2.4 3.1l8.2 0c1.7 0 3.5-1.4 3.9-3.1L-616.9 695.5c0.4-1.7 2.1-3.1 3.9-3.1l2.3 0c10 0 17.7-2 23.3-6.1 5.5-4.1 8.3-9.5 8.3-16.2 0-2.9-0.5-5.4-1.6-7.3-1-2-2.6-3.6-4.5-4.8-2-1.2-4.4-2.1-7.1-2.6-2.7-0.5-5.9-0.7-9.6-0.7l-17.1 0zm115.3 0.3 0 2.3-0.9 0 0 1.1 0.9 0 0 4.2c0 1 0.2 1.7 0.6 2.1 0.4 0.4 1 0.7 1.8 0.7 0.2 0 0.5 0 0.8-0.1 0.3 0 0.6-0.1 0.8-0.2l0-1.2-0.1 0c-0.1 0-0.3 0.1-0.5 0.2-0.2 0.1-0.5 0.1-0.7 0.1-0.4 0-0.6-0.1-0.8-0.2-0.2-0.1-0.3-0.2-0.4-0.4-0.1-0.2-0.2-0.4-0.2-0.7 0-0.2 0-0.6 0-1l0-3.6 2.8 0 0-1.1-2.7 0 0-2.3-1.3 0zm-17 0.1c-1.7 0-3.4 1.3-3.8 2.9 0 0.1 0 0.1-0.1 0.2 0 0-0.2 0.8-0.5 2.2l-10 45.4c-0.2 1-0.4 1.7-0.4 1.9l0 0c-0.3 1.6 0.6 2.9 2.2 3l0 0 7.6 0c1.7 0 3.3-1.3 3.8-2.9 0-0.1 0.1-0.1 0.1-0.2l10.9-49.4c0.4-1.7-0.7-3.1-2.5-3.1l-7.3 0c0 0 0 0 0 0zm26.6 2c-0.5 0-0.9 0.1-1.3 0.3-0.4 0.2-0.8 0.5-1.2 0.8l0-0.9-1.3 0 0 7.9 1.3 0 0-5.9c0.4-0.3 0.7-0.5 1.1-0.7 0.4-0.2 0.7-0.2 1.1-0.2 0.4 0 0.7 0.1 0.9 0.2 0.2 0.1 0.4 0.2 0.5 0.4 0.1 0.2 0.2 0.5 0.2 0.8 0 0.3 0 0.6 0 1l0 4.5 1.3 0 0-5.1c0-0.1 0-0.3 0-0.4 0-0.1 0-0.3-0.1-0.4 0.4-0.3 0.8-0.5 1.1-0.7 0.4-0.2 0.7-0.3 1.1-0.3 0.4 0 0.7 0.1 0.9 0.2 0.2 0.1 0.4 0.3 0.5 0.5 0.1 0.2 0.2 0.4 0.2 0.8 0 0.3 0 0.6 0 1l0 4.5 1.3 0 0-5.2c0-0.9-0.2-1.7-0.6-2.2-0.4-0.5-1.1-0.8-1.9-0.8-0.5 0-1 0.1-1.4 0.3-0.4 0.2-1 0.5-1.5 1-0.2-0.4-0.5-0.7-0.8-0.9-0.4-0.2-0.8-0.3-1.4-0.3zm-112.8 8 2.7 0c3.1 0 5.5 0.5 7.1 1.6 1.6 1.1 2.3 2.7 2.3 4.9 0 3.3-1.2 5.9-3.7 7.7-2.4 1.8-5.9 2.7-10.3 2.7l-2 0c-1.8 0-2.9-1.4-2.5-3.1l2.4-10.6c0.4-1.7 2.1-3.1 3.9-3.1zm50.8 2.2c-3.3 0-6.6 0.3-9.9 0.8-2.4 0.4-2.7 0.4-4.2 0.8-3.1 0.7-3.6 3.8-3.6 3.8l-1 4.1c-0.6 2.6 0.9 2.5 1.6 2.3 1.4-0.4 2.1-0.8 4.8-1.4 2.6-0.6 5.4-1 7.7-1 3.3 0 5.7 0.3 7.4 1 1.6 0.7 2.5 1.9 2.5 3.7 0 0.4 0 0.8-0.1 1.2-0.1 0.3-0.4 0.6-1.2 0.8-4.7 0.3-8 0.7-12 1.3-4 0.6-7.4 1.5-10.3 2.8-3.1 1.4-5.4 3.2-7 5.5-1.6 2.3-2.3 5.2-2.3 8.5 0 3.2 1.1 5.7 3.3 7.7 2.2 2 5.1 2.9 8.6 2.9 2.2 0 3.9-0.2 5.1-0.5 1.2-0.3 2.5-0.7 3.9-1.3 1-0.4 2.2-1.1 3.4-1.9 1.2-0.8 2-1.3 3.1-2l0 0.1-0.3 1.3c0 0 0 0 0 0l0 0c-0.3 1.6 0.6 2.9 2.2 3l0 0 0.1 0c1 0 4.6 0 6.3 0l1.2 0c0.1 0 0.1 0 0.1 0 1.6-0.2 3.1-1.5 3.5-3.1l6-25.7c0.1-0.6 0.2-1.3 0.3-2.1 0.1-0.8 0.2-1.5 0.1-1.9 0-3.6-1.5-6.3-4.6-8.1-3.1-1.7-7.9-2.6-14.6-2.6zm2.8 23.6c0.3 0 0.4 0.1 0.3 1-0.1 0.5-1.1 4.9-1.6 6.9-0.1 0.6-1 1.5-1.3 1.7-1 0.6-2.1 1.2-3.2 1.6-1.5 0.6-2.9 0.9-4.2 0.9-2 0-3.6-0.3-4.6-0.9-1.1-0.6-1.6-1.6-1.6-3 0-1.7 0.4-3 1.2-4 0.8-1 2-1.8 3.5-2.4 1.5-0.5 3.3-0.9 5.4-1.2 1.9-0.2 5.5-0.7 6-0.7 0.1 0 0.2 0 0.3 0z" fill="#369"/>
+    <path d="m-749.8 654.4-17 0c-1.8 0-3.5 1.4-3.9 3.1l-11.5 49.9c-0.4 1.7 0.7 3.1 2.5 3.1l8.2 0c1.8 0 3.5-1.4 3.9-3.1l2.8-12.1c0.4-1.7 2.1-3.1 3.9-3.1l2.3 0c10 0 17.7-2 23.3-6.1 5.5-4.1 8.3-9.5 8.3-16.2 0-2.9-0.5-5.4-1.6-7.3-1-2-2.5-3.6-4.5-4.8-2-1.2-4.3-2.1-7.1-2.6-2.7-0.5-6-0.7-9.6-0.8zm-4.8 10.4 2.7 0c3.1 0 5.5 0.5 7.1 1.6 1.6 1 2.4 2.7 2.4 4.8 0 3.3-1.2 5.9-3.7 7.7-2.5 1.8-5.9 2.7-10.3 2.7l-2 0c-1.8 0-2.9-1.4-2.5-3.1l2.5-10.6c0.4-1.7 2.1-3.1 3.9-3.1zm50.7 2.3c-3.3 0-6.6 0.2-9.9 0.8-2.4 0.4-2.6 0.5-4.2 0.8-3.1 0.7-3.6 3.8-3.6 3.8l-1 4.1c-0.6 2.6 0.9 2.5 1.6 2.3 1.3-0.4 2.1-0.8 4.8-1.4 2.6-0.6 5.4-1 7.7-1 3.3 0 5.8 0.4 7.4 1.1 1.7 0.7 2.4 1.9 2.4 3.7 0 0.4 0 0.8-0.1 1.2-0.1 0.3-0.4 0.6-1.2 0.8-4.6 0.3-8 0.7-12 1.3-4 0.6-7.4 1.5-10.3 2.8-3.1 1.4-5.4 3.2-7 5.5-1.6 2.3-2.3 5.2-2.3 8.5 0 3.2 1.1 5.8 3.3 7.8 2.2 2 5.1 2.9 8.6 2.9 2.2 0 3.9-0.2 5.1-0.5 1.2-0.3 2.5-0.7 3.9-1.3 1-0.4 2.2-1.1 3.4-1.9 1.2-0.8 2-1.3 3.1-2l0 0.1-0.3 1.3c0 0 0 0 0 0-0.3 1.6 0.6 2.9 2.2 3.1l0 0 0.1 0c1 0 4.6 0 6.3 0l1.2 0c0.1 0 0.1 0 0.1-0.1 1.6-0.2 3.1-1.5 3.5-3l5.9-25.7c0.1-0.6 0.3-1.3 0.3-2.1 0.1-0.8 0.1-1.5 0.1-1.9 0-3.6-1.5-6.3-4.6-8.1-3.1-1.7-7.9-2.6-14.6-2.6zm60.2 0.6c-1.7 0-4 1.4-5.1 3.1 0 0-11.7 20-12.8 22-0.6 1.1-1.2 0.4-1.3 0-0.1-0.5-3.6-21.9-3.6-21.9-0.4-1.7-2.2-3.2-4.4-3.2l-7.3 0c-1.8 0-2.9 1.4-2.5 3.1 0 0 5.6 31.5 6.7 39 0.5 4.1-0.1 4.8-0.1 4.8l-7.2 12.6c-1.1 1.7-0.5 3.1 1.3 3.1l8.4 0c1.7 0 4.1-1.4 5.1-3.1l32.5-54.9c0 0 3.1-4.7 0.2-4.7-2 0-9.8 0-9.8 0zM-701.4 690.8c0.5 0 0.8-0.3 0.6 1-0.1 0.5-1.1 4.9-1.6 6.9-0.1 0.6-0.9 1.5-1.3 1.7-1 0.6-2.1 1.2-3.2 1.7-1.5 0.6-2.9 0.9-4.2 0.9-2 0-3.6-0.3-4.6-0.9-1.1-0.6-1.6-1.6-1.6-3 0-1.7 0.4-3 1.2-4 0.8-1 2-1.8 3.5-2.3 1.5-0.5 3.3-0.9 5.4-1.2 1.9-0.2 5.5-0.7 6-0.7z" fill="#1c3664"/>
+  </g>
+</svg>
\ No newline at end of file
diff --git a/container/srv-http/root/srv/_h5ai/public/images/ui/preview-close.svg b/container/srv-http/root/srv/_h5ai/public/images/ui/preview-close.svg
new file mode 100755
index 0000000..ef5f8a0
--- /dev/null
+++ b/container/srv-http/root/srv/_h5ai/public/images/ui/preview-close.svg
@@ -0,0 +1,3 @@
+<svg xmlns:svg="http://www.w3.org/2000/svg" xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" version="1.1">
+  <path d="M19 6.4l-1.4-1.4-5.6 5.6-5.6-5.6-1.4 1.4 5.6 5.6-5.6 5.6 1.4 1.4 5.6-5.6 5.6 5.6 1.4-1.4-5.6-5.6z" fill="#fff"/>
+</svg>
\ No newline at end of file
diff --git a/container/srv-http/root/srv/_h5ai/public/images/ui/preview-fullscreen.svg b/container/srv-http/root/srv/_h5ai/public/images/ui/preview-fullscreen.svg
new file mode 100755
index 0000000..bf04ad7
--- /dev/null
+++ b/container/srv-http/root/srv/_h5ai/public/images/ui/preview-fullscreen.svg
@@ -0,0 +1,3 @@
+<svg xmlns:svg="http://www.w3.org/2000/svg" xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" version="1.1">
+  <path d="M7 14h-2v5h5v-2h-3v-3zm-2-4h2v-3h3v-2h-5v5zm12 7h-3v2h5v-5h-2v3zm-3-12v2h3v3h2v-5h-5z" fill="#fff"/>
+</svg>
\ No newline at end of file
diff --git a/container/srv-http/root/srv/_h5ai/public/images/ui/preview-next.svg b/container/srv-http/root/srv/_h5ai/public/images/ui/preview-next.svg
new file mode 100755
index 0000000..1b72100
--- /dev/null
+++ b/container/srv-http/root/srv/_h5ai/public/images/ui/preview-next.svg
@@ -0,0 +1,3 @@
+<svg xmlns:svg="http://www.w3.org/2000/svg" xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" version="1.1">
+  <path d="M10 6l-1.4 1.4 4.6 4.6-4.6 4.6 1.4 1.4 6-6z" fill="#fff"/>
+</svg>
\ No newline at end of file
diff --git a/container/srv-http/root/srv/_h5ai/public/images/ui/preview-no-fullscreen.svg b/container/srv-http/root/srv/_h5ai/public/images/ui/preview-no-fullscreen.svg
new file mode 100755
index 0000000..d2a3efb
--- /dev/null
+++ b/container/srv-http/root/srv/_h5ai/public/images/ui/preview-no-fullscreen.svg
@@ -0,0 +1,3 @@
+<svg xmlns:svg="http://www.w3.org/2000/svg" xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" version="1.1">
+  <path d="M5 16h3v3h2v-5h-5v2zm3-8h-3v2h5v-5h-2v3zm6 11h2v-3h3v-2h-5v5zm2-11v-3h-2v5h5v-2h-3z" fill="#fff"/>
+</svg>
\ No newline at end of file
diff --git a/container/srv-http/root/srv/_h5ai/public/images/ui/preview-prev.svg b/container/srv-http/root/srv/_h5ai/public/images/ui/preview-prev.svg
new file mode 100755
index 0000000..a592b22
--- /dev/null
+++ b/container/srv-http/root/srv/_h5ai/public/images/ui/preview-prev.svg
@@ -0,0 +1,3 @@
+<svg xmlns:svg="http://www.w3.org/2000/svg" xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" version="1.1">
+  <path d="M14.6 18 16 16.6 11.4 12 16 7.4 14.6 6l-6 6z" fill="#fff"/>
+</svg>
\ No newline at end of file
diff --git a/container/srv-http/root/srv/_h5ai/public/images/ui/preview-raw.svg b/container/srv-http/root/srv/_h5ai/public/images/ui/preview-raw.svg
new file mode 100755
index 0000000..7a8a69d
--- /dev/null
+++ b/container/srv-http/root/srv/_h5ai/public/images/ui/preview-raw.svg
@@ -0,0 +1,3 @@
+<svg xmlns:svg="http://www.w3.org/2000/svg" xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" version="1.1">
+  <path d="M19 9h-4v-6h-6v6h-4l7 7 7-7zm-14 9v2h14v-2h-14z" fill="#fff"/>
+</svg>
\ No newline at end of file
diff --git a/container/srv-http/root/srv/_h5ai/public/images/ui/search.svg b/container/srv-http/root/srv/_h5ai/public/images/ui/search.svg
new file mode 100755
index 0000000..d6d4c78
--- /dev/null
+++ b/container/srv-http/root/srv/_h5ai/public/images/ui/search.svg
@@ -0,0 +1,5 @@
+<svg xmlns:svg="http://www.w3.org/2000/svg" xmlns="http://www.w3.org/2000/svg" width="24" height="24" version="1.1">
+  <g transform="translate(0,-8)">
+    <path d="m15.8 22.3h-0.8l-0.3-0.3c1-1.1 1.6-2.6 1.6-4.2 0-3.6-2.9-6.5-6.5-6.5-3.6 0-6.5 2.9-6.5 6.5 0 3.6 2.9 6.5 6.5 6.5 1.6 0 3.1-0.6 4.2-1.6l0.3 0.3v0.8l5 5 1.5-1.5-5-5zm-6 0c-2.5 0-4.5-2-4.5-4.5 0-2.5 2-4.5 4.5-4.5 2.5 0 4.5 2 4.5 4.5 0 2.5-2 4.5-4.5 4.5z" fill="#555"/>
+  </g>
+</svg>
\ No newline at end of file
diff --git a/container/srv-http/root/srv/_h5ai/public/images/ui/selected.svg b/container/srv-http/root/srv/_h5ai/public/images/ui/selected.svg
new file mode 100755
index 0000000..50ac249
--- /dev/null
+++ b/container/srv-http/root/srv/_h5ai/public/images/ui/selected.svg
@@ -0,0 +1,3 @@
+<svg xmlns:svg="http://www.w3.org/2000/svg" xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" version="1.1">
+  <path d="M9 16.2l-4.2-4.2-1.4 1.4 5.6 5.6 12-12-1.4-1.4z" fill="#fff"/>
+</svg>
\ No newline at end of file
diff --git a/container/srv-http/root/srv/_h5ai/public/images/ui/sidebar.svg b/container/srv-http/root/srv/_h5ai/public/images/ui/sidebar.svg
new file mode 100755
index 0000000..4e38c05
--- /dev/null
+++ b/container/srv-http/root/srv/_h5ai/public/images/ui/sidebar.svg
@@ -0,0 +1,3 @@
+<svg xmlns:svg="http://www.w3.org/2000/svg" xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" version="1.1">
+  <path d="M3 18h18v-2h-18v2zm0-5h18v-2h-18v2zm0-7v2h18v-2h-18z" fill="#555"/>
+</svg>
\ No newline at end of file
diff --git a/container/srv-http/root/srv/_h5ai/public/images/ui/sort.svg b/container/srv-http/root/srv/_h5ai/public/images/ui/sort.svg
new file mode 100755
index 0000000..5b0ed8d
--- /dev/null
+++ b/container/srv-http/root/srv/_h5ai/public/images/ui/sort.svg
@@ -0,0 +1,3 @@
+<svg xmlns:svg="http://www.w3.org/2000/svg" xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" version="1.1">
+  <path d="M18 9.7 16.6 8.3 12 12.9 7.4 8.3 6 9.7l6 6z" fill="#555"/>
+</svg>
\ No newline at end of file
diff --git a/container/srv-http/root/srv/_h5ai/public/images/ui/spinner.svg b/container/srv-http/root/srv/_h5ai/public/images/ui/spinner.svg
new file mode 100755
index 0000000..a5f7a7b
--- /dev/null
+++ b/container/srv-http/root/srv/_h5ai/public/images/ui/spinner.svg
@@ -0,0 +1,6 @@
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 32 32" width="32" height="32" fill="white">
+  <path opacity=".25" d="M16 0 A16 16 0 0 0 16 32 A16 16 0 0 0 16 0 M16 4 A12 12 0 0 1 16 28 A12 12 0 0 1 16 4"/>
+  <path d="M16 0 A16 16 0 0 1 32 16 L28 16 A12 12 0 0 0 16 4z">
+    <animateTransform attributeName="transform" type="rotate" from="0 16 16" to="360 16 16" dur="0.8s" repeatCount="indefinite" />
+  </path>
+</svg>
diff --git a/container/srv-http/root/srv/_h5ai/public/images/ui/tree-indicator.svg b/container/srv-http/root/srv/_h5ai/public/images/ui/tree-indicator.svg
new file mode 100755
index 0000000..8dfd404
--- /dev/null
+++ b/container/srv-http/root/srv/_h5ai/public/images/ui/tree-indicator.svg
@@ -0,0 +1,3 @@
+<svg xmlns:svg="http://www.w3.org/2000/svg" xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" version="1.1">
+  <path d="M10 6l-1.4 1.4 4.6 4.6-4.6 4.6 1.4 1.4 6-6z" fill="#555"/>
+</svg>
\ No newline at end of file
diff --git a/container/srv-http/root/srv/_h5ai/public/images/ui/tree-toggle.svg b/container/srv-http/root/srv/_h5ai/public/images/ui/tree-toggle.svg
new file mode 100755
index 0000000..9914792
--- /dev/null
+++ b/container/srv-http/root/srv/_h5ai/public/images/ui/tree-toggle.svg
@@ -0,0 +1,3 @@
+<svg xmlns:svg="http://www.w3.org/2000/svg" xmlns="http://www.w3.org/2000/svg" version="1.1" width="24" height="24" viewBox="0 0 24 24">
+  <path d="M4 3 4 6 7 6 7 3zm5 0 0 3 8 0 0-3zm-3 5 0 3 3 0 0-3zm5 0 0 3 9 0 0-3zm-5 5 0 3 3 0 0-3zm5 0 0 3 6 0 0-3zm-5 5 0 3 3 0 0-3zm5 0 0 3 8 0 0-3z" fill="#555"/>
+</svg>
\ No newline at end of file
diff --git a/container/srv-http/root/srv/_h5ai/public/images/ui/view-details.svg b/container/srv-http/root/srv/_h5ai/public/images/ui/view-details.svg
new file mode 100755
index 0000000..5e756e0
--- /dev/null
+++ b/container/srv-http/root/srv/_h5ai/public/images/ui/view-details.svg
@@ -0,0 +1,3 @@
+<svg xmlns:svg="http://www.w3.org/2000/svg" xmlns="http://www.w3.org/2000/svg" version="1.1" width="24" height="24" viewBox="0 0 24 24">
+  <path d="m4 4 0 4 16 0 0-4zm0 6 0 4 16 0 0-4zm0 6 0 4 16 0 0-4z" fill="#555"/>
+</svg>
\ No newline at end of file
diff --git a/container/srv-http/root/srv/_h5ai/public/images/ui/view-grid.svg b/container/srv-http/root/srv/_h5ai/public/images/ui/view-grid.svg
new file mode 100755
index 0000000..8f4c48c
--- /dev/null
+++ b/container/srv-http/root/srv/_h5ai/public/images/ui/view-grid.svg
@@ -0,0 +1,3 @@
+<svg xmlns:svg="http://www.w3.org/2000/svg" xmlns="http://www.w3.org/2000/svg" version="1.1" width="24" height="24" viewBox="0 0 24 24">
+  <path d="m4 4 0 4 7 0 0-4zm9 0 0 4 7 0 0-4zm-9 6 0 4 7 0 0-4zm9 0 0 4 7 0 0-4zm-9 6 0 4 7 0 0-4zm9 0 0 4 7 0 0-4z" fill="#555"/>
+</svg>
\ No newline at end of file
diff --git a/container/srv-http/root/srv/_h5ai/public/images/ui/view-icons.svg b/container/srv-http/root/srv/_h5ai/public/images/ui/view-icons.svg
new file mode 100755
index 0000000..8601293
--- /dev/null
+++ b/container/srv-http/root/srv/_h5ai/public/images/ui/view-icons.svg
@@ -0,0 +1,3 @@
+<svg xmlns:svg="http://www.w3.org/2000/svg" xmlns="http://www.w3.org/2000/svg" version="1.1" width="24" height="24" viewBox="0 0 24 24">
+  <path d="m4 4 0 7 7 0 0-7zm9 0 0 7 7 0 0-7zm-9 9 0 7 7 0 0-7zm9 0 0 7 7 0 0-7z" fill="#555"/>
+</svg>
\ No newline at end of file
diff --git a/container/srv-http/root/srv/_h5ai/public/index.php b/container/srv-http/root/srv/_h5ai/public/index.php
new file mode 100755
index 0000000..89f99e8
--- /dev/null
+++ b/container/srv-http/root/srv/_h5ai/public/index.php
@@ -0,0 +1,17 @@
+<?php
+
+define('H5AI_VERSION', '0.29.2');
+define('MIN_PHP_VERSION', '5.5.0');
+
+if (!function_exists('version_compare') || version_compare(PHP_VERSION, MIN_PHP_VERSION, '<')) {
+    header('Content-type: text/plain;charset=utf-8');
+    exit('[ERR] h5ai requires PHP ' . MIN_PHP_VERSION . ' or later, but found PHP ' . PHP_VERSION);
+}
+
+if (substr(H5AI_VERSION, 0, 1) === '{') {
+    header('Content-type: text/plain;charset=utf-8');
+    exit('[ERR] h5ai sources must be preprocessed to work correctly');
+}
+
+require_once __DIR__ . '/../private/php/class-bootstrap.php';
+Bootstrap::run();
diff --git a/container/srv-http/root/srv/_h5ai/public/js/scripts.js b/container/srv-http/root/srv/_h5ai/public/js/scripts.js
new file mode 100755
index 0000000..664fd61
--- /dev/null
+++ b/container/srv-http/root/srv/_h5ai/public/js/scripts.js
@@ -0,0 +1,5 @@
+/* h5ai v0.29.2 - https://larsjung.de/h5ai/ */
+!function(e){function t(e,t){if(!t)throw i.className=r,new Error(r+": "+e)}function n(e){return"function"==typeof e}if(!e||e.window!==e||!e.document)throw new Error("no-window");var r="no-browser",i=e.document.documentElement;i.className="",t("console",e.console&&n(e.console.log)),t("assign",e.Object&&n(e.Object.assign)),t("promise",n(e.Promise)),t("xhr",e.XMLHttpRequest)}(this),function(e){function t(r){if(n[r])return n[r].exports;var i=n[r]={exports:{},id:r,loaded:!1};return e[r].call(i.exports,i,i.exports,t),i.loaded=!0,i.exports}var n={};return t.m=e,t.c=n,t.p="",t(0)}([function(e,t,n){"use strict";n(1)},function(e,t,n){"use strict";var r=n(2),i=r.dom,o=r.awaitReady,a=n(7),s=i("script[data-module]").attr("data-module"),c={action:"get",setup:!0,options:!0,types:!0};if("index"===s)c.theme=!0,c.langs=!0;else{if("info"!==s)throw new Error("no-main-module: '"+s+"'");c.refresh=!0}a._update(c).then(function(){return o()}).then(function(){return n(9)("./"+s)})},function(e,t,n){"use strict";e.exports=Object.assign({},n(3),n(4),n(5),n(6))},function(e,t){"use strict";var n="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},r=function(e){return void 0!==e&&null!==e},i=function(e,t){return("undefined"==typeof e?"undefined":n(e))===t},o=function(e){return i(e,"string")},a=function(e){return i(e,"function")},s=function(e){return i(e,"number")},c=function(e){return e&&e.hasOwnProperty("length")},u=function(e){return!e||o(e)?[]:(c(e)&&(e=Array.from(e)),Object.keys(e))},l=function(e){return u(e).map(function(t){return e[t]})},f=function(e,t){return u(e).forEach(function(n){return t(e[n],n)})},d=function(e,t){return l(e).filter(t)},p=function(e,t){return l(e).map(t)},h=function(e,t){return l(e).indexOf(t)>=0},g=function(e){return d(e,function(e){return!!e})},m=function(e,t){return!!e&&e instanceof t},v=function(e){return Array.from(e)},b=function(e,t){return t=l(t),d(e,function(e){return t.indexOf(e)<0})},w=function(e,t){return t=l(t),d(e,function(e){return t.indexOf(e)>=0})},y=function(e,t){return e<t?-1:e>t?1:0},x=function(e,t){var n=a(t)?t:function(e){return e[t]},r=function(e,t){return y(n(e),n(t))};return l(e).sort(r)},k=function(e,t){var n=null;return function(){clearTimeout(n),n=setTimeout(e,t)}};e.exports={is:r,isStr:o,isFn:a,isNum:s,hasLength:c,keys:u,values:l,each:f,filter:d,map:p,includes:h,compact:g,isInstanceOf:m,toArray:v,difference:b,intersection:w,cmp:y,sortBy:x,debounce:k}},function(e,t,n){(function(t){"use strict";function r(e){if(Array.isArray(e)){for(var t=0,n=Array(e.length);t<e.length;t++)n[t]=e[t];return n}return Array.from(e)}var i=function(){function e(e,t){var n=[],r=!0,i=!1,o=void 0;try{for(var a,s=e[Symbol.iterator]();!(r=(a=s.next()).done)&&(n.push(a.value),!t||n.length!==t);r=!0);}catch(e){i=!0,o=e}finally{try{!r&&s.return&&s.return()}finally{if(i)throw o}}return n}return function(t,n){if(Array.isArray(t))return t;if(Symbol.iterator in Object(t))return e(t,n);throw new TypeError("Invalid attempt to destructure non-iterable instance")}}(),o=n(3),a=o.each,s=o.filter,c=o.hasLength,u=o.is,l=o.isStr,f=o.map,d=o.isInstanceOf,p=o.toArray,h=t.window,g=h.document,m=function(){var e=function(e){return g.createElement(e)},t=[[/^<t(head|body|foot)|^<c(ap|olg)/i,e("table")],[/^<col/i,e("colgroup")],[/^<tr/i,e("tbody")],[/^<t[dh]/i,e("tr")]],n=e("div"),r=function(e){var r=!0,o=!1,a=void 0;try{for(var s,c=t[Symbol.iterator]();!(r=(s=c.next()).done);r=!0){var u=s.value,l=i(u,2),f=l[0],d=l[1];if(f.test(e))return d}}catch(e){o=!0,a=e}finally{try{!r&&c.return&&c.return()}finally{if(o)throw a}}return n};return function(e){var t=r(e);t.innerHTML=e;var n=p(t.childNodes);return a(n,function(e){return t.removeChild(e)}),t.innerHTML="",n}}(),v=function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:g;try{return p(t.querySelectorAll(e))}catch(e){return[]}},b=function(e){return d(e,h.Element)},w=function(e){return d(e,h.Document)},y=function(e){return u(e)&&e.window===e&&w(e.document)},x=function(e){return b(e)||w(e)||y(e)},k=function(e,t,n){return e.addEventListener(t,n)},_=function(e,t,n){return e.removeEventListener(t,n)},C=new Promise(function(e){/^(i|c|loade)/.test(g.readyState)?e():k(g,"DOMContentLoaded",function(){return e()})}),S=function(){return C},A=new Promise(function(e){k(h,"load",function(){return e()})}),T=function(){return A},E=function e(t){if(d(t,e))return t;var n=void 0;return l(t)?(t=t.trim(),n="<"===t[0]?m(t):v(t)):n=x(t)?[t]:c(t)?t:[t],n=s(n,x),Object.assign(Object.create(e.prototype),n,{length:n.length})};E.prototype={constructor:E,each:function(e){return a(this,e),this},map:function(e){return f(this,e)},find:function(e){var t;return E((t=[]).concat.apply(t,r(this.map(function(t){return v(e,t)}))))},on:function(e,t){return this.each(function(n){return k(n,e,t)})},off:function(e,t){return this.each(function(n){return _(n,e,t)})},attr:function(e,t){return void 0===t?this.length?this[0].getAttribute(e):void 0:this.each(function(n){return n.setAttribute(e,t)})},rmAttr:function(e){return this.each(function(t){return t.removeAttribute(e)})},prop:function(e,t){return void 0===t?this.length?this[0][e]:void 0:this.each(function(n){n[e]=t})},rmProp:function(e){return this.each(function(t){return delete t[e]})},val:function(e){return void 0===e?this.length?this[0].value:void 0:this.each(function(t){t.value=e})},html:function(e){return void 0===e?this.map(function(e){return e.innerHTML}).join(""):this.each(function(t){t.innerHTML=e})},text:function(e){return void 0===e?this.map(function(e){return e.textContent}).join(""):this.each(function(t){t.textContent=e})},clr:function(){return this.html("")},rm:function(){return this.each(function(e){var t=e.parentNode;t&&t.removeChild(e)})},rpl:function(e){return this.each(function(t){var n=t.parentNode;n&&n.replaceChild(E(e)[0],t)})},app:function(e){return this.each(function(t){E(e).each(function(e){return t.appendChild(e)})})},appTo:function(e){return E(e).app(this),this},pre:function(e){return this.each(function(t){E(e).each(function(e){var n=t.firstChild;n?t.insertBefore(e,n):t.appendChild(e)})})},preTo:function(e){return E(e).pre(this),this},cls:function(){return arguments.length?(this.each(function(e){e.className=""}),this.addCls.apply(this,arguments)):this.length?p(this[0].classList):[]},hasCls:function(e){return p(this).every(function(t){return t.classList.contains(e)})},addCls:function(){for(var e=arguments.length,t=Array(e),n=0;n<e;n++)t[n]=arguments[n];return this.each(function(e){var n=!0,r=!1,i=void 0;try{for(var o,a=t[Symbol.iterator]();!(n=(o=a.next()).done);n=!0){var s=o.value;e.classList.add(s)}}catch(e){r=!0,i=e}finally{try{!n&&a.return&&a.return()}finally{if(r)throw i}}})},rmCls:function(){for(var e=arguments.length,t=Array(e),n=0;n<e;n++)t[n]=arguments[n];return this.each(function(e){var n=!0,r=!1,i=void 0;try{for(var o,a=t[Symbol.iterator]();!(n=(o=a.next()).done);n=!0){var s=o.value;e.classList.remove(s)}}catch(e){r=!0,i=e}finally{try{!n&&a.return&&a.return()}finally{if(r)throw i}}})},tglCls:function(){for(var e=arguments.length,t=Array(e),n=0;n<e;n++)t[n]=arguments[n];return this.each(function(e){var n=!0,r=!1,i=void 0;try{for(var o,a=t[Symbol.iterator]();!(n=(o=a.next()).done);n=!0){var s=o.value;e.classList.contains(s)?e.classList.remove(s):e.classList.add(s)}}catch(e){r=!0,i=e}finally{try{!n&&a.return&&a.return()}finally{if(r)throw i}}})},parent:function(){return E(this.map(function(e){return e.parentNode}))},children:function(){var e;return E((e=[]).concat.apply(e,r(this.map(function(e){return p(e.children)}))))},hide:function(){return this.addCls("hidden")},show:function(){return this.rmCls("hidden")},isHidden:function(){return this.hasCls("hidden")},css:function(e){return this.each(function(t){return Object.assign(t.style,e)})}},e.exports={awaitReady:S,awaitLoad:T,dom:E}}).call(t,function(){return this}())},function(e,t){"use strict";var n="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},r=/(^([+\-]?(?:0|[1-9]\d*)(?:\.\d*)?(?:[eE][+\-]?\d+)?)?$|^0x[0-9a-f]+$|\d+)/gi,i=/(^([\w ]+,?[\w ]+)?[\w ]+,?[\w ]+\d+:\d+(:\d+)?[\w ]?|^\d{1,4}[\/\-]\d{1,4}[\/\-]\d{1,4}|^\w+, \w+ \d+, \d{4})/,o=/^0x[0-9a-f]+$/i,a=/^0/,s=function(e,t){var s=String(e).trim(),c=String(t).trim(),u=s.replace(r,"\0$1\0").replace(/\0$/,"").replace(/^\0/,"").split("\0"),l=c.replace(r,"\0$1\0").replace(/\0$/,"").replace(/^\0/,"").split("\0"),f=parseInt(s.match(o),16)||1!==u.length&&s.match(i)&&Date.parse(s),d=parseInt(c.match(o),16)||f&&c.match(i)&&Date.parse(c)||null;if(d){if(f<d)return-1;if(f>d)return 1}for(var p=0,h=Math.max(u.length,l.length);p<h;p+=1){var g=!(u[p]||"").match(a)&&parseFloat(u[p])||u[p]||0,m=!(l[p]||"").match(a)&&parseFloat(l[p])||l[p]||0;if(isNaN(g)!==isNaN(m))return isNaN(g)?1:-1;if(("undefined"==typeof g?"undefined":n(g))!==("undefined"==typeof m?"undefined":n(m))&&(g=String(g),m=String(m)),g<m)return-1;if(g>m)return 1}return 0};e.exports={naturalCmp:s}},function(e,t){"use strict";var n=function(e){return e.replace(/[\-\[\]{}()*+?.,\\$\^|#\s]/g,"\\$&")},r=function(e,t){return t?"re:"===e.substr(0,3)?e.substr(3):e.trim().split(/\s+/).map(function(e){return e.split("").map(function(e){return n(e)}).join(".*?")}).join("|"):n(e)};e.exports={parsePattern:r}},function(e,t,n){"use strict";var r=n(8),i=r.request,o=e.exports={_update:function(e){return i(e).then(function(e){return Object.assign(o,e)})}}},function(e,t,n){(function(t){"use strict";var r=n(2),i=r.each,o=r.dom,a=t.window.XMLHttpRequest,s=function(e){return new Promise(function(t){var n=new a,r=function(){if(n.readyState===a.DONE)try{t(JSON.parse(n.responseText))}catch(e){t({err:e,txt:n.responseText})}};n.open("POST","?",!0),n.onreadystatechange=r,n.setRequestHeader("Content-Type","application/json;charset=utf-8"),n.send(JSON.stringify(e))})},c=function(e){var t=o('<form method="post" action="?" style="display:none;"/>');i(e,function(e,n){o('<input type="hidden"/>').attr("name",n).attr("value",e).appTo(t)}),t.appTo("body"),t[0].submit(),t.rm()};e.exports={request:s,formRequest:c}}).call(t,function(){return this}())},function(e,t,n){function r(e){return n(i(e))}function i(e){return o[e]||function(){throw new Error("Cannot find module '"+e+"'.")}()}var o={"./index":10,"./index.js":10,"./info":50,"./info.js":50};r.keys=function(){return Object.keys(o)},r.resolve=i,e.exports=r,r.id=9},function(e,t,n){(function(e){"use strict";n(11),n(24),n(25),n(26),n(27),n(29),n(30),n(31),n(32),n(34),n(36),n(37),n(44),n(45),n(46),n(47),n(48),n(49);var t=e.window.document.location.href;n(20).setLocation(t,!0)}).call(t,function(){return this}())},function(e,t,n){"use strict";var r=n(2),i=r.each,o=r.dom,a=n(12),s=n(13),c=n(14),u=n(15),l=n(17),f=n(18),d=Object.assign({modeToggle:!1},c.view),p='<div id="viewmode-settings" class="block"><h1 class="l10n-view">View</h1></div>',h='<div id="viewmode-[MODE]" class="button mode">\n            <img src="'+s.image("view-[MODE]")+'" alt="viewmode-[MODE]"/>\n        </div>',g='<input id="viewmode-size" type="range" min="0" max="0" value="0">',m='<div id="viewmode-toggle" class="tool">\n            <img alt="viewmode"/>\n        </div>',v=void 0,b=void 0,w=function(e,t){o("#viewmode-settings .mode").rmCls("active"),o("#viewmode-"+e).addCls("active"),o("#viewmode-size").val(b.indexOf(t)),"next"===d.modeToggle&&(e=v[(v.indexOf(e)+1)%v.length]),o("#viewmode-toggle img").attr("src",s.image("view-"+e))},y=function(){if(!(v.length<2&&b.length<2)){var e=o(p);if(v.length>1&&i(v,function(t){o(h.replace(/\[MODE\]/g,t)).on("click",function(){f.setMode(t)}).appTo(e)}),b.length>1){var t=b.length-1;o(g).attr("max",t).on("input",function(e){return f.setSize(b[e.target.valueAsNumber])}).on("change",function(e){return f.setSize(b[e.target.valueAsNumber])}).appTo(e)}e.appTo(u.$el)}},x=function(){var e=f.getMode(),t=(v.indexOf(e)+1)%v.length,n=v[t];f.setMode(n)},k=function(){d.modeToggle&&v.length>1&&o(m).on("click",x).appTo(l.$toolbar)},_=function(){v=f.getModes(),b=f.getSizes(),y(),k(),w(f.getMode(),f.getSize()),a.sub("view.mode.changed",w)};_()},function(e,t,n){(function(t){"use strict";var r=n(2),i=r.isStr,o=r.isFn,a=r.dom,s={},c=function(e,t){i(e)&&o(t)&&(s[e]||(s[e]=[]),s[e].push(t))},u=function(e){for(var t=arguments.length,n=Array(t>1?t-1:0),r=1;r<t;r++)n[r-1]=arguments[r];i(e)&&s[e]&&s[e].forEach(function(t){t.apply(e,n)})};a(t.window).on("resize",function(){return u("resize")}),e.exports={sub:c,pub:u}}).call(t,function(){return this}())},function(e,t,n){"use strict";var r=n(2),i=r.includes,o=n(7),a=n(14),s=a.publicHref+"images/",c=s+"ui/",u=s+"themes/",l=u+"default/",f=["file","folder","folder-page","folder-parent","ar","aud","bin","img","txt","vid","x"],d=function(e){return c+e+".svg"},p=function(e){var t=(e||"").split("-")[0],n=o.theme[e]||o.theme[t];return n?u+n:i(f,e)?l+e+".svg":i(f,t)?l+t+".svg":l+"file.svg"};e.exports={image:d,icon:p}},function(e,t,n){"use strict";var r=n(7);e.exports=Object.assign({},r.options,{publicHref:r.setup.PUBLIC_HREF,rootHref:r.setup.ROOT_HREF})},function(e,t,n){"use strict";var r=n(2),i=r.dom,o=n(13),a=n(14),s=n(16),c=n(17),u=Object.assign({disableSidebar:!1},a.view),l="sidebarIsVisible",f='<div id="sidebar"></div>',d='<div id="sidebar-toggle" class="tool">\n            <img alt="sidebar"/>\n        </div>',p=function(){var e=i(f).hide(),t=i(d),n=t.find("img"),r=function(r){var i=s.get(l);r&&(i=!i,s.put(l,i)),i?(t.addCls("active"),n.attr("src",o.image("back")),e.show()):(t.rmCls("active"),n.attr("src",o.image("sidebar")),e.hide())};return u.disableSidebar||(e.appTo(c.$mainrow),t.appTo(c.$toolbar).on("click",function(){return r(!0)}),r()),{$el:e}};e.exports=p()},function(e,t){(function(t){"use strict";var n=t.window.localStorage,r="_h5ai",i=function(){try{return JSON.parse(n[r])}catch(e){}return{}},o=function(e){n[r]=JSON.stringify(e)},a=function(e,t){var n=i();n[e]=t,o(n)},s=function(e){return i()[e]};e.exports={put:a,get:s}}).call(t,function(){return this}())},function(e,t,n){"use strict";var r=n(2),i=r.dom,o="body",a='<div id="topbar">\n            <div id="toolbar"></div>\n            <div id="flowbar"></div>\n            <a id="backlink" href="https://larsjung.de/h5ai/" title="powered by h5ai - https://larsjung.de/h5ai/">\n                <div>powered</div>\n                <div>by h5ai</div>\n            </a>\n        </div>',s='<div id="mainrow">\n            <div id="content"></div>\n        </div>',c=function(){var e=i(o).attr("id","root").clr().app(a).app(s);return{$root:e,$topbar:e.find("#topbar"),$toolbar:e.find("#toolbar"),$flowbar:e.find("#flowbar"),$mainrow:e.find("#mainrow"),$content:e.find("#content")}};e.exports=c()},function(e,t,n){"use strict";var r=n(2),i=r.each,o=r.map,a=r.includes,s=r.intersection,c=r.dom,u=n(12),l=n(19),f=n(20),d=n(13),p=n(16),h=n(14),g=n(17),m=["details","grid","icons"],v=[20,40,60,80,100,150,200,250,300,350,400],b=Object.assign({binaryPrefix:!1,hideFolders:!1,hideParentFolder:!1,maxIconSize:40,modes:m,setParentFolderLabels:!1,sizes:v},h.view),w=b.sizes.sort(function(e,t){return e-t}),y=s(b.modes,m),x="view",k='<div id="view">\n            <ul id="items" class="clearfix">\n                <li class="header">\n                    <a class="icon"></a>\n                    <a class="label" href="#"><span class="l10n-name"/></a>\n                    <a class="date" href="#"><span class="l10n-lastModified"/></a>\n                    <a class="size" href="#"><span class="l10n-size"/></a>\n                </li>\n            </ul>\n            <div id="view-hint"></div>\n        </div>',_='<li class="item">\n            <a>\n                <span class="icon square"><img/></span>\n                <span class="icon landscape"><img/></span>\n                <span class="label"></span>\n                <span class="date"></span>\n                <span class="size"></span>\n            </a>\n        </li>',C=c(k),S=C.find("#items"),A=C.find("#view-hint"),T=function(e,t,n){return Math.min(n,Math.max(t,e))},E=function(e){var t=T(e,20,80),n=T(e,40,160),r=T(e,80,1e3),i=Math.round(4*r/3),o="!important;",a="#view.view-details.view-size-"+e,s="#view.view-grid.view-size-"+e,c="#view.view-icons.view-size-"+e,u=[a+" .item .label {line-height: "+(t+14)+"px "+o+"}",a+" .item .date {line-height: "+(t+14)+"px "+o+"}",a+" .item .size {line-height: "+(t+14)+"px "+o+"}",a+" .square {width: "+t+"px "+o+" height: "+t+"px "+o+"}",a+" .square img {width: "+t+"px "+o+" height: "+t+"px "+o+"}",a+" .label {margin-left: "+(t+32)+"px "+o+"}",s+" .item .label {line-height: "+n+"px "+o+"}",s+" .square {width: "+n+"px "+o+" height: "+n+"px "+o+"}",s+" .square img {width: "+n+"px "+o+" height: "+n+"px "+o+"}",c+" .item {width: "+i+"px "+o+"}",c+" .landscape {width: "+i+"px "+o+" height: "+r+"px "+o+"}",c+" .landscape img {width: "+r+"px "+o+" height: "+r+"px "+o+"}",c+" .landscape .thumb {width: "+i+"px "+o+"}"];return u.join("\n")},M=function(){var e=o(w,function(e){return E(e)});e.push("#view .icon img {max-width: "+b.maxIconSize+"px; max-height: "+b.maxIconSize+"px;}"),c("<style></style>").text(e.join("\n")).appTo("head")},D=function(e,t){var n=p.get(x);e=e||n&&n.mode,t=t||n&&n.size,e=a(b.modes,e)?e:b.modes[0],t=a(b.sizes,t)?t:b.sizes[0],p.put(x,{mode:e,size:t}),i(y,function(t){t===e?C.addCls("view-"+t):C.rmCls("view-"+t)}),i(w,function(e){e===t?C.addCls("view-size-"+e):C.rmCls("view-size-"+e)}),u.pub("view.mode.changed",e,t)},P=function(){return y},z=function(){return p.get(x).mode},L=function(e){return D(e,null)},$=function(){return w},H=function(){return p.get(x).size},O=function(e){return D(null,e)},B=function(e){var t=e.target._item;u.pub("item.mouseenter",t)},R=function(e){var t=e.target._item;u.pub("item.mouseleave",t)},N=function(e){var t=c(_),n=t.find("a"),r=t.find(".icon img"),i=t.find(".label"),o=t.find(".date"),a=t.find(".size");return t.addCls(e.isFolder()?"folder":"file").on("mouseenter",B).on("mouseleave",R),f.setLink(n,e),i.text(e.label).attr("title",e.label),o.attr("data-time",e.time).text(l.formatDate(e.time)),a.attr("data-bytes",e.size).text(l.formatSize(e.size)),e.icon=d.icon(e.type),e.isFolder()&&!e.isManaged&&(t.addCls("page"),e.icon=d.icon("folder-page")),e.isCurrentParentFolder()&&(e.icon=d.icon("folder-parent"),b.setParentFolderLabels||i.addCls("l10n-parentDirectory"),t.addCls("folder-parent")),r.attr("src",e.icon).attr("alt",e.type),e.$view=t,t[0]._item=e,t},I=function(){var e=S.find(".item").length===S.find(".folder-parent").length;e?A.show():A.hide()},j=function(e){var t=o(S.find(".item"),function(e){return e._item});S.find(".item").rm(),i(e,function(e){return S.app(N(e))}),g.$content[0].scrollLeft=0,g.$content[0].scrollTop=0,I(),u.pub("view.changed",e,t)},F=function(e,t){i(e,function(e){N(e).hide().appTo(S).show()}),i(t,function(e){e.$view.hide().rm()}),I(),u.pub("view.changed",e,t)},q=function(e){A.rmCls().addCls("l10n-"+e),I()},Y=function(e){e||(e=f.getItem());var t=[];e.parent&&!b.hideParentFolder&&t.push(e.parent),i(e.content,function(e){e.isFolder()&&b.hideFolders||t.push(e)}),q("empty"),j(t)},Z=function(e,t,n){var r=[];i(t,function(e){e.isFolder()&&b.hideFolders||r.push(e)}),q("empty"),F(r,n)},U=function(){var e=C[0].offsetWidth;C.rmCls("width-0").rmCls("width-1"),e<320?C.addCls("width-0"):e<480&&C.addCls("width-1")},V=function(){M(),D(),C.appTo(g.$content),A.hide(),l.setDefaultMetric(b.binaryPrefix),u.sub("location.changed",Y),u.sub("location.refreshed",Z),u.sub("resize",U),U()};V(),e.exports={$el:C,setItems:j,changeItems:F,setLocation:Y,setHint:q,getModes:P,getMode:z,setMode:L,getSizes:$,getSize:H,setSize:O}},function(e,t,n){"use strict";var r=n(2),i=r.isNum,o={t:1e3,k:1e3,u:["B","KB","MB","GB","TB","PB","EB","ZB","YB"]},a={t:1024,k:1024,u:["B","KiB","MiB","GiB","TiB","PiB","EiB","ZiB","YiB"]},s=o,c=[[/YYYY/,"Y",4],[/YY/,"Y",2],[/Y/,"Y",0],[/MM/,"M",2],[/M/,"M",0],[/DD/,"D",2],[/D/,"D",0],[/HH/,"H",2],[/H/,"H",0],[/mm/,"m",2],[/m/,"m",0],[/ss/,"s",2],[/s/,"s",0]],u="YYYY-MM-DD HH:mm",l=function(e){s=e?a:o},f=function(e,t){if(t=t||s,!i(e)||e<0)return"";for(var n=0,r=t.u.length-1;e>=t.t&&n<r;)e/=t.k,n+=1;return(n<=1?Math.round(e):e.toFixed(1)).toString()+" "+t.u[n]},d=function(e){u=e},p=function(e,t){var n=String(e);return t&&(n=("000"+n).substr(-t)),n},h=function(e,t){if(!e||!i(e))return"";t=t||u;var n=new Date(e),r={Y:n.getFullYear(),M:n.getMonth()+1,D:n.getDate(),H:n.getHours(),m:n.getMinutes(),s:n.getSeconds()};return c.forEach(function(e){t=t.replace(e[0],p(r[e[1]],e[2]))}),t};e.exports={setDefaultMetric:l,formatSize:f,setDefaultDateFormat:d,formatDate:h}},function(e,t,n){(function(t){"use strict";var r=n(2),i=r.each,o=r.values,a=r.difference,s=n(8),c=s.request,u=n(14),l=n(12),f=n(21),d=t.window,p=d.document,h=Object.assign({fastBrowsing:!0,unmanagedInNewWindow:!0},u.view),g=h.fastBrowsing?d.history:null,m=/^.*:\/\/[^\/]*|[^\/]*$/g,v=[[/\/+/g,"/"],[/ /g,"%20"],[/!/g,"%21"],[/#/g,"%23"],[/\$/g,"%24"],[/&/g,"%26"],[/'/g,"%27"],[/\(/g,"%28"],[/\)/g,"%29"],[/\*/g,"%2A"],[/\+/g,"%2B"],[/\,/g,"%2C"],[/:/g,"%3A"],[/;/g,"%3B"],[/\=/g,"%3D"],[/\?/g,"%3F"],[/@/g,"%40"],[/\[/g,"%5B"],[/\]/g,"%5D"]],b=null,w=function(e){return v.reduce(function(e,t){return e.replace(t[0],t[1])},e)},y=function(e){return e.replace(m,"")},x=function(){var e="/a b",t=p.createElement("a");return t.href=e,y(t.href)===e}(),k=function(e){var t=p.createElement("a"),n=void 0;return t.href=e,n=y(t.href),x&&(n=encodeURIComponent(n).replace(/%2F/gi,"/")),w(n)},_=function(){return p.domain},C=function(){return b},S=function(){return n(22).get(b)},A=function(){return c({action:"get",items:{href:b,what:1}}).then(function(e){var t=n(22),r=t.get(b);if(e){var o={};i(e.items,function(e){var n=t.get(e);o[n.absHref]=!0}),i(r.content,function(e){o[e.absHref]||t.remove(e.absHref)})}return r})},T=function(){var e=S(),t=o(e.content);l.pub("location.beforeRefresh"),A().then(function(){var n=o(e.content),r=a(n,t),i=a(t,n);l.pub("location.refreshed",e,r,i)})},E=function(e,t){l.pub("location.beforeChange"),e=k(e),b!==e&&(b=e,g&&(t?g.replaceState({absHref:b},"",b):g.pushState({absHref:b},"",b)));var n=S();n.isLoaded?(l.pub("location.changed",n),T()):(f.set("loading..."),A().then(function(){n.isLoaded=!0,f.set(),l.pub("location.changed",n)}))},M=function(e,t){e.attr("href",t.absHref),g&&t.isFolder()&&t.isManaged&&e.on("click",function(e){return E(t.absHref),e.preventDefault(),!1}),h.unmanagedInNewWindow&&!t.isManaged&&e.attr("target","_blank")},D=function(e){e.state&&e.state.absHref&&E(e.state.absHref,!0)};d.onpopstate=g?D:null,e.exports={forceEncoding:w,getDomain:_,getAbsHref:C,getItem:S,setLocation:E,refresh:T,setLink:M}}).call(t,function(){return this}())},function(e,t,n){"use strict";var r=n(2),i=r.dom,o=n(17),a=function(){var e=i('<div id="notification"></div>').hide().appTo(o.$root),t=function(t){t?e.html(t).show():e.hide()};return{set:t}};e.exports=a()},function(e,t,n){"use strict";var r=n(2),i=r.keys,o=r.each,a=r.filter,s=r.sortBy,c=r.isStr,u=r.isNum,l=n(8),f=n(20),d=n(14),p=n(23),h=/\/$/,g=/^(.*\/)([^\/]+\/?)$/,m={},v=function(e,t){return c(e)&&e.startsWith(t)},b=function(e){e=e.replace(h,"");try{e=decodeURIComponent(e)}catch(e){}return e},w=function(e){if("/"===e)return{parent:null,name:"/"};var t=g.exec(e);if(!t)return null;var n={parent:t[1],name:t[2]};return n.parent&&!v(n.parent,d.rootHref)&&(n.parent=null),n},y=function(e){if(c(e))e={href:e};else if(!e||!c(e.href))return null;var t=f.forceEncoding(e.href);if(!v(t,d.rootHref))return null;var n=m[t]||_(t);return u(e.time)&&(n.time=e.time),u(e.size)&&(n.size=e.size),e.managed&&(n.isManaged=!0),e.fetched&&(n.isContentFetched=!0),n},x=function e(t){t=f.forceEncoding(t);var n=m[t];n&&(delete m[t],n.parent&&delete n.parent.content[n.absHref],o(n.content,function(t){e(t.absHref)}))},k=function(e){return new Promise(function(t){var n=y(e);n.isContentFetched?t(n):l.request({action:"get",items:{href:n.absHref,what:1}}).then(function(e){e.items&&o(e.items,function(e){y(e)}),t(n)})})},_=function e(t){var n=w(t),r=Object.assign(Object.create(e.prototype),{absHref:t,type:p.getType(t),label:b("/"===t?f.getDomain():n.name),time:null,size:null,parent:null,isManaged:null,content:{}});return m[t]=r,n.parent&&(r.parent=y(n.parent),r.parent.content[r.absHref]=r,i(r.parent.content).length>1&&(r.parent.isContentFetched=!0)),r};_.prototype={constructor:_,isFolder:function(){return h.test(this.absHref)},isCurrentFolder:function(){return this.absHref===f.getAbsHref()},isInCurrentFolder:function(){return!!this.parent&&this.parent.isCurrentFolder()},isCurrentParentFolder:function(){var e=y(f.getAbsHref());return!!e&&this===e.parent},isDomain:function(){return"/"===this.absHref},isRoot:function(){return this.absHref===d.rootHref},isEmpty:function(){return 0===i(this.content).length},fetchContent:function(){return k(this.absHref)},getCrumb:function(){for(var e=this,t=[e];e.parent;)e=e.parent,t.unshift(e);return t},getSubfolders:function(){return s(a(this.content,function(e){return e.isFolder()}),function(e){return e.label.toLowerCase()})},getStats:function(){var e=0,t=0;o(this.content,function(n){n.isFolder()?e+=1:t+=1});for(var n=0,r=this;r.parent;)n+=1,r=r.parent;return{folders:e,files:t,depth:n}}},e.exports={get:y,remove:x}},function(e,t,n){"use strict";var r=n(2),i=r.each,o=r.map,a=n(7),s=/\/$/,c={},u=function(e){return e.replace(/[\-\[\]\/\{\}\(\)\+\?\.\\\^\$]/g,"\\$&")},l=function(e){i(e,function(e,t){var n="^("+o(e,function(e){return"("+u(e).replace(/\*/g,".*")+")"}).join("|")+")$";c[t]=new RegExp(n,"i")})},f=function(e){if(s.test(e))return"folder";var t=e.lastIndexOf("/"),n=t>=0?e.substr(t+1):e,r=void 0;return i(c,function(e,t){c[t].test(n)&&(r=t)}),r?r:"file"};l(Object.assign({},a.types)),e.exports={getType:f}},function(e,t,n){(function(e){"use strict";var t=n(12),r=n(20),i=n(14),o=e.window,a=Object.assign({enabled:!1,interval:5e3},i.autorefresh),s=null,c=function(){r.refresh()},u=function(){o.clearTimeout(s)},l=function(){o.clearTimeout(s),s=o.setTimeout(c,a.interval)},f=function(){a.enabled&&(a.interval=Math.max(1e3,a.interval),t.sub("location.beforeChange",u),t.sub("location.beforeRefresh",u),t.sub("location.changed",l),t.sub("location.refreshed",l))};f()}).call(t,function(){return this}())},function(e,t,n){"use strict";var r=n(2),i=r.each,o=r.dom,a=n(13),s=n(14),c=Object.assign({enabled:!1},s.contextmenu),u='<div id="cm-overlay"></div>',l='<div class="cm-panel"><ul></ul></div>',f='<li class="cm-sep"></li>',d='<li class="cm-entry"><span class="cm-icon"><img/></span><span class="cm-text"></span></li>',p='<li class="cm-label"><span class="cm-text"></span></li>',h=function(e){for(;!e._cmId&&e.parentNode;)e=e.parentNode;return e._cmId},g=function(e){var t=o(u),n=function(n){n.stopPropagation(),n.preventDefault();var r=h(n.target);n.target!==t[0]&&void 0===r||(t.rm(),e(r))};return t.on("contextmenu",n).on("click",n)},m=function(e){var t=o(l),n=t.find("ul"),r=void 0;return i(e,function(e){"-"===e.type?o(f).appTo(n):"l"===e.type?o(p).appTo(n).find(".cm-text").text(e.text):"e"===e.type&&(r=o(d).appTo(n),r[0]._cmId=e.id,r.find(".cm-text").text(e.text),e.icon?r.find(".cm-icon img").attr("src",a.icon(e.icon)):r.find(".cm-icon").addCls("no-icon"))}),t},v=function(e,t,n,r){var i=4;t.css({left:0,top:0,opacity:0}),e.show();var o=e[0].getBoundingClientRect(),a=t[0].getBoundingClientRect(),s=o.left,c=o.top,u=o.width,l=o.height,f=a.width,d=a.height,p=n,h=r;f>u-2*i&&(p=i,f=u-2*i),d>l-2*i&&(h=i,d=l-2*i),p<s+i&&(p=s+i),p+f>s+u-i&&(p=s+u-i-f),h<c+i&&(h=c+i),h+d>c+l-i&&(h=c+l-i-d),t.css({left:p+"px",top:h+"px",width:f+"px",height:d+"px",opacity:1})},b=function(e,t,n,r){var i=g(r),o=m(n);i.hide().app(o).appTo("body"),v(i,o,e,t)},w=function(){if(c.enabled){var e=[{type:"e",id:"e1",text:"testing context menus"},{type:"e",id:"e2",text:"another entry"},{type:"e",id:"e3",text:"one with icon",icon:"folder"},{type:"-"},{type:"e",id:"e4",text:"one with icon",icon:"x"},{type:"e",id:"e5",text:"one with icon",icon:"img"}];o("#view").on("contextmenu",function(t){t.preventDefault(),b(t.pageX,t.pageY,e)})}};w()},function(e,t,n){"use strict";var r=n(2),i=r.each,o=r.dom,a=n(12),s=n(20),c=n(13),u=n(14),l=n(17),f=Object.assign({enabled:!1},u.crumb),d='<div id="crumbbar"></div>',p='<a class="crumb">\n            <img class="sep" src="'+c.image("crumb")+'" alt=">"/>\n            <span class="label"></span>\n        </a>',h='<img class="hint" src="'+c.icon("folder-page")+'" alt="has index page"/>',g=function(e){var t=o(p);return s.setLink(t,e),t.find(".label").text(e.label),e.isCurrentFolder()&&t.addCls("active"),e.isManaged||t.app(o(h)),e._$crumb=t,t[0]._item=e,t},m=function(e){var t=e._$crumb,n=o("#crumbbar");t&&t.parent()[0]===n[0]?(n.children().rmCls("active"),t.addCls("active")):(n.clr(),i(e.getCrumb(),function(e){n.app(g(e))}))},v=function(){f.enabled&&(o(d).appTo(l.$flowbar),a.sub("location.changed",m))};v()},function(e,t,n){"use strict";var r=n(28),i=n(2),o=i.each,a=i.dom,s=n(8),c=n(12),u=n(14),l=Object.assign({enabled:!1},u.custom),f=function(e,t){var n=a("#content-"+t);if(e&&e[t].content){var i=e[t].content;"md"===e[t].type&&(i=r(i)),n.html(i).show()}else n.hide()},d=function(e){s.request({action:"get",custom:e.absHref}).then(function(e){var t=e&&e.custom;o(["header","footer"],function(e){return f(t,e)})})},p=function(){l.enabled&&(a('<div id="content-header"></div>').hide().preTo("#content"),a('<div id="content-footer"></div>').hide().appTo("#content"),c.sub("location.changed",d))};p()},function(e,t,n){(function(t){!function(t){"use strict";function n(e){this.tokens=[],this.tokens.links=Object.create(null),this.options=e||b.defaults,this.rules=w.normal,this.options.pedantic?this.rules=w.pedantic:this.options.gfm&&(this.options.tables?this.rules=w.tables:this.rules=w.gfm)}function r(e,t){if(this.options=t||b.defaults,this.links=e,this.rules=y.normal,this.renderer=this.options.renderer||new i,this.renderer.options=this.options,!this.links)throw new Error("Tokens array requires a `links` property.");this.options.pedantic?this.rules=y.pedantic:this.options.gfm&&(this.options.breaks?this.rules=y.breaks:this.rules=y.gfm)}function i(e){this.options=e||b.defaults}function o(){}function a(e){this.tokens=[],this.token=null,this.options=e||b.defaults,this.options.renderer=this.options.renderer||new i,this.renderer=this.options.renderer,this.renderer.options=this.options,this.slugger=new s}function s(){this.seen={}}function c(e,t){if(t){if(c.escapeTest.test(e))return e.replace(c.escapeReplace,function(e){return c.replacements[e]})}else if(c.escapeTestNoEncode.test(e))return e.replace(c.escapeReplaceNoEncode,function(e){return c.replacements[e]});return e}function u(e){return e.replace(/&(#(?:\d+)|(?:#x[0-9A-Fa-f]+)|(?:\w+));?/gi,function(e,t){return t=t.toLowerCase(),"colon"===t?":":"#"===t.charAt(0)?"x"===t.charAt(1)?String.fromCharCode(parseInt(t.substring(2),16)):String.fromCharCode(+t.substring(1)):""})}function l(e,t){return e=e.source||e,t=t||"",{replace:function(t,n){return n=n.source||n,n=n.replace(/(^|[^\[])\^/g,"$1"),e=e.replace(t,n),this},getRegex:function(){return new RegExp(e,t)}}}function f(e,t,n){if(e){try{var r=decodeURIComponent(u(n)).replace(/[^\w:]/g,"").toLowerCase()}catch(e){return null}if(0===r.indexOf("javascript:")||0===r.indexOf("vbscript:")||0===r.indexOf("data:"))return null}t&&!k.test(n)&&(n=d(t,n));try{n=encodeURI(n).replace(/%25/g,"%")}catch(e){return null}return n}function d(e,t){return x[" "+e]||(/^[^:]+:\/*[^\/]*$/.test(e)?x[" "+e]=e+"/":x[" "+e]=m(e,"/",!0)),e=x[" "+e],"//"===t.slice(0,2)?e.replace(/:[\s\S]*/,":")+t:"/"===t.charAt(0)?e.replace(/(:\/*[^\/]*)[\s\S]*/,"$1")+t:e+t}function p(){}function h(e){for(var t,n,r=1;r<arguments.length;r++){t=arguments[r];for(n in t)Object.prototype.hasOwnProperty.call(t,n)&&(e[n]=t[n])}return e}function g(e,t){var n=e.replace(/\|/g,function(e,t,n){for(var r=!1,i=t;--i>=0&&"\\"===n[i];)r=!r;
+return r?"|":" |"}),r=n.split(/ \|/),i=0;if(r.length>t)r.splice(t);else for(;r.length<t;)r.push("");for(;i<r.length;i++)r[i]=r[i].trim().replace(/\\\|/g,"|");return r}function m(e,t,n){if(0===e.length)return"";for(var r=0;r<e.length;){var i=e.charAt(e.length-r-1);if(i!==t||n){if(i===t||!n)break;r++}else r++}return e.substr(0,e.length-r)}function v(e,t){if(e.indexOf(t[1])===-1)return-1;for(var n=0,r=0;r<e.length;r++)if("\\"===e[r])r++;else if(e[r]===t[0])n++;else if(e[r]===t[1]&&(n--,n<0))return r;return-1}function b(e,t,r){if("undefined"==typeof e||null===e)throw new Error("marked(): input parameter is undefined or null");if("string"!=typeof e)throw new Error("marked(): input parameter is of type "+Object.prototype.toString.call(e)+", string expected");if(r||"function"==typeof t){r||(r=t,t=null),t=h({},b.defaults,t||{});var i,o,s=t.highlight,u=0;try{i=n.lex(e,t)}catch(e){return r(e)}o=i.length;var l=function(e){if(e)return t.highlight=s,r(e);var n;try{n=a.parse(i,t)}catch(t){e=t}return t.highlight=s,e?r(e):r(null,n)};if(!s||s.length<3)return l();if(delete t.highlight,!o)return l();for(;u<i.length;u++)!function(e){return"code"!==e.type?--o||l():s(e.text,e.lang,function(t,n){return t?l(t):null==n||n===e.text?--o||l():(e.text=n,e.escaped=!0,void(--o||l()))})}(i[u])}else try{return t&&(t=h({},b.defaults,t)),a.parse(n.lex(e,t),t)}catch(e){if(e.message+="\nPlease report this to https://github.com/markedjs/marked.",(t||b.defaults).silent)return"<p>An error occurred:</p><pre>"+c(e.message+"",!0)+"</pre>";throw e}}var w={newline:/^\n+/,code:/^( {4}[^\n]+\n*)+/,fences:p,hr:/^ {0,3}((?:- *){3,}|(?:_ *){3,}|(?:\* *){3,})(?:\n+|$)/,heading:/^ *(#{1,6}) *([^\n]+?) *(?:#+ *)?(?:\n+|$)/,nptable:p,blockquote:/^( {0,3}> ?(paragraph|[^\n]*)(?:\n|$))+/,list:/^( {0,3})(bull) [\s\S]+?(?:hr|def|\n{2,}(?! )(?!\1bull )\n*|\s*$)/,html:"^ {0,3}(?:<(script|pre|style)[\\s>][\\s\\S]*?(?:</\\1>[^\\n]*\\n+|$)|comment[^\\n]*(\\n+|$)|<\\?[\\s\\S]*?\\?>\\n*|<![A-Z][\\s\\S]*?>\\n*|<!\\[CDATA\\[[\\s\\S]*?\\]\\]>\\n*|</?(tag)(?: +|\\n|/?>)[\\s\\S]*?(?:\\n{2,}|$)|<(?!script|pre|style)([a-z][\\w-]*)(?:attribute)*? */?>(?=\\h*\\n)[\\s\\S]*?(?:\\n{2,}|$)|</(?!script|pre|style)[a-z][\\w-]*\\s*>(?=\\h*\\n)[\\s\\S]*?(?:\\n{2,}|$))",def:/^ {0,3}\[(label)\]: *\n? *<?([^\s>]+)>?(?:(?: +\n? *| *\n *)(title))? *(?:\n+|$)/,table:p,lheading:/^([^\n]+)\n *(=|-){2,} *(?:\n+|$)/,paragraph:/^([^\n]+(?:\n(?!hr|heading|lheading| {0,3}>|<\/?(?:tag)(?: +|\n|\/?>)|<(?:script|pre|style|!--))[^\n]+)*)/,text:/^[^\n]+/};w._label=/(?!\s*\])(?:\\[\[\]]|[^\[\]])+/,w._title=/(?:"(?:\\"?|[^"\\])*"|'[^'\n]*(?:\n[^'\n]+)*\n?'|\([^()]*\))/,w.def=l(w.def).replace("label",w._label).replace("title",w._title).getRegex(),w.bullet=/(?:[*+-]|\d{1,9}\.)/,w.item=/^( *)(bull) ?[^\n]*(?:\n(?!\1bull ?)[^\n]*)*/,w.item=l(w.item,"gm").replace(/bull/g,w.bullet).getRegex(),w.list=l(w.list).replace(/bull/g,w.bullet).replace("hr","\\n+(?=\\1?(?:(?:- *){3,}|(?:_ *){3,}|(?:\\* *){3,})(?:\\n+|$))").replace("def","\\n+(?="+w.def.source+")").getRegex(),w._tag="address|article|aside|base|basefont|blockquote|body|caption|center|col|colgroup|dd|details|dialog|dir|div|dl|dt|fieldset|figcaption|figure|footer|form|frame|frameset|h[1-6]|head|header|hr|html|iframe|legend|li|link|main|menu|menuitem|meta|nav|noframes|ol|optgroup|option|p|param|section|source|summary|table|tbody|td|tfoot|th|thead|title|tr|track|ul",w._comment=/<!--(?!-?>)[\s\S]*?-->/,w.html=l(w.html,"i").replace("comment",w._comment).replace("tag",w._tag).replace("attribute",/ +[a-zA-Z:_][\w.:-]*(?: *= *"[^"\n]*"| *= *'[^'\n]*'| *= *[^\s"'=<>`]+)?/).getRegex(),w.paragraph=l(w.paragraph).replace("hr",w.hr).replace("heading",w.heading).replace("lheading",w.lheading).replace("tag",w._tag).getRegex(),w.blockquote=l(w.blockquote).replace("paragraph",w.paragraph).getRegex(),w.normal=h({},w),w.gfm=h({},w.normal,{fences:/^ {0,3}(`{3,}|~{3,})([^`\n]*)\n(?:|([\s\S]*?)\n)(?: {0,3}\1[~`]* *(?:\n+|$)|$)/,paragraph:/^/,heading:/^ *(#{1,6}) +([^\n]+?) *#* *(?:\n+|$)/}),w.gfm.paragraph=l(w.paragraph).replace("(?!","(?!"+w.gfm.fences.source.replace("\\1","\\2")+"|"+w.list.source.replace("\\1","\\3")+"|").getRegex(),w.tables=h({},w.gfm,{nptable:/^ *([^|\n ].*\|.*)\n *([-:]+ *\|[-| :]*)(?:\n((?:.*[^>\n ].*(?:\n|$))*)\n*|$)/,table:/^ *\|(.+)\n *\|?( *[-:]+[-| :]*)(?:\n((?: *[^>\n ].*(?:\n|$))*)\n*|$)/}),w.pedantic=h({},w.normal,{html:l("^ *(?:comment *(?:\\n|\\s*$)|<(tag)[\\s\\S]+?</\\1> *(?:\\n{2,}|\\s*$)|<tag(?:\"[^\"]*\"|'[^']*'|\\s[^'\"/>\\s]*)*?/?> *(?:\\n{2,}|\\s*$))").replace("comment",w._comment).replace(/tag/g,"(?!(?:a|em|strong|small|s|cite|q|dfn|abbr|data|time|code|var|samp|kbd|sub|sup|i|b|u|mark|ruby|rt|rp|bdi|bdo|span|br|wbr|ins|del|img)\\b)\\w+(?!:|[^\\w\\s@]*@)\\b").getRegex(),def:/^ *\[([^\]]+)\]: *<?([^\s>]+)>?(?: +(["(][^\n]+[")]))? *(?:\n+|$)/}),n.rules=w,n.lex=function(e,t){var r=new n(t);return r.lex(e)},n.prototype.lex=function(e){return e=e.replace(/\r\n|\r/g,"\n").replace(/\t/g,"    ").replace(/\u00a0/g," ").replace(/\u2424/g,"\n"),this.token(e,!0)},n.prototype.token=function(e,t){e=e.replace(/^ +$/gm,"");for(var n,r,i,o,a,s,c,u,l,f,d,p,h,v,b,y;e;)if((i=this.rules.newline.exec(e))&&(e=e.substring(i[0].length),i[0].length>1&&this.tokens.push({type:"space"})),i=this.rules.code.exec(e))e=e.substring(i[0].length),i=i[0].replace(/^ {4}/gm,""),this.tokens.push({type:"code",text:this.options.pedantic?i:m(i,"\n")});else if(i=this.rules.fences.exec(e))e=e.substring(i[0].length),this.tokens.push({type:"code",lang:i[2]?i[2].trim():i[2],text:i[3]||""});else if(i=this.rules.heading.exec(e))e=e.substring(i[0].length),this.tokens.push({type:"heading",depth:i[1].length,text:i[2]});else if(t&&(i=this.rules.nptable.exec(e))&&(s={type:"table",header:g(i[1].replace(/^ *| *\| *$/g,"")),align:i[2].replace(/^ *|\| *$/g,"").split(/ *\| */),cells:i[3]?i[3].replace(/\n$/,"").split("\n"):[]},s.header.length===s.align.length)){for(e=e.substring(i[0].length),d=0;d<s.align.length;d++)/^ *-+: *$/.test(s.align[d])?s.align[d]="right":/^ *:-+: *$/.test(s.align[d])?s.align[d]="center":/^ *:-+ *$/.test(s.align[d])?s.align[d]="left":s.align[d]=null;for(d=0;d<s.cells.length;d++)s.cells[d]=g(s.cells[d],s.header.length);this.tokens.push(s)}else if(i=this.rules.hr.exec(e))e=e.substring(i[0].length),this.tokens.push({type:"hr"});else if(i=this.rules.blockquote.exec(e))e=e.substring(i[0].length),this.tokens.push({type:"blockquote_start"}),i=i[0].replace(/^ *> ?/gm,""),this.token(i,t),this.tokens.push({type:"blockquote_end"});else if(i=this.rules.list.exec(e)){for(e=e.substring(i[0].length),o=i[2],v=o.length>1,c={type:"list_start",ordered:v,start:v?+o:"",loose:!1},this.tokens.push(c),i=i[0].match(this.rules.item),u=[],n=!1,h=i.length,d=0;d<h;d++)s=i[d],f=s.length,s=s.replace(/^ *([*+-]|\d+\.) */,""),~s.indexOf("\n ")&&(f-=s.length,s=this.options.pedantic?s.replace(/^ {1,4}/gm,""):s.replace(new RegExp("^ {1,"+f+"}","gm"),"")),d!==h-1&&(a=w.bullet.exec(i[d+1])[0],(o.length>1?1===a.length:a.length>1||this.options.smartLists&&a!==o)&&(e=i.slice(d+1).join("\n")+e,d=h-1)),r=n||/\n\n(?!\s*$)/.test(s),d!==h-1&&(n="\n"===s.charAt(s.length-1),r||(r=n)),r&&(c.loose=!0),b=/^\[[ xX]\] /.test(s),y=void 0,b&&(y=" "!==s[1],s=s.replace(/^\[[ xX]\] +/,"")),l={type:"list_item_start",task:b,checked:y,loose:r},u.push(l),this.tokens.push(l),this.token(s,!1),this.tokens.push({type:"list_item_end"});if(c.loose)for(h=u.length,d=0;d<h;d++)u[d].loose=!0;this.tokens.push({type:"list_end"})}else if(i=this.rules.html.exec(e))e=e.substring(i[0].length),this.tokens.push({type:this.options.sanitize?"paragraph":"html",pre:!this.options.sanitizer&&("pre"===i[1]||"script"===i[1]||"style"===i[1]),text:i[0]});else if(t&&(i=this.rules.def.exec(e)))e=e.substring(i[0].length),i[3]&&(i[3]=i[3].substring(1,i[3].length-1)),p=i[1].toLowerCase().replace(/\s+/g," "),this.tokens.links[p]||(this.tokens.links[p]={href:i[2],title:i[3]});else if(t&&(i=this.rules.table.exec(e))&&(s={type:"table",header:g(i[1].replace(/^ *| *\| *$/g,"")),align:i[2].replace(/^ *|\| *$/g,"").split(/ *\| */),cells:i[3]?i[3].replace(/(?: *\| *)?\n$/,"").split("\n"):[]},s.header.length===s.align.length)){for(e=e.substring(i[0].length),d=0;d<s.align.length;d++)/^ *-+: *$/.test(s.align[d])?s.align[d]="right":/^ *:-+: *$/.test(s.align[d])?s.align[d]="center":/^ *:-+ *$/.test(s.align[d])?s.align[d]="left":s.align[d]=null;for(d=0;d<s.cells.length;d++)s.cells[d]=g(s.cells[d].replace(/^ *\| *| *\| *$/g,""),s.header.length);this.tokens.push(s)}else if(i=this.rules.lheading.exec(e))e=e.substring(i[0].length),this.tokens.push({type:"heading",depth:"="===i[2]?1:2,text:i[1]});else if(t&&(i=this.rules.paragraph.exec(e)))e=e.substring(i[0].length),this.tokens.push({type:"paragraph",text:"\n"===i[1].charAt(i[1].length-1)?i[1].slice(0,-1):i[1]});else if(i=this.rules.text.exec(e))e=e.substring(i[0].length),this.tokens.push({type:"text",text:i[0]});else if(e)throw new Error("Infinite loop on byte: "+e.charCodeAt(0));return this.tokens};var y={escape:/^\\([!"#$%&'()*+,\-.\/:;<=>?@\[\]\\^_`{|}~])/,autolink:/^<(scheme:[^\s\x00-\x1f<>]*|email)>/,url:p,tag:"^comment|^</[a-zA-Z][\\w:-]*\\s*>|^<[a-zA-Z][\\w-]*(?:attribute)*?\\s*/?>|^<\\?[\\s\\S]*?\\?>|^<![a-zA-Z]+\\s[\\s\\S]*?>|^<!\\[CDATA\\[[\\s\\S]*?\\]\\]>",link:/^!?\[(label)\]\(href(?:\s+(title))?\s*\)/,reflink:/^!?\[(label)\]\[(?!\s*\])((?:\\[\[\]]?|[^\[\]\\])+)\]/,nolink:/^!?\[(?!\s*\])((?:\[[^\[\]]*\]|\\[\[\]]|[^\[\]])*)\](?:\[\])?/,strong:/^__([^\s_])__(?!_)|^\*\*([^\s*])\*\*(?!\*)|^__([^\s][\s\S]*?[^\s])__(?!_)|^\*\*([^\s][\s\S]*?[^\s])\*\*(?!\*)/,em:/^_([^\s_])_(?!_)|^\*([^\s*"<\[])\*(?!\*)|^_([^\s][\s\S]*?[^\s_])_(?!_|[^\spunctuation])|^_([^\s_][\s\S]*?[^\s])_(?!_|[^\spunctuation])|^\*([^\s"<\[][\s\S]*?[^\s*])\*(?!\*)|^\*([^\s*"<\[][\s\S]*?[^\s])\*(?!\*)/,code:/^(`+)([^`]|[^`][\s\S]*?[^`])\1(?!`)/,br:/^( {2,}|\\)\n(?!\s*$)/,del:p,text:/^(`+|[^`])[\s\S]*?(?=[\\<!\[`*]|\b_| {2,}\n|$)/};y._punctuation="!\"#$%&'()*+,\\-./:;<=>?@\\[^_{|}~",y.em=l(y.em).replace(/punctuation/g,y._punctuation).getRegex(),y._escapes=/\\([!"#$%&'()*+,\-.\/:;<=>?@\[\]\\^_`{|}~])/g,y._scheme=/[a-zA-Z][a-zA-Z0-9+.-]{1,31}/,y._email=/[a-zA-Z0-9.!#$%&'*+\/=?^_`{|}~-]+(@)[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)+(?![-_])/,y.autolink=l(y.autolink).replace("scheme",y._scheme).replace("email",y._email).getRegex(),y._attribute=/\s+[a-zA-Z:_][\w.:-]*(?:\s*=\s*"[^"]*"|\s*=\s*'[^']*'|\s*=\s*[^\s"'=<>`]+)?/,y.tag=l(y.tag).replace("comment",w._comment).replace("attribute",y._attribute).getRegex(),y._label=/(?:\[[^\[\]]*\]|\\[\[\]]?|`[^`]*`|[^\[\]\\])*?/,y._href=/\s*(<(?:\\[<>]?|[^\s<>\\])*>|[^\s\x00-\x1f]*)/,y._title=/"(?:\\"?|[^"\\])*"|'(?:\\'?|[^'\\])*'|\((?:\\\)?|[^)\\])*\)/,y.link=l(y.link).replace("label",y._label).replace("href",y._href).replace("title",y._title).getRegex(),y.reflink=l(y.reflink).replace("label",y._label).getRegex(),y.normal=h({},y),y.pedantic=h({},y.normal,{strong:/^__(?=\S)([\s\S]*?\S)__(?!_)|^\*\*(?=\S)([\s\S]*?\S)\*\*(?!\*)/,em:/^_(?=\S)([\s\S]*?\S)_(?!_)|^\*(?=\S)([\s\S]*?\S)\*(?!\*)/,link:l(/^!?\[(label)\]\((.*?)\)/).replace("label",y._label).getRegex(),reflink:l(/^!?\[(label)\]\s*\[([^\]]*)\]/).replace("label",y._label).getRegex()}),y.gfm=h({},y.normal,{escape:l(y.escape).replace("])","~|])").getRegex(),_extended_email:/[A-Za-z0-9._+-]+(@)[a-zA-Z0-9-_]+(?:\.[a-zA-Z0-9-_]*[a-zA-Z0-9])+(?![-_])/,url:/^((?:ftp|https?):\/\/|www\.)(?:[a-zA-Z0-9\-]+\.?)+[^\s<]*|^email/,_backpedal:/(?:[^?!.,:;*_~()&]+|\([^)]*\)|&(?![a-zA-Z0-9]+;$)|[?!.,:;*_~)]+(?!$))+/,del:/^~+(?=\S)([\s\S]*?\S)~+/,text:l(y.text).replace("]|","~]|").replace("|$","|https?://|ftp://|www\\.|[a-zA-Z0-9.!#$%&'*+/=?^_`{\\|}~-]+@|$").getRegex()}),y.gfm.url=l(y.gfm.url,"i").replace("email",y.gfm._extended_email).getRegex(),y.breaks=h({},y.gfm,{br:l(y.br).replace("{2,}","*").getRegex(),text:l(y.gfm.text).replace("{2,}","*").getRegex()}),r.rules=y,r.output=function(e,t,n){var i=new r(t,n);return i.output(e)},r.prototype.output=function(e){for(var t,n,i,o,a,s,u="";e;)if(a=this.rules.escape.exec(e))e=e.substring(a[0].length),u+=c(a[1]);else if(a=this.rules.tag.exec(e))!this.inLink&&/^<a /i.test(a[0])?this.inLink=!0:this.inLink&&/^<\/a>/i.test(a[0])&&(this.inLink=!1),!this.inRawBlock&&/^<(pre|code|kbd|script)(\s|>)/i.test(a[0])?this.inRawBlock=!0:this.inRawBlock&&/^<\/(pre|code|kbd|script)(\s|>)/i.test(a[0])&&(this.inRawBlock=!1),e=e.substring(a[0].length),u+=this.options.sanitize?this.options.sanitizer?this.options.sanitizer(a[0]):c(a[0]):a[0];else if(a=this.rules.link.exec(e)){var l=v(a[2],"()");if(l>-1){var f=a[2].length-l;a[2]=a[2].substring(0,l),a[0]=a[0].substring(0,a[0].length-f)}e=e.substring(a[0].length),this.inLink=!0,i=a[2],this.options.pedantic?(t=/^([^'"]*[^\s])\s+(['"])(.*)\2/.exec(i),t?(i=t[1],o=t[3]):o=""):o=a[3]?a[3].slice(1,-1):"",i=i.trim().replace(/^<([\s\S]*)>$/,"$1"),u+=this.outputLink(a,{href:r.escapes(i),title:r.escapes(o)}),this.inLink=!1}else if((a=this.rules.reflink.exec(e))||(a=this.rules.nolink.exec(e))){if(e=e.substring(a[0].length),t=(a[2]||a[1]).replace(/\s+/g," "),t=this.links[t.toLowerCase()],!t||!t.href){u+=a[0].charAt(0),e=a[0].substring(1)+e;continue}this.inLink=!0,u+=this.outputLink(a,t),this.inLink=!1}else if(a=this.rules.strong.exec(e))e=e.substring(a[0].length),u+=this.renderer.strong(this.output(a[4]||a[3]||a[2]||a[1]));else if(a=this.rules.em.exec(e))e=e.substring(a[0].length),u+=this.renderer.em(this.output(a[6]||a[5]||a[4]||a[3]||a[2]||a[1]));else if(a=this.rules.code.exec(e))e=e.substring(a[0].length),u+=this.renderer.codespan(c(a[2].trim(),!0));else if(a=this.rules.br.exec(e))e=e.substring(a[0].length),u+=this.renderer.br();else if(a=this.rules.del.exec(e))e=e.substring(a[0].length),u+=this.renderer.del(this.output(a[1]));else if(a=this.rules.autolink.exec(e))e=e.substring(a[0].length),"@"===a[2]?(n=c(this.mangle(a[1])),i="mailto:"+n):(n=c(a[1]),i=n),u+=this.renderer.link(i,null,n);else if(this.inLink||!(a=this.rules.url.exec(e))){if(a=this.rules.text.exec(e))e=e.substring(a[0].length),u+=this.inRawBlock?this.renderer.text(a[0]):this.renderer.text(c(this.smartypants(a[0])));else if(e)throw new Error("Infinite loop on byte: "+e.charCodeAt(0))}else{if("@"===a[2])n=c(a[0]),i="mailto:"+n;else{do s=a[0],a[0]=this.rules._backpedal.exec(a[0])[0];while(s!==a[0]);n=c(a[0]),i="www."===a[1]?"http://"+n:n}e=e.substring(a[0].length),u+=this.renderer.link(i,null,n)}return u},r.escapes=function(e){return e?e.replace(r.rules._escapes,"$1"):e},r.prototype.outputLink=function(e,t){var n=t.href,r=t.title?c(t.title):null;return"!"!==e[0].charAt(0)?this.renderer.link(n,r,this.output(e[1])):this.renderer.image(n,r,c(e[1]))},r.prototype.smartypants=function(e){return this.options.smartypants?e.replace(/---/g,"—").replace(/--/g,"–").replace(/(^|[-\u2014\/(\[{"\s])'/g,"$1‘").replace(/'/g,"’").replace(/(^|[-\u2014\/(\[{\u2018\s])"/g,"$1“").replace(/"/g,"”").replace(/\.{3}/g,"…"):e},r.prototype.mangle=function(e){if(!this.options.mangle)return e;for(var t,n="",r=e.length,i=0;i<r;i++)t=e.charCodeAt(i),Math.random()>.5&&(t="x"+t.toString(16)),n+="&#"+t+";";return n},i.prototype.code=function(e,t,n){var r=(t||"").match(/\S*/)[0];if(this.options.highlight){var i=this.options.highlight(e,r);null!=i&&i!==e&&(n=!0,e=i)}return r?'<pre><code class="'+this.options.langPrefix+c(r,!0)+'">'+(n?e:c(e,!0))+"</code></pre>\n":"<pre><code>"+(n?e:c(e,!0))+"</code></pre>"},i.prototype.blockquote=function(e){return"<blockquote>\n"+e+"</blockquote>\n"},i.prototype.html=function(e){return e},i.prototype.heading=function(e,t,n,r){return this.options.headerIds?"<h"+t+' id="'+this.options.headerPrefix+r.slug(n)+'">'+e+"</h"+t+">\n":"<h"+t+">"+e+"</h"+t+">\n"},i.prototype.hr=function(){return this.options.xhtml?"<hr/>\n":"<hr>\n"},i.prototype.list=function(e,t,n){var r=t?"ol":"ul",i=t&&1!==n?' start="'+n+'"':"";return"<"+r+i+">\n"+e+"</"+r+">\n"},i.prototype.listitem=function(e){return"<li>"+e+"</li>\n"},i.prototype.checkbox=function(e){return"<input "+(e?'checked="" ':"")+'disabled="" type="checkbox"'+(this.options.xhtml?" /":"")+"> "},i.prototype.paragraph=function(e){return"<p>"+e+"</p>\n"},i.prototype.table=function(e,t){return t&&(t="<tbody>"+t+"</tbody>"),"<table>\n<thead>\n"+e+"</thead>\n"+t+"</table>\n"},i.prototype.tablerow=function(e){return"<tr>\n"+e+"</tr>\n"},i.prototype.tablecell=function(e,t){var n=t.header?"th":"td",r=t.align?"<"+n+' align="'+t.align+'">':"<"+n+">";return r+e+"</"+n+">\n"},i.prototype.strong=function(e){return"<strong>"+e+"</strong>"},i.prototype.em=function(e){return"<em>"+e+"</em>"},i.prototype.codespan=function(e){return"<code>"+e+"</code>"},i.prototype.br=function(){return this.options.xhtml?"<br/>":"<br>"},i.prototype.del=function(e){return"<del>"+e+"</del>"},i.prototype.link=function(e,t,n){if(e=f(this.options.sanitize,this.options.baseUrl,e),null===e)return n;var r='<a href="'+c(e)+'"';return t&&(r+=' title="'+t+'"'),r+=">"+n+"</a>"},i.prototype.image=function(e,t,n){if(e=f(this.options.sanitize,this.options.baseUrl,e),null===e)return n;var r='<img src="'+e+'" alt="'+n+'"';return t&&(r+=' title="'+t+'"'),r+=this.options.xhtml?"/>":">"},i.prototype.text=function(e){return e},o.prototype.strong=o.prototype.em=o.prototype.codespan=o.prototype.del=o.prototype.text=function(e){return e},o.prototype.link=o.prototype.image=function(e,t,n){return""+n},o.prototype.br=function(){return""},a.parse=function(e,t){var n=new a(t);return n.parse(e)},a.prototype.parse=function(e){this.inline=new r(e.links,this.options),this.inlineText=new r(e.links,h({},this.options,{renderer:new o})),this.tokens=e.reverse();for(var t="";this.next();)t+=this.tok();return t},a.prototype.next=function(){return this.token=this.tokens.pop()},a.prototype.peek=function(){return this.tokens[this.tokens.length-1]||0},a.prototype.parseText=function(){for(var e=this.token.text;"text"===this.peek().type;)e+="\n"+this.next().text;return this.inline.output(e)},a.prototype.tok=function(){switch(this.token.type){case"space":return"";case"hr":return this.renderer.hr();case"heading":return this.renderer.heading(this.inline.output(this.token.text),this.token.depth,u(this.inlineText.output(this.token.text)),this.slugger);case"code":return this.renderer.code(this.token.text,this.token.lang,this.token.escaped);case"table":var e,t,n,r,i="",o="";for(n="",e=0;e<this.token.header.length;e++)n+=this.renderer.tablecell(this.inline.output(this.token.header[e]),{header:!0,align:this.token.align[e]});for(i+=this.renderer.tablerow(n),e=0;e<this.token.cells.length;e++){for(t=this.token.cells[e],n="",r=0;r<t.length;r++)n+=this.renderer.tablecell(this.inline.output(t[r]),{header:!1,align:this.token.align[r]});o+=this.renderer.tablerow(n)}return this.renderer.table(i,o);case"blockquote_start":for(o="";"blockquote_end"!==this.next().type;)o+=this.tok();return this.renderer.blockquote(o);case"list_start":o="";for(var a=this.token.ordered,s=this.token.start;"list_end"!==this.next().type;)o+=this.tok();return this.renderer.list(o,a,s);case"list_item_start":o="";var c=this.token.loose;for(this.token.task&&(o+=this.renderer.checkbox(this.token.checked));"list_item_end"!==this.next().type;)o+=c||"text"!==this.token.type?this.tok():this.parseText();return this.renderer.listitem(o);case"html":return this.renderer.html(this.token.text);case"paragraph":return this.renderer.paragraph(this.inline.output(this.token.text));case"text":return this.renderer.paragraph(this.parseText());default:var l='Token with "'+this.token.type+'" type was not found.';if(!this.options.silent)throw new Error(l);console.log(l)}},s.prototype.slug=function(e){var t=e.toLowerCase().trim().replace(/[\u2000-\u206F\u2E00-\u2E7F\\'!"#$%&()*+,.\/:;<=>?@[\]^`{|}~]/g,"").replace(/\s/g,"-");if(this.seen.hasOwnProperty(t)){var n=t;do this.seen[n]++,t=n+"-"+this.seen[n];while(this.seen.hasOwnProperty(t))}return this.seen[t]=0,t},c.escapeTest=/[&<>"']/,c.escapeReplace=/[&<>"']/g,c.replacements={"&":"&","<":"<",">":">",'"':""","'":"'"},c.escapeTestNoEncode=/[<>"']|&(?!#?\w+;)/,c.escapeReplaceNoEncode=/[<>"']|&(?!#?\w+;)/g;var x={},k=/^$|^[a-z][a-z0-9+.-]*:|^[?#]/i;p.exec=p,b.options=b.setOptions=function(e){return h(b.defaults,e),b},b.getDefaults=function(){return{baseUrl:null,breaks:!1,gfm:!0,headerIds:!0,headerPrefix:"",highlight:null,langPrefix:"language-",mangle:!0,pedantic:!1,renderer:new i,sanitize:!1,sanitizer:null,silent:!1,smartLists:!1,smartypants:!1,tables:!0,xhtml:!1}},b.defaults=b.getDefaults(),b.Parser=a,b.parser=a.parse,b.Renderer=i,b.TextRenderer=o,b.Lexer=n,b.lexer=n.lex,b.InlineLexer=r,b.inlineLexer=r.output,b.Slugger=s,b.parse=b,e.exports=b}(this||("undefined"!=typeof window?window:t))}).call(t,function(){return this}())},function(e,t,n){"use strict";var r=n(2),i=r.each,o=r.dom,a=n(8),s=n(12),c=n(20),u=n(13),l=n(14),f=Object.assign({enabled:!1,type:"php-tar",packageName:"package",alwaysVisible:!1},l.download),d='<div id="download" class="tool">\n            <img src="'+u.image("download")+'" alt="download"/>\n        </div>',p=[],h=void 0,g=function(e){p=e.slice(0),p.length?h.show():f.alwaysVisible||h.hide()},m=function(){var e=f.type,t=f.packageName,n="shell-zip"===e?"zip":"tar";t||(t=1===p.length?p[0].label:c.getItem().label);var r={action:"download",as:t+"."+n,type:e,baseHref:c.getAbsHref(),hrefs:""};i(p,function(e,t){r["hrefs["+t+"]"]=e.absHref}),a.formRequest(r)},v=function(){f.enabled&&(h=o(d).hide().appTo("#toolbar").on("click",m),f.alwaysVisible&&h.show(),s.sub("selection",g))};v()},function(e,t,n){"use strict";var r=n(2),i=r.filter,o=r.debounce,a=r.parsePattern,s=r.dom,c=n(12),u=n(20),l=n(13),f=n(14),d=n(18),p=Object.assign({enabled:!1,advanced:!1,debounceTime:100,ignorecase:!0},f.filter),h='<div id="filter" class="tool">\n            <img src="'+l.image("filter")+'" alt="filter"/>\n            <input class="l10n_ph-filter" type="text" value=""/>\n        </div>',g=!1,m="",v=void 0,b=void 0,w=function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"";if(e!==m){if(m=e,!e)return void d.setLocation();v.addCls("pending");var t=new RegExp(e,p.ignorecase?"i":""),n=i(u.getItem().content,function(e){return t.test(e.label)});v.rmCls("pending"),d.setHint("noMatch"),d.setItems(n)}},y=function(){g?(v.addCls("active"),b[0].focus(),w(a(b.val(),p.advanced))):(w(),v.rmCls("active"))},x=function(){g=!g,y()},k=function(){g=!1,b.val(""),y()},_=function(){p.enabled&&(v=s(h).appTo("#toolbar"),b=v.find("input"),v.find("img").on("click",x),b.on("keyup",o(y,p.debounceTime)),c.sub("location.changed",k))};_()},function(e,t,n){(function(e){"use strict";var t=n(2),r=t.map,i=n(12),o=n(14),a=e.window,s=Object.assign({enabled:!1,id:"UA-000000-0"},o["google-analytics-ua"]),c=function(){!function(e,t,n,r,i,o,a){e.GoogleAnalyticsObject=i,e[i]=e[i]||function(){(e[i].q=e[i].q||[]).push(arguments)},e[i].l=1*new Date,o=t.createElement(n),a=t.getElementsByTagName(n)[0],o.async=1,o.src=r,a.parentNode.insertBefore(o,a)}(window,document,"script","//www.google-analytics.com/analytics.js","ga")},u=function(){s.enabled&&(c(),a.ga("create",s.id,"auto"),i.sub("location.changed",function(e){var t=a.location;a.ga("send","pageview",{location:t.protocol+"//"+t.host+e.absHref,title:r(e.getCrumb(),function(e){return e.label}).join(" > ")})}))};u()}).call(t,function(){return this}())},function(e,t,n){(function(e){"use strict";var t=n(33),r=n(2),i=r.isNum,o=r.dom,a=n(12),s=n(19),c=n(13),u=n(14),l=n(16),f=Object.assign({enabled:!1,show:!1,qrcode:!0,qrColor:"#999"},u.info),d='<div id="info">\n            <div class="icon"><img/></div>\n            <div class="block">\n                <div class="label"></div>\n                <div class="time"></div>\n                <div class="size"></div>\n                <div class="content">\n                    <span class="folders"></span> <span class="l10n-folders"></span>,\n                    <span class="files"></span> <span class="l10n-files"></span>\n                </div>\n            </div>\n            <div class="qrcode"/>\n        </div>',p='<div class="block">\n            <h1 class="l10n-info">Info</h1>\n            <div id="view-info" class="button view">\n                <img src="'+c.image("info-toggle")+'" alt="view-info"/>\n            </div>\n        </div>',h="ext/info",g=void 0,m=void 0,v=void 0,b=void 0,w=void 0,y=void 0,x=void 0,k=void 0,_=void 0,C=function(){l.get(h)?(o("#view-info").addCls("active"),o("#info").show()):(o("#view-info").rmCls("active"),o("#info").hide())},S=function(n){var r=n.thumbRational||n.icon,o=!!n.thumbRational;if(!n.isCurrentFolder()&&r||(r=c.icon("folder")),g.attr("src",r),o?g.addCls("thumb"):g.rmCls("thumb"),m.text(n.label),i(n.time)?v.text(s.formatDate(n.time)):v.text("."),i(n.size)?(b.text(s.formatSize(n.size)),b.show()):b.hide(),n.isContentFetched){var a=n.getStats();y.text(a.folders),x.text(a.files),w.show()}else w.hide();if(f.qrcode){var u=e.window.location;k.clr().app(t({render:"image",size:200,fill:f.qrFill,back:f.qrBack,text:u.protocol+"//"+u.host+n.absHref,crisp:!0,quiet:1}))}},A=function(e){S(e)},T=function(){S(_)},E=function(e){_=e,S(_)},M=function(){if(f.enabled){var e=o(d).hide().appTo("#mainrow");g=e.find(".icon img"),m=e.find(".label"),v=e.find(".time"),b=e.find(".size"),w=e.find(".content"),y=e.find(".folders"),x=e.find(".files"),k=e.find(".qrcode"),f.qrcode||k.rm(),o(p).appTo("#sidebar").find("#view-info").on("click",function(e){l.put(h,!l.get(h)),C(),a.pub("resize"),e.preventDefault()}),"boolean"!=typeof l.get(h)&&l.put(h,f.show),C(),a.sub("location.changed",E),a.sub("item.mouseenter",A),a.sub("item.mouseleave",T)}};M()}).call(t,function(){return this}())},function(e,t,n){var r,i,o;!function(t,n){e.exports=n()}(this,function(){return function(e){function t(r){if(n[r])return n[r].exports;var i=n[r]={exports:{},id:r,loaded:!1};return e[r].call(i.exports,i,i.exports,t),i.loaded=!0,i.exports}var n={};return t.m=e,t.c=n,t.p="",t(0)}([function(e,t,n){"use strict";var r=n(1),i=r.create_canvas,o=r.canvas_to_img,a=r.dpr,s=n(2),c=n(3),u=n(4);e.exports=function(e){var t=Object.assign({},s,e),n=c(t.text,t.ecLevel,t.minVersion,t.quiet),r=t.ratio||a,l=i(t.size,r),f=l.getContext("2d");return f.scale(r,r),u(n,f,t),"image"===t.render?o(l):l}},function(e,t){"use strict";var n=window,r=n.document,i=n.devicePixelRatio||1,o=function(e){return r.createElement(e)},a=function(e,t){return e.getAttribute(t)},s=function(e,t,n){return e.setAttribute(t,n)},c=function(e,t){var n=o("canvas");return s(n,"width",e*t),s(n,"height",e*t),n.style.width=e+"px",n.style.height=e+"px",n},u=function(e){var t=o("img");return s(t,"crossorigin","anonymous"),s(t,"src",e.toDataURL("image/png")),s(t,"width",a(e,"width")),s(t,"height",a(e,"height")),t.style.width=e.style.width,t.style.height=e.style.height,t};e.exports={create_canvas:c,canvas_to_img:u,dpr:i}},function(e,t){"use strict";e.exports={render:"image",crisp:!0,minVersion:1,ecLevel:"L",size:200,ratio:null,fill:"#333",back:"#fff",text:"no text",rounded:0,quiet:0,mode:"plain",mSize:30,mPosX:50,mPosY:50,label:"no label",fontname:"sans",fontcolor:"#333",image:null}},function(n,a){"use strict";var s="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},c=/code length overflow/i,u=function(){var n=function(){function e(t,n){if("undefined"==typeof t.length)throw new Error(t.length+"/"+n);var r=function(){for(var e=0;e<t.length&&0==t[e];)e+=1;for(var r=new Array(t.length-e+n),i=0;i<t.length-e;i+=1)r[i]=t[i+e];return r}(),i={};return i.getAt=function(e){return r[e]},i.getLength=function(){return r.length},i.multiply=function(t){for(var n=new Array(i.getLength()+t.getLength()-1),r=0;r<i.getLength();r+=1)for(var o=0;o<t.getLength();o+=1)n[r+o]^=a.gexp(a.glog(i.getAt(r))+a.glog(t.getAt(o)));return e(n,0)},i.mod=function(t){if(i.getLength()-t.getLength()<0)return i;for(var n=a.glog(i.getAt(0))-a.glog(t.getAt(0)),r=new Array(i.getLength()),o=0;o<i.getLength();o+=1)r[o]=i.getAt(o);for(var o=0;o<t.getLength();o+=1)r[o]^=a.gexp(a.glog(t.getAt(o))+n);return e(r,0).mod(t)},i}var t=function(t,n){var i=236,a=17,l=t,f=r[n],d=null,p=0,g=null,m=new Array,v={},b=function(e,t){p=4*l+17,d=function(e){for(var t=new Array(e),n=0;n<e;n+=1){t[n]=new Array(e);for(var r=0;r<e;r+=1)t[n][r]=null}return t}(p),w(0,0),w(p-7,0),w(0,p-7),k(),x(),C(e,t),l>=7&&_(e),null==g&&(g=T(l,f,m)),S(g,t)},w=function(e,t){for(var n=-1;n<=7;n+=1)if(!(e+n<=-1||p<=e+n))for(var r=-1;r<=7;r+=1)t+r<=-1||p<=t+r||(0<=n&&n<=6&&(0==r||6==r)||0<=r&&r<=6&&(0==n||6==n)||2<=n&&n<=4&&2<=r&&r<=4?d[e+n][t+r]=!0:d[e+n][t+r]=!1)},y=function(){for(var e=0,t=0,n=0;n<8;n+=1){b(!0,n);var r=o.getLostPoint(v);(0==n||e>r)&&(e=r,t=n)}return t},x=function(){for(var e=8;e<p-8;e+=1)null==d[e][6]&&(d[e][6]=e%2==0);for(var t=8;t<p-8;t+=1)null==d[6][t]&&(d[6][t]=t%2==0)},k=function(){for(var e=o.getPatternPosition(l),t=0;t<e.length;t+=1)for(var n=0;n<e.length;n+=1){var r=e[t],i=e[n];if(null==d[r][i])for(var a=-2;a<=2;a+=1)for(var s=-2;s<=2;s+=1)a==-2||2==a||s==-2||2==s||0==a&&0==s?d[r+a][i+s]=!0:d[r+a][i+s]=!1}},_=function(e){for(var t=o.getBCHTypeNumber(l),n=0;n<18;n+=1){var r=!e&&1==(t>>n&1);d[Math.floor(n/3)][n%3+p-8-3]=r}for(var n=0;n<18;n+=1){var r=!e&&1==(t>>n&1);d[n%3+p-8-3][Math.floor(n/3)]=r}},C=function(e,t){for(var n=f<<3|t,r=o.getBCHTypeInfo(n),i=0;i<15;i+=1){var a=!e&&1==(r>>i&1);i<6?d[i][8]=a:i<8?d[i+1][8]=a:d[p-15+i][8]=a}for(var i=0;i<15;i+=1){var a=!e&&1==(r>>i&1);i<8?d[8][p-i-1]=a:i<9?d[8][15-i-1+1]=a:d[8][15-i-1]=a}d[p-8][8]=!e},S=function(e,t){for(var n=-1,r=p-1,i=7,a=0,s=o.getMaskFunction(t),c=p-1;c>0;c-=2)for(6==c&&(c-=1);;){for(var u=0;u<2;u+=1)if(null==d[r][c-u]){var l=!1;a<e.length&&(l=1==(e[a]>>>i&1));var f=s(r,c-u);f&&(l=!l),d[r][c-u]=l,i-=1,i==-1&&(a+=1,i=7)}if(r+=n,r<0||p<=r){r-=n,n=-n;break}}},A=function(t,n){for(var r=0,i=0,a=0,s=new Array(n.length),c=new Array(n.length),u=0;u<n.length;u+=1){var l=n[u].dataCount,f=n[u].totalCount-l;i=Math.max(i,l),a=Math.max(a,f),s[u]=new Array(l);for(var d=0;d<s[u].length;d+=1)s[u][d]=255&t.getBuffer()[d+r];r+=l;var p=o.getErrorCorrectPolynomial(f),h=e(s[u],p.getLength()-1),g=h.mod(p);c[u]=new Array(p.getLength()-1);for(var d=0;d<c[u].length;d+=1){var m=d+g.getLength()-c[u].length;c[u][d]=m>=0?g.getAt(m):0}}for(var v=0,d=0;d<n.length;d+=1)v+=n[d].totalCount;for(var b=new Array(v),w=0,d=0;d<i;d+=1)for(var u=0;u<n.length;u+=1)d<s[u].length&&(b[w]=s[u][d],w+=1);for(var d=0;d<a;d+=1)for(var u=0;u<n.length;u+=1)d<c[u].length&&(b[w]=c[u][d],w+=1);return b},T=function(e,t,n){for(var r=s.getRSBlocks(e,t),u=c(),l=0;l<n.length;l+=1){var f=n[l];u.put(f.getMode(),4),u.put(f.getLength(),o.getLengthInBits(f.getMode(),e)),f.write(u)}for(var d=0,l=0;l<r.length;l+=1)d+=r[l].dataCount;if(u.getLengthInBits()>8*d)throw new Error("code length overflow. ("+u.getLengthInBits()+">"+8*d+")");for(u.getLengthInBits()+4<=8*d&&u.put(0,4);u.getLengthInBits()%8!=0;)u.putBit(!1);for(;!(u.getLengthInBits()>=8*d)&&(u.put(i,8),!(u.getLengthInBits()>=8*d));)u.put(a,8);return A(u,r)};return v.addData=function(e){var t=u(e);m.push(t),g=null},v.isDark=function(e,t){if(e<0||p<=e||t<0||p<=t)throw new Error(e+","+t);return d[e][t]},v.getModuleCount=function(){return p},v.make=function(){b(!1,y())},v.createTableTag=function(e,t){e=e||2,t="undefined"==typeof t?4*e:t;var n="";n+='<table style="',n+=" border-width: 0px; border-style: none;",n+=" border-collapse: collapse;",n+=" padding: 0px; margin: "+t+"px;",n+='">',n+="<tbody>";for(var r=0;r<v.getModuleCount();r+=1){n+="<tr>";for(var i=0;i<v.getModuleCount();i+=1)n+='<td style="',n+=" border-width: 0px; border-style: none;",n+=" border-collapse: collapse;",n+=" padding: 0px; margin: 0px;",n+=" width: "+e+"px;",n+=" height: "+e+"px;",n+=" background-color: ",n+=v.isDark(r,i)?"#000000":"#ffffff",n+=";",n+='"/>';n+="</tr>"}return n+="</tbody>",n+="</table>"},v.createImgTag=function(e,t){e=e||2,t="undefined"==typeof t?4*e:t;var n=v.getModuleCount()*e+2*t,r=t,i=n-t;return h(n,n,function(t,n){if(r<=t&&t<i&&r<=n&&n<i){var o=Math.floor((t-r)/e),a=Math.floor((n-r)/e);
+return v.isDark(a,o)?0:1}return 1})},v};t.stringToBytes=function(e){for(var t=new Array,n=0;n<e.length;n+=1){var r=e.charCodeAt(n);t.push(255&r)}return t},t.createStringToBytes=function(e,t){var n=function(){for(var n=d(e),r=function(){var e=n.read();if(e==-1)throw new Error;return e},i=0,o={};;){var a=n.read();if(a==-1)break;var s=r(),c=r(),u=r(),l=String.fromCharCode(a<<8|s),f=c<<8|u;o[l]=f,i+=1}if(i!=t)throw new Error(i+" != "+t);return o}(),r="?".charCodeAt(0);return function(e){for(var t=new Array,i=0;i<e.length;i+=1){var o=e.charCodeAt(i);if(o<128)t.push(o);else{var a=n[e.charAt(i)];"number"==typeof a?(255&a)==a?t.push(a):(t.push(a>>>8),t.push(255&a)):t.push(r)}}return t}};var n={MODE_NUMBER:1,MODE_ALPHA_NUM:2,MODE_8BIT_BYTE:4,MODE_KANJI:8},r={L:1,M:0,Q:3,H:2},i={PATTERN000:0,PATTERN001:1,PATTERN010:2,PATTERN011:3,PATTERN100:4,PATTERN101:5,PATTERN110:6,PATTERN111:7},o=function(){var t=[[],[6,18],[6,22],[6,26],[6,30],[6,34],[6,22,38],[6,24,42],[6,26,46],[6,28,50],[6,30,54],[6,32,58],[6,34,62],[6,26,46,66],[6,26,48,70],[6,26,50,74],[6,30,54,78],[6,30,56,82],[6,30,58,86],[6,34,62,90],[6,28,50,72,94],[6,26,50,74,98],[6,30,54,78,102],[6,28,54,80,106],[6,32,58,84,110],[6,30,58,86,114],[6,34,62,90,118],[6,26,50,74,98,122],[6,30,54,78,102,126],[6,26,52,78,104,130],[6,30,56,82,108,134],[6,34,60,86,112,138],[6,30,58,86,114,142],[6,34,62,90,118,146],[6,30,54,78,102,126,150],[6,24,50,76,102,128,154],[6,28,54,80,106,132,158],[6,32,58,84,110,136,162],[6,26,54,82,110,138,166],[6,30,58,86,114,142,170]],r=1335,o=7973,s=21522,c={},u=function(e){for(var t=0;0!=e;)t+=1,e>>>=1;return t};return c.getBCHTypeInfo=function(e){for(var t=e<<10;u(t)-u(r)>=0;)t^=r<<u(t)-u(r);return(e<<10|t)^s},c.getBCHTypeNumber=function(e){for(var t=e<<12;u(t)-u(o)>=0;)t^=o<<u(t)-u(o);return e<<12|t},c.getPatternPosition=function(e){return t[e-1]},c.getMaskFunction=function(e){switch(e){case i.PATTERN000:return function(e,t){return(e+t)%2==0};case i.PATTERN001:return function(e,t){return e%2==0};case i.PATTERN010:return function(e,t){return t%3==0};case i.PATTERN011:return function(e,t){return(e+t)%3==0};case i.PATTERN100:return function(e,t){return(Math.floor(e/2)+Math.floor(t/3))%2==0};case i.PATTERN101:return function(e,t){return e*t%2+e*t%3==0};case i.PATTERN110:return function(e,t){return(e*t%2+e*t%3)%2==0};case i.PATTERN111:return function(e,t){return(e*t%3+(e+t)%2)%2==0};default:throw new Error("bad maskPattern:"+e)}},c.getErrorCorrectPolynomial=function(t){for(var n=e([1],0),r=0;r<t;r+=1)n=n.multiply(e([1,a.gexp(r)],0));return n},c.getLengthInBits=function(e,t){if(1<=t&&t<10)switch(e){case n.MODE_NUMBER:return 10;case n.MODE_ALPHA_NUM:return 9;case n.MODE_8BIT_BYTE:return 8;case n.MODE_KANJI:return 8;default:throw new Error("mode:"+e)}else if(t<27)switch(e){case n.MODE_NUMBER:return 12;case n.MODE_ALPHA_NUM:return 11;case n.MODE_8BIT_BYTE:return 16;case n.MODE_KANJI:return 10;default:throw new Error("mode:"+e)}else{if(!(t<41))throw new Error("type:"+t);switch(e){case n.MODE_NUMBER:return 14;case n.MODE_ALPHA_NUM:return 13;case n.MODE_8BIT_BYTE:return 16;case n.MODE_KANJI:return 12;default:throw new Error("mode:"+e)}}},c.getLostPoint=function(e){for(var t=e.getModuleCount(),n=0,r=0;r<t;r+=1)for(var i=0;i<t;i+=1){for(var o=0,a=e.isDark(r,i),s=-1;s<=1;s+=1)if(!(r+s<0||t<=r+s))for(var c=-1;c<=1;c+=1)i+c<0||t<=i+c||0==s&&0==c||a==e.isDark(r+s,i+c)&&(o+=1);o>5&&(n+=3+o-5)}for(var r=0;r<t-1;r+=1)for(var i=0;i<t-1;i+=1){var u=0;e.isDark(r,i)&&(u+=1),e.isDark(r+1,i)&&(u+=1),e.isDark(r,i+1)&&(u+=1),e.isDark(r+1,i+1)&&(u+=1),0!=u&&4!=u||(n+=3)}for(var r=0;r<t;r+=1)for(var i=0;i<t-6;i+=1)e.isDark(r,i)&&!e.isDark(r,i+1)&&e.isDark(r,i+2)&&e.isDark(r,i+3)&&e.isDark(r,i+4)&&!e.isDark(r,i+5)&&e.isDark(r,i+6)&&(n+=40);for(var i=0;i<t;i+=1)for(var r=0;r<t-6;r+=1)e.isDark(r,i)&&!e.isDark(r+1,i)&&e.isDark(r+2,i)&&e.isDark(r+3,i)&&e.isDark(r+4,i)&&!e.isDark(r+5,i)&&e.isDark(r+6,i)&&(n+=40);for(var l=0,i=0;i<t;i+=1)for(var r=0;r<t;r+=1)e.isDark(r,i)&&(l+=1);var f=Math.abs(100*l/t/t-50)/5;return n+=10*f},c}(),a=function(){for(var e=new Array(256),t=new Array(256),n=0;n<8;n+=1)e[n]=1<<n;for(var n=8;n<256;n+=1)e[n]=e[n-4]^e[n-5]^e[n-6]^e[n-8];for(var n=0;n<255;n+=1)t[e[n]]=n;var r={};return r.glog=function(e){if(e<1)throw new Error("glog("+e+")");return t[e]},r.gexp=function(t){for(;t<0;)t+=255;for(;t>=256;)t-=255;return e[t]},r}(),s=function(){var e=[[1,26,19],[1,26,16],[1,26,13],[1,26,9],[1,44,34],[1,44,28],[1,44,22],[1,44,16],[1,70,55],[1,70,44],[2,35,17],[2,35,13],[1,100,80],[2,50,32],[2,50,24],[4,25,9],[1,134,108],[2,67,43],[2,33,15,2,34,16],[2,33,11,2,34,12],[2,86,68],[4,43,27],[4,43,19],[4,43,15],[2,98,78],[4,49,31],[2,32,14,4,33,15],[4,39,13,1,40,14],[2,121,97],[2,60,38,2,61,39],[4,40,18,2,41,19],[4,40,14,2,41,15],[2,146,116],[3,58,36,2,59,37],[4,36,16,4,37,17],[4,36,12,4,37,13],[2,86,68,2,87,69],[4,69,43,1,70,44],[6,43,19,2,44,20],[6,43,15,2,44,16],[4,101,81],[1,80,50,4,81,51],[4,50,22,4,51,23],[3,36,12,8,37,13],[2,116,92,2,117,93],[6,58,36,2,59,37],[4,46,20,6,47,21],[7,42,14,4,43,15],[4,133,107],[8,59,37,1,60,38],[8,44,20,4,45,21],[12,33,11,4,34,12],[3,145,115,1,146,116],[4,64,40,5,65,41],[11,36,16,5,37,17],[11,36,12,5,37,13],[5,109,87,1,110,88],[5,65,41,5,66,42],[5,54,24,7,55,25],[11,36,12,7,37,13],[5,122,98,1,123,99],[7,73,45,3,74,46],[15,43,19,2,44,20],[3,45,15,13,46,16],[1,135,107,5,136,108],[10,74,46,1,75,47],[1,50,22,15,51,23],[2,42,14,17,43,15],[5,150,120,1,151,121],[9,69,43,4,70,44],[17,50,22,1,51,23],[2,42,14,19,43,15],[3,141,113,4,142,114],[3,70,44,11,71,45],[17,47,21,4,48,22],[9,39,13,16,40,14],[3,135,107,5,136,108],[3,67,41,13,68,42],[15,54,24,5,55,25],[15,43,15,10,44,16],[4,144,116,4,145,117],[17,68,42],[17,50,22,6,51,23],[19,46,16,6,47,17],[2,139,111,7,140,112],[17,74,46],[7,54,24,16,55,25],[34,37,13],[4,151,121,5,152,122],[4,75,47,14,76,48],[11,54,24,14,55,25],[16,45,15,14,46,16],[6,147,117,4,148,118],[6,73,45,14,74,46],[11,54,24,16,55,25],[30,46,16,2,47,17],[8,132,106,4,133,107],[8,75,47,13,76,48],[7,54,24,22,55,25],[22,45,15,13,46,16],[10,142,114,2,143,115],[19,74,46,4,75,47],[28,50,22,6,51,23],[33,46,16,4,47,17],[8,152,122,4,153,123],[22,73,45,3,74,46],[8,53,23,26,54,24],[12,45,15,28,46,16],[3,147,117,10,148,118],[3,73,45,23,74,46],[4,54,24,31,55,25],[11,45,15,31,46,16],[7,146,116,7,147,117],[21,73,45,7,74,46],[1,53,23,37,54,24],[19,45,15,26,46,16],[5,145,115,10,146,116],[19,75,47,10,76,48],[15,54,24,25,55,25],[23,45,15,25,46,16],[13,145,115,3,146,116],[2,74,46,29,75,47],[42,54,24,1,55,25],[23,45,15,28,46,16],[17,145,115],[10,74,46,23,75,47],[10,54,24,35,55,25],[19,45,15,35,46,16],[17,145,115,1,146,116],[14,74,46,21,75,47],[29,54,24,19,55,25],[11,45,15,46,46,16],[13,145,115,6,146,116],[14,74,46,23,75,47],[44,54,24,7,55,25],[59,46,16,1,47,17],[12,151,121,7,152,122],[12,75,47,26,76,48],[39,54,24,14,55,25],[22,45,15,41,46,16],[6,151,121,14,152,122],[6,75,47,34,76,48],[46,54,24,10,55,25],[2,45,15,64,46,16],[17,152,122,4,153,123],[29,74,46,14,75,47],[49,54,24,10,55,25],[24,45,15,46,46,16],[4,152,122,18,153,123],[13,74,46,32,75,47],[48,54,24,14,55,25],[42,45,15,32,46,16],[20,147,117,4,148,118],[40,75,47,7,76,48],[43,54,24,22,55,25],[10,45,15,67,46,16],[19,148,118,6,149,119],[18,75,47,31,76,48],[34,54,24,34,55,25],[20,45,15,61,46,16]],t=function(e,t){var n={};return n.totalCount=e,n.dataCount=t,n},n={},i=function(t,n){switch(n){case r.L:return e[4*(t-1)+0];case r.M:return e[4*(t-1)+1];case r.Q:return e[4*(t-1)+2];case r.H:return e[4*(t-1)+3];default:return}};return n.getRSBlocks=function(e,n){var r=i(e,n);if("undefined"==typeof r)throw new Error("bad rs block @ typeNumber:"+e+"/errorCorrectLevel:"+n);for(var o=r.length/3,a=new Array,s=0;s<o;s+=1)for(var c=r[3*s+0],u=r[3*s+1],l=r[3*s+2],f=0;f<c;f+=1)a.push(t(u,l));return a},n}(),c=function(){var e=new Array,t=0,n={};return n.getBuffer=function(){return e},n.getAt=function(t){var n=Math.floor(t/8);return 1==(e[n]>>>7-t%8&1)},n.put=function(e,t){for(var r=0;r<t;r+=1)n.putBit(1==(e>>>t-r-1&1))},n.getLengthInBits=function(){return t},n.putBit=function(n){var r=Math.floor(t/8);e.length<=r&&e.push(0),n&&(e[r]|=128>>>t%8),t+=1},n},u=function(e){var r=n.MODE_8BIT_BYTE,i=t.stringToBytes(e),o={};return o.getMode=function(){return r},o.getLength=function(e){return i.length},o.write=function(e){for(var t=0;t<i.length;t+=1)e.put(i[t],8)},o},l=function(){var e=new Array,t={};return t.writeByte=function(t){e.push(255&t)},t.writeShort=function(e){t.writeByte(e),t.writeByte(e>>>8)},t.writeBytes=function(e,n,r){n=n||0,r=r||e.length;for(var i=0;i<r;i+=1)t.writeByte(e[i+n])},t.writeString=function(e){for(var n=0;n<e.length;n+=1)t.writeByte(e.charCodeAt(n))},t.toByteArray=function(){return e},t.toString=function(){var t="";t+="[";for(var n=0;n<e.length;n+=1)n>0&&(t+=","),t+=e[n];return t+="]"},t},f=function(){var e=0,t=0,n=0,r="",i={},o=function(e){r+=String.fromCharCode(a(63&e))},a=function(e){if(e<0);else{if(e<26)return 65+e;if(e<52)return 97+(e-26);if(e<62)return 48+(e-52);if(62==e)return 43;if(63==e)return 47}throw new Error("n:"+e)};return i.writeByte=function(r){for(e=e<<8|255&r,t+=8,n+=1;t>=6;)o(e>>>t-6),t-=6},i.flush=function(){if(t>0&&(o(e<<6-t),e=0,t=0),n%3!=0)for(var i=3-n%3,a=0;a<i;a+=1)r+="="},i.toString=function(){return r},i},d=function(e){var t=e,n=0,r=0,i=0,o={};o.read=function(){for(;i<8;){if(n>=t.length){if(0==i)return-1;throw new Error("unexpected end of file./"+i)}var e=t.charAt(n);if(n+=1,"="==e)return i=0,-1;e.match(/^\s$/)||(r=r<<6|a(e.charCodeAt(0)),i+=6)}var o=r>>>i-8&255;return i-=8,o};var a=function(e){if(65<=e&&e<=90)return e-65;if(97<=e&&e<=122)return e-97+26;if(48<=e&&e<=57)return e-48+52;if(43==e)return 62;if(47==e)return 63;throw new Error("c:"+e)};return o},p=function(e,t){var n=e,r=t,i=new Array(e*t),o={};o.setPixel=function(e,t,r){i[t*n+e]=r},o.write=function(e){e.writeString("GIF87a"),e.writeShort(n),e.writeShort(r),e.writeByte(128),e.writeByte(0),e.writeByte(0),e.writeByte(0),e.writeByte(0),e.writeByte(0),e.writeByte(255),e.writeByte(255),e.writeByte(255),e.writeString(","),e.writeShort(0),e.writeShort(0),e.writeShort(n),e.writeShort(r),e.writeByte(0);var t=2,i=s(t);e.writeByte(t);for(var o=0;i.length-o>255;)e.writeByte(255),e.writeBytes(i,o,255),o+=255;e.writeByte(i.length-o),e.writeBytes(i,o,i.length-o),e.writeByte(0),e.writeString(";")};var a=function(e){var t=e,n=0,r=0,i={};return i.write=function(e,i){if(e>>>i!=0)throw new Error("length over");for(;n+i>=8;)t.writeByte(255&(e<<n|r)),i-=8-n,e>>>=8-n,r=0,n=0;r|=e<<n,n+=i},i.flush=function(){n>0&&t.writeByte(r)},i},s=function(e){for(var t=1<<e,n=(1<<e)+1,r=e+1,o=c(),s=0;s<t;s+=1)o.add(String.fromCharCode(s));o.add(String.fromCharCode(t)),o.add(String.fromCharCode(n));var u=l(),f=a(u);f.write(t,r);var d=0,p=String.fromCharCode(i[d]);for(d+=1;d<i.length;){var h=String.fromCharCode(i[d]);d+=1,o.contains(p+h)?p+=h:(f.write(o.indexOf(p),r),o.size()<4095&&(o.size()==1<<r&&(r+=1),o.add(p+h)),p=h)}return f.write(o.indexOf(p),r),f.write(n,r),f.flush(),u.toByteArray()},c=function(){var e={},t=0,n={};return n.add=function(r){if(n.contains(r))throw new Error("dup key:"+r);e[r]=t,t+=1},n.size=function(){return t},n.indexOf=function(t){return e[t]},n.contains=function(t){return"undefined"!=typeof e[t]},n};return o},h=function(e,t,n,r){for(var i=p(e,t),o=0;o<t;o+=1)for(var a=0;a<e;a+=1)i.setPixel(a,o,n(a,o));var s=l();i.write(s);for(var c=f(),u=s.toByteArray(),d=0;d<u.length;d+=1)c.writeByte(u[d]);c.flush();var h="";return h+="<img",h+=' src="',h+="data:image/gif;base64,",h+=c,h+='"',h+=' width="',h+=e,h+='"',h+=' height="',h+=t,h+='"',r&&(h+=' alt="',h+=r,h+='"'),h+="/>"};return t}();return function(n){i=[],r=n,o="function"==typeof r?r.apply(t,i):r,!(void 0!==o&&(e.exports=o))}(function(){return n}),!function(e){e.stringToBytes=function(e){function t(e){for(var t=[],n=0;n<e.length;n++){var r=e.charCodeAt(n);r<128?t.push(r):r<2048?t.push(192|r>>6,128|63&r):r<55296||r>=57344?t.push(224|r>>12,128|r>>6&63,128|63&r):(n++,r=65536+((1023&r)<<10|1023&e.charCodeAt(n)),t.push(240|r>>18,128|r>>12&63,128|r>>6&63,128|63&r))}return t}return t(e)}}(n),n}(),l=function(e,t){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:1;n=Math.max(1,n);for(var r=n;r<=40;r+=1)try{var i=function(){var n=u(r,t);n.addData(e),n.make();var i=n.getModuleCount(),o=function(e,t){return e>=0&&e<i&&t>=0&&t<i&&n.isDark(e,t)};return{v:{text:e,level:t,version:r,moduleCount:i,isDark:o}}}();if("object"===("undefined"==typeof i?"undefined":s(i)))return i.v}catch(e){if(!(r<40&&c.test(e.message)))throw e}return null},f=function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"",t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"L",n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:1,r=arguments.length>3&&void 0!==arguments[3]?arguments[3]:0,i=l(e,t,n);if(i){var o=i.isDark;i.moduleCount+=2*r,i.isDark=function(e,t){return o(e-r,t-r)}}return i};n.exports=f},function(e,t,n){"use strict";var r=n(5),i=n(6),o=function(e,t){e.fillStyle=t.back,e.fillRect(0,0,t.size,t.size)},a=function(e,t,n,r,i,o){e.isDark(i,o)&&t.rect(o*r,i*r,r,r)},s=function(e,t,n){if(e){var i=n.rounded>0&&n.rounded<=100?r:a,o=e.moduleCount,s=n.size/o,c=0;n.crisp&&(s=Math.floor(s),c=Math.floor((n.size-s*o)/2)),t.translate(c,c),t.beginPath();for(var u=0;u<o;u+=1)for(var l=0;l<o;l+=1)i(e,t,n,s,u,l);t.fillStyle=n.fill,t.fill(),t.translate(-c,-c)}},c=function(e,t,n){o(t,n),s(e,t,n),i(t,n)};e.exports=c},function(e,t){"use strict";var n=function(e){return{c:e,m:function(){var e;return(e=this.c).moveTo.apply(e,arguments),this},l:function(){var e;return(e=this.c).lineTo.apply(e,arguments),this},a:function(){var e;return(e=this.c).arcTo.apply(e,arguments),this}}},r=function(e,t,n,r,i,o,a,s,c,u){a?e.m(t+o,n):e.m(t,n),s?e.l(r-o,n).a(r,n,r,i,o):e.l(r,n),c?e.l(r,i-o).a(r,i,t,i,o):e.l(r,i),u?e.l(t+o,i).a(t,i,t,n,o):e.l(t,i),a?e.l(t,n+o).a(t,n,r,n,o):e.l(t,n)},i=function(e,t,n,r,i,o,a,s,c,u){a&&e.m(t+o,n).l(t,n).l(t,n+o).a(t,n,t+o,n,o),s&&e.m(r-o,n).l(r,n).l(r,n+o).a(r,n,r-o,n,o),c&&e.m(r-o,i).l(r,i).l(r,i-o).a(r,i,r-o,i,o),u&&e.m(t+o,i).l(t,i).l(t,i-o).a(t,i,t+o,i,o)},o=function(e,t,o,a,s,c){var u=c*a,l=s*a,f=u+a,d=l+a,p=.005*o.rounded*a,h=e.isDark,g=s-1,m=s+1,v=c-1,b=c+1,w=h(s,c),y=h(g,v),x=h(g,c),k=h(g,b),_=h(s,b),C=h(m,b),S=h(m,c),A=h(m,v),T=h(s,v);t=n(t),w?r(t,u,l,f,d,p,!x&&!T,!x&&!_,!S&&!_,!S&&!T):i(t,u,l,f,d,p,x&&T&&y,x&&_&&k,S&&_&&C,S&&T&&A)};e.exports=o},function(e,t){"use strict";var n=function(e,t){var n=t.size,r="bold "+.01*t.mSize*n+"px "+t.fontname;e.strokeStyle=t.back,e.lineWidth=.01*t.mSize*n*.1,e.fillStyle=t.fontcolor,e.font=r;var i=e.measureText(t.label).width,o=.01*t.mSize,a=i/n,s=(1-a)*t.mPosX*.01,c=(1-o)*t.mPosY*.01,u=s*n,l=c*n+.75*t.mSize*.01*n;e.strokeText(t.label,u,l),e.fillText(t.label,u,l)},r=function(e,t){var n=t.size,r=t.image.naturalWidth||1,i=t.image.naturalHeight||1,o=.01*t.mSize,a=o*r/i,s=(1-a)*t.mPosX*.01,c=(1-o)*t.mPosY*.01,u=s*n,l=c*n,f=a*n,d=o*n;e.draw_image(t.image,u,l,f,d)},i=function(e,t){var i=t.mode;"label"===i?n(e,t):"image"===i&&r(e,t)};e.exports=i}])})},function(e,t,n){(function(e){"use strict";var t=n(2),r=t.each,i=t.isStr,o=t.dom,a=n(8),s=n(12),c=n(19),u=n(35),l=n(14),f=n(16),d=e.window,p=Object.assign({enabled:!1,lang:"en",useBrowserLang:!0},l.l10n),h={isoCode:"en",lang:"english",dateFormat:"YYYY-MM-DD HH:mm",details:"details",download:"download",empty:"empty",files:"files",filter:"filter",folders:"folders",grid:"grid",icons:"icons",language:"Language",lastModified:"Last modified",name:"Name",noMatch:"no match",parentDirectory:"Parent Directory",search:"search",size:"Size",tree:"Tree",view:"View"},g='<div class="block">\n            <h1 class="l10n-language">Language</h1>\n            <div class="select">\n                <select id="langs"/>\n            </div>\n        </div>',m="<option/>",v="ext/l10n",b={en:Object.assign({},h)},w=b.en,y=function(e){e&&(w=e);var t="selected";o("#langs option").rmAttr(t).rmProp(t),o("#langs ."+w.isoCode).attr(t,"").prop(t,!0),r(w,function(e,t){o(".l10n-"+t).text(e),o(".l10n_ph-"+t).attr("placeholder",e)}),c.setDefaultDateFormat(w.dateFormat),o("#items .item").each(function(e){o(e).find(".date").text(c.formatDate(e._item.time))})},x=function(e){return b[e]?Promise.resolve(b[e]):a.request({action:"get",l10n:[e]}).then(function(t){return b[e]=Object.assign({},h,t.l10n&&t.l10n[e],{isoCode:e}),b[e]})},k=function(e,t,n){var r=f.get(v);if(e[r])t=r;else if(n){var i=d.navigator.language||d.navigator.browserLanguage;i&&(e[i]?t=i:i.length>2&&e[i.substr(0,2)]&&(t=i.substr(0,2)))}e[t]||(t="en"),x(t).then(y)},_=function(e){var t=o(g),n=t.find("select").on("change",function(t){var n=t.target.value;f.put(v,n),k(e,n,!1)});r(e,function(e,t){o(m).attr("value",t).addCls(t).text(t+" - "+(i(e)?e:e.lang)).appTo(n)}),t.appTo("#sidebar")},C=function(){p.enabled&&_(u),s.sub("view.changed",function(){k(u,p.lang,p.useBrowserLang)})};C()}).call(t,function(){return this}())},function(e,t,n){"use strict";var r=n(7),i=r.langs;e.exports=Object.assign({},i)},function(e,t,n){(function(e){"use strict";var t=n(2),r=t.dom,i=t.awaitLoad,o=n(12),a=n(14),s=e.window,c=Object.assign({enabled:!1,baseURL:"not-set",idSite:0},a["piwik-analytics"]),u=function(){if(c.enabled){var e=("https:"===s.location.protocol?"https://":"http://")+c.baseURL+"/",t=[],n=null;r("<script></script>").attr("src",e+"piwik.js").appTo("body"),i().then(function(){if(n=s.Piwik&&s.Piwik.getTracker(e+"piwik.php",c.idSite))for(n.enableLinkTracking();t.length;)n.trackPageView(t.shift())}),o.sub("location.changed",function(e){var r=e.getCrumb().map(function(e){return e.label}).join(" > ");n?n.trackPageView(r):t.push(r)})}};u()}).call(t,function(){return this}())},function(e,t,n){"use strict";n(38),n(39),n(40),n(41),n(43)},function(e,t,n){(function(t){"use strict";var r=n(2),i=r.each,o=r.isFn,a=r.dom,s=r.includes,c=r.compact,u=n(12),l=n(13),f=n(14),d=n(16),p=t.window,h=Object.assign({enabled:!0},f.preview),g='<div id="pv-overlay">\n            <div id="pv-container"></div>\n            <div id="pv-spinner"><img class="back"/><img class="spinner" src="'+l.image("spinner")+'"/></div>\n            <div id="pv-prev-area" class="hof"><img src="'+l.image("preview-prev")+'"/></div>\n            <div id="pv-next-area" class="hof"><img src="'+l.image("preview-next")+'"/></div>\n            <div id="pv-bottombar" class="clearfix hof">\n                <ul id="pv-buttons">\n                    <li id="pv-bar-close" class="bar-right bar-button"><img src="'+l.image("preview-close")+'"/></li>\n                    <li id="pv-bar-raw" class="bar-right"><a class="bar-button" target="_blank"><img src="'+l.image("preview-raw")+'"/></a></li>\n                    <li id="pv-bar-fullscreen" class="bar-right bar-button"><img src="'+l.image("preview-fullscreen")+'"/></li>\n                    <li id="pv-bar-next" class="bar-right bar-button"><img src="'+l.image("preview-next")+'"/></li>\n                    <li id="pv-bar-idx" class="bar-right bar-label"></li>\n                    <li id="pv-bar-prev" class="bar-right bar-button"><img src="'+l.image("preview-prev")+'"/></li>\n                </ul>\n            </div>\n        </div>',m="ext/preview",v=d.get(m)||!1,b=null,w=!1,y=null,x=null,k=function(){var e=a("#pv-container"),t=e[0],n=e.children()[0];if(t&&n){var r=t.offsetWidth,i=t.offsetHeight,o=n.offsetWidth,s=n.offsetHeight;a(n).css({left:.5*(r-o)+"px",top:.5*(i-s)+"px"})}},_=function(){var e=p.document.documentElement,t=e.clientWidth,n=e.clientHeight,r=v?0:20,i=v?0:48;a("#pv-container").css({width:t-2*r+"px",height:n-2*r-i+"px",left:r+"px",top:r+"px"}),a("#pv-spinner").css({left:.5*t+"px",top:.5*n+"px"}),v?(a("#pv-overlay").addCls("fullscreen"),a("#pv-bar-fullscreen").find("img").attr("src",l.image("preview-no-fullscreen"))):(a("#pv-overlay").rmCls("fullscreen"),a("#pv-bar-fullscreen").find("img").attr("src",l.image("preview-fullscreen"))),k(),o(x&&x.adjust)&&x.adjust()},C=function(e,t){a("#pv-bar-idx").text(e+"/"+t).show()},S=function(e){a("#pv-bar-raw").show().find("a").attr("href",e)},A=function(e){a("#pv-buttons .bar-left").rm(),i(e,function(e){a("<li></li>").addCls("bar-left").addCls("bar-label").text(e).appTo("#pv-buttons")})},T=function(){var e=a("#pv-overlay .hof");p.clearTimeout(b),e.show(),v&&(b=p.setTimeout(function(){return e.hide()},2e3))},E=function(){return x&&x.moveIdx(1)},M=function(){return x&&x.moveIdx(-1)},D=function(){v=!v,d.put(m,v),T(),_()},P=function(e){e.stopPropagation(),e.preventDefault()},z=function(e){var t=e.keyCode;27===t?(P(e),$()):8===t||37===t?(P(e),M()):13===t||32===t||39===t?(P(e),E()):70===t&&(P(e),D())},L=function(){A([]),a("#pv-container").clr(),a("#pv-overlay").show(),a(p).on("keydown",z),_()},$=function(){A([]),a("#pv-container").clr(),a("#pv-overlay").hide(),a(p).off("keydown",z)},H=function e(t,n,r){p.clearTimeout(y);var i=a("#pv-spinner");if(!t)return w=!1,void i.hide();if(!w&&r)return void(y=p.setTimeout(function(){return e(!0,n)},r));var o=i.find(".back");n?o.attr("src",n).show():o.hide(),w=!0,i.show()},O=function e(t,n,r,i){var o=Object.assign(Object.create(e.prototype),{items:t,load:r,adjust:i});return o.setIdx(n),o};O.prototype={setIdx:function(e){var t=this;this.idx=(e+this.items.length)%this.items.length,this.item=this.items[this.idx],C(this.idx+1,this.items.length),S(this.item.absHref),A([this.item.label]);var n=this.item;Promise.resolve().then(function(){i(a("#pv-container *"),function(e){"function"==typeof e.unload&&e.unload()}),a("#pv-container").hide().clr(),H(!0,n.thumbSquare||n.icon,200)}).then(function(){return t.load(n)}).then(function(e){n===t.item&&(a("#pv-container").clr().app(e).show(),H(!1),_())})},moveIdx:function(e){this.setIdx(this.idx+e)}};var B=function(e,t,n){var r=function(r){r.$view&&s(e,r.type)&&r.$view.find("a").on("click",function(i){i.preventDefault();var o=c(a("#items .item").map(function(t){var n=t._item;return s(e,n.type)?n:null}));x=O(o,o.indexOf(r),t,n),L()})};u.sub("view.changed",function(e){return i(e,r)})},R=function(){h.enabled&&(a(g).hide().appTo("body").on("keydown",z).on("mousemove",T).on("mousedown",T).on("click",function(e){"pv-overlay"!==e.target.id&&"pv-container"!==e.target.id||$()}).on("mousedown",P).on("mousemove",P).on("keydown",P).on("keypress",P),a("#pv-spinner").hide(),a("#pv-bar-prev, #pv-prev-area").on("click",M),a("#pv-bar-next, #pv-next-area").on("click",E),a("#pv-bar-close").on("click",$),a("#pv-bar-fullscreen").on("click",D),a(p).on("resize",_).on("load",_))};e.exports={setLabels:A,register:B,get item(){return x&&x.item}},R()}).call(t,function(){return this}())},function(e,t,n){"use strict";var r=n(2),i=r.dom,o=n(19),a=n(14),s=n(38),c=Object.assign({enabled:!1,autoplay:!0,types:[]},a["preview-aud"]),u='<audio id="pv-content-aud"/>',l=function(){var e=i("#pv-content-aud")[0];e&&s.setLabels([s.item.label,o.formatDate(1e3*e.duration,"m:ss")])},f=function(e){e.unload=function(){e.src="",e.load()}},d=function(e){return new Promise(function(t){var n=i(u).on("loadedmetadata",function(){return t(n)}).attr("controls","controls");c.autoplay&&n.attr("autoplay","autoplay"),f(n[0]),n.attr("src",e.absHref)})},p=function(){c.enabled&&s.register(c.types,d,l)};p()},function(e,t,n){"use strict";var r=n(2),i=r.dom,o=n(8),a=n(14),s=n(38),c=Object.assign({enabled:!1,size:null,types:[]},a["preview-img"]),u='<img id="pv-content-img"/>',l=function(){var e=i("#pv-content-img")[0];if(e){var t=e.offsetWidth,n=[s.item.label];if(!c.size){var r=e.naturalWidth,o=e.naturalHeight;n.push(String(r)+"x"+String(o)),n.push(String((100*t/r).toFixed(0))+"%")}s.setLabels(n)}},f=function(e){return o.request({action:"get",thumbs:[{type:"img",href:e,width:c.size,height:0}]}).then(function(e){return e&&e.thumbs&&e.thumbs[0]?e.thumbs[0]:null})},d=function(e){return Promise.resolve(e.absHref).then(function(e){return c.size?f(e):e}).then(function(e){return new Promise(function(t){var n=i(u).on("load",function(){return t(n)}).attr("src",e)})})},p=function(){c.enabled&&s.register(c.types,d,l)};p()},function(e,t,n){(function(e){"use strict";var t=n(42),r=n(28),i=n(2),o=i.keys,a=i.dom,s=n(14),c=n(38),u=e.window,l=u.XMLHttpRequest,f=Object.assign({enabled:!1,styles:{}},s["preview-txt"]),d='<pre id="pv-content-txt"></pre>',p='<div id="pv-content-txt"></div>',h=function(){var e=a("#pv-content-txt")[0];if(e){var t=a("#pv-container")[0];e.style.height=t.offsetHeight+"px",c.setLabels([c.item.label,c.item.size+" bytes"])}},g=function(e){return new Promise(function(t,n){var r=new l,i=function(){if(r.readyState===l.DONE)try{t(r.responseText||"")}catch(e){n(String(e))}};r.open("GET",e,!0),r.onreadystatechange=i,r.send()})},m=function(e){return g(e.absHref).catch(function(e){return"[request failed] "+e}).then(function(n){var i=f.styles[e.type];if(1===i)return a(d).text(n);if(2===i)return a(p).html(r(n));if(3===i){var o=a("<code></code>").text(n);return u.setTimeout(function(){t.el(o[0])},n.length<2e4?0:500),a(d).app(o)}return a(p).text(n)})},v=function(){f.enabled&&c.register(o(f.styles),m,h)};v()}).call(t,function(){return this}())},function(e,t,n){!function(t,n){e.exports=n()}(this,function(){var e=".lolight",t="ll-",n="_nam#2196f3}_num#ec407a}_str#43a047}_rex#ef6c00}_pct#666}_key#555;font-weight:bold}_com#aaa;font-style:italic}".replace(/_/g,"."+t).replace(/#/g,"{color:#"),r=/^(a(bstract|lias|nd|rguments|rray|s(m|sert)?|uto)|b(ase|egin|ool(ean)?|reak|yte)|c(ase|atch|har|hecked|lass|lone|ompl|onst|ontinue)|de(bugger|cimal|clare|f(ault|er)?|init|l(egate|ete)?)|do|double|e(cho|ls?if|lse(if)?|nd|nsure|num|vent|x(cept|ec|p(licit|ort)|te(nds|nsion|rn)))|f(allthrough|alse|inal(ly)?|ixed|loat|or(each)?|riend|rom|unc(tion)?)|global|goto|guard|i(f|mp(lements|licit|ort)|n(it|clude(_once)?|line|out|stanceof|t(erface|ernal)?)?|s)|l(ambda|et|ock|ong)|m(odule|utable)|NaN|n(amespace|ative|ext|ew|il|ot|ull)|o(bject|perator|r|ut|verride)|p(ackage|arams|rivate|rotected|rotocol|ublic)|r(aise|e(adonly|do|f|gister|peat|quire(_once)?|scue|strict|try|turn))|s(byte|ealed|elf|hort|igned|izeof|tatic|tring|truct|ubscript|uper|ynchronized|witch)|t(emplate|hen|his|hrows?|ransient|rue|ry|ype(alias|def|id|name|of))|u(n(checked|def(ined)?|ion|less|signed|til)|se|sing)|v(ar|irtual|oid|olatile)|w(char_t|hen|here|hile|ith)|xor|yield)$/,i="com",o="key",a="nam",s="num",c="pct",u="rex",l="spc",f="str",d="unk",p=[[s,/#([0-9a-f]{6}|[0-9a-f]{3})\b/],[i,/(\/\/|#).*?(?=\n|$)/],[i,/\/\*[\s\S]*?\*\//],[i,/<!--[\s\S]*?-->/],[u,/\/(\\\/|[^\n])*?\//],[f,/(['"`])(\\\1|[\s\S])*?\1/],[s,/[+-]?([0-9]*\.?[0-9]+|[0-9]+\.?[0-9]*)([eE][+-]?[0-9]+)?/],[c,/[\\.,:;+\-*\/=<>()[\]{}|?!&(a)~]/],[l,/\s+/],[a,/[\w$]+/],[d,/./]],h=function(e){if("string"!=typeof e)throw new Error("tok: no string");for(var t=[],n=p.length,i=!1;e;)for(var c=0;c<n;c+=1){var f=p[c][1].exec(e);if(f&&0===f.index){var d=p[c][0];if(d!==u||!i){var h=f[0];d===a&&r.test(h)&&(d=o),d===l?h.indexOf("\n")>=0&&(i=!1):i=d===s||d===a,e=e.slice(h.length),t.push([d,h]);break}}}return t},g=function(e,t){if("undefined"!=typeof document)t(document);else if(e)throw new Error("no doc")},m=function(e){g(!0,function(n){var r=h(e.textContent);e.innerHTML="",r.forEach(function(r){var i=n.createElement("span");i.className=t+r[0],i.textContent=r[1],e.appendChild(i)})})},v=function(t){g(!0,function(n){[].forEach.call(n.querySelectorAll(t||e),function(e){m(e)})})};return g(!1,function(e){var t=e.querySelector("head"),r=e.createElement("style");r.textContent=n,t.insertBefore(r,t.firstChild),/^(i|c|loade)/.test(e.readyState)?v():e.addEventListener("DOMContentLoaded",function(){v()})}),v.tok=h,v.el=m,v})},function(e,t,n){"use strict";var r=n(2),i=r.dom,o=n(14),a=n(38),s=Object.assign({enabled:!1,autoplay:!0,types:[]},o["preview-vid"]),c='<video id="pv-content-vid"/>',u=function(){var e=i("#pv-content-vid")[0];if(e){var t=e.offsetWidth,n=e.videoWidth,r=e.videoHeight;a.setLabels([a.item.label,String(n)+"x"+String(r),String((100*t/n).toFixed(0))+"%"])}},l=function(e){e.unload=function(){e.src="",e.load()}},f=function(e){return new Promise(function(t){var n=i(c).on("loadedmetadata",function(){return t(n)}).attr("controls","controls");s.autoplay&&n.attr("autoplay","autoplay"),l(n[0]),n.attr("src",e.absHref)})},d=function(){s.enabled&&a.register(s.types,f,u)};d()},function(e,t,n){"use strict";var r=n(2),i=r.map,o=r.debounce,a=r.parsePattern,s=r.dom,c=n(8),u=n(12),l=n(20),f=n(13),d=n(14),p=n(22),h=n(18),g=Object.assign({enabled:!1,advanced:!1,debounceTime:300,ignorecase:!0},d.search),m='<div id="search" class="tool">\n            <img src="'+f.image("search")+'" alt="search"/>\n            <input class="l10n_ph-search" type="text" value=""/>\n        </div>',v=!1,b="",w=void 0,y=void 0,x=function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"";if(e!==b){if(b=e,!e)return void h.setLocation();w.addCls("pending"),c.request({action:"get",search:{href:l.getAbsHref(),pattern:e,ignorecase:g.ignorecase}}).then(function(e){w.rmCls("pending"),h.setHint("noMatch"),h.setItems(i(e.search,function(e){return p.get(e)}))})}},k=function(){v?(w.addCls("active"),y[0].focus(),x(a(y.val(),g.advanced))):(x(),w.rmCls("active"))},_=function(){v=!v,k()},C=function(){v=!1,y.val(""),k()},S=function(){g.enabled&&(w=s(m).appTo("#toolbar"),y=w.find("input"),w.find("img").on("click",_),y.on("keyup",o(k,g.debounceTime)),u.sub("location.changed",C))};S()},function(e,t,n){(function(e){"use strict";var t=n(2),r=t.each,i=t.dom,o=n(12),a=n(13),s=n(14),c=e.window.document,u=Object.assign({enabled:!1,clickndrag:!1,checkboxes:!1},s.select),l='<span class="selector">\n            <img src="'+a.image("selected")+'" alt="selected"/>\n        </span>',f=i(c),d=i("html"),p=i('<div id="selection-rect"></div>'),h=Math.max,g=Math.min,m=Math.abs,v=0,b=0,w=function(){var e=i("#items .item.selected").map(function(e){return e._item});o.pub("selection",e)},y=function(e){var t=i(e);if(!t.length||t.isHidden())return null;var n=t[0].getBoundingClientRect();return{l:n.left,t:n.top,r:n.right,b:n.bottom}},x=function(e,t){return!!e&&!!t&&e.l===t.l&&e.t===t.t&&e.r===t.r&&e.b===t.b},k=function(e){var t=e[0];x(y(t),t&&t._rect)||e.each(function(e){e._rect=y(e)})},_=function(e,t){if(!e||!t)return!1;var n=h(e.l,t.l),r=g(e.r,t.r),i=h(e.t,t.t),o=g(e.b,t.b);return n<=r&&i<=o},C=function(e){var t=i("#content")[0],n=y(t),r=e.pageX-n.l+t.scrollLeft,o=e.pageY-n.t+t.scrollTop;return{x:r,y:o}},S=function(e){var t=C(e),n=t.x,r=t.y,o=g(v,n),a=g(b,r),s=m(v-n),c=m(b-r),u=e.ctrlKey||e.metaKey;if(!(!u&&s<4&&c<4)){u||i("#items .item").rmCls("selected"),d.addCls("drag-select"),p.show().css({left:o+"px",top:a+"px",width:s+"px",height:c+"px"});var l=y(p),f=i("#items .item:not(.folder-parent)");k(f),f.rmCls("selecting").each(function(e){_(l,e._rect)&&i(e).addCls("selecting")})}},A=function e(t){f.off("mousemove",S).off("mouseup",e),S(t),i("#items .item.selecting.selected").rmCls("selecting").rmCls("selected"),i("#items .item.selecting").rmCls("selecting").addCls("selected"),w(),d.rmCls("drag-select"),p.hide(),t.stopPropagation(),t.preventDefault()},T=function(e){if(!(0!==e.button||e.offsetX>=i("#content")[0].offsetWidth-16)){var t=C(e),n=t.x,r=t.y;v=n,b=r,f.on("mousemove",S).on("mouseup",A),S(e),e.preventDefault()}},E=function(e){for(;!e._item&&e.parentNode;)e=e.parentNode;return e._item},M=function(e){E(e.target).$view.tglCls("selected"),w(),e.stopPropagation(),e.preventDefault()},D=function(e){e.$view&&!e.isCurrentParentFolder()&&i(l).on("click",M).appTo(e.$view.find("a"))},P=function(e,t){u.checkboxes&&r(e,D),r(t,function(e){e.$view&&e.$view.rmCls("selected")}),w()},z=function(){u.enabled&&(u.clickndrag||u.checkboxes)&&(o.sub("view.changed",P),u.clickndrag&&(p.hide().appTo("#content"),i("#content").on("mousedown",T).on("drag",function(e){return e.preventDefault()}).on("dragstart",function(e){return e.preventDefault()})))};z()}).call(t,function(){return this}())},function(e,t,n){"use strict";var r=n(2),i=r.each,o=r.toArray,a=r.dom,s=r.cmp,c=r.naturalCmp,u=n(12),l=n(13),f=n(14),d=n(16),p=Object.assign({enabled:!1,column:0,reverse:!1,ignorecase:!0,natural:!1,folders:0},f.sort),h="ext/sort",g='<img src="'+l.image("sort")+'" class="sort" alt="sort order"/>',m=function(e){
+return e.isFolder()?p.folders:1},v={0:"label",1:"time",2:"size"},b={0:"label",1:"date",2:"size"},w=function(e,t,n,r){return function(i,o){var a=i._item,u=o._item,l=m(a)-m(u);if(0!==l)return l;var f=a[e],d=u[e];return(isNaN(f)||isNaN(d))&&(f=String(f),d=String(d),n&&(f=f.toLowerCase(),d=d.toLowerCase())),l=r?c(f,d):s(f,d),t?-l:l}},y=function(e,t){var n=a("#items li.header a"),r=a("#items li.header a."+b[e]),i=w(v[e],t,p.ignorecase,p.natural);d.put(h,{column:e,reverse:t}),n.rmCls("ascending").rmCls("descending"),r.addCls(t?"descending":"ascending"),a(o(a("#items .item:not(.folder-parent)")).sort(i)).appTo("#items")},x=function(){var e=d.get(h),t=e&&e.column||p.column,n=e&&e.reverse||p.reverse;y(t,n)},k=function(){var e=a("#items li.header");i(b,function(t,n){var r="0"===n?"app":"pre";e.find("a."+t)[r](g).on("click",function(e){y(n,a(e.currentTarget).hasCls("ascending")),e.preventDefault()})})},_=function(){p.enabled&&(k(),u.sub("view.changed",x))};_()},function(e,t,n){"use strict";var r=n(2),i=r.each,o=r.map,a=r.includes,s=n(8),c=n(12),u=n(14),l=Object.assign({enabled:!1,img:["img-bmp","img-gif","img-ico","img-jpg","img-png"],mov:["vid-avi","vid-flv","vid-mkv","vid-mov","vid-mp4","vid-mpg","vid-webm"],doc:["x-pdf","x-ps"],delay:1,size:100,exif:!1,chunksize:20},u.thumbnails),f=4/3,d=function(e,t){var n=null;if(a(l.img,t.type))n="img";else if(a(l.mov,t.type))n="mov";else{if(!a(l.doc,t.type))return;n="doc"}t.thumbSquare?t.$view.find(".icon.square img").addCls("thumb").attr("src",t.thumbSquare):e.push({type:n,href:t.absHref,ratio:1,callback:function(e){e&&t.$view&&(t.thumbSquare=e,t.$view.find(".icon.square img").addCls("thumb").attr("src",e))}}),t.thumbRational?t.$view.find(".icon.landscape img").addCls("thumb").attr("src",t.thumbRational):e.push({type:n,href:t.absHref,ratio:f,callback:function(e){e&&t.$view&&(t.thumbRational=e,t.$view.find(".icon.landscape img").addCls("thumb").attr("src",e))}})},p=function(e){var t=o(e,function(e){return{type:e.type,href:e.href,width:Math.round(l.size*e.ratio),height:l.size}});return s.request({action:"get",thumbs:t}).then(function(t){i(e,function(e,n){e.callback(t&&t.thumbs?t.thumbs[n]:null)})})},h=function(e){for(var t=e.length,n=l.chunksize,r=Promise.resolve(),i=function(t){r=r.then(function(){return p(e.slice(t,t+n))})},o=0;o<t;o+=n)i(o)},g=function(e){var t=[];i(e,function(e){return d(t,e)}),h(t)},m=function(e){setTimeout(function(){return g(e)},l.delay)},v=function(){l.enabled&&c.sub("view.changed",m)};v()},function(e,t,n){(function(e){"use strict";var t=n(12),r=n(14),i=e.window.document,o=Object.assign({enabled:!1},r.title),a=function(e){var t=e.getCrumb().map(function(e){return e.label}),n=t.join(" > ");t.length>1&&(n=t[t.length-1]+" - "+n),i.title=n},s=function(){o.enabled&&t.sub("location.changed",a)};s()}).call(t,function(){return this}())},function(e,t,n){"use strict";var r=n(2),i=r.each,o=r.dom,a=r.cmp,s=r.naturalCmp,c=n(12),u=n(20),l=n(13),f=n(14),d=n(16),p=Object.assign({enabled:!1,show:!0,maxSubfolders:50,naturalSort:!1,ignorecase:!0},f.tree),h='<div class="item folder">\n            <span class="indicator">\n                <img src="'+l.image("tree-indicator")+'"/>\n            </span>\n            <a>\n                <span class="icon"><img src="'+l.icon("folder")+'"/></span>\n                <span class="label"></span>\n            </a>\n        </span>',g='<div class="block">\n            <h1 class="l10n-tree">Tree</h1>\n            <div id="view-tree" class="button view">\n                <img src="'+l.image("tree-toggle")+'" alt="view-tree"/>\n            </div>\n        </div>',m="ext/tree",v=function(e){for(;!e._item&&e.parentNode;)e=e.parentNode;return e._item},b=function(e){var t=v(e.target);"unknown"===t._treeState?t.fetchContent().then(function(){t._treeState="open",y(t)}):"open"===t._treeState?(t._treeState="closed",t._$tree.rmCls("open").addCls("closed")):"closed"===t._treeState&&(t._treeState="open",t._$tree.rmCls("closed").addCls("open"))},w=function(e,t){var n=e.label,r=t.label;return p.ignorecase&&(n=n.toLowerCase(),r=r.toLowerCase()),p.naturalSort?s(n,r):a(n,r)},y=function e(t){var n=t.getSubfolders(),r=n.length,a=p.maxSubfolders,s=o(h);if(s.find(".indicator").on("click",b),s.find(".label").text(t.label),u.setLink(s.find("a"),t),t.isCurrentFolder()&&s.addCls("active"),t.isManaged||s.find(".icon img").attr("src",l.icon("folder-page")),t._treeState=t._treeState||"none",t.isManaged&&!t.isContentFetched?t._treeState="unknown":r||(t._treeState="none"),s.addCls(t._treeState),r){var c=o('<div class="content"></div>').appTo(s);n.sort(w),i(n.slice(0,a),function(t){return c.app(e(t))}),r>a&&c.app('<div class="summary">… '+(r-a)+" more subfolders</div>")}return t._$tree&&t._$tree.rpl(s),t._$tree=s,s[0]._item=t,s},x=function e(t){return t._treeState="open",t.fetchContent().then(function(){return t.parent?e(t.parent):t})},k=function(){d.get(m)?(o("#view-tree").addCls("active"),o("#tree").show()):(o("#view-tree").rmCls("active"),o("#tree").hide())},_=function(e){x(e).then(function(e){o("#tree").clr().app(y(e)),k()})},C=function(){p.enabled&&(o('<div id="tree"></div>').hide().appTo("#mainrow"),o(g).appTo("#sidebar").find("#view-tree").on("click",function(e){d.put(m,!d.get(m)),k(),c.pub("resize"),e.preventDefault()}),"boolean"!=typeof d.get(m)&&d.put(m,p.show),k(),c.sub("location.changed",_))};C()},function(e,t,n){(function(e){"use strict";var t=n(2),r=t.dom,i=n(7),o=n(8),a=n(13),s='<ul id="tests"></ul>',c='<li class="test">\n            <span class="label"></span>\n            <span class="result"></span>\n            <div class="info"></div>\n        </li>',u='<div id="login-wrapper">\n            <input id="pass" type="password" placeholder="password"/>\n            <span id="login">login</span>\n            <span id="logout">logout</span>\n            <div id="hint">\n                The preset password is the empty string, just click login.\n                Change it in \'_h5ai/private/conf/options.json\'.\n            </div>\n        </div>',l='<div id="support">\n            Show your support with a donation!\n            <div class="paypal">\n                <form action="https://www.paypal.com/cgi-bin/webscr" method="post" target="_blank">\n                    <input type="hidden" name="cmd" value="_s-xclick"/>\n                    <input type="hidden" name="hosted_button_id" value="8WSPKWT7YBTSQ"/>\n                    <input type="image" src="'+a.image("paypal")+'" name="submit" alt="PayPal"/>\n                </form>\n            </div>\n        </div>',f=i.setup,d=function(e,t,n,i){var o=r(c).appTo("#tests");o.find(".label").text(e),o.find(".result").addCls(n?"passed":"failed").text(i?i:n?"yes":"no"),o.find(".info").html(t)},p=function(){f.AS_ADMIN&&(r(s).appTo("#content"),d("h5ai version","Only green if this is an official h5ai release",/^\d+\.\d+\.\d+$/.test(f.VERSION),f.VERSION),d("Index file found","Add <code>"+f.INDEX_HREF+"</code> to your index file list",f.INDEX_HREF),d("Options parsable","File <code>options.json</code> is readable and syntax is correct",null!==i.options),d("Types parsable","File <code>types.json</code> is readable and syntax is correct",null!==i.types),d("Server software","Server is one of apache, lighttpd, nginx or cherokee",f.HAS_SERVER,f.SERVER_NAME+" "+f.SERVER_VERSION),d("PHP version","PHP version >= "+f.MIN_PHP_VERSION,!0,f.PHP_VERSION),d("PHP arch","64-bit required to correctly display file/folder sizes > ~2GB","64-bit"===f.PHP_ARCH,f.PHP_ARCH),d("Public Cache directory","Web server has write access",f.HAS_WRITABLE_CACHE_PUB),d("Private Cache directory","Web server has write access",f.HAS_WRITABLE_CACHE_PRV),d("Image thumbs","PHP GD extension with JPEG support available",f.HAS_PHP_JPEG),d("Use EXIF thumbs","PHP EXIF extension available",f.HAS_PHP_EXIF),d("Movie thumbs","Command line program <code>avconv</code> or <code>ffmpeg</code> available",f.HAS_CMD_AVCONV||f.HAS_CMD_FFMPEG),d("PDF thumbs","Command line program <code>convert</code> or <code>gm</code> available",f.HAS_CMD_CONVERT||f.HAS_CMD_GM),d("Shell tar","Command line program <code>tar</code> available",f.HAS_CMD_TAR),d("Shell zip","Command line program <code>zip</code> available",f.HAS_CMD_ZIP),d("Shell du","Command line program <code>du</code> available",f.HAS_CMD_DU))},h=function(){e.window.location.reload()},g=function(){o.request({action:"login",pass:r("#pass").val()}).then(h)},m=function(){o.request({action:"logout"}).then(h)},v=function(e){13===e.which&&g()},b=function(){r(l).appTo("#content")},w=function(){r(u).appTo("#content"),f.AS_ADMIN?(r("#pass").rm(),r("#login").rm(),r("#logout").on("click",m)):(r("#pass").on("keydown",v)[0].focus(),r("#login").on("click",g),r("#logout").rm()),i.options.hasCustomPasshash&&r("#hint").rm()},y=function(){b(),w(),p()};y()}).call(t,function(){return this}())}]);
\ No newline at end of file
-- 
2.23.0
                    
                  
                  
                          
                            
                            1
                            
                          
                          
                            
                            0
                            
                          
                          
                            
    
                          
                        
                    
                    
                        Signed-off-by: Ren Wen <15991987063(a)163.com>
---
 src/scheduler/submit_job.cr | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/src/scheduler/submit_job.cr b/src/scheduler/submit_job.cr
index 4303b1d..c322d0f 100644
--- a/src/scheduler/submit_job.cr
+++ b/src/scheduler/submit_job.cr
@@ -37,6 +37,7 @@ class Sched
   def submit_cluster_job(job, cluster_config)
     job_messages = Array(Hash(String, String)).new
     lab = job.lab
+    subqueue = job.subqueue
 
     # collect all job ids
     job_ids = [] of String
@@ -52,7 +53,7 @@ class Sched
     # steps for each host
     cluster_config["nodes"].as_h.each do |host, config|
       queue = host.to_s
-      job_id = add_task(queue, lab)
+      job_id = add_task("#{queue}/#{subqueue}", lab)
 
       # return when job_id is '0'
       # 2 Questions:
-- 
2.23.0
                    
                  
                  
                          
                            
                            2
                            
                          
                          
                            
                            2
                            
                          
                          
                            
    
                          
                        
                    15 Dec '20
                    
                        Signed-off-by: Wang Chenglong <18509160991(a)163.com>
---
 doc/tutorial.md | 84 ++++++++++++++++++++++++++++++++-----------------
 1 file changed, 55 insertions(+), 29 deletions(-)
diff --git a/doc/tutorial.md b/doc/tutorial.md
index e6f8491..88544f4 100644
--- a/doc/tutorial.md
+++ b/doc/tutorial.md
@@ -152,29 +152,34 @@ job yaml ���������������������������������������������[YAML](http://yaml.org/YAM
 
    1. ������������ os ��������� rootfs������ openEuler ���������
         - ������ docker ������ rootfs
-
+		
             1) ������ openEuler ��������������� docker ���������������
-
+		
                 ```bash
                 wget https://repo.openeuler.org/openEuler-20.03-LTS/docker_img/aarch64/openEuler…
-                ```
-            2) ������ docker ������
+                ```	
+            2) ������ docker ������		   
                 ```bash
                 docker load -i openEuler-docker.aarch64
                 ```
 
-            3) ������ openEuler ������
+            3) ������ openEuler ������			   
                 ```bash
-                docker run -id openeuler-20.03-lts
+                docker run -d --name initramfs-docker openeuler-20.03-lts
                 ```
-            4) ������ docker ��� rootfs
+            4) ������ docker ��� rootfs			   
                 ```bash
-                docker cp -a  docker run -d openeuler-20.03-lts:/ openEuler-rootfs
+                docker cp -a  initramfs-docker:/ openEuler-rootfs/
                 ```
-        - ������ qemu.img(qcow2������)������  rootfs (openEuler������)
 
+		{compass-ci} ������������������������ '.tar.xz' ��������� docker ������������������ rootfs ������������
+		```bash
+		./{compass-ci}/container/docker-rootfs/run openEuler-docker.aarch64.tar.xz /tmp/openeuler-rootfs-20.03
+		```
 
-            1) ������ openEule r��������������������� qcow2 ������������
+        - ������ qemu.img(qcow2������)������  rootfs (openEuler������)
+		
+            1) ������ openEuler ��������������������� qcow2 ������������		
                 ```bash
                 wget https://repo.openeuler.org/openEuler-20.03-LTS/virtual_machine_img/aarch64/…
                 ```
@@ -183,45 +188,66 @@ job yaml ���������������������������������������������[YAML](http://yaml.org/YAM
                 cd {compass-ci}/container/qcow2rootfs
                 ./run  openEuler-20.03-LTS.aarch64.qcow2.xz   /tmp/openEuler-rootfs
                 ```
+
    2. ������rootfs
-        1. ������chroot��������������� rootfs (��������������� root ������)
+        1. ������ chroot ��������������� rootfs (��������������� root ������)         	
             ```bash
             chroot openEuler-rootfs
             ```
         2. ���������������������������������������
 
             a. ������ root ������
-            b. ������ ssh ������
-            c. ������������������
-            d. ������������ docker ������ osimage ������������������������
-			>	1. ������������������������
-			>	2. ��� centos ������������������������rpm���
-			>	3. ������ yum ������������
-			>	4. ������ docker ������������������
-
-   3. ������ rootfs������������
-        ```bash
-        cd $rootfs
-        find . | coip -o -Hnewc |gzip -9 > $os_name.cgz
-        ```
+            b. ��������������� /sbin/init
+                        >       ���������������systemd������������
+                                ```bash
+                                ls -l /sbin/init
+                                /sbin/init -> ../lib/systemd/systemd
+                                ```
+            c. ������������ docker ������ osimage ���������������������
+                        >       ������ docker ������������������ /.dockerenv
+            d. ������������������
+                        >       openssh-server  (ssh ������������������)
+                        >       ntpdate         (������������)
+                        >       cifs-utils      (cifs���������������������)
+                        >       nfs-utils       (nfs���������������������)
+                        >       curl            (���������url������)
+                                ```bash
+                                yum -y install openssh-server ntpdate cifs-utils nfs-utils curl
+                                ```
+            e. ������������ docker ������ osimage ������������������������
+			>	������ docker ������������������ /.dockerenv
+
+   3. ������rootfs
+   	```bash
+	cd $rootfs
+	find . | coip -o -Hnewc |gzip -9 > $os_name.cgz
+	```
+
+   4. ������������������/������������
+   	������������������ {compass-ci} ��������������������������� ��������� rootfs ������������������������������������������������������/���������������������������
+	```bash
+	find /lib/modules/* | cpio -o -Hnewc | gzip -9 > /modules-$os_name.cgz
+	find /usr/src/kernels/* | cpio -o -Hnewc | gzip -9 > /headers-$os_name.cgz
+	```
+   
 #### FAQ
-1. ������������ ���Unable to mount root fs on unknown-block���
+1. ������������ ���Unable to mount root fs on unknown-block��� 
     - ������������
         ```bash
         [    0.390437] List of all partitions:
-        [    0.390806] No filesystem could mount root, tried:
+        [    0.390806] No filesystem could mount root, tried: 
         [    0.391489] Kernel panic - not syncing: VFS: Unable to mount root fs on unknown-block(0,0)
 		...
         [    0.399404] Memory Limit: none
         [    0.399749] ---[ end Kernel panic - not syncing: VFS: Unable to mount root fs on unknown-block(0,0) ]---
         ```
 	- ������������
-
+		
 		1������������������������������������������������
 		2������������������������������������ 644 ���������
-
+	
 2. ������������������
-
+	
 	- ������������
 
         ������������������������������������������������
-- 
2.23.0
                    
                  
                  
                          
                            
                            2
                            
                          
                          
                            
                            4
                            
                          
                          
                            
    
                          
                        
                    
                    
                        [error]
Traceback (most recent call last):
5: from /home/lukaiyi/compass-ci/sbin/compare:72:in `<main>'
4: from /home/lukaiyi/compass-ci/lib/compare.rb:66:in `compare_group'
3: from /home/lukaiyi/compass-ci/lib/compare_matrixes.rb:389:in `compare_group_matrices'
2: from /home/lukaiyi/compass-ci/lib/compare_matrixes.rb:389:in `each'
1: from /home/lukaiyi/compass-ci/lib/compare_matrixes.rb:390:in `block in compare_group_matrices'
/home/lukaiyi/compass-ci/lib/compare_matrixes.rb:390:in `+': no implicit conversion of nil into String (TypeError)
[why]
get_matrix_str maybe return nil, if so, the line 390 will raise error like above.
386 def compare_group_matrices(group_matrices, suites_list, options)
387  result_str = ''
388  group_matrices_array = sort_by_matrix_size(group_matrices)
389  group_matrices_array.each do |matrice_kv|
390    result_str += get_matrix_str(matrice_kv[0], matrice_kv[1], suites_list, options)
391  end
392  result_str
393 end
---
 lib/compare_matrixes.rb | 1 +
 1 file changed, 1 insertion(+)
diff --git a/lib/compare_matrixes.rb b/lib/compare_matrixes.rb
index 0e08ec7..e8f52f1 100644
--- a/lib/compare_matrixes.rb
+++ b/lib/compare_matrixes.rb
@@ -402,6 +402,7 @@ def get_matrix_str(matrice_key, matrice_value, suites_list, options)
   return compare_matrixes(m_list, suites_list.shift, m_titles, matrice_key, options: options) if options[:no_print]
 
   print compare_matrixes(m_list, suites_list.shift, m_titles, matrice_key, options: options)
+  return ''
 end
 
 # big size first
-- 
2.23.0
                    
                  
                  
                          
                            
                            2
                            
                          
                          
                            
                            1
                            
                          
                          
                            
    
                          
                        
                    
                    
                        remove h5ai link from upper right corner of result page
Signed-off-by: Lu Weitao <luweitaobe(a)163.com>
---
 container/srv-http/root/srv/_h5ai/public/js/scripts.js | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/container/srv-http/root/srv/_h5ai/public/js/scripts.js b/container/srv-http/root/srv/_h5ai/public/js/scripts.js
index f4f2f84..62942b8 100755
--- a/container/srv-http/root/srv/_h5ai/public/js/scripts.js
+++ b/container/srv-http/root/srv/_h5ai/public/js/scripts.js
@@ -1028,7 +1028,7 @@
             i = r.dom,
             o = "body",
             a =
-            '<div id="topbar">\n            <div id="toolbar"></div>\n            <div id="flowbar"></div>\n            <a id="backlink" href="https://larsjung.de/h5ai/" title="powered by h5ai - https://larsjung.de/h5ai/">\n                <div>powered</div>\n                <div>by h5ai</div>\n            </a>\n        </div>',
+            '<div id="topbar">\n            <div id="toolbar"></div>\n            <div id="flowbar"></div>\n            </a>\n        </div>',
             s =
             '<div id="mainrow">\n            <div id="content"></div>\n        </div>',
             c = function() {
@@ -6274,4 +6274,4 @@
             })()
         ));
     },
-]);
\ No newline at end of file
+]);
-- 
2.23.0
                    
                  
                  
                          
                            
                            2
                            
                          
                          
                            
                            3
                            
                          
                          
                            
    
                          
                        
                    
                    
                        [Why]
It's inconvenient for read and modify the file
	container/srv-http/root/srv/_h5ai/public/js/script.js
because of the file had write as one line
[How]
Use the code formatter prettier format it
Signed-off-by: Lu Weitao <luweitaobe(a)163.com>
---
 .../root/srv/_h5ai/public/js/scripts.js       | 6282 ++++++++++++++++-
 1 file changed, 6277 insertions(+), 5 deletions(-)
diff --git a/container/srv-http/root/srv/_h5ai/public/js/scripts.js b/container/srv-http/root/srv/_h5ai/public/js/scripts.js
index 664fd61..f4f2f84 100755
--- a/container/srv-http/root/srv/_h5ai/public/js/scripts.js
+++ b/container/srv-http/root/srv/_h5ai/public/js/scripts.js
@@ -1,5 +1,6277 @@
-/* h5ai v0.29.2 - https://larsjung.de/h5ai/ */
-!function(e){function t(e,t){if(!t)throw i.className=r,new Error(r+": "+e)}function n(e){return"function"==typeof e}if(!e||e.window!==e||!e.document)throw new Error("no-window");var r="no-browser",i=e.document.documentElement;i.className="",t("console",e.console&&n(e.console.log)),t("assign",e.Object&&n(e.Object.assign)),t("promise",n(e.Promise)),t("xhr",e.XMLHttpRequest)}(this),function(e){function t(r){if(n[r])return n[r].exports;var i=n[r]={exports:{},id:r,loaded:!1};return e[r].call(i.exports,i,i.exports,t),i.loaded=!0,i.exports}var n={};return t.m=e,t.c=n,t.p="",t(0)}([function(e,t,n){"use strict";n(1)},function(e,t,n){"use strict";var r=n(2),i=r.dom,o=r.awaitReady,a=n(7),s=i("script[data-module]").attr("data-module"),c={action:"get",setup:!0,options:!0,types:!0};if("index"===s)c.theme=!0,c.langs=!0;else{if("info"!==s)throw new Error("no-main-module: '"+s+"'");c.refresh=!0}a._update(c).then(function(){return o()}).then(function(){return n(9)("./"+s)})},function(e,t,n){"use strict";e.exports=Object.assign({},n(3),n(4),n(5),n(6))},function(e,t){"use strict";var n="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},r=function(e){return void 0!==e&&null!==e},i=function(e,t){return("undefined"==typeof e?"undefined":n(e))===t},o=function(e){return i(e,"string")},a=function(e){return i(e,"function")},s=function(e){return i(e,"number")},c=function(e){return e&&e.hasOwnProperty("length")},u=function(e){return!e||o(e)?[]:(c(e)&&(e=Array.from(e)),Object.keys(e))},l=function(e){return u(e).map(function(t){return e[t]})},f=function(e,t){return u(e).forEach(function(n){return t(e[n],n)})},d=function(e,t){return l(e).filter(t)},p=function(e,t){return l(e).map(t)},h=function(e,t){return l(e).indexOf(t)>=0},g=function(e){return d(e,function(e){return!!e})},m=function(e,t){return!!e&&e instanceof t},v=function(e){return Array.from(e)},b=function(e,t){return t=l(t),d(e,function(e){return t.indexOf(e)<0})},w=function(e,t){return t=l(t),d(e,function(e){return t.indexOf(e)>=0})},y=function(e,t){return e<t?-1:e>t?1:0},x=function(e,t){var n=a(t)?t:function(e){return e[t]},r=function(e,t){return y(n(e),n(t))};return l(e).sort(r)},k=function(e,t){var n=null;return function(){clearTimeout(n),n=setTimeout(e,t)}};e.exports={is:r,isStr:o,isFn:a,isNum:s,hasLength:c,keys:u,values:l,each:f,filter:d,map:p,includes:h,compact:g,isInstanceOf:m,toArray:v,difference:b,intersection:w,cmp:y,sortBy:x,debounce:k}},function(e,t,n){(function(t){"use strict";function r(e){if(Array.isArray(e)){for(var t=0,n=Array(e.length);t<e.length;t++)n[t]=e[t];return n}return Array.from(e)}var i=function(){function e(e,t){var n=[],r=!0,i=!1,o=void 0;try{for(var a,s=e[Symbol.iterator]();!(r=(a=s.next()).done)&&(n.push(a.value),!t||n.length!==t);r=!0);}catch(e){i=!0,o=e}finally{try{!r&&s.return&&s.return()}finally{if(i)throw o}}return n}return function(t,n){if(Array.isArray(t))return t;if(Symbol.iterator in Object(t))return e(t,n);throw new TypeError("Invalid attempt to destructure non-iterable instance")}}(),o=n(3),a=o.each,s=o.filter,c=o.hasLength,u=o.is,l=o.isStr,f=o.map,d=o.isInstanceOf,p=o.toArray,h=t.window,g=h.document,m=function(){var e=function(e){return g.createElement(e)},t=[[/^<t(head|body|foot)|^<c(ap|olg)/i,e("table")],[/^<col/i,e("colgroup")],[/^<tr/i,e("tbody")],[/^<t[dh]/i,e("tr")]],n=e("div"),r=function(e){var r=!0,o=!1,a=void 0;try{for(var s,c=t[Symbol.iterator]();!(r=(s=c.next()).done);r=!0){var u=s.value,l=i(u,2),f=l[0],d=l[1];if(f.test(e))return d}}catch(e){o=!0,a=e}finally{try{!r&&c.return&&c.return()}finally{if(o)throw a}}return n};return function(e){var t=r(e);t.innerHTML=e;var n=p(t.childNodes);return a(n,function(e){return t.removeChild(e)}),t.innerHTML="",n}}(),v=function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:g;try{return p(t.querySelectorAll(e))}catch(e){return[]}},b=function(e){return d(e,h.Element)},w=function(e){return d(e,h.Document)},y=function(e){return u(e)&&e.window===e&&w(e.document)},x=function(e){return b(e)||w(e)||y(e)},k=function(e,t,n){return e.addEventListener(t,n)},_=function(e,t,n){return e.removeEventListener(t,n)},C=new Promise(function(e){/^(i|c|loade)/.test(g.readyState)?e():k(g,"DOMContentLoaded",function(){return e()})}),S=function(){return C},A=new Promise(function(e){k(h,"load",function(){return e()})}),T=function(){return A},E=function e(t){if(d(t,e))return t;var n=void 0;return l(t)?(t=t.trim(),n="<"===t[0]?m(t):v(t)):n=x(t)?[t]:c(t)?t:[t],n=s(n,x),Object.assign(Object.create(e.prototype),n,{length:n.length})};E.prototype={constructor:E,each:function(e){return a(this,e),this},map:function(e){return f(this,e)},find:function(e){var t;return E((t=[]).concat.apply(t,r(this.map(function(t){return v(e,t)}))))},on:function(e,t){return this.each(function(n){return k(n,e,t)})},off:function(e,t){return this.each(function(n){return _(n,e,t)})},attr:function(e,t){return void 0===t?this.length?this[0].getAttribute(e):void 0:this.each(function(n){return n.setAttribute(e,t)})},rmAttr:function(e){return this.each(function(t){return t.removeAttribute(e)})},prop:function(e,t){return void 0===t?this.length?this[0][e]:void 0:this.each(function(n){n[e]=t})},rmProp:function(e){return this.each(function(t){return delete t[e]})},val:function(e){return void 0===e?this.length?this[0].value:void 0:this.each(function(t){t.value=e})},html:function(e){return void 0===e?this.map(function(e){return e.innerHTML}).join(""):this.each(function(t){t.innerHTML=e})},text:function(e){return void 0===e?this.map(function(e){return e.textContent}).join(""):this.each(function(t){t.textContent=e})},clr:function(){return this.html("")},rm:function(){return this.each(function(e){var t=e.parentNode;t&&t.removeChild(e)})},rpl:function(e){return this.each(function(t){var n=t.parentNode;n&&n.replaceChild(E(e)[0],t)})},app:function(e){return this.each(function(t){E(e).each(function(e){return t.appendChild(e)})})},appTo:function(e){return E(e).app(this),this},pre:function(e){return this.each(function(t){E(e).each(function(e){var n=t.firstChild;n?t.insertBefore(e,n):t.appendChild(e)})})},preTo:function(e){return E(e).pre(this),this},cls:function(){return arguments.length?(this.each(function(e){e.className=""}),this.addCls.apply(this,arguments)):this.length?p(this[0].classList):[]},hasCls:function(e){return p(this).every(function(t){return t.classList.contains(e)})},addCls:function(){for(var e=arguments.length,t=Array(e),n=0;n<e;n++)t[n]=arguments[n];return this.each(function(e){var n=!0,r=!1,i=void 0;try{for(var o,a=t[Symbol.iterator]();!(n=(o=a.next()).done);n=!0){var s=o.value;e.classList.add(s)}}catch(e){r=!0,i=e}finally{try{!n&&a.return&&a.return()}finally{if(r)throw i}}})},rmCls:function(){for(var e=arguments.length,t=Array(e),n=0;n<e;n++)t[n]=arguments[n];return this.each(function(e){var n=!0,r=!1,i=void 0;try{for(var o,a=t[Symbol.iterator]();!(n=(o=a.next()).done);n=!0){var s=o.value;e.classList.remove(s)}}catch(e){r=!0,i=e}finally{try{!n&&a.return&&a.return()}finally{if(r)throw i}}})},tglCls:function(){for(var e=arguments.length,t=Array(e),n=0;n<e;n++)t[n]=arguments[n];return this.each(function(e){var n=!0,r=!1,i=void 0;try{for(var o,a=t[Symbol.iterator]();!(n=(o=a.next()).done);n=!0){var s=o.value;e.classList.contains(s)?e.classList.remove(s):e.classList.add(s)}}catch(e){r=!0,i=e}finally{try{!n&&a.return&&a.return()}finally{if(r)throw i}}})},parent:function(){return E(this.map(function(e){return e.parentNode}))},children:function(){var e;return E((e=[]).concat.apply(e,r(this.map(function(e){return p(e.children)}))))},hide:function(){return this.addCls("hidden")},show:function(){return this.rmCls("hidden")},isHidden:function(){return this.hasCls("hidden")},css:function(e){return this.each(function(t){return Object.assign(t.style,e)})}},e.exports={awaitReady:S,awaitLoad:T,dom:E}}).call(t,function(){return this}())},function(e,t){"use strict";var n="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},r=/(^([+\-]?(?:0|[1-9]\d*)(?:\.\d*)?(?:[eE][+\-]?\d+)?)?$|^0x[0-9a-f]+$|\d+)/gi,i=/(^([\w ]+,?[\w ]+)?[\w ]+,?[\w ]+\d+:\d+(:\d+)?[\w ]?|^\d{1,4}[\/\-]\d{1,4}[\/\-]\d{1,4}|^\w+, \w+ \d+, \d{4})/,o=/^0x[0-9a-f]+$/i,a=/^0/,s=function(e,t){var s=String(e).trim(),c=String(t).trim(),u=s.replace(r,"\0$1\0").replace(/\0$/,"").replace(/^\0/,"").split("\0"),l=c.replace(r,"\0$1\0").replace(/\0$/,"").replace(/^\0/,"").split("\0"),f=parseInt(s.match(o),16)||1!==u.length&&s.match(i)&&Date.parse(s),d=parseInt(c.match(o),16)||f&&c.match(i)&&Date.parse(c)||null;if(d){if(f<d)return-1;if(f>d)return 1}for(var p=0,h=Math.max(u.length,l.length);p<h;p+=1){var g=!(u[p]||"").match(a)&&parseFloat(u[p])||u[p]||0,m=!(l[p]||"").match(a)&&parseFloat(l[p])||l[p]||0;if(isNaN(g)!==isNaN(m))return isNaN(g)?1:-1;if(("undefined"==typeof g?"undefined":n(g))!==("undefined"==typeof m?"undefined":n(m))&&(g=String(g),m=String(m)),g<m)return-1;if(g>m)return 1}return 0};e.exports={naturalCmp:s}},function(e,t){"use strict";var n=function(e){return e.replace(/[\-\[\]{}()*+?.,\\$\^|#\s]/g,"\\$&")},r=function(e,t){return t?"re:"===e.substr(0,3)?e.substr(3):e.trim().split(/\s+/).map(function(e){return e.split("").map(function(e){return n(e)}).join(".*?")}).join("|"):n(e)};e.exports={parsePattern:r}},function(e,t,n){"use strict";var r=n(8),i=r.request,o=e.exports={_update:function(e){return i(e).then(function(e){return Object.assign(o,e)})}}},function(e,t,n){(function(t){"use strict";var r=n(2),i=r.each,o=r.dom,a=t.window.XMLHttpRequest,s=function(e){return new Promise(function(t){var n=new a,r=function(){if(n.readyState===a.DONE)try{t(JSON.parse(n.responseText))}catch(e){t({err:e,txt:n.responseText})}};n.open("POST","?",!0),n.onreadystatechange=r,n.setRequestHeader("Content-Type","application/json;charset=utf-8"),n.send(JSON.stringify(e))})},c=function(e){var t=o('<form method="post" action="?" style="display:none;"/>');i(e,function(e,n){o('<input type="hidden"/>').attr("name",n).attr("value",e).appTo(t)}),t.appTo("body"),t[0].submit(),t.rm()};e.exports={request:s,formRequest:c}}).call(t,function(){return this}())},function(e,t,n){function r(e){return n(i(e))}function i(e){return o[e]||function(){throw new Error("Cannot find module '"+e+"'.")}()}var o={"./index":10,"./index.js":10,"./info":50,"./info.js":50};r.keys=function(){return Object.keys(o)},r.resolve=i,e.exports=r,r.id=9},function(e,t,n){(function(e){"use strict";n(11),n(24),n(25),n(26),n(27),n(29),n(30),n(31),n(32),n(34),n(36),n(37),n(44),n(45),n(46),n(47),n(48),n(49);var t=e.window.document.location.href;n(20).setLocation(t,!0)}).call(t,function(){return this}())},function(e,t,n){"use strict";var r=n(2),i=r.each,o=r.dom,a=n(12),s=n(13),c=n(14),u=n(15),l=n(17),f=n(18),d=Object.assign({modeToggle:!1},c.view),p='<div id="viewmode-settings" class="block"><h1 class="l10n-view">View</h1></div>',h='<div id="viewmode-[MODE]" class="button mode">\n            <img src="'+s.image("view-[MODE]")+'" alt="viewmode-[MODE]"/>\n        </div>',g='<input id="viewmode-size" type="range" min="0" max="0" value="0">',m='<div id="viewmode-toggle" class="tool">\n            <img alt="viewmode"/>\n        </div>',v=void 0,b=void 0,w=function(e,t){o("#viewmode-settings .mode").rmCls("active"),o("#viewmode-"+e).addCls("active"),o("#viewmode-size").val(b.indexOf(t)),"next"===d.modeToggle&&(e=v[(v.indexOf(e)+1)%v.length]),o("#viewmode-toggle img").attr("src",s.image("view-"+e))},y=function(){if(!(v.length<2&&b.length<2)){var e=o(p);if(v.length>1&&i(v,function(t){o(h.replace(/\[MODE\]/g,t)).on("click",function(){f.setMode(t)}).appTo(e)}),b.length>1){var t=b.length-1;o(g).attr("max",t).on("input",function(e){return f.setSize(b[e.target.valueAsNumber])}).on("change",function(e){return f.setSize(b[e.target.valueAsNumber])}).appTo(e)}e.appTo(u.$el)}},x=function(){var e=f.getMode(),t=(v.indexOf(e)+1)%v.length,n=v[t];f.setMode(n)},k=function(){d.modeToggle&&v.length>1&&o(m).on("click",x).appTo(l.$toolbar)},_=function(){v=f.getModes(),b=f.getSizes(),y(),k(),w(f.getMode(),f.getSize()),a.sub("view.mode.changed",w)};_()},function(e,t,n){(function(t){"use strict";var r=n(2),i=r.isStr,o=r.isFn,a=r.dom,s={},c=function(e,t){i(e)&&o(t)&&(s[e]||(s[e]=[]),s[e].push(t))},u=function(e){for(var t=arguments.length,n=Array(t>1?t-1:0),r=1;r<t;r++)n[r-1]=arguments[r];i(e)&&s[e]&&s[e].forEach(function(t){t.apply(e,n)})};a(t.window).on("resize",function(){return u("resize")}),e.exports={sub:c,pub:u}}).call(t,function(){return this}())},function(e,t,n){"use strict";var r=n(2),i=r.includes,o=n(7),a=n(14),s=a.publicHref+"images/",c=s+"ui/",u=s+"themes/",l=u+"default/",f=["file","folder","folder-page","folder-parent","ar","aud","bin","img","txt","vid","x"],d=function(e){return c+e+".svg"},p=function(e){var t=(e||"").split("-")[0],n=o.theme[e]||o.theme[t];return n?u+n:i(f,e)?l+e+".svg":i(f,t)?l+t+".svg":l+"file.svg"};e.exports={image:d,icon:p}},function(e,t,n){"use strict";var r=n(7);e.exports=Object.assign({},r.options,{publicHref:r.setup.PUBLIC_HREF,rootHref:r.setup.ROOT_HREF})},function(e,t,n){"use strict";var r=n(2),i=r.dom,o=n(13),a=n(14),s=n(16),c=n(17),u=Object.assign({disableSidebar:!1},a.view),l="sidebarIsVisible",f='<div id="sidebar"></div>',d='<div id="sidebar-toggle" class="tool">\n            <img alt="sidebar"/>\n        </div>',p=function(){var e=i(f).hide(),t=i(d),n=t.find("img"),r=function(r){var i=s.get(l);r&&(i=!i,s.put(l,i)),i?(t.addCls("active"),n.attr("src",o.image("back")),e.show()):(t.rmCls("active"),n.attr("src",o.image("sidebar")),e.hide())};return u.disableSidebar||(e.appTo(c.$mainrow),t.appTo(c.$toolbar).on("click",function(){return r(!0)}),r()),{$el:e}};e.exports=p()},function(e,t){(function(t){"use strict";var n=t.window.localStorage,r="_h5ai",i=function(){try{return JSON.parse(n[r])}catch(e){}return{}},o=function(e){n[r]=JSON.stringify(e)},a=function(e,t){var n=i();n[e]=t,o(n)},s=function(e){return i()[e]};e.exports={put:a,get:s}}).call(t,function(){return this}())},function(e,t,n){"use strict";var r=n(2),i=r.dom,o="body",a='<div id="topbar">\n            <div id="toolbar"></div>\n            <div id="flowbar"></div>\n            <a id="backlink" href="https://larsjung.de/h5ai/" title="powered by h5ai - https://larsjung.de/h5ai/">\n                <div>powered</div>\n                <div>by h5ai</div>\n            </a>\n        </div>',s='<div id="mainrow">\n            <div id="content"></div>\n        </div>',c=function(){var e=i(o).attr("id","root").clr().app(a).app(s);return{$root:e,$topbar:e.find("#topbar"),$toolbar:e.find("#toolbar"),$flowbar:e.find("#flowbar"),$mainrow:e.find("#mainrow"),$content:e.find("#content")}};e.exports=c()},function(e,t,n){"use strict";var r=n(2),i=r.each,o=r.map,a=r.includes,s=r.intersection,c=r.dom,u=n(12),l=n(19),f=n(20),d=n(13),p=n(16),h=n(14),g=n(17),m=["details","grid","icons"],v=[20,40,60,80,100,150,200,250,300,350,400],b=Object.assign({binaryPrefix:!1,hideFolders:!1,hideParentFolder:!1,maxIconSize:40,modes:m,setParentFolderLabels:!1,sizes:v},h.view),w=b.sizes.sort(function(e,t){return e-t}),y=s(b.modes,m),x="view",k='<div id="view">\n            <ul id="items" class="clearfix">\n                <li class="header">\n                    <a class="icon"></a>\n                    <a class="label" href="#"><span class="l10n-name"/></a>\n                    <a class="date" href="#"><span class="l10n-lastModified"/></a>\n                    <a class="size" href="#"><span class="l10n-size"/></a>\n                </li>\n            </ul>\n            <div id="view-hint"></div>\n        </div>',_='<li class="item">\n            <a>\n                <span class="icon square"><img/></span>\n                <span class="icon landscape"><img/></span>\n                <span class="label"></span>\n                <span class="date"></span>\n                <span class="size"></span>\n            </a>\n        </li>',C=c(k),S=C.find("#items"),A=C.find("#view-hint"),T=function(e,t,n){return Math.min(n,Math.max(t,e))},E=function(e){var t=T(e,20,80),n=T(e,40,160),r=T(e,80,1e3),i=Math.round(4*r/3),o="!important;",a="#view.view-details.view-size-"+e,s="#view.view-grid.view-size-"+e,c="#view.view-icons.view-size-"+e,u=[a+" .item .label {line-height: "+(t+14)+"px "+o+"}",a+" .item .date {line-height: "+(t+14)+"px "+o+"}",a+" .item .size {line-height: "+(t+14)+"px "+o+"}",a+" .square {width: "+t+"px "+o+" height: "+t+"px "+o+"}",a+" .square img {width: "+t+"px "+o+" height: "+t+"px "+o+"}",a+" .label {margin-left: "+(t+32)+"px "+o+"}",s+" .item .label {line-height: "+n+"px "+o+"}",s+" .square {width: "+n+"px "+o+" height: "+n+"px "+o+"}",s+" .square img {width: "+n+"px "+o+" height: "+n+"px "+o+"}",c+" .item {width: "+i+"px "+o+"}",c+" .landscape {width: "+i+"px "+o+" height: "+r+"px "+o+"}",c+" .landscape img {width: "+r+"px "+o+" height: "+r+"px "+o+"}",c+" .landscape .thumb {width: "+i+"px "+o+"}"];return u.join("\n")},M=function(){var e=o(w,function(e){return E(e)});e.push("#view .icon img {max-width: "+b.maxIconSize+"px; max-height: "+b.maxIconSize+"px;}"),c("<style></style>").text(e.join("\n")).appTo("head")},D=function(e,t){var n=p.get(x);e=e||n&&n.mode,t=t||n&&n.size,e=a(b.modes,e)?e:b.modes[0],t=a(b.sizes,t)?t:b.sizes[0],p.put(x,{mode:e,size:t}),i(y,function(t){t===e?C.addCls("view-"+t):C.rmCls("view-"+t)}),i(w,function(e){e===t?C.addCls("view-size-"+e):C.rmCls("view-size-"+e)}),u.pub("view.mode.changed",e,t)},P=function(){return y},z=function(){return p.get(x).mode},L=function(e){return D(e,null)},$=function(){return w},H=function(){return p.get(x).size},O=function(e){return D(null,e)},B=function(e){var t=e.target._item;u.pub("item.mouseenter",t)},R=function(e){var t=e.target._item;u.pub("item.mouseleave",t)},N=function(e){var t=c(_),n=t.find("a"),r=t.find(".icon img"),i=t.find(".label"),o=t.find(".date"),a=t.find(".size");return t.addCls(e.isFolder()?"folder":"file").on("mouseenter",B).on("mouseleave",R),f.setLink(n,e),i.text(e.label).attr("title",e.label),o.attr("data-time",e.time).text(l.formatDate(e.time)),a.attr("data-bytes",e.size).text(l.formatSize(e.size)),e.icon=d.icon(e.type),e.isFolder()&&!e.isManaged&&(t.addCls("page"),e.icon=d.icon("folder-page")),e.isCurrentParentFolder()&&(e.icon=d.icon("folder-parent"),b.setParentFolderLabels||i.addCls("l10n-parentDirectory"),t.addCls("folder-parent")),r.attr("src",e.icon).attr("alt",e.type),e.$view=t,t[0]._item=e,t},I=function(){var e=S.find(".item").length===S.find(".folder-parent").length;e?A.show():A.hide()},j=function(e){var t=o(S.find(".item"),function(e){return e._item});S.find(".item").rm(),i(e,function(e){return S.app(N(e))}),g.$content[0].scrollLeft=0,g.$content[0].scrollTop=0,I(),u.pub("view.changed",e,t)},F=function(e,t){i(e,function(e){N(e).hide().appTo(S).show()}),i(t,function(e){e.$view.hide().rm()}),I(),u.pub("view.changed",e,t)},q=function(e){A.rmCls().addCls("l10n-"+e),I()},Y=function(e){e||(e=f.getItem());var t=[];e.parent&&!b.hideParentFolder&&t.push(e.parent),i(e.content,function(e){e.isFolder()&&b.hideFolders||t.push(e)}),q("empty"),j(t)},Z=function(e,t,n){var r=[];i(t,function(e){e.isFolder()&&b.hideFolders||r.push(e)}),q("empty"),F(r,n)},U=function(){var e=C[0].offsetWidth;C.rmCls("width-0").rmCls("width-1"),e<320?C.addCls("width-0"):e<480&&C.addCls("width-1")},V=function(){M(),D(),C.appTo(g.$content),A.hide(),l.setDefaultMetric(b.binaryPrefix),u.sub("location.changed",Y),u.sub("location.refreshed",Z),u.sub("resize",U),U()};V(),e.exports={$el:C,setItems:j,changeItems:F,setLocation:Y,setHint:q,getModes:P,getMode:z,setMode:L,getSizes:$,getSize:H,setSize:O}},function(e,t,n){"use strict";var r=n(2),i=r.isNum,o={t:1e3,k:1e3,u:["B","KB","MB","GB","TB","PB","EB","ZB","YB"]},a={t:1024,k:1024,u:["B","KiB","MiB","GiB","TiB","PiB","EiB","ZiB","YiB"]},s=o,c=[[/YYYY/,"Y",4],[/YY/,"Y",2],[/Y/,"Y",0],[/MM/,"M",2],[/M/,"M",0],[/DD/,"D",2],[/D/,"D",0],[/HH/,"H",2],[/H/,"H",0],[/mm/,"m",2],[/m/,"m",0],[/ss/,"s",2],[/s/,"s",0]],u="YYYY-MM-DD HH:mm",l=function(e){s=e?a:o},f=function(e,t){if(t=t||s,!i(e)||e<0)return"";for(var n=0,r=t.u.length-1;e>=t.t&&n<r;)e/=t.k,n+=1;return(n<=1?Math.round(e):e.toFixed(1)).toString()+" "+t.u[n]},d=function(e){u=e},p=function(e,t){var n=String(e);return t&&(n=("000"+n).substr(-t)),n},h=function(e,t){if(!e||!i(e))return"";t=t||u;var n=new Date(e),r={Y:n.getFullYear(),M:n.getMonth()+1,D:n.getDate(),H:n.getHours(),m:n.getMinutes(),s:n.getSeconds()};return c.forEach(function(e){t=t.replace(e[0],p(r[e[1]],e[2]))}),t};e.exports={setDefaultMetric:l,formatSize:f,setDefaultDateFormat:d,formatDate:h}},function(e,t,n){(function(t){"use strict";var r=n(2),i=r.each,o=r.values,a=r.difference,s=n(8),c=s.request,u=n(14),l=n(12),f=n(21),d=t.window,p=d.document,h=Object.assign({fastBrowsing:!0,unmanagedInNewWindow:!0},u.view),g=h.fastBrowsing?d.history:null,m=/^.*:\/\/[^\/]*|[^\/]*$/g,v=[[/\/+/g,"/"],[/ /g,"%20"],[/!/g,"%21"],[/#/g,"%23"],[/\$/g,"%24"],[/&/g,"%26"],[/'/g,"%27"],[/\(/g,"%28"],[/\)/g,"%29"],[/\*/g,"%2A"],[/\+/g,"%2B"],[/\,/g,"%2C"],[/:/g,"%3A"],[/;/g,"%3B"],[/\=/g,"%3D"],[/\?/g,"%3F"],[/@/g,"%40"],[/\[/g,"%5B"],[/\]/g,"%5D"]],b=null,w=function(e){return v.reduce(function(e,t){return e.replace(t[0],t[1])},e)},y=function(e){return e.replace(m,"")},x=function(){var e="/a b",t=p.createElement("a");return t.href=e,y(t.href)===e}(),k=function(e){var t=p.createElement("a"),n=void 0;return t.href=e,n=y(t.href),x&&(n=encodeURIComponent(n).replace(/%2F/gi,"/")),w(n)},_=function(){return p.domain},C=function(){return b},S=function(){return n(22).get(b)},A=function(){return c({action:"get",items:{href:b,what:1}}).then(function(e){var t=n(22),r=t.get(b);if(e){var o={};i(e.items,function(e){var n=t.get(e);o[n.absHref]=!0}),i(r.content,function(e){o[e.absHref]||t.remove(e.absHref)})}return r})},T=function(){var e=S(),t=o(e.content);l.pub("location.beforeRefresh"),A().then(function(){var n=o(e.content),r=a(n,t),i=a(t,n);l.pub("location.refreshed",e,r,i)})},E=function(e,t){l.pub("location.beforeChange"),e=k(e),b!==e&&(b=e,g&&(t?g.replaceState({absHref:b},"",b):g.pushState({absHref:b},"",b)));var n=S();n.isLoaded?(l.pub("location.changed",n),T()):(f.set("loading..."),A().then(function(){n.isLoaded=!0,f.set(),l.pub("location.changed",n)}))},M=function(e,t){e.attr("href",t.absHref),g&&t.isFolder()&&t.isManaged&&e.on("click",function(e){return E(t.absHref),e.preventDefault(),!1}),h.unmanagedInNewWindow&&!t.isManaged&&e.attr("target","_blank")},D=function(e){e.state&&e.state.absHref&&E(e.state.absHref,!0)};d.onpopstate=g?D:null,e.exports={forceEncoding:w,getDomain:_,getAbsHref:C,getItem:S,setLocation:E,refresh:T,setLink:M}}).call(t,function(){return this}())},function(e,t,n){"use strict";var r=n(2),i=r.dom,o=n(17),a=function(){var e=i('<div id="notification"></div>').hide().appTo(o.$root),t=function(t){t?e.html(t).show():e.hide()};return{set:t}};e.exports=a()},function(e,t,n){"use strict";var r=n(2),i=r.keys,o=r.each,a=r.filter,s=r.sortBy,c=r.isStr,u=r.isNum,l=n(8),f=n(20),d=n(14),p=n(23),h=/\/$/,g=/^(.*\/)([^\/]+\/?)$/,m={},v=function(e,t){return c(e)&&e.startsWith(t)},b=function(e){e=e.replace(h,"");try{e=decodeURIComponent(e)}catch(e){}return e},w=function(e){if("/"===e)return{parent:null,name:"/"};var t=g.exec(e);if(!t)return null;var n={parent:t[1],name:t[2]};return n.parent&&!v(n.parent,d.rootHref)&&(n.parent=null),n},y=function(e){if(c(e))e={href:e};else if(!e||!c(e.href))return null;var t=f.forceEncoding(e.href);if(!v(t,d.rootHref))return null;var n=m[t]||_(t);return u(e.time)&&(n.time=e.time),u(e.size)&&(n.size=e.size),e.managed&&(n.isManaged=!0),e.fetched&&(n.isContentFetched=!0),n},x=function e(t){t=f.forceEncoding(t);var n=m[t];n&&(delete m[t],n.parent&&delete n.parent.content[n.absHref],o(n.content,function(t){e(t.absHref)}))},k=function(e){return new Promise(function(t){var n=y(e);n.isContentFetched?t(n):l.request({action:"get",items:{href:n.absHref,what:1}}).then(function(e){e.items&&o(e.items,function(e){y(e)}),t(n)})})},_=function e(t){var n=w(t),r=Object.assign(Object.create(e.prototype),{absHref:t,type:p.getType(t),label:b("/"===t?f.getDomain():n.name),time:null,size:null,parent:null,isManaged:null,content:{}});return m[t]=r,n.parent&&(r.parent=y(n.parent),r.parent.content[r.absHref]=r,i(r.parent.content).length>1&&(r.parent.isContentFetched=!0)),r};_.prototype={constructor:_,isFolder:function(){return h.test(this.absHref)},isCurrentFolder:function(){return this.absHref===f.getAbsHref()},isInCurrentFolder:function(){return!!this.parent&&this.parent.isCurrentFolder()},isCurrentParentFolder:function(){var e=y(f.getAbsHref());return!!e&&this===e.parent},isDomain:function(){return"/"===this.absHref},isRoot:function(){return this.absHref===d.rootHref},isEmpty:function(){return 0===i(this.content).length},fetchContent:function(){return k(this.absHref)},getCrumb:function(){for(var e=this,t=[e];e.parent;)e=e.parent,t.unshift(e);return t},getSubfolders:function(){return s(a(this.content,function(e){return e.isFolder()}),function(e){return e.label.toLowerCase()})},getStats:function(){var e=0,t=0;o(this.content,function(n){n.isFolder()?e+=1:t+=1});for(var n=0,r=this;r.parent;)n+=1,r=r.parent;return{folders:e,files:t,depth:n}}},e.exports={get:y,remove:x}},function(e,t,n){"use strict";var r=n(2),i=r.each,o=r.map,a=n(7),s=/\/$/,c={},u=function(e){return e.replace(/[\-\[\]\/\{\}\(\)\+\?\.\\\^\$]/g,"\\$&")},l=function(e){i(e,function(e,t){var n="^("+o(e,function(e){return"("+u(e).replace(/\*/g,".*")+")"}).join("|")+")$";c[t]=new RegExp(n,"i")})},f=function(e){if(s.test(e))return"folder";var t=e.lastIndexOf("/"),n=t>=0?e.substr(t+1):e,r=void 0;return i(c,function(e,t){c[t].test(n)&&(r=t)}),r?r:"file"};l(Object.assign({},a.types)),e.exports={getType:f}},function(e,t,n){(function(e){"use strict";var t=n(12),r=n(20),i=n(14),o=e.window,a=Object.assign({enabled:!1,interval:5e3},i.autorefresh),s=null,c=function(){r.refresh()},u=function(){o.clearTimeout(s)},l=function(){o.clearTimeout(s),s=o.setTimeout(c,a.interval)},f=function(){a.enabled&&(a.interval=Math.max(1e3,a.interval),t.sub("location.beforeChange",u),t.sub("location.beforeRefresh",u),t.sub("location.changed",l),t.sub("location.refreshed",l))};f()}).call(t,function(){return this}())},function(e,t,n){"use strict";var r=n(2),i=r.each,o=r.dom,a=n(13),s=n(14),c=Object.assign({enabled:!1},s.contextmenu),u='<div id="cm-overlay"></div>',l='<div class="cm-panel"><ul></ul></div>',f='<li class="cm-sep"></li>',d='<li class="cm-entry"><span class="cm-icon"><img/></span><span class="cm-text"></span></li>',p='<li class="cm-label"><span class="cm-text"></span></li>',h=function(e){for(;!e._cmId&&e.parentNode;)e=e.parentNode;return e._cmId},g=function(e){var t=o(u),n=function(n){n.stopPropagation(),n.preventDefault();var r=h(n.target);n.target!==t[0]&&void 0===r||(t.rm(),e(r))};return t.on("contextmenu",n).on("click",n)},m=function(e){var t=o(l),n=t.find("ul"),r=void 0;return i(e,function(e){"-"===e.type?o(f).appTo(n):"l"===e.type?o(p).appTo(n).find(".cm-text").text(e.text):"e"===e.type&&(r=o(d).appTo(n),r[0]._cmId=e.id,r.find(".cm-text").text(e.text),e.icon?r.find(".cm-icon img").attr("src",a.icon(e.icon)):r.find(".cm-icon").addCls("no-icon"))}),t},v=function(e,t,n,r){var i=4;t.css({left:0,top:0,opacity:0}),e.show();var o=e[0].getBoundingClientRect(),a=t[0].getBoundingClientRect(),s=o.left,c=o.top,u=o.width,l=o.height,f=a.width,d=a.height,p=n,h=r;f>u-2*i&&(p=i,f=u-2*i),d>l-2*i&&(h=i,d=l-2*i),p<s+i&&(p=s+i),p+f>s+u-i&&(p=s+u-i-f),h<c+i&&(h=c+i),h+d>c+l-i&&(h=c+l-i-d),t.css({left:p+"px",top:h+"px",width:f+"px",height:d+"px",opacity:1})},b=function(e,t,n,r){var i=g(r),o=m(n);i.hide().app(o).appTo("body"),v(i,o,e,t)},w=function(){if(c.enabled){var e=[{type:"e",id:"e1",text:"testing context menus"},{type:"e",id:"e2",text:"another entry"},{type:"e",id:"e3",text:"one with icon",icon:"folder"},{type:"-"},{type:"e",id:"e4",text:"one with icon",icon:"x"},{type:"e",id:"e5",text:"one with icon",icon:"img"}];o("#view").on("contextmenu",function(t){t.preventDefault(),b(t.pageX,t.pageY,e)})}};w()},function(e,t,n){"use strict";var r=n(2),i=r.each,o=r.dom,a=n(12),s=n(20),c=n(13),u=n(14),l=n(17),f=Object.assign({enabled:!1},u.crumb),d='<div id="crumbbar"></div>',p='<a class="crumb">\n            <img class="sep" src="'+c.image("crumb")+'" alt=">"/>\n            <span class="label"></span>\n        </a>',h='<img class="hint" src="'+c.icon("folder-page")+'" alt="has index page"/>',g=function(e){var t=o(p);return s.setLink(t,e),t.find(".label").text(e.label),e.isCurrentFolder()&&t.addCls("active"),e.isManaged||t.app(o(h)),e._$crumb=t,t[0]._item=e,t},m=function(e){var t=e._$crumb,n=o("#crumbbar");t&&t.parent()[0]===n[0]?(n.children().rmCls("active"),t.addCls("active")):(n.clr(),i(e.getCrumb(),function(e){n.app(g(e))}))},v=function(){f.enabled&&(o(d).appTo(l.$flowbar),a.sub("location.changed",m))};v()},function(e,t,n){"use strict";var r=n(28),i=n(2),o=i.each,a=i.dom,s=n(8),c=n(12),u=n(14),l=Object.assign({enabled:!1},u.custom),f=function(e,t){var n=a("#content-"+t);if(e&&e[t].content){var i=e[t].content;"md"===e[t].type&&(i=r(i)),n.html(i).show()}else n.hide()},d=function(e){s.request({action:"get",custom:e.absHref}).then(function(e){var t=e&&e.custom;o(["header","footer"],function(e){return f(t,e)})})},p=function(){l.enabled&&(a('<div id="content-header"></div>').hide().preTo("#content"),a('<div id="content-footer"></div>').hide().appTo("#content"),c.sub("location.changed",d))};p()},function(e,t,n){(function(t){!function(t){"use strict";function n(e){this.tokens=[],this.tokens.links=Object.create(null),this.options=e||b.defaults,this.rules=w.normal,this.options.pedantic?this.rules=w.pedantic:this.options.gfm&&(this.options.tables?this.rules=w.tables:this.rules=w.gfm)}function r(e,t){if(this.options=t||b.defaults,this.links=e,this.rules=y.normal,this.renderer=this.options.renderer||new i,this.renderer.options=this.options,!this.links)throw new Error("Tokens array requires a `links` property.");this.options.pedantic?this.rules=y.pedantic:this.options.gfm&&(this.options.breaks?this.rules=y.breaks:this.rules=y.gfm)}function i(e){this.options=e||b.defaults}function o(){}function a(e){this.tokens=[],this.token=null,this.options=e||b.defaults,this.options.renderer=this.options.renderer||new i,this.renderer=this.options.renderer,this.renderer.options=this.options,this.slugger=new s}function s(){this.seen={}}function c(e,t){if(t){if(c.escapeTest.test(e))return e.replace(c.escapeReplace,function(e){return c.replacements[e]})}else if(c.escapeTestNoEncode.test(e))return e.replace(c.escapeReplaceNoEncode,function(e){return c.replacements[e]});return e}function u(e){return e.replace(/&(#(?:\d+)|(?:#x[0-9A-Fa-f]+)|(?:\w+));?/gi,function(e,t){return t=t.toLowerCase(),"colon"===t?":":"#"===t.charAt(0)?"x"===t.charAt(1)?String.fromCharCode(parseInt(t.substring(2),16)):String.fromCharCode(+t.substring(1)):""})}function l(e,t){return e=e.source||e,t=t||"",{replace:function(t,n){return n=n.source||n,n=n.replace(/(^|[^\[])\^/g,"$1"),e=e.replace(t,n),this},getRegex:function(){return new RegExp(e,t)}}}function f(e,t,n){if(e){try{var r=decodeURIComponent(u(n)).replace(/[^\w:]/g,"").toLowerCase()}catch(e){return null}if(0===r.indexOf("javascript:")||0===r.indexOf("vbscript:")||0===r.indexOf("data:"))return null}t&&!k.test(n)&&(n=d(t,n));try{n=encodeURI(n).replace(/%25/g,"%")}catch(e){return null}return n}function d(e,t){return x[" "+e]||(/^[^:]+:\/*[^\/]*$/.test(e)?x[" "+e]=e+"/":x[" "+e]=m(e,"/",!0)),e=x[" "+e],"//"===t.slice(0,2)?e.replace(/:[\s\S]*/,":")+t:"/"===t.charAt(0)?e.replace(/(:\/*[^\/]*)[\s\S]*/,"$1")+t:e+t}function p(){}function h(e){for(var t,n,r=1;r<arguments.length;r++){t=arguments[r];for(n in t)Object.prototype.hasOwnProperty.call(t,n)&&(e[n]=t[n])}return e}function g(e,t){var n=e.replace(/\|/g,function(e,t,n){for(var r=!1,i=t;--i>=0&&"\\"===n[i];)r=!r;
-return r?"|":" |"}),r=n.split(/ \|/),i=0;if(r.length>t)r.splice(t);else for(;r.length<t;)r.push("");for(;i<r.length;i++)r[i]=r[i].trim().replace(/\\\|/g,"|");return r}function m(e,t,n){if(0===e.length)return"";for(var r=0;r<e.length;){var i=e.charAt(e.length-r-1);if(i!==t||n){if(i===t||!n)break;r++}else r++}return e.substr(0,e.length-r)}function v(e,t){if(e.indexOf(t[1])===-1)return-1;for(var n=0,r=0;r<e.length;r++)if("\\"===e[r])r++;else if(e[r]===t[0])n++;else if(e[r]===t[1]&&(n--,n<0))return r;return-1}function b(e,t,r){if("undefined"==typeof e||null===e)throw new Error("marked(): input parameter is undefined or null");if("string"!=typeof e)throw new Error("marked(): input parameter is of type "+Object.prototype.toString.call(e)+", string expected");if(r||"function"==typeof t){r||(r=t,t=null),t=h({},b.defaults,t||{});var i,o,s=t.highlight,u=0;try{i=n.lex(e,t)}catch(e){return r(e)}o=i.length;var l=function(e){if(e)return t.highlight=s,r(e);var n;try{n=a.parse(i,t)}catch(t){e=t}return t.highlight=s,e?r(e):r(null,n)};if(!s||s.length<3)return l();if(delete t.highlight,!o)return l();for(;u<i.length;u++)!function(e){return"code"!==e.type?--o||l():s(e.text,e.lang,function(t,n){return t?l(t):null==n||n===e.text?--o||l():(e.text=n,e.escaped=!0,void(--o||l()))})}(i[u])}else try{return t&&(t=h({},b.defaults,t)),a.parse(n.lex(e,t),t)}catch(e){if(e.message+="\nPlease report this to https://github.com/markedjs/marked.",(t||b.defaults).silent)return"<p>An error occurred:</p><pre>"+c(e.message+"",!0)+"</pre>";throw e}}var w={newline:/^\n+/,code:/^( {4}[^\n]+\n*)+/,fences:p,hr:/^ {0,3}((?:- *){3,}|(?:_ *){3,}|(?:\* *){3,})(?:\n+|$)/,heading:/^ *(#{1,6}) *([^\n]+?) *(?:#+ *)?(?:\n+|$)/,nptable:p,blockquote:/^( {0,3}> ?(paragraph|[^\n]*)(?:\n|$))+/,list:/^( {0,3})(bull) [\s\S]+?(?:hr|def|\n{2,}(?! )(?!\1bull )\n*|\s*$)/,html:"^ {0,3}(?:<(script|pre|style)[\\s>][\\s\\S]*?(?:</\\1>[^\\n]*\\n+|$)|comment[^\\n]*(\\n+|$)|<\\?[\\s\\S]*?\\?>\\n*|<![A-Z][\\s\\S]*?>\\n*|<!\\[CDATA\\[[\\s\\S]*?\\]\\]>\\n*|</?(tag)(?: +|\\n|/?>)[\\s\\S]*?(?:\\n{2,}|$)|<(?!script|pre|style)([a-z][\\w-]*)(?:attribute)*? */?>(?=\\h*\\n)[\\s\\S]*?(?:\\n{2,}|$)|</(?!script|pre|style)[a-z][\\w-]*\\s*>(?=\\h*\\n)[\\s\\S]*?(?:\\n{2,}|$))",def:/^ {0,3}\[(label)\]: *\n? *<?([^\s>]+)>?(?:(?: +\n? *| *\n *)(title))? *(?:\n+|$)/,table:p,lheading:/^([^\n]+)\n *(=|-){2,} *(?:\n+|$)/,paragraph:/^([^\n]+(?:\n(?!hr|heading|lheading| {0,3}>|<\/?(?:tag)(?: +|\n|\/?>)|<(?:script|pre|style|!--))[^\n]+)*)/,text:/^[^\n]+/};w._label=/(?!\s*\])(?:\\[\[\]]|[^\[\]])+/,w._title=/(?:"(?:\\"?|[^"\\])*"|'[^'\n]*(?:\n[^'\n]+)*\n?'|\([^()]*\))/,w.def=l(w.def).replace("label",w._label).replace("title",w._title).getRegex(),w.bullet=/(?:[*+-]|\d{1,9}\.)/,w.item=/^( *)(bull) ?[^\n]*(?:\n(?!\1bull ?)[^\n]*)*/,w.item=l(w.item,"gm").replace(/bull/g,w.bullet).getRegex(),w.list=l(w.list).replace(/bull/g,w.bullet).replace("hr","\\n+(?=\\1?(?:(?:- *){3,}|(?:_ *){3,}|(?:\\* *){3,})(?:\\n+|$))").replace("def","\\n+(?="+w.def.source+")").getRegex(),w._tag="address|article|aside|base|basefont|blockquote|body|caption|center|col|colgroup|dd|details|dialog|dir|div|dl|dt|fieldset|figcaption|figure|footer|form|frame|frameset|h[1-6]|head|header|hr|html|iframe|legend|li|link|main|menu|menuitem|meta|nav|noframes|ol|optgroup|option|p|param|section|source|summary|table|tbody|td|tfoot|th|thead|title|tr|track|ul",w._comment=/<!--(?!-?>)[\s\S]*?-->/,w.html=l(w.html,"i").replace("comment",w._comment).replace("tag",w._tag).replace("attribute",/ +[a-zA-Z:_][\w.:-]*(?: *= *"[^"\n]*"| *= *'[^'\n]*'| *= *[^\s"'=<>`]+)?/).getRegex(),w.paragraph=l(w.paragraph).replace("hr",w.hr).replace("heading",w.heading).replace("lheading",w.lheading).replace("tag",w._tag).getRegex(),w.blockquote=l(w.blockquote).replace("paragraph",w.paragraph).getRegex(),w.normal=h({},w),w.gfm=h({},w.normal,{fences:/^ {0,3}(`{3,}|~{3,})([^`\n]*)\n(?:|([\s\S]*?)\n)(?: {0,3}\1[~`]* *(?:\n+|$)|$)/,paragraph:/^/,heading:/^ *(#{1,6}) +([^\n]+?) *#* *(?:\n+|$)/}),w.gfm.paragraph=l(w.paragraph).replace("(?!","(?!"+w.gfm.fences.source.replace("\\1","\\2")+"|"+w.list.source.replace("\\1","\\3")+"|").getRegex(),w.tables=h({},w.gfm,{nptable:/^ *([^|\n ].*\|.*)\n *([-:]+ *\|[-| :]*)(?:\n((?:.*[^>\n ].*(?:\n|$))*)\n*|$)/,table:/^ *\|(.+)\n *\|?( *[-:]+[-| :]*)(?:\n((?: *[^>\n ].*(?:\n|$))*)\n*|$)/}),w.pedantic=h({},w.normal,{html:l("^ *(?:comment *(?:\\n|\\s*$)|<(tag)[\\s\\S]+?</\\1> *(?:\\n{2,}|\\s*$)|<tag(?:\"[^\"]*\"|'[^']*'|\\s[^'\"/>\\s]*)*?/?> *(?:\\n{2,}|\\s*$))").replace("comment",w._comment).replace(/tag/g,"(?!(?:a|em|strong|small|s|cite|q|dfn|abbr|data|time|code|var|samp|kbd|sub|sup|i|b|u|mark|ruby|rt|rp|bdi|bdo|span|br|wbr|ins|del|img)\\b)\\w+(?!:|[^\\w\\s@]*@)\\b").getRegex(),def:/^ *\[([^\]]+)\]: *<?([^\s>]+)>?(?: +(["(][^\n]+[")]))? *(?:\n+|$)/}),n.rules=w,n.lex=function(e,t){var r=new n(t);return r.lex(e)},n.prototype.lex=function(e){return e=e.replace(/\r\n|\r/g,"\n").replace(/\t/g,"    ").replace(/\u00a0/g," ").replace(/\u2424/g,"\n"),this.token(e,!0)},n.prototype.token=function(e,t){e=e.replace(/^ +$/gm,"");for(var n,r,i,o,a,s,c,u,l,f,d,p,h,v,b,y;e;)if((i=this.rules.newline.exec(e))&&(e=e.substring(i[0].length),i[0].length>1&&this.tokens.push({type:"space"})),i=this.rules.code.exec(e))e=e.substring(i[0].length),i=i[0].replace(/^ {4}/gm,""),this.tokens.push({type:"code",text:this.options.pedantic?i:m(i,"\n")});else if(i=this.rules.fences.exec(e))e=e.substring(i[0].length),this.tokens.push({type:"code",lang:i[2]?i[2].trim():i[2],text:i[3]||""});else if(i=this.rules.heading.exec(e))e=e.substring(i[0].length),this.tokens.push({type:"heading",depth:i[1].length,text:i[2]});else if(t&&(i=this.rules.nptable.exec(e))&&(s={type:"table",header:g(i[1].replace(/^ *| *\| *$/g,"")),align:i[2].replace(/^ *|\| *$/g,"").split(/ *\| */),cells:i[3]?i[3].replace(/\n$/,"").split("\n"):[]},s.header.length===s.align.length)){for(e=e.substring(i[0].length),d=0;d<s.align.length;d++)/^ *-+: *$/.test(s.align[d])?s.align[d]="right":/^ *:-+: *$/.test(s.align[d])?s.align[d]="center":/^ *:-+ *$/.test(s.align[d])?s.align[d]="left":s.align[d]=null;for(d=0;d<s.cells.length;d++)s.cells[d]=g(s.cells[d],s.header.length);this.tokens.push(s)}else if(i=this.rules.hr.exec(e))e=e.substring(i[0].length),this.tokens.push({type:"hr"});else if(i=this.rules.blockquote.exec(e))e=e.substring(i[0].length),this.tokens.push({type:"blockquote_start"}),i=i[0].replace(/^ *> ?/gm,""),this.token(i,t),this.tokens.push({type:"blockquote_end"});else if(i=this.rules.list.exec(e)){for(e=e.substring(i[0].length),o=i[2],v=o.length>1,c={type:"list_start",ordered:v,start:v?+o:"",loose:!1},this.tokens.push(c),i=i[0].match(this.rules.item),u=[],n=!1,h=i.length,d=0;d<h;d++)s=i[d],f=s.length,s=s.replace(/^ *([*+-]|\d+\.) */,""),~s.indexOf("\n ")&&(f-=s.length,s=this.options.pedantic?s.replace(/^ {1,4}/gm,""):s.replace(new RegExp("^ {1,"+f+"}","gm"),"")),d!==h-1&&(a=w.bullet.exec(i[d+1])[0],(o.length>1?1===a.length:a.length>1||this.options.smartLists&&a!==o)&&(e=i.slice(d+1).join("\n")+e,d=h-1)),r=n||/\n\n(?!\s*$)/.test(s),d!==h-1&&(n="\n"===s.charAt(s.length-1),r||(r=n)),r&&(c.loose=!0),b=/^\[[ xX]\] /.test(s),y=void 0,b&&(y=" "!==s[1],s=s.replace(/^\[[ xX]\] +/,"")),l={type:"list_item_start",task:b,checked:y,loose:r},u.push(l),this.tokens.push(l),this.token(s,!1),this.tokens.push({type:"list_item_end"});if(c.loose)for(h=u.length,d=0;d<h;d++)u[d].loose=!0;this.tokens.push({type:"list_end"})}else if(i=this.rules.html.exec(e))e=e.substring(i[0].length),this.tokens.push({type:this.options.sanitize?"paragraph":"html",pre:!this.options.sanitizer&&("pre"===i[1]||"script"===i[1]||"style"===i[1]),text:i[0]});else if(t&&(i=this.rules.def.exec(e)))e=e.substring(i[0].length),i[3]&&(i[3]=i[3].substring(1,i[3].length-1)),p=i[1].toLowerCase().replace(/\s+/g," "),this.tokens.links[p]||(this.tokens.links[p]={href:i[2],title:i[3]});else if(t&&(i=this.rules.table.exec(e))&&(s={type:"table",header:g(i[1].replace(/^ *| *\| *$/g,"")),align:i[2].replace(/^ *|\| *$/g,"").split(/ *\| */),cells:i[3]?i[3].replace(/(?: *\| *)?\n$/,"").split("\n"):[]},s.header.length===s.align.length)){for(e=e.substring(i[0].length),d=0;d<s.align.length;d++)/^ *-+: *$/.test(s.align[d])?s.align[d]="right":/^ *:-+: *$/.test(s.align[d])?s.align[d]="center":/^ *:-+ *$/.test(s.align[d])?s.align[d]="left":s.align[d]=null;for(d=0;d<s.cells.length;d++)s.cells[d]=g(s.cells[d].replace(/^ *\| *| *\| *$/g,""),s.header.length);this.tokens.push(s)}else if(i=this.rules.lheading.exec(e))e=e.substring(i[0].length),this.tokens.push({type:"heading",depth:"="===i[2]?1:2,text:i[1]});else if(t&&(i=this.rules.paragraph.exec(e)))e=e.substring(i[0].length),this.tokens.push({type:"paragraph",text:"\n"===i[1].charAt(i[1].length-1)?i[1].slice(0,-1):i[1]});else if(i=this.rules.text.exec(e))e=e.substring(i[0].length),this.tokens.push({type:"text",text:i[0]});else if(e)throw new Error("Infinite loop on byte: "+e.charCodeAt(0));return this.tokens};var y={escape:/^\\([!"#$%&'()*+,\-.\/:;<=>?@\[\]\\^_`{|}~])/,autolink:/^<(scheme:[^\s\x00-\x1f<>]*|email)>/,url:p,tag:"^comment|^</[a-zA-Z][\\w:-]*\\s*>|^<[a-zA-Z][\\w-]*(?:attribute)*?\\s*/?>|^<\\?[\\s\\S]*?\\?>|^<![a-zA-Z]+\\s[\\s\\S]*?>|^<!\\[CDATA\\[[\\s\\S]*?\\]\\]>",link:/^!?\[(label)\]\(href(?:\s+(title))?\s*\)/,reflink:/^!?\[(label)\]\[(?!\s*\])((?:\\[\[\]]?|[^\[\]\\])+)\]/,nolink:/^!?\[(?!\s*\])((?:\[[^\[\]]*\]|\\[\[\]]|[^\[\]])*)\](?:\[\])?/,strong:/^__([^\s_])__(?!_)|^\*\*([^\s*])\*\*(?!\*)|^__([^\s][\s\S]*?[^\s])__(?!_)|^\*\*([^\s][\s\S]*?[^\s])\*\*(?!\*)/,em:/^_([^\s_])_(?!_)|^\*([^\s*"<\[])\*(?!\*)|^_([^\s][\s\S]*?[^\s_])_(?!_|[^\spunctuation])|^_([^\s_][\s\S]*?[^\s])_(?!_|[^\spunctuation])|^\*([^\s"<\[][\s\S]*?[^\s*])\*(?!\*)|^\*([^\s*"<\[][\s\S]*?[^\s])\*(?!\*)/,code:/^(`+)([^`]|[^`][\s\S]*?[^`])\1(?!`)/,br:/^( {2,}|\\)\n(?!\s*$)/,del:p,text:/^(`+|[^`])[\s\S]*?(?=[\\<!\[`*]|\b_| {2,}\n|$)/};y._punctuation="!\"#$%&'()*+,\\-./:;<=>?@\\[^_{|}~",y.em=l(y.em).replace(/punctuation/g,y._punctuation).getRegex(),y._escapes=/\\([!"#$%&'()*+,\-.\/:;<=>?@\[\]\\^_`{|}~])/g,y._scheme=/[a-zA-Z][a-zA-Z0-9+.-]{1,31}/,y._email=/[a-zA-Z0-9.!#$%&'*+\/=?^_`{|}~-]+(@)[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)+(?![-_])/,y.autolink=l(y.autolink).replace("scheme",y._scheme).replace("email",y._email).getRegex(),y._attribute=/\s+[a-zA-Z:_][\w.:-]*(?:\s*=\s*"[^"]*"|\s*=\s*'[^']*'|\s*=\s*[^\s"'=<>`]+)?/,y.tag=l(y.tag).replace("comment",w._comment).replace("attribute",y._attribute).getRegex(),y._label=/(?:\[[^\[\]]*\]|\\[\[\]]?|`[^`]*`|[^\[\]\\])*?/,y._href=/\s*(<(?:\\[<>]?|[^\s<>\\])*>|[^\s\x00-\x1f]*)/,y._title=/"(?:\\"?|[^"\\])*"|'(?:\\'?|[^'\\])*'|\((?:\\\)?|[^)\\])*\)/,y.link=l(y.link).replace("label",y._label).replace("href",y._href).replace("title",y._title).getRegex(),y.reflink=l(y.reflink).replace("label",y._label).getRegex(),y.normal=h({},y),y.pedantic=h({},y.normal,{strong:/^__(?=\S)([\s\S]*?\S)__(?!_)|^\*\*(?=\S)([\s\S]*?\S)\*\*(?!\*)/,em:/^_(?=\S)([\s\S]*?\S)_(?!_)|^\*(?=\S)([\s\S]*?\S)\*(?!\*)/,link:l(/^!?\[(label)\]\((.*?)\)/).replace("label",y._label).getRegex(),reflink:l(/^!?\[(label)\]\s*\[([^\]]*)\]/).replace("label",y._label).getRegex()}),y.gfm=h({},y.normal,{escape:l(y.escape).replace("])","~|])").getRegex(),_extended_email:/[A-Za-z0-9._+-]+(@)[a-zA-Z0-9-_]+(?:\.[a-zA-Z0-9-_]*[a-zA-Z0-9])+(?![-_])/,url:/^((?:ftp|https?):\/\/|www\.)(?:[a-zA-Z0-9\-]+\.?)+[^\s<]*|^email/,_backpedal:/(?:[^?!.,:;*_~()&]+|\([^)]*\)|&(?![a-zA-Z0-9]+;$)|[?!.,:;*_~)]+(?!$))+/,del:/^~+(?=\S)([\s\S]*?\S)~+/,text:l(y.text).replace("]|","~]|").replace("|$","|https?://|ftp://|www\\.|[a-zA-Z0-9.!#$%&'*+/=?^_`{\\|}~-]+@|$").getRegex()}),y.gfm.url=l(y.gfm.url,"i").replace("email",y.gfm._extended_email).getRegex(),y.breaks=h({},y.gfm,{br:l(y.br).replace("{2,}","*").getRegex(),text:l(y.gfm.text).replace("{2,}","*").getRegex()}),r.rules=y,r.output=function(e,t,n){var i=new r(t,n);return i.output(e)},r.prototype.output=function(e){for(var t,n,i,o,a,s,u="";e;)if(a=this.rules.escape.exec(e))e=e.substring(a[0].length),u+=c(a[1]);else if(a=this.rules.tag.exec(e))!this.inLink&&/^<a /i.test(a[0])?this.inLink=!0:this.inLink&&/^<\/a>/i.test(a[0])&&(this.inLink=!1),!this.inRawBlock&&/^<(pre|code|kbd|script)(\s|>)/i.test(a[0])?this.inRawBlock=!0:this.inRawBlock&&/^<\/(pre|code|kbd|script)(\s|>)/i.test(a[0])&&(this.inRawBlock=!1),e=e.substring(a[0].length),u+=this.options.sanitize?this.options.sanitizer?this.options.sanitizer(a[0]):c(a[0]):a[0];else if(a=this.rules.link.exec(e)){var l=v(a[2],"()");if(l>-1){var f=a[2].length-l;a[2]=a[2].substring(0,l),a[0]=a[0].substring(0,a[0].length-f)}e=e.substring(a[0].length),this.inLink=!0,i=a[2],this.options.pedantic?(t=/^([^'"]*[^\s])\s+(['"])(.*)\2/.exec(i),t?(i=t[1],o=t[3]):o=""):o=a[3]?a[3].slice(1,-1):"",i=i.trim().replace(/^<([\s\S]*)>$/,"$1"),u+=this.outputLink(a,{href:r.escapes(i),title:r.escapes(o)}),this.inLink=!1}else if((a=this.rules.reflink.exec(e))||(a=this.rules.nolink.exec(e))){if(e=e.substring(a[0].length),t=(a[2]||a[1]).replace(/\s+/g," "),t=this.links[t.toLowerCase()],!t||!t.href){u+=a[0].charAt(0),e=a[0].substring(1)+e;continue}this.inLink=!0,u+=this.outputLink(a,t),this.inLink=!1}else if(a=this.rules.strong.exec(e))e=e.substring(a[0].length),u+=this.renderer.strong(this.output(a[4]||a[3]||a[2]||a[1]));else if(a=this.rules.em.exec(e))e=e.substring(a[0].length),u+=this.renderer.em(this.output(a[6]||a[5]||a[4]||a[3]||a[2]||a[1]));else if(a=this.rules.code.exec(e))e=e.substring(a[0].length),u+=this.renderer.codespan(c(a[2].trim(),!0));else if(a=this.rules.br.exec(e))e=e.substring(a[0].length),u+=this.renderer.br();else if(a=this.rules.del.exec(e))e=e.substring(a[0].length),u+=this.renderer.del(this.output(a[1]));else if(a=this.rules.autolink.exec(e))e=e.substring(a[0].length),"@"===a[2]?(n=c(this.mangle(a[1])),i="mailto:"+n):(n=c(a[1]),i=n),u+=this.renderer.link(i,null,n);else if(this.inLink||!(a=this.rules.url.exec(e))){if(a=this.rules.text.exec(e))e=e.substring(a[0].length),u+=this.inRawBlock?this.renderer.text(a[0]):this.renderer.text(c(this.smartypants(a[0])));else if(e)throw new Error("Infinite loop on byte: "+e.charCodeAt(0))}else{if("@"===a[2])n=c(a[0]),i="mailto:"+n;else{do s=a[0],a[0]=this.rules._backpedal.exec(a[0])[0];while(s!==a[0]);n=c(a[0]),i="www."===a[1]?"http://"+n:n}e=e.substring(a[0].length),u+=this.renderer.link(i,null,n)}return u},r.escapes=function(e){return e?e.replace(r.rules._escapes,"$1"):e},r.prototype.outputLink=function(e,t){var n=t.href,r=t.title?c(t.title):null;return"!"!==e[0].charAt(0)?this.renderer.link(n,r,this.output(e[1])):this.renderer.image(n,r,c(e[1]))},r.prototype.smartypants=function(e){return this.options.smartypants?e.replace(/---/g,"—").replace(/--/g,"–").replace(/(^|[-\u2014\/(\[{"\s])'/g,"$1‘").replace(/'/g,"’").replace(/(^|[-\u2014\/(\[{\u2018\s])"/g,"$1“").replace(/"/g,"”").replace(/\.{3}/g,"…"):e},r.prototype.mangle=function(e){if(!this.options.mangle)return e;for(var t,n="",r=e.length,i=0;i<r;i++)t=e.charCodeAt(i),Math.random()>.5&&(t="x"+t.toString(16)),n+="&#"+t+";";return n},i.prototype.code=function(e,t,n){var r=(t||"").match(/\S*/)[0];if(this.options.highlight){var i=this.options.highlight(e,r);null!=i&&i!==e&&(n=!0,e=i)}return r?'<pre><code class="'+this.options.langPrefix+c(r,!0)+'">'+(n?e:c(e,!0))+"</code></pre>\n":"<pre><code>"+(n?e:c(e,!0))+"</code></pre>"},i.prototype.blockquote=function(e){return"<blockquote>\n"+e+"</blockquote>\n"},i.prototype.html=function(e){return e},i.prototype.heading=function(e,t,n,r){return this.options.headerIds?"<h"+t+' id="'+this.options.headerPrefix+r.slug(n)+'">'+e+"</h"+t+">\n":"<h"+t+">"+e+"</h"+t+">\n"},i.prototype.hr=function(){return this.options.xhtml?"<hr/>\n":"<hr>\n"},i.prototype.list=function(e,t,n){var r=t?"ol":"ul",i=t&&1!==n?' start="'+n+'"':"";return"<"+r+i+">\n"+e+"</"+r+">\n"},i.prototype.listitem=function(e){return"<li>"+e+"</li>\n"},i.prototype.checkbox=function(e){return"<input "+(e?'checked="" ':"")+'disabled="" type="checkbox"'+(this.options.xhtml?" /":"")+"> "},i.prototype.paragraph=function(e){return"<p>"+e+"</p>\n"},i.prototype.table=function(e,t){return t&&(t="<tbody>"+t+"</tbody>"),"<table>\n<thead>\n"+e+"</thead>\n"+t+"</table>\n"},i.prototype.tablerow=function(e){return"<tr>\n"+e+"</tr>\n"},i.prototype.tablecell=function(e,t){var n=t.header?"th":"td",r=t.align?"<"+n+' align="'+t.align+'">':"<"+n+">";return r+e+"</"+n+">\n"},i.prototype.strong=function(e){return"<strong>"+e+"</strong>"},i.prototype.em=function(e){return"<em>"+e+"</em>"},i.prototype.codespan=function(e){return"<code>"+e+"</code>"},i.prototype.br=function(){return this.options.xhtml?"<br/>":"<br>"},i.prototype.del=function(e){return"<del>"+e+"</del>"},i.prototype.link=function(e,t,n){if(e=f(this.options.sanitize,this.options.baseUrl,e),null===e)return n;var r='<a href="'+c(e)+'"';return t&&(r+=' title="'+t+'"'),r+=">"+n+"</a>"},i.prototype.image=function(e,t,n){if(e=f(this.options.sanitize,this.options.baseUrl,e),null===e)return n;var r='<img src="'+e+'" alt="'+n+'"';return t&&(r+=' title="'+t+'"'),r+=this.options.xhtml?"/>":">"},i.prototype.text=function(e){return e},o.prototype.strong=o.prototype.em=o.prototype.codespan=o.prototype.del=o.prototype.text=function(e){return e},o.prototype.link=o.prototype.image=function(e,t,n){return""+n},o.prototype.br=function(){return""},a.parse=function(e,t){var n=new a(t);return n.parse(e)},a.prototype.parse=function(e){this.inline=new r(e.links,this.options),this.inlineText=new r(e.links,h({},this.options,{renderer:new o})),this.tokens=e.reverse();for(var t="";this.next();)t+=this.tok();return t},a.prototype.next=function(){return this.token=this.tokens.pop()},a.prototype.peek=function(){return this.tokens[this.tokens.length-1]||0},a.prototype.parseText=function(){for(var e=this.token.text;"text"===this.peek().type;)e+="\n"+this.next().text;return this.inline.output(e)},a.prototype.tok=function(){switch(this.token.type){case"space":return"";case"hr":return this.renderer.hr();case"heading":return this.renderer.heading(this.inline.output(this.token.text),this.token.depth,u(this.inlineText.output(this.token.text)),this.slugger);case"code":return this.renderer.code(this.token.text,this.token.lang,this.token.escaped);case"table":var e,t,n,r,i="",o="";for(n="",e=0;e<this.token.header.length;e++)n+=this.renderer.tablecell(this.inline.output(this.token.header[e]),{header:!0,align:this.token.align[e]});for(i+=this.renderer.tablerow(n),e=0;e<this.token.cells.length;e++){for(t=this.token.cells[e],n="",r=0;r<t.length;r++)n+=this.renderer.tablecell(this.inline.output(t[r]),{header:!1,align:this.token.align[r]});o+=this.renderer.tablerow(n)}return this.renderer.table(i,o);case"blockquote_start":for(o="";"blockquote_end"!==this.next().type;)o+=this.tok();return this.renderer.blockquote(o);case"list_start":o="";for(var a=this.token.ordered,s=this.token.start;"list_end"!==this.next().type;)o+=this.tok();return this.renderer.list(o,a,s);case"list_item_start":o="";var c=this.token.loose;for(this.token.task&&(o+=this.renderer.checkbox(this.token.checked));"list_item_end"!==this.next().type;)o+=c||"text"!==this.token.type?this.tok():this.parseText();return this.renderer.listitem(o);case"html":return this.renderer.html(this.token.text);case"paragraph":return this.renderer.paragraph(this.inline.output(this.token.text));case"text":return this.renderer.paragraph(this.parseText());default:var l='Token with "'+this.token.type+'" type was not found.';if(!this.options.silent)throw new Error(l);console.log(l)}},s.prototype.slug=function(e){var t=e.toLowerCase().trim().replace(/[\u2000-\u206F\u2E00-\u2E7F\\'!"#$%&()*+,.\/:;<=>?@[\]^`{|}~]/g,"").replace(/\s/g,"-");if(this.seen.hasOwnProperty(t)){var n=t;do this.seen[n]++,t=n+"-"+this.seen[n];while(this.seen.hasOwnProperty(t))}return this.seen[t]=0,t},c.escapeTest=/[&<>"']/,c.escapeReplace=/[&<>"']/g,c.replacements={"&":"&","<":"<",">":">",'"':""","'":"'"},c.escapeTestNoEncode=/[<>"']|&(?!#?\w+;)/,c.escapeReplaceNoEncode=/[<>"']|&(?!#?\w+;)/g;var x={},k=/^$|^[a-z][a-z0-9+.-]*:|^[?#]/i;p.exec=p,b.options=b.setOptions=function(e){return h(b.defaults,e),b},b.getDefaults=function(){return{baseUrl:null,breaks:!1,gfm:!0,headerIds:!0,headerPrefix:"",highlight:null,langPrefix:"language-",mangle:!0,pedantic:!1,renderer:new i,sanitize:!1,sanitizer:null,silent:!1,smartLists:!1,smartypants:!1,tables:!0,xhtml:!1}},b.defaults=b.getDefaults(),b.Parser=a,b.parser=a.parse,b.Renderer=i,b.TextRenderer=o,b.Lexer=n,b.lexer=n.lex,b.InlineLexer=r,b.inlineLexer=r.output,b.Slugger=s,b.parse=b,e.exports=b}(this||("undefined"!=typeof window?window:t))}).call(t,function(){return this}())},function(e,t,n){"use strict";var r=n(2),i=r.each,o=r.dom,a=n(8),s=n(12),c=n(20),u=n(13),l=n(14),f=Object.assign({enabled:!1,type:"php-tar",packageName:"package",alwaysVisible:!1},l.download),d='<div id="download" class="tool">\n            <img src="'+u.image("download")+'" alt="download"/>\n        </div>',p=[],h=void 0,g=function(e){p=e.slice(0),p.length?h.show():f.alwaysVisible||h.hide()},m=function(){var e=f.type,t=f.packageName,n="shell-zip"===e?"zip":"tar";t||(t=1===p.length?p[0].label:c.getItem().label);var r={action:"download",as:t+"."+n,type:e,baseHref:c.getAbsHref(),hrefs:""};i(p,function(e,t){r["hrefs["+t+"]"]=e.absHref}),a.formRequest(r)},v=function(){f.enabled&&(h=o(d).hide().appTo("#toolbar").on("click",m),f.alwaysVisible&&h.show(),s.sub("selection",g))};v()},function(e,t,n){"use strict";var r=n(2),i=r.filter,o=r.debounce,a=r.parsePattern,s=r.dom,c=n(12),u=n(20),l=n(13),f=n(14),d=n(18),p=Object.assign({enabled:!1,advanced:!1,debounceTime:100,ignorecase:!0},f.filter),h='<div id="filter" class="tool">\n            <img src="'+l.image("filter")+'" alt="filter"/>\n            <input class="l10n_ph-filter" type="text" value=""/>\n        </div>',g=!1,m="",v=void 0,b=void 0,w=function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"";if(e!==m){if(m=e,!e)return void d.setLocation();v.addCls("pending");var t=new RegExp(e,p.ignorecase?"i":""),n=i(u.getItem().content,function(e){return t.test(e.label)});v.rmCls("pending"),d.setHint("noMatch"),d.setItems(n)}},y=function(){g?(v.addCls("active"),b[0].focus(),w(a(b.val(),p.advanced))):(w(),v.rmCls("active"))},x=function(){g=!g,y()},k=function(){g=!1,b.val(""),y()},_=function(){p.enabled&&(v=s(h).appTo("#toolbar"),b=v.find("input"),v.find("img").on("click",x),b.on("keyup",o(y,p.debounceTime)),c.sub("location.changed",k))};_()},function(e,t,n){(function(e){"use strict";var t=n(2),r=t.map,i=n(12),o=n(14),a=e.window,s=Object.assign({enabled:!1,id:"UA-000000-0"},o["google-analytics-ua"]),c=function(){!function(e,t,n,r,i,o,a){e.GoogleAnalyticsObject=i,e[i]=e[i]||function(){(e[i].q=e[i].q||[]).push(arguments)},e[i].l=1*new Date,o=t.createElement(n),a=t.getElementsByTagName(n)[0],o.async=1,o.src=r,a.parentNode.insertBefore(o,a)}(window,document,"script","//www.google-analytics.com/analytics.js","ga")},u=function(){s.enabled&&(c(),a.ga("create",s.id,"auto"),i.sub("location.changed",function(e){var t=a.location;a.ga("send","pageview",{location:t.protocol+"//"+t.host+e.absHref,title:r(e.getCrumb(),function(e){return e.label}).join(" > ")})}))};u()}).call(t,function(){return this}())},function(e,t,n){(function(e){"use strict";var t=n(33),r=n(2),i=r.isNum,o=r.dom,a=n(12),s=n(19),c=n(13),u=n(14),l=n(16),f=Object.assign({enabled:!1,show:!1,qrcode:!0,qrColor:"#999"},u.info),d='<div id="info">\n            <div class="icon"><img/></div>\n            <div class="block">\n                <div class="label"></div>\n                <div class="time"></div>\n                <div class="size"></div>\n                <div class="content">\n                    <span class="folders"></span> <span class="l10n-folders"></span>,\n                    <span class="files"></span> <span class="l10n-files"></span>\n                </div>\n            </div>\n            <div class="qrcode"/>\n        </div>',p='<div class="block">\n            <h1 class="l10n-info">Info</h1>\n            <div id="view-info" class="button view">\n                <img src="'+c.image("info-toggle")+'" alt="view-info"/>\n            </div>\n        </div>',h="ext/info",g=void 0,m=void 0,v=void 0,b=void 0,w=void 0,y=void 0,x=void 0,k=void 0,_=void 0,C=function(){l.get(h)?(o("#view-info").addCls("active"),o("#info").show()):(o("#view-info").rmCls("active"),o("#info").hide())},S=function(n){var r=n.thumbRational||n.icon,o=!!n.thumbRational;if(!n.isCurrentFolder()&&r||(r=c.icon("folder")),g.attr("src",r),o?g.addCls("thumb"):g.rmCls("thumb"),m.text(n.label),i(n.time)?v.text(s.formatDate(n.time)):v.text("."),i(n.size)?(b.text(s.formatSize(n.size)),b.show()):b.hide(),n.isContentFetched){var a=n.getStats();y.text(a.folders),x.text(a.files),w.show()}else w.hide();if(f.qrcode){var u=e.window.location;k.clr().app(t({render:"image",size:200,fill:f.qrFill,back:f.qrBack,text:u.protocol+"//"+u.host+n.absHref,crisp:!0,quiet:1}))}},A=function(e){S(e)},T=function(){S(_)},E=function(e){_=e,S(_)},M=function(){if(f.enabled){var e=o(d).hide().appTo("#mainrow");g=e.find(".icon img"),m=e.find(".label"),v=e.find(".time"),b=e.find(".size"),w=e.find(".content"),y=e.find(".folders"),x=e.find(".files"),k=e.find(".qrcode"),f.qrcode||k.rm(),o(p).appTo("#sidebar").find("#view-info").on("click",function(e){l.put(h,!l.get(h)),C(),a.pub("resize"),e.preventDefault()}),"boolean"!=typeof l.get(h)&&l.put(h,f.show),C(),a.sub("location.changed",E),a.sub("item.mouseenter",A),a.sub("item.mouseleave",T)}};M()}).call(t,function(){return this}())},function(e,t,n){var r,i,o;!function(t,n){e.exports=n()}(this,function(){return function(e){function t(r){if(n[r])return n[r].exports;var i=n[r]={exports:{},id:r,loaded:!1};return e[r].call(i.exports,i,i.exports,t),i.loaded=!0,i.exports}var n={};return t.m=e,t.c=n,t.p="",t(0)}([function(e,t,n){"use strict";var r=n(1),i=r.create_canvas,o=r.canvas_to_img,a=r.dpr,s=n(2),c=n(3),u=n(4);e.exports=function(e){var t=Object.assign({},s,e),n=c(t.text,t.ecLevel,t.minVersion,t.quiet),r=t.ratio||a,l=i(t.size,r),f=l.getContext("2d");return f.scale(r,r),u(n,f,t),"image"===t.render?o(l):l}},function(e,t){"use strict";var n=window,r=n.document,i=n.devicePixelRatio||1,o=function(e){return r.createElement(e)},a=function(e,t){return e.getAttribute(t)},s=function(e,t,n){return e.setAttribute(t,n)},c=function(e,t){var n=o("canvas");return s(n,"width",e*t),s(n,"height",e*t),n.style.width=e+"px",n.style.height=e+"px",n},u=function(e){var t=o("img");return s(t,"crossorigin","anonymous"),s(t,"src",e.toDataURL("image/png")),s(t,"width",a(e,"width")),s(t,"height",a(e,"height")),t.style.width=e.style.width,t.style.height=e.style.height,t};e.exports={create_canvas:c,canvas_to_img:u,dpr:i}},function(e,t){"use strict";e.exports={render:"image",crisp:!0,minVersion:1,ecLevel:"L",size:200,ratio:null,fill:"#333",back:"#fff",text:"no text",rounded:0,quiet:0,mode:"plain",mSize:30,mPosX:50,mPosY:50,label:"no label",fontname:"sans",fontcolor:"#333",image:null}},function(n,a){"use strict";var s="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},c=/code length overflow/i,u=function(){var n=function(){function e(t,n){if("undefined"==typeof t.length)throw new Error(t.length+"/"+n);var r=function(){for(var e=0;e<t.length&&0==t[e];)e+=1;for(var r=new Array(t.length-e+n),i=0;i<t.length-e;i+=1)r[i]=t[i+e];return r}(),i={};return i.getAt=function(e){return r[e]},i.getLength=function(){return r.length},i.multiply=function(t){for(var n=new Array(i.getLength()+t.getLength()-1),r=0;r<i.getLength();r+=1)for(var o=0;o<t.getLength();o+=1)n[r+o]^=a.gexp(a.glog(i.getAt(r))+a.glog(t.getAt(o)));return e(n,0)},i.mod=function(t){if(i.getLength()-t.getLength()<0)return i;for(var n=a.glog(i.getAt(0))-a.glog(t.getAt(0)),r=new Array(i.getLength()),o=0;o<i.getLength();o+=1)r[o]=i.getAt(o);for(var o=0;o<t.getLength();o+=1)r[o]^=a.gexp(a.glog(t.getAt(o))+n);return e(r,0).mod(t)},i}var t=function(t,n){var i=236,a=17,l=t,f=r[n],d=null,p=0,g=null,m=new Array,v={},b=function(e,t){p=4*l+17,d=function(e){for(var t=new Array(e),n=0;n<e;n+=1){t[n]=new Array(e);for(var r=0;r<e;r+=1)t[n][r]=null}return t}(p),w(0,0),w(p-7,0),w(0,p-7),k(),x(),C(e,t),l>=7&&_(e),null==g&&(g=T(l,f,m)),S(g,t)},w=function(e,t){for(var n=-1;n<=7;n+=1)if(!(e+n<=-1||p<=e+n))for(var r=-1;r<=7;r+=1)t+r<=-1||p<=t+r||(0<=n&&n<=6&&(0==r||6==r)||0<=r&&r<=6&&(0==n||6==n)||2<=n&&n<=4&&2<=r&&r<=4?d[e+n][t+r]=!0:d[e+n][t+r]=!1)},y=function(){for(var e=0,t=0,n=0;n<8;n+=1){b(!0,n);var r=o.getLostPoint(v);(0==n||e>r)&&(e=r,t=n)}return t},x=function(){for(var e=8;e<p-8;e+=1)null==d[e][6]&&(d[e][6]=e%2==0);for(var t=8;t<p-8;t+=1)null==d[6][t]&&(d[6][t]=t%2==0)},k=function(){for(var e=o.getPatternPosition(l),t=0;t<e.length;t+=1)for(var n=0;n<e.length;n+=1){var r=e[t],i=e[n];if(null==d[r][i])for(var a=-2;a<=2;a+=1)for(var s=-2;s<=2;s+=1)a==-2||2==a||s==-2||2==s||0==a&&0==s?d[r+a][i+s]=!0:d[r+a][i+s]=!1}},_=function(e){for(var t=o.getBCHTypeNumber(l),n=0;n<18;n+=1){var r=!e&&1==(t>>n&1);d[Math.floor(n/3)][n%3+p-8-3]=r}for(var n=0;n<18;n+=1){var r=!e&&1==(t>>n&1);d[n%3+p-8-3][Math.floor(n/3)]=r}},C=function(e,t){for(var n=f<<3|t,r=o.getBCHTypeInfo(n),i=0;i<15;i+=1){var a=!e&&1==(r>>i&1);i<6?d[i][8]=a:i<8?d[i+1][8]=a:d[p-15+i][8]=a}for(var i=0;i<15;i+=1){var a=!e&&1==(r>>i&1);i<8?d[8][p-i-1]=a:i<9?d[8][15-i-1+1]=a:d[8][15-i-1]=a}d[p-8][8]=!e},S=function(e,t){for(var n=-1,r=p-1,i=7,a=0,s=o.getMaskFunction(t),c=p-1;c>0;c-=2)for(6==c&&(c-=1);;){for(var u=0;u<2;u+=1)if(null==d[r][c-u]){var l=!1;a<e.length&&(l=1==(e[a]>>>i&1));var f=s(r,c-u);f&&(l=!l),d[r][c-u]=l,i-=1,i==-1&&(a+=1,i=7)}if(r+=n,r<0||p<=r){r-=n,n=-n;break}}},A=function(t,n){for(var r=0,i=0,a=0,s=new Array(n.length),c=new Array(n.length),u=0;u<n.length;u+=1){var l=n[u].dataCount,f=n[u].totalCount-l;i=Math.max(i,l),a=Math.max(a,f),s[u]=new Array(l);for(var d=0;d<s[u].length;d+=1)s[u][d]=255&t.getBuffer()[d+r];r+=l;var p=o.getErrorCorrectPolynomial(f),h=e(s[u],p.getLength()-1),g=h.mod(p);c[u]=new Array(p.getLength()-1);for(var d=0;d<c[u].length;d+=1){var m=d+g.getLength()-c[u].length;c[u][d]=m>=0?g.getAt(m):0}}for(var v=0,d=0;d<n.length;d+=1)v+=n[d].totalCount;for(var b=new Array(v),w=0,d=0;d<i;d+=1)for(var u=0;u<n.length;u+=1)d<s[u].length&&(b[w]=s[u][d],w+=1);for(var d=0;d<a;d+=1)for(var u=0;u<n.length;u+=1)d<c[u].length&&(b[w]=c[u][d],w+=1);return b},T=function(e,t,n){for(var r=s.getRSBlocks(e,t),u=c(),l=0;l<n.length;l+=1){var f=n[l];u.put(f.getMode(),4),u.put(f.getLength(),o.getLengthInBits(f.getMode(),e)),f.write(u)}for(var d=0,l=0;l<r.length;l+=1)d+=r[l].dataCount;if(u.getLengthInBits()>8*d)throw new Error("code length overflow. ("+u.getLengthInBits()+">"+8*d+")");for(u.getLengthInBits()+4<=8*d&&u.put(0,4);u.getLengthInBits()%8!=0;)u.putBit(!1);for(;!(u.getLengthInBits()>=8*d)&&(u.put(i,8),!(u.getLengthInBits()>=8*d));)u.put(a,8);return A(u,r)};return v.addData=function(e){var t=u(e);m.push(t),g=null},v.isDark=function(e,t){if(e<0||p<=e||t<0||p<=t)throw new Error(e+","+t);return d[e][t]},v.getModuleCount=function(){return p},v.make=function(){b(!1,y())},v.createTableTag=function(e,t){e=e||2,t="undefined"==typeof t?4*e:t;var n="";n+='<table style="',n+=" border-width: 0px; border-style: none;",n+=" border-collapse: collapse;",n+=" padding: 0px; margin: "+t+"px;",n+='">',n+="<tbody>";for(var r=0;r<v.getModuleCount();r+=1){n+="<tr>";for(var i=0;i<v.getModuleCount();i+=1)n+='<td style="',n+=" border-width: 0px; border-style: none;",n+=" border-collapse: collapse;",n+=" padding: 0px; margin: 0px;",n+=" width: "+e+"px;",n+=" height: "+e+"px;",n+=" background-color: ",n+=v.isDark(r,i)?"#000000":"#ffffff",n+=";",n+='"/>';n+="</tr>"}return n+="</tbody>",n+="</table>"},v.createImgTag=function(e,t){e=e||2,t="undefined"==typeof t?4*e:t;var n=v.getModuleCount()*e+2*t,r=t,i=n-t;return h(n,n,function(t,n){if(r<=t&&t<i&&r<=n&&n<i){var o=Math.floor((t-r)/e),a=Math.floor((n-r)/e);
-return v.isDark(a,o)?0:1}return 1})},v};t.stringToBytes=function(e){for(var t=new Array,n=0;n<e.length;n+=1){var r=e.charCodeAt(n);t.push(255&r)}return t},t.createStringToBytes=function(e,t){var n=function(){for(var n=d(e),r=function(){var e=n.read();if(e==-1)throw new Error;return e},i=0,o={};;){var a=n.read();if(a==-1)break;var s=r(),c=r(),u=r(),l=String.fromCharCode(a<<8|s),f=c<<8|u;o[l]=f,i+=1}if(i!=t)throw new Error(i+" != "+t);return o}(),r="?".charCodeAt(0);return function(e){for(var t=new Array,i=0;i<e.length;i+=1){var o=e.charCodeAt(i);if(o<128)t.push(o);else{var a=n[e.charAt(i)];"number"==typeof a?(255&a)==a?t.push(a):(t.push(a>>>8),t.push(255&a)):t.push(r)}}return t}};var n={MODE_NUMBER:1,MODE_ALPHA_NUM:2,MODE_8BIT_BYTE:4,MODE_KANJI:8},r={L:1,M:0,Q:3,H:2},i={PATTERN000:0,PATTERN001:1,PATTERN010:2,PATTERN011:3,PATTERN100:4,PATTERN101:5,PATTERN110:6,PATTERN111:7},o=function(){var t=[[],[6,18],[6,22],[6,26],[6,30],[6,34],[6,22,38],[6,24,42],[6,26,46],[6,28,50],[6,30,54],[6,32,58],[6,34,62],[6,26,46,66],[6,26,48,70],[6,26,50,74],[6,30,54,78],[6,30,56,82],[6,30,58,86],[6,34,62,90],[6,28,50,72,94],[6,26,50,74,98],[6,30,54,78,102],[6,28,54,80,106],[6,32,58,84,110],[6,30,58,86,114],[6,34,62,90,118],[6,26,50,74,98,122],[6,30,54,78,102,126],[6,26,52,78,104,130],[6,30,56,82,108,134],[6,34,60,86,112,138],[6,30,58,86,114,142],[6,34,62,90,118,146],[6,30,54,78,102,126,150],[6,24,50,76,102,128,154],[6,28,54,80,106,132,158],[6,32,58,84,110,136,162],[6,26,54,82,110,138,166],[6,30,58,86,114,142,170]],r=1335,o=7973,s=21522,c={},u=function(e){for(var t=0;0!=e;)t+=1,e>>>=1;return t};return c.getBCHTypeInfo=function(e){for(var t=e<<10;u(t)-u(r)>=0;)t^=r<<u(t)-u(r);return(e<<10|t)^s},c.getBCHTypeNumber=function(e){for(var t=e<<12;u(t)-u(o)>=0;)t^=o<<u(t)-u(o);return e<<12|t},c.getPatternPosition=function(e){return t[e-1]},c.getMaskFunction=function(e){switch(e){case i.PATTERN000:return function(e,t){return(e+t)%2==0};case i.PATTERN001:return function(e,t){return e%2==0};case i.PATTERN010:return function(e,t){return t%3==0};case i.PATTERN011:return function(e,t){return(e+t)%3==0};case i.PATTERN100:return function(e,t){return(Math.floor(e/2)+Math.floor(t/3))%2==0};case i.PATTERN101:return function(e,t){return e*t%2+e*t%3==0};case i.PATTERN110:return function(e,t){return(e*t%2+e*t%3)%2==0};case i.PATTERN111:return function(e,t){return(e*t%3+(e+t)%2)%2==0};default:throw new Error("bad maskPattern:"+e)}},c.getErrorCorrectPolynomial=function(t){for(var n=e([1],0),r=0;r<t;r+=1)n=n.multiply(e([1,a.gexp(r)],0));return n},c.getLengthInBits=function(e,t){if(1<=t&&t<10)switch(e){case n.MODE_NUMBER:return 10;case n.MODE_ALPHA_NUM:return 9;case n.MODE_8BIT_BYTE:return 8;case n.MODE_KANJI:return 8;default:throw new Error("mode:"+e)}else if(t<27)switch(e){case n.MODE_NUMBER:return 12;case n.MODE_ALPHA_NUM:return 11;case n.MODE_8BIT_BYTE:return 16;case n.MODE_KANJI:return 10;default:throw new Error("mode:"+e)}else{if(!(t<41))throw new Error("type:"+t);switch(e){case n.MODE_NUMBER:return 14;case n.MODE_ALPHA_NUM:return 13;case n.MODE_8BIT_BYTE:return 16;case n.MODE_KANJI:return 12;default:throw new Error("mode:"+e)}}},c.getLostPoint=function(e){for(var t=e.getModuleCount(),n=0,r=0;r<t;r+=1)for(var i=0;i<t;i+=1){for(var o=0,a=e.isDark(r,i),s=-1;s<=1;s+=1)if(!(r+s<0||t<=r+s))for(var c=-1;c<=1;c+=1)i+c<0||t<=i+c||0==s&&0==c||a==e.isDark(r+s,i+c)&&(o+=1);o>5&&(n+=3+o-5)}for(var r=0;r<t-1;r+=1)for(var i=0;i<t-1;i+=1){var u=0;e.isDark(r,i)&&(u+=1),e.isDark(r+1,i)&&(u+=1),e.isDark(r,i+1)&&(u+=1),e.isDark(r+1,i+1)&&(u+=1),0!=u&&4!=u||(n+=3)}for(var r=0;r<t;r+=1)for(var i=0;i<t-6;i+=1)e.isDark(r,i)&&!e.isDark(r,i+1)&&e.isDark(r,i+2)&&e.isDark(r,i+3)&&e.isDark(r,i+4)&&!e.isDark(r,i+5)&&e.isDark(r,i+6)&&(n+=40);for(var i=0;i<t;i+=1)for(var r=0;r<t-6;r+=1)e.isDark(r,i)&&!e.isDark(r+1,i)&&e.isDark(r+2,i)&&e.isDark(r+3,i)&&e.isDark(r+4,i)&&!e.isDark(r+5,i)&&e.isDark(r+6,i)&&(n+=40);for(var l=0,i=0;i<t;i+=1)for(var r=0;r<t;r+=1)e.isDark(r,i)&&(l+=1);var f=Math.abs(100*l/t/t-50)/5;return n+=10*f},c}(),a=function(){for(var e=new Array(256),t=new Array(256),n=0;n<8;n+=1)e[n]=1<<n;for(var n=8;n<256;n+=1)e[n]=e[n-4]^e[n-5]^e[n-6]^e[n-8];for(var n=0;n<255;n+=1)t[e[n]]=n;var r={};return r.glog=function(e){if(e<1)throw new Error("glog("+e+")");return t[e]},r.gexp=function(t){for(;t<0;)t+=255;for(;t>=256;)t-=255;return e[t]},r}(),s=function(){var e=[[1,26,19],[1,26,16],[1,26,13],[1,26,9],[1,44,34],[1,44,28],[1,44,22],[1,44,16],[1,70,55],[1,70,44],[2,35,17],[2,35,13],[1,100,80],[2,50,32],[2,50,24],[4,25,9],[1,134,108],[2,67,43],[2,33,15,2,34,16],[2,33,11,2,34,12],[2,86,68],[4,43,27],[4,43,19],[4,43,15],[2,98,78],[4,49,31],[2,32,14,4,33,15],[4,39,13,1,40,14],[2,121,97],[2,60,38,2,61,39],[4,40,18,2,41,19],[4,40,14,2,41,15],[2,146,116],[3,58,36,2,59,37],[4,36,16,4,37,17],[4,36,12,4,37,13],[2,86,68,2,87,69],[4,69,43,1,70,44],[6,43,19,2,44,20],[6,43,15,2,44,16],[4,101,81],[1,80,50,4,81,51],[4,50,22,4,51,23],[3,36,12,8,37,13],[2,116,92,2,117,93],[6,58,36,2,59,37],[4,46,20,6,47,21],[7,42,14,4,43,15],[4,133,107],[8,59,37,1,60,38],[8,44,20,4,45,21],[12,33,11,4,34,12],[3,145,115,1,146,116],[4,64,40,5,65,41],[11,36,16,5,37,17],[11,36,12,5,37,13],[5,109,87,1,110,88],[5,65,41,5,66,42],[5,54,24,7,55,25],[11,36,12,7,37,13],[5,122,98,1,123,99],[7,73,45,3,74,46],[15,43,19,2,44,20],[3,45,15,13,46,16],[1,135,107,5,136,108],[10,74,46,1,75,47],[1,50,22,15,51,23],[2,42,14,17,43,15],[5,150,120,1,151,121],[9,69,43,4,70,44],[17,50,22,1,51,23],[2,42,14,19,43,15],[3,141,113,4,142,114],[3,70,44,11,71,45],[17,47,21,4,48,22],[9,39,13,16,40,14],[3,135,107,5,136,108],[3,67,41,13,68,42],[15,54,24,5,55,25],[15,43,15,10,44,16],[4,144,116,4,145,117],[17,68,42],[17,50,22,6,51,23],[19,46,16,6,47,17],[2,139,111,7,140,112],[17,74,46],[7,54,24,16,55,25],[34,37,13],[4,151,121,5,152,122],[4,75,47,14,76,48],[11,54,24,14,55,25],[16,45,15,14,46,16],[6,147,117,4,148,118],[6,73,45,14,74,46],[11,54,24,16,55,25],[30,46,16,2,47,17],[8,132,106,4,133,107],[8,75,47,13,76,48],[7,54,24,22,55,25],[22,45,15,13,46,16],[10,142,114,2,143,115],[19,74,46,4,75,47],[28,50,22,6,51,23],[33,46,16,4,47,17],[8,152,122,4,153,123],[22,73,45,3,74,46],[8,53,23,26,54,24],[12,45,15,28,46,16],[3,147,117,10,148,118],[3,73,45,23,74,46],[4,54,24,31,55,25],[11,45,15,31,46,16],[7,146,116,7,147,117],[21,73,45,7,74,46],[1,53,23,37,54,24],[19,45,15,26,46,16],[5,145,115,10,146,116],[19,75,47,10,76,48],[15,54,24,25,55,25],[23,45,15,25,46,16],[13,145,115,3,146,116],[2,74,46,29,75,47],[42,54,24,1,55,25],[23,45,15,28,46,16],[17,145,115],[10,74,46,23,75,47],[10,54,24,35,55,25],[19,45,15,35,46,16],[17,145,115,1,146,116],[14,74,46,21,75,47],[29,54,24,19,55,25],[11,45,15,46,46,16],[13,145,115,6,146,116],[14,74,46,23,75,47],[44,54,24,7,55,25],[59,46,16,1,47,17],[12,151,121,7,152,122],[12,75,47,26,76,48],[39,54,24,14,55,25],[22,45,15,41,46,16],[6,151,121,14,152,122],[6,75,47,34,76,48],[46,54,24,10,55,25],[2,45,15,64,46,16],[17,152,122,4,153,123],[29,74,46,14,75,47],[49,54,24,10,55,25],[24,45,15,46,46,16],[4,152,122,18,153,123],[13,74,46,32,75,47],[48,54,24,14,55,25],[42,45,15,32,46,16],[20,147,117,4,148,118],[40,75,47,7,76,48],[43,54,24,22,55,25],[10,45,15,67,46,16],[19,148,118,6,149,119],[18,75,47,31,76,48],[34,54,24,34,55,25],[20,45,15,61,46,16]],t=function(e,t){var n={};return n.totalCount=e,n.dataCount=t,n},n={},i=function(t,n){switch(n){case r.L:return e[4*(t-1)+0];case r.M:return e[4*(t-1)+1];case r.Q:return e[4*(t-1)+2];case r.H:return e[4*(t-1)+3];default:return}};return n.getRSBlocks=function(e,n){var r=i(e,n);if("undefined"==typeof r)throw new Error("bad rs block @ typeNumber:"+e+"/errorCorrectLevel:"+n);for(var o=r.length/3,a=new Array,s=0;s<o;s+=1)for(var c=r[3*s+0],u=r[3*s+1],l=r[3*s+2],f=0;f<c;f+=1)a.push(t(u,l));return a},n}(),c=function(){var e=new Array,t=0,n={};return n.getBuffer=function(){return e},n.getAt=function(t){var n=Math.floor(t/8);return 1==(e[n]>>>7-t%8&1)},n.put=function(e,t){for(var r=0;r<t;r+=1)n.putBit(1==(e>>>t-r-1&1))},n.getLengthInBits=function(){return t},n.putBit=function(n){var r=Math.floor(t/8);e.length<=r&&e.push(0),n&&(e[r]|=128>>>t%8),t+=1},n},u=function(e){var r=n.MODE_8BIT_BYTE,i=t.stringToBytes(e),o={};return o.getMode=function(){return r},o.getLength=function(e){return i.length},o.write=function(e){for(var t=0;t<i.length;t+=1)e.put(i[t],8)},o},l=function(){var e=new Array,t={};return t.writeByte=function(t){e.push(255&t)},t.writeShort=function(e){t.writeByte(e),t.writeByte(e>>>8)},t.writeBytes=function(e,n,r){n=n||0,r=r||e.length;for(var i=0;i<r;i+=1)t.writeByte(e[i+n])},t.writeString=function(e){for(var n=0;n<e.length;n+=1)t.writeByte(e.charCodeAt(n))},t.toByteArray=function(){return e},t.toString=function(){var t="";t+="[";for(var n=0;n<e.length;n+=1)n>0&&(t+=","),t+=e[n];return t+="]"},t},f=function(){var e=0,t=0,n=0,r="",i={},o=function(e){r+=String.fromCharCode(a(63&e))},a=function(e){if(e<0);else{if(e<26)return 65+e;if(e<52)return 97+(e-26);if(e<62)return 48+(e-52);if(62==e)return 43;if(63==e)return 47}throw new Error("n:"+e)};return i.writeByte=function(r){for(e=e<<8|255&r,t+=8,n+=1;t>=6;)o(e>>>t-6),t-=6},i.flush=function(){if(t>0&&(o(e<<6-t),e=0,t=0),n%3!=0)for(var i=3-n%3,a=0;a<i;a+=1)r+="="},i.toString=function(){return r},i},d=function(e){var t=e,n=0,r=0,i=0,o={};o.read=function(){for(;i<8;){if(n>=t.length){if(0==i)return-1;throw new Error("unexpected end of file./"+i)}var e=t.charAt(n);if(n+=1,"="==e)return i=0,-1;e.match(/^\s$/)||(r=r<<6|a(e.charCodeAt(0)),i+=6)}var o=r>>>i-8&255;return i-=8,o};var a=function(e){if(65<=e&&e<=90)return e-65;if(97<=e&&e<=122)return e-97+26;if(48<=e&&e<=57)return e-48+52;if(43==e)return 62;if(47==e)return 63;throw new Error("c:"+e)};return o},p=function(e,t){var n=e,r=t,i=new Array(e*t),o={};o.setPixel=function(e,t,r){i[t*n+e]=r},o.write=function(e){e.writeString("GIF87a"),e.writeShort(n),e.writeShort(r),e.writeByte(128),e.writeByte(0),e.writeByte(0),e.writeByte(0),e.writeByte(0),e.writeByte(0),e.writeByte(255),e.writeByte(255),e.writeByte(255),e.writeString(","),e.writeShort(0),e.writeShort(0),e.writeShort(n),e.writeShort(r),e.writeByte(0);var t=2,i=s(t);e.writeByte(t);for(var o=0;i.length-o>255;)e.writeByte(255),e.writeBytes(i,o,255),o+=255;e.writeByte(i.length-o),e.writeBytes(i,o,i.length-o),e.writeByte(0),e.writeString(";")};var a=function(e){var t=e,n=0,r=0,i={};return i.write=function(e,i){if(e>>>i!=0)throw new Error("length over");for(;n+i>=8;)t.writeByte(255&(e<<n|r)),i-=8-n,e>>>=8-n,r=0,n=0;r|=e<<n,n+=i},i.flush=function(){n>0&&t.writeByte(r)},i},s=function(e){for(var t=1<<e,n=(1<<e)+1,r=e+1,o=c(),s=0;s<t;s+=1)o.add(String.fromCharCode(s));o.add(String.fromCharCode(t)),o.add(String.fromCharCode(n));var u=l(),f=a(u);f.write(t,r);var d=0,p=String.fromCharCode(i[d]);for(d+=1;d<i.length;){var h=String.fromCharCode(i[d]);d+=1,o.contains(p+h)?p+=h:(f.write(o.indexOf(p),r),o.size()<4095&&(o.size()==1<<r&&(r+=1),o.add(p+h)),p=h)}return f.write(o.indexOf(p),r),f.write(n,r),f.flush(),u.toByteArray()},c=function(){var e={},t=0,n={};return n.add=function(r){if(n.contains(r))throw new Error("dup key:"+r);e[r]=t,t+=1},n.size=function(){return t},n.indexOf=function(t){return e[t]},n.contains=function(t){return"undefined"!=typeof e[t]},n};return o},h=function(e,t,n,r){for(var i=p(e,t),o=0;o<t;o+=1)for(var a=0;a<e;a+=1)i.setPixel(a,o,n(a,o));var s=l();i.write(s);for(var c=f(),u=s.toByteArray(),d=0;d<u.length;d+=1)c.writeByte(u[d]);c.flush();var h="";return h+="<img",h+=' src="',h+="data:image/gif;base64,",h+=c,h+='"',h+=' width="',h+=e,h+='"',h+=' height="',h+=t,h+='"',r&&(h+=' alt="',h+=r,h+='"'),h+="/>"};return t}();return function(n){i=[],r=n,o="function"==typeof r?r.apply(t,i):r,!(void 0!==o&&(e.exports=o))}(function(){return n}),!function(e){e.stringToBytes=function(e){function t(e){for(var t=[],n=0;n<e.length;n++){var r=e.charCodeAt(n);r<128?t.push(r):r<2048?t.push(192|r>>6,128|63&r):r<55296||r>=57344?t.push(224|r>>12,128|r>>6&63,128|63&r):(n++,r=65536+((1023&r)<<10|1023&e.charCodeAt(n)),t.push(240|r>>18,128|r>>12&63,128|r>>6&63,128|63&r))}return t}return t(e)}}(n),n}(),l=function(e,t){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:1;n=Math.max(1,n);for(var r=n;r<=40;r+=1)try{var i=function(){var n=u(r,t);n.addData(e),n.make();var i=n.getModuleCount(),o=function(e,t){return e>=0&&e<i&&t>=0&&t<i&&n.isDark(e,t)};return{v:{text:e,level:t,version:r,moduleCount:i,isDark:o}}}();if("object"===("undefined"==typeof i?"undefined":s(i)))return i.v}catch(e){if(!(r<40&&c.test(e.message)))throw e}return null},f=function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"",t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"L",n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:1,r=arguments.length>3&&void 0!==arguments[3]?arguments[3]:0,i=l(e,t,n);if(i){var o=i.isDark;i.moduleCount+=2*r,i.isDark=function(e,t){return o(e-r,t-r)}}return i};n.exports=f},function(e,t,n){"use strict";var r=n(5),i=n(6),o=function(e,t){e.fillStyle=t.back,e.fillRect(0,0,t.size,t.size)},a=function(e,t,n,r,i,o){e.isDark(i,o)&&t.rect(o*r,i*r,r,r)},s=function(e,t,n){if(e){var i=n.rounded>0&&n.rounded<=100?r:a,o=e.moduleCount,s=n.size/o,c=0;n.crisp&&(s=Math.floor(s),c=Math.floor((n.size-s*o)/2)),t.translate(c,c),t.beginPath();for(var u=0;u<o;u+=1)for(var l=0;l<o;l+=1)i(e,t,n,s,u,l);t.fillStyle=n.fill,t.fill(),t.translate(-c,-c)}},c=function(e,t,n){o(t,n),s(e,t,n),i(t,n)};e.exports=c},function(e,t){"use strict";var n=function(e){return{c:e,m:function(){var e;return(e=this.c).moveTo.apply(e,arguments),this},l:function(){var e;return(e=this.c).lineTo.apply(e,arguments),this},a:function(){var e;return(e=this.c).arcTo.apply(e,arguments),this}}},r=function(e,t,n,r,i,o,a,s,c,u){a?e.m(t+o,n):e.m(t,n),s?e.l(r-o,n).a(r,n,r,i,o):e.l(r,n),c?e.l(r,i-o).a(r,i,t,i,o):e.l(r,i),u?e.l(t+o,i).a(t,i,t,n,o):e.l(t,i),a?e.l(t,n+o).a(t,n,r,n,o):e.l(t,n)},i=function(e,t,n,r,i,o,a,s,c,u){a&&e.m(t+o,n).l(t,n).l(t,n+o).a(t,n,t+o,n,o),s&&e.m(r-o,n).l(r,n).l(r,n+o).a(r,n,r-o,n,o),c&&e.m(r-o,i).l(r,i).l(r,i-o).a(r,i,r-o,i,o),u&&e.m(t+o,i).l(t,i).l(t,i-o).a(t,i,t+o,i,o)},o=function(e,t,o,a,s,c){var u=c*a,l=s*a,f=u+a,d=l+a,p=.005*o.rounded*a,h=e.isDark,g=s-1,m=s+1,v=c-1,b=c+1,w=h(s,c),y=h(g,v),x=h(g,c),k=h(g,b),_=h(s,b),C=h(m,b),S=h(m,c),A=h(m,v),T=h(s,v);t=n(t),w?r(t,u,l,f,d,p,!x&&!T,!x&&!_,!S&&!_,!S&&!T):i(t,u,l,f,d,p,x&&T&&y,x&&_&&k,S&&_&&C,S&&T&&A)};e.exports=o},function(e,t){"use strict";var n=function(e,t){var n=t.size,r="bold "+.01*t.mSize*n+"px "+t.fontname;e.strokeStyle=t.back,e.lineWidth=.01*t.mSize*n*.1,e.fillStyle=t.fontcolor,e.font=r;var i=e.measureText(t.label).width,o=.01*t.mSize,a=i/n,s=(1-a)*t.mPosX*.01,c=(1-o)*t.mPosY*.01,u=s*n,l=c*n+.75*t.mSize*.01*n;e.strokeText(t.label,u,l),e.fillText(t.label,u,l)},r=function(e,t){var n=t.size,r=t.image.naturalWidth||1,i=t.image.naturalHeight||1,o=.01*t.mSize,a=o*r/i,s=(1-a)*t.mPosX*.01,c=(1-o)*t.mPosY*.01,u=s*n,l=c*n,f=a*n,d=o*n;e.draw_image(t.image,u,l,f,d)},i=function(e,t){var i=t.mode;"label"===i?n(e,t):"image"===i&&r(e,t)};e.exports=i}])})},function(e,t,n){(function(e){"use strict";var t=n(2),r=t.each,i=t.isStr,o=t.dom,a=n(8),s=n(12),c=n(19),u=n(35),l=n(14),f=n(16),d=e.window,p=Object.assign({enabled:!1,lang:"en",useBrowserLang:!0},l.l10n),h={isoCode:"en",lang:"english",dateFormat:"YYYY-MM-DD HH:mm",details:"details",download:"download",empty:"empty",files:"files",filter:"filter",folders:"folders",grid:"grid",icons:"icons",language:"Language",lastModified:"Last modified",name:"Name",noMatch:"no match",parentDirectory:"Parent Directory",search:"search",size:"Size",tree:"Tree",view:"View"},g='<div class="block">\n            <h1 class="l10n-language">Language</h1>\n            <div class="select">\n                <select id="langs"/>\n            </div>\n        </div>',m="<option/>",v="ext/l10n",b={en:Object.assign({},h)},w=b.en,y=function(e){e&&(w=e);var t="selected";o("#langs option").rmAttr(t).rmProp(t),o("#langs ."+w.isoCode).attr(t,"").prop(t,!0),r(w,function(e,t){o(".l10n-"+t).text(e),o(".l10n_ph-"+t).attr("placeholder",e)}),c.setDefaultDateFormat(w.dateFormat),o("#items .item").each(function(e){o(e).find(".date").text(c.formatDate(e._item.time))})},x=function(e){return b[e]?Promise.resolve(b[e]):a.request({action:"get",l10n:[e]}).then(function(t){return b[e]=Object.assign({},h,t.l10n&&t.l10n[e],{isoCode:e}),b[e]})},k=function(e,t,n){var r=f.get(v);if(e[r])t=r;else if(n){var i=d.navigator.language||d.navigator.browserLanguage;i&&(e[i]?t=i:i.length>2&&e[i.substr(0,2)]&&(t=i.substr(0,2)))}e[t]||(t="en"),x(t).then(y)},_=function(e){var t=o(g),n=t.find("select").on("change",function(t){var n=t.target.value;f.put(v,n),k(e,n,!1)});r(e,function(e,t){o(m).attr("value",t).addCls(t).text(t+" - "+(i(e)?e:e.lang)).appTo(n)}),t.appTo("#sidebar")},C=function(){p.enabled&&_(u),s.sub("view.changed",function(){k(u,p.lang,p.useBrowserLang)})};C()}).call(t,function(){return this}())},function(e,t,n){"use strict";var r=n(7),i=r.langs;e.exports=Object.assign({},i)},function(e,t,n){(function(e){"use strict";var t=n(2),r=t.dom,i=t.awaitLoad,o=n(12),a=n(14),s=e.window,c=Object.assign({enabled:!1,baseURL:"not-set",idSite:0},a["piwik-analytics"]),u=function(){if(c.enabled){var e=("https:"===s.location.protocol?"https://":"http://")+c.baseURL+"/",t=[],n=null;r("<script></script>").attr("src",e+"piwik.js").appTo("body"),i().then(function(){if(n=s.Piwik&&s.Piwik.getTracker(e+"piwik.php",c.idSite))for(n.enableLinkTracking();t.length;)n.trackPageView(t.shift())}),o.sub("location.changed",function(e){var r=e.getCrumb().map(function(e){return e.label}).join(" > ");n?n.trackPageView(r):t.push(r)})}};u()}).call(t,function(){return this}())},function(e,t,n){"use strict";n(38),n(39),n(40),n(41),n(43)},function(e,t,n){(function(t){"use strict";var r=n(2),i=r.each,o=r.isFn,a=r.dom,s=r.includes,c=r.compact,u=n(12),l=n(13),f=n(14),d=n(16),p=t.window,h=Object.assign({enabled:!0},f.preview),g='<div id="pv-overlay">\n            <div id="pv-container"></div>\n            <div id="pv-spinner"><img class="back"/><img class="spinner" src="'+l.image("spinner")+'"/></div>\n            <div id="pv-prev-area" class="hof"><img src="'+l.image("preview-prev")+'"/></div>\n            <div id="pv-next-area" class="hof"><img src="'+l.image("preview-next")+'"/></div>\n            <div id="pv-bottombar" class="clearfix hof">\n                <ul id="pv-buttons">\n                    <li id="pv-bar-close" class="bar-right bar-button"><img src="'+l.image("preview-close")+'"/></li>\n                    <li id="pv-bar-raw" class="bar-right"><a class="bar-button" target="_blank"><img src="'+l.image("preview-raw")+'"/></a></li>\n                    <li id="pv-bar-fullscreen" class="bar-right bar-button"><img src="'+l.image("preview-fullscreen")+'"/></li>\n                    <li id="pv-bar-next" class="bar-right bar-button"><img src="'+l.image("preview-next")+'"/></li>\n                    <li id="pv-bar-idx" class="bar-right bar-label"></li>\n                    <li id="pv-bar-prev" class="bar-right bar-button"><img src="'+l.image("preview-prev")+'"/></li>\n                </ul>\n            </div>\n        </div>',m="ext/preview",v=d.get(m)||!1,b=null,w=!1,y=null,x=null,k=function(){var e=a("#pv-container"),t=e[0],n=e.children()[0];if(t&&n){var r=t.offsetWidth,i=t.offsetHeight,o=n.offsetWidth,s=n.offsetHeight;a(n).css({left:.5*(r-o)+"px",top:.5*(i-s)+"px"})}},_=function(){var e=p.document.documentElement,t=e.clientWidth,n=e.clientHeight,r=v?0:20,i=v?0:48;a("#pv-container").css({width:t-2*r+"px",height:n-2*r-i+"px",left:r+"px",top:r+"px"}),a("#pv-spinner").css({left:.5*t+"px",top:.5*n+"px"}),v?(a("#pv-overlay").addCls("fullscreen"),a("#pv-bar-fullscreen").find("img").attr("src",l.image("preview-no-fullscreen"))):(a("#pv-overlay").rmCls("fullscreen"),a("#pv-bar-fullscreen").find("img").attr("src",l.image("preview-fullscreen"))),k(),o(x&&x.adjust)&&x.adjust()},C=function(e,t){a("#pv-bar-idx").text(e+"/"+t).show()},S=function(e){a("#pv-bar-raw").show().find("a").attr("href",e)},A=function(e){a("#pv-buttons .bar-left").rm(),i(e,function(e){a("<li></li>").addCls("bar-left").addCls("bar-label").text(e).appTo("#pv-buttons")})},T=function(){var e=a("#pv-overlay .hof");p.clearTimeout(b),e.show(),v&&(b=p.setTimeout(function(){return e.hide()},2e3))},E=function(){return x&&x.moveIdx(1)},M=function(){return x&&x.moveIdx(-1)},D=function(){v=!v,d.put(m,v),T(),_()},P=function(e){e.stopPropagation(),e.preventDefault()},z=function(e){var t=e.keyCode;27===t?(P(e),$()):8===t||37===t?(P(e),M()):13===t||32===t||39===t?(P(e),E()):70===t&&(P(e),D())},L=function(){A([]),a("#pv-container").clr(),a("#pv-overlay").show(),a(p).on("keydown",z),_()},$=function(){A([]),a("#pv-container").clr(),a("#pv-overlay").hide(),a(p).off("keydown",z)},H=function e(t,n,r){p.clearTimeout(y);var i=a("#pv-spinner");if(!t)return w=!1,void i.hide();if(!w&&r)return void(y=p.setTimeout(function(){return e(!0,n)},r));var o=i.find(".back");n?o.attr("src",n).show():o.hide(),w=!0,i.show()},O=function e(t,n,r,i){var o=Object.assign(Object.create(e.prototype),{items:t,load:r,adjust:i});return o.setIdx(n),o};O.prototype={setIdx:function(e){var t=this;this.idx=(e+this.items.length)%this.items.length,this.item=this.items[this.idx],C(this.idx+1,this.items.length),S(this.item.absHref),A([this.item.label]);var n=this.item;Promise.resolve().then(function(){i(a("#pv-container *"),function(e){"function"==typeof e.unload&&e.unload()}),a("#pv-container").hide().clr(),H(!0,n.thumbSquare||n.icon,200)}).then(function(){return t.load(n)}).then(function(e){n===t.item&&(a("#pv-container").clr().app(e).show(),H(!1),_())})},moveIdx:function(e){this.setIdx(this.idx+e)}};var B=function(e,t,n){var r=function(r){r.$view&&s(e,r.type)&&r.$view.find("a").on("click",function(i){i.preventDefault();var o=c(a("#items .item").map(function(t){var n=t._item;return s(e,n.type)?n:null}));x=O(o,o.indexOf(r),t,n),L()})};u.sub("view.changed",function(e){return i(e,r)})},R=function(){h.enabled&&(a(g).hide().appTo("body").on("keydown",z).on("mousemove",T).on("mousedown",T).on("click",function(e){"pv-overlay"!==e.target.id&&"pv-container"!==e.target.id||$()}).on("mousedown",P).on("mousemove",P).on("keydown",P).on("keypress",P),a("#pv-spinner").hide(),a("#pv-bar-prev, #pv-prev-area").on("click",M),a("#pv-bar-next, #pv-next-area").on("click",E),a("#pv-bar-close").on("click",$),a("#pv-bar-fullscreen").on("click",D),a(p).on("resize",_).on("load",_))};e.exports={setLabels:A,register:B,get item(){return x&&x.item}},R()}).call(t,function(){return this}())},function(e,t,n){"use strict";var r=n(2),i=r.dom,o=n(19),a=n(14),s=n(38),c=Object.assign({enabled:!1,autoplay:!0,types:[]},a["preview-aud"]),u='<audio id="pv-content-aud"/>',l=function(){var e=i("#pv-content-aud")[0];e&&s.setLabels([s.item.label,o.formatDate(1e3*e.duration,"m:ss")])},f=function(e){e.unload=function(){e.src="",e.load()}},d=function(e){return new Promise(function(t){var n=i(u).on("loadedmetadata",function(){return t(n)}).attr("controls","controls");c.autoplay&&n.attr("autoplay","autoplay"),f(n[0]),n.attr("src",e.absHref)})},p=function(){c.enabled&&s.register(c.types,d,l)};p()},function(e,t,n){"use strict";var r=n(2),i=r.dom,o=n(8),a=n(14),s=n(38),c=Object.assign({enabled:!1,size:null,types:[]},a["preview-img"]),u='<img id="pv-content-img"/>',l=function(){var e=i("#pv-content-img")[0];if(e){var t=e.offsetWidth,n=[s.item.label];if(!c.size){var r=e.naturalWidth,o=e.naturalHeight;n.push(String(r)+"x"+String(o)),n.push(String((100*t/r).toFixed(0))+"%")}s.setLabels(n)}},f=function(e){return o.request({action:"get",thumbs:[{type:"img",href:e,width:c.size,height:0}]}).then(function(e){return e&&e.thumbs&&e.thumbs[0]?e.thumbs[0]:null})},d=function(e){return Promise.resolve(e.absHref).then(function(e){return c.size?f(e):e}).then(function(e){return new Promise(function(t){var n=i(u).on("load",function(){return t(n)}).attr("src",e)})})},p=function(){c.enabled&&s.register(c.types,d,l)};p()},function(e,t,n){(function(e){"use strict";var t=n(42),r=n(28),i=n(2),o=i.keys,a=i.dom,s=n(14),c=n(38),u=e.window,l=u.XMLHttpRequest,f=Object.assign({enabled:!1,styles:{}},s["preview-txt"]),d='<pre id="pv-content-txt"></pre>',p='<div id="pv-content-txt"></div>',h=function(){var e=a("#pv-content-txt")[0];if(e){var t=a("#pv-container")[0];e.style.height=t.offsetHeight+"px",c.setLabels([c.item.label,c.item.size+" bytes"])}},g=function(e){return new Promise(function(t,n){var r=new l,i=function(){if(r.readyState===l.DONE)try{t(r.responseText||"")}catch(e){n(String(e))}};r.open("GET",e,!0),r.onreadystatechange=i,r.send()})},m=function(e){return g(e.absHref).catch(function(e){return"[request failed] "+e}).then(function(n){var i=f.styles[e.type];if(1===i)return a(d).text(n);if(2===i)return a(p).html(r(n));if(3===i){var o=a("<code></code>").text(n);return u.setTimeout(function(){t.el(o[0])},n.length<2e4?0:500),a(d).app(o)}return a(p).text(n)})},v=function(){f.enabled&&c.register(o(f.styles),m,h)};v()}).call(t,function(){return this}())},function(e,t,n){!function(t,n){e.exports=n()}(this,function(){var e=".lolight",t="ll-",n="_nam#2196f3}_num#ec407a}_str#43a047}_rex#ef6c00}_pct#666}_key#555;font-weight:bold}_com#aaa;font-style:italic}".replace(/_/g,"."+t).replace(/#/g,"{color:#"),r=/^(a(bstract|lias|nd|rguments|rray|s(m|sert)?|uto)|b(ase|egin|ool(ean)?|reak|yte)|c(ase|atch|har|hecked|lass|lone|ompl|onst|ontinue)|de(bugger|cimal|clare|f(ault|er)?|init|l(egate|ete)?)|do|double|e(cho|ls?if|lse(if)?|nd|nsure|num|vent|x(cept|ec|p(licit|ort)|te(nds|nsion|rn)))|f(allthrough|alse|inal(ly)?|ixed|loat|or(each)?|riend|rom|unc(tion)?)|global|goto|guard|i(f|mp(lements|licit|ort)|n(it|clude(_once)?|line|out|stanceof|t(erface|ernal)?)?|s)|l(ambda|et|ock|ong)|m(odule|utable)|NaN|n(amespace|ative|ext|ew|il|ot|ull)|o(bject|perator|r|ut|verride)|p(ackage|arams|rivate|rotected|rotocol|ublic)|r(aise|e(adonly|do|f|gister|peat|quire(_once)?|scue|strict|try|turn))|s(byte|ealed|elf|hort|igned|izeof|tatic|tring|truct|ubscript|uper|ynchronized|witch)|t(emplate|hen|his|hrows?|ransient|rue|ry|ype(alias|def|id|name|of))|u(n(checked|def(ined)?|ion|less|signed|til)|se|sing)|v(ar|irtual|oid|olatile)|w(char_t|hen|here|hile|ith)|xor|yield)$/,i="com",o="key",a="nam",s="num",c="pct",u="rex",l="spc",f="str",d="unk",p=[[s,/#([0-9a-f]{6}|[0-9a-f]{3})\b/],[i,/(\/\/|#).*?(?=\n|$)/],[i,/\/\*[\s\S]*?\*\//],[i,/<!--[\s\S]*?-->/],[u,/\/(\\\/|[^\n])*?\//],[f,/(['"`])(\\\1|[\s\S])*?\1/],[s,/[+-]?([0-9]*\.?[0-9]+|[0-9]+\.?[0-9]*)([eE][+-]?[0-9]+)?/],[c,/[\\.,:;+\-*\/=<>()[\]{}|?!&(a)~]/],[l,/\s+/],[a,/[\w$]+/],[d,/./]],h=function(e){if("string"!=typeof e)throw new Error("tok: no string");for(var t=[],n=p.length,i=!1;e;)for(var c=0;c<n;c+=1){var f=p[c][1].exec(e);if(f&&0===f.index){var d=p[c][0];if(d!==u||!i){var h=f[0];d===a&&r.test(h)&&(d=o),d===l?h.indexOf("\n")>=0&&(i=!1):i=d===s||d===a,e=e.slice(h.length),t.push([d,h]);break}}}return t},g=function(e,t){if("undefined"!=typeof document)t(document);else if(e)throw new Error("no doc")},m=function(e){g(!0,function(n){var r=h(e.textContent);e.innerHTML="",r.forEach(function(r){var i=n.createElement("span");i.className=t+r[0],i.textContent=r[1],e.appendChild(i)})})},v=function(t){g(!0,function(n){[].forEach.call(n.querySelectorAll(t||e),function(e){m(e)})})};return g(!1,function(e){var t=e.querySelector("head"),r=e.createElement("style");r.textContent=n,t.insertBefore(r,t.firstChild),/^(i|c|loade)/.test(e.readyState)?v():e.addEventListener("DOMContentLoaded",function(){v()})}),v.tok=h,v.el=m,v})},function(e,t,n){"use strict";var r=n(2),i=r.dom,o=n(14),a=n(38),s=Object.assign({enabled:!1,autoplay:!0,types:[]},o["preview-vid"]),c='<video id="pv-content-vid"/>',u=function(){var e=i("#pv-content-vid")[0];if(e){var t=e.offsetWidth,n=e.videoWidth,r=e.videoHeight;a.setLabels([a.item.label,String(n)+"x"+String(r),String((100*t/n).toFixed(0))+"%"])}},l=function(e){e.unload=function(){e.src="",e.load()}},f=function(e){return new Promise(function(t){var n=i(c).on("loadedmetadata",function(){return t(n)}).attr("controls","controls");s.autoplay&&n.attr("autoplay","autoplay"),l(n[0]),n.attr("src",e.absHref)})},d=function(){s.enabled&&a.register(s.types,f,u)};d()},function(e,t,n){"use strict";var r=n(2),i=r.map,o=r.debounce,a=r.parsePattern,s=r.dom,c=n(8),u=n(12),l=n(20),f=n(13),d=n(14),p=n(22),h=n(18),g=Object.assign({enabled:!1,advanced:!1,debounceTime:300,ignorecase:!0},d.search),m='<div id="search" class="tool">\n            <img src="'+f.image("search")+'" alt="search"/>\n            <input class="l10n_ph-search" type="text" value=""/>\n        </div>',v=!1,b="",w=void 0,y=void 0,x=function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"";if(e!==b){if(b=e,!e)return void h.setLocation();w.addCls("pending"),c.request({action:"get",search:{href:l.getAbsHref(),pattern:e,ignorecase:g.ignorecase}}).then(function(e){w.rmCls("pending"),h.setHint("noMatch"),h.setItems(i(e.search,function(e){return p.get(e)}))})}},k=function(){v?(w.addCls("active"),y[0].focus(),x(a(y.val(),g.advanced))):(x(),w.rmCls("active"))},_=function(){v=!v,k()},C=function(){v=!1,y.val(""),k()},S=function(){g.enabled&&(w=s(m).appTo("#toolbar"),y=w.find("input"),w.find("img").on("click",_),y.on("keyup",o(k,g.debounceTime)),u.sub("location.changed",C))};S()},function(e,t,n){(function(e){"use strict";var t=n(2),r=t.each,i=t.dom,o=n(12),a=n(13),s=n(14),c=e.window.document,u=Object.assign({enabled:!1,clickndrag:!1,checkboxes:!1},s.select),l='<span class="selector">\n            <img src="'+a.image("selected")+'" alt="selected"/>\n        </span>',f=i(c),d=i("html"),p=i('<div id="selection-rect"></div>'),h=Math.max,g=Math.min,m=Math.abs,v=0,b=0,w=function(){var e=i("#items .item.selected").map(function(e){return e._item});o.pub("selection",e)},y=function(e){var t=i(e);if(!t.length||t.isHidden())return null;var n=t[0].getBoundingClientRect();return{l:n.left,t:n.top,r:n.right,b:n.bottom}},x=function(e,t){return!!e&&!!t&&e.l===t.l&&e.t===t.t&&e.r===t.r&&e.b===t.b},k=function(e){var t=e[0];x(y(t),t&&t._rect)||e.each(function(e){e._rect=y(e)})},_=function(e,t){if(!e||!t)return!1;var n=h(e.l,t.l),r=g(e.r,t.r),i=h(e.t,t.t),o=g(e.b,t.b);return n<=r&&i<=o},C=function(e){var t=i("#content")[0],n=y(t),r=e.pageX-n.l+t.scrollLeft,o=e.pageY-n.t+t.scrollTop;return{x:r,y:o}},S=function(e){var t=C(e),n=t.x,r=t.y,o=g(v,n),a=g(b,r),s=m(v-n),c=m(b-r),u=e.ctrlKey||e.metaKey;if(!(!u&&s<4&&c<4)){u||i("#items .item").rmCls("selected"),d.addCls("drag-select"),p.show().css({left:o+"px",top:a+"px",width:s+"px",height:c+"px"});var l=y(p),f=i("#items .item:not(.folder-parent)");k(f),f.rmCls("selecting").each(function(e){_(l,e._rect)&&i(e).addCls("selecting")})}},A=function e(t){f.off("mousemove",S).off("mouseup",e),S(t),i("#items .item.selecting.selected").rmCls("selecting").rmCls("selected"),i("#items .item.selecting").rmCls("selecting").addCls("selected"),w(),d.rmCls("drag-select"),p.hide(),t.stopPropagation(),t.preventDefault()},T=function(e){if(!(0!==e.button||e.offsetX>=i("#content")[0].offsetWidth-16)){var t=C(e),n=t.x,r=t.y;v=n,b=r,f.on("mousemove",S).on("mouseup",A),S(e),e.preventDefault()}},E=function(e){for(;!e._item&&e.parentNode;)e=e.parentNode;return e._item},M=function(e){E(e.target).$view.tglCls("selected"),w(),e.stopPropagation(),e.preventDefault()},D=function(e){e.$view&&!e.isCurrentParentFolder()&&i(l).on("click",M).appTo(e.$view.find("a"))},P=function(e,t){u.checkboxes&&r(e,D),r(t,function(e){e.$view&&e.$view.rmCls("selected")}),w()},z=function(){u.enabled&&(u.clickndrag||u.checkboxes)&&(o.sub("view.changed",P),u.clickndrag&&(p.hide().appTo("#content"),i("#content").on("mousedown",T).on("drag",function(e){return e.preventDefault()}).on("dragstart",function(e){return e.preventDefault()})))};z()}).call(t,function(){return this}())},function(e,t,n){"use strict";var r=n(2),i=r.each,o=r.toArray,a=r.dom,s=r.cmp,c=r.naturalCmp,u=n(12),l=n(13),f=n(14),d=n(16),p=Object.assign({enabled:!1,column:0,reverse:!1,ignorecase:!0,natural:!1,folders:0},f.sort),h="ext/sort",g='<img src="'+l.image("sort")+'" class="sort" alt="sort order"/>',m=function(e){
-return e.isFolder()?p.folders:1},v={0:"label",1:"time",2:"size"},b={0:"label",1:"date",2:"size"},w=function(e,t,n,r){return function(i,o){var a=i._item,u=o._item,l=m(a)-m(u);if(0!==l)return l;var f=a[e],d=u[e];return(isNaN(f)||isNaN(d))&&(f=String(f),d=String(d),n&&(f=f.toLowerCase(),d=d.toLowerCase())),l=r?c(f,d):s(f,d),t?-l:l}},y=function(e,t){var n=a("#items li.header a"),r=a("#items li.header a."+b[e]),i=w(v[e],t,p.ignorecase,p.natural);d.put(h,{column:e,reverse:t}),n.rmCls("ascending").rmCls("descending"),r.addCls(t?"descending":"ascending"),a(o(a("#items .item:not(.folder-parent)")).sort(i)).appTo("#items")},x=function(){var e=d.get(h),t=e&&e.column||p.column,n=e&&e.reverse||p.reverse;y(t,n)},k=function(){var e=a("#items li.header");i(b,function(t,n){var r="0"===n?"app":"pre";e.find("a."+t)[r](g).on("click",function(e){y(n,a(e.currentTarget).hasCls("ascending")),e.preventDefault()})})},_=function(){p.enabled&&(k(),u.sub("view.changed",x))};_()},function(e,t,n){"use strict";var r=n(2),i=r.each,o=r.map,a=r.includes,s=n(8),c=n(12),u=n(14),l=Object.assign({enabled:!1,img:["img-bmp","img-gif","img-ico","img-jpg","img-png"],mov:["vid-avi","vid-flv","vid-mkv","vid-mov","vid-mp4","vid-mpg","vid-webm"],doc:["x-pdf","x-ps"],delay:1,size:100,exif:!1,chunksize:20},u.thumbnails),f=4/3,d=function(e,t){var n=null;if(a(l.img,t.type))n="img";else if(a(l.mov,t.type))n="mov";else{if(!a(l.doc,t.type))return;n="doc"}t.thumbSquare?t.$view.find(".icon.square img").addCls("thumb").attr("src",t.thumbSquare):e.push({type:n,href:t.absHref,ratio:1,callback:function(e){e&&t.$view&&(t.thumbSquare=e,t.$view.find(".icon.square img").addCls("thumb").attr("src",e))}}),t.thumbRational?t.$view.find(".icon.landscape img").addCls("thumb").attr("src",t.thumbRational):e.push({type:n,href:t.absHref,ratio:f,callback:function(e){e&&t.$view&&(t.thumbRational=e,t.$view.find(".icon.landscape img").addCls("thumb").attr("src",e))}})},p=function(e){var t=o(e,function(e){return{type:e.type,href:e.href,width:Math.round(l.size*e.ratio),height:l.size}});return s.request({action:"get",thumbs:t}).then(function(t){i(e,function(e,n){e.callback(t&&t.thumbs?t.thumbs[n]:null)})})},h=function(e){for(var t=e.length,n=l.chunksize,r=Promise.resolve(),i=function(t){r=r.then(function(){return p(e.slice(t,t+n))})},o=0;o<t;o+=n)i(o)},g=function(e){var t=[];i(e,function(e){return d(t,e)}),h(t)},m=function(e){setTimeout(function(){return g(e)},l.delay)},v=function(){l.enabled&&c.sub("view.changed",m)};v()},function(e,t,n){(function(e){"use strict";var t=n(12),r=n(14),i=e.window.document,o=Object.assign({enabled:!1},r.title),a=function(e){var t=e.getCrumb().map(function(e){return e.label}),n=t.join(" > ");t.length>1&&(n=t[t.length-1]+" - "+n),i.title=n},s=function(){o.enabled&&t.sub("location.changed",a)};s()}).call(t,function(){return this}())},function(e,t,n){"use strict";var r=n(2),i=r.each,o=r.dom,a=r.cmp,s=r.naturalCmp,c=n(12),u=n(20),l=n(13),f=n(14),d=n(16),p=Object.assign({enabled:!1,show:!0,maxSubfolders:50,naturalSort:!1,ignorecase:!0},f.tree),h='<div class="item folder">\n            <span class="indicator">\n                <img src="'+l.image("tree-indicator")+'"/>\n            </span>\n            <a>\n                <span class="icon"><img src="'+l.icon("folder")+'"/></span>\n                <span class="label"></span>\n            </a>\n        </span>',g='<div class="block">\n            <h1 class="l10n-tree">Tree</h1>\n            <div id="view-tree" class="button view">\n                <img src="'+l.image("tree-toggle")+'" alt="view-tree"/>\n            </div>\n        </div>',m="ext/tree",v=function(e){for(;!e._item&&e.parentNode;)e=e.parentNode;return e._item},b=function(e){var t=v(e.target);"unknown"===t._treeState?t.fetchContent().then(function(){t._treeState="open",y(t)}):"open"===t._treeState?(t._treeState="closed",t._$tree.rmCls("open").addCls("closed")):"closed"===t._treeState&&(t._treeState="open",t._$tree.rmCls("closed").addCls("open"))},w=function(e,t){var n=e.label,r=t.label;return p.ignorecase&&(n=n.toLowerCase(),r=r.toLowerCase()),p.naturalSort?s(n,r):a(n,r)},y=function e(t){var n=t.getSubfolders(),r=n.length,a=p.maxSubfolders,s=o(h);if(s.find(".indicator").on("click",b),s.find(".label").text(t.label),u.setLink(s.find("a"),t),t.isCurrentFolder()&&s.addCls("active"),t.isManaged||s.find(".icon img").attr("src",l.icon("folder-page")),t._treeState=t._treeState||"none",t.isManaged&&!t.isContentFetched?t._treeState="unknown":r||(t._treeState="none"),s.addCls(t._treeState),r){var c=o('<div class="content"></div>').appTo(s);n.sort(w),i(n.slice(0,a),function(t){return c.app(e(t))}),r>a&&c.app('<div class="summary">… '+(r-a)+" more subfolders</div>")}return t._$tree&&t._$tree.rpl(s),t._$tree=s,s[0]._item=t,s},x=function e(t){return t._treeState="open",t.fetchContent().then(function(){return t.parent?e(t.parent):t})},k=function(){d.get(m)?(o("#view-tree").addCls("active"),o("#tree").show()):(o("#view-tree").rmCls("active"),o("#tree").hide())},_=function(e){x(e).then(function(e){o("#tree").clr().app(y(e)),k()})},C=function(){p.enabled&&(o('<div id="tree"></div>').hide().appTo("#mainrow"),o(g).appTo("#sidebar").find("#view-tree").on("click",function(e){d.put(m,!d.get(m)),k(),c.pub("resize"),e.preventDefault()}),"boolean"!=typeof d.get(m)&&d.put(m,p.show),k(),c.sub("location.changed",_))};C()},function(e,t,n){(function(e){"use strict";var t=n(2),r=t.dom,i=n(7),o=n(8),a=n(13),s='<ul id="tests"></ul>',c='<li class="test">\n            <span class="label"></span>\n            <span class="result"></span>\n            <div class="info"></div>\n        </li>',u='<div id="login-wrapper">\n            <input id="pass" type="password" placeholder="password"/>\n            <span id="login">login</span>\n            <span id="logout">logout</span>\n            <div id="hint">\n                The preset password is the empty string, just click login.\n                Change it in \'_h5ai/private/conf/options.json\'.\n            </div>\n        </div>',l='<div id="support">\n            Show your support with a donation!\n            <div class="paypal">\n                <form action="https://www.paypal.com/cgi-bin/webscr" method="post" target="_blank">\n                    <input type="hidden" name="cmd" value="_s-xclick"/>\n                    <input type="hidden" name="hosted_button_id" value="8WSPKWT7YBTSQ"/>\n                    <input type="image" src="'+a.image("paypal")+'" name="submit" alt="PayPal"/>\n                </form>\n            </div>\n        </div>',f=i.setup,d=function(e,t,n,i){var o=r(c).appTo("#tests");o.find(".label").text(e),o.find(".result").addCls(n?"passed":"failed").text(i?i:n?"yes":"no"),o.find(".info").html(t)},p=function(){f.AS_ADMIN&&(r(s).appTo("#content"),d("h5ai version","Only green if this is an official h5ai release",/^\d+\.\d+\.\d+$/.test(f.VERSION),f.VERSION),d("Index file found","Add <code>"+f.INDEX_HREF+"</code> to your index file list",f.INDEX_HREF),d("Options parsable","File <code>options.json</code> is readable and syntax is correct",null!==i.options),d("Types parsable","File <code>types.json</code> is readable and syntax is correct",null!==i.types),d("Server software","Server is one of apache, lighttpd, nginx or cherokee",f.HAS_SERVER,f.SERVER_NAME+" "+f.SERVER_VERSION),d("PHP version","PHP version >= "+f.MIN_PHP_VERSION,!0,f.PHP_VERSION),d("PHP arch","64-bit required to correctly display file/folder sizes > ~2GB","64-bit"===f.PHP_ARCH,f.PHP_ARCH),d("Public Cache directory","Web server has write access",f.HAS_WRITABLE_CACHE_PUB),d("Private Cache directory","Web server has write access",f.HAS_WRITABLE_CACHE_PRV),d("Image thumbs","PHP GD extension with JPEG support available",f.HAS_PHP_JPEG),d("Use EXIF thumbs","PHP EXIF extension available",f.HAS_PHP_EXIF),d("Movie thumbs","Command line program <code>avconv</code> or <code>ffmpeg</code> available",f.HAS_CMD_AVCONV||f.HAS_CMD_FFMPEG),d("PDF thumbs","Command line program <code>convert</code> or <code>gm</code> available",f.HAS_CMD_CONVERT||f.HAS_CMD_GM),d("Shell tar","Command line program <code>tar</code> available",f.HAS_CMD_TAR),d("Shell zip","Command line program <code>zip</code> available",f.HAS_CMD_ZIP),d("Shell du","Command line program <code>du</code> available",f.HAS_CMD_DU))},h=function(){e.window.location.reload()},g=function(){o.request({action:"login",pass:r("#pass").val()}).then(h)},m=function(){o.request({action:"logout"}).then(h)},v=function(e){13===e.which&&g()},b=function(){r(l).appTo("#content")},w=function(){r(u).appTo("#content"),f.AS_ADMIN?(r("#pass").rm(),r("#login").rm(),r("#logout").on("click",m)):(r("#pass").on("keydown",v)[0].focus(),r("#login").on("click",g),r("#logout").rm()),i.options.hasCustomPasshash&&r("#hint").rm()},y=function(){b(),w(),p()};y()}).call(t,function(){return this}())}]);
\ No newline at end of file
+/* h5ai v0.29.2 - https://larsjung.de/h5ai/ */ !(function(e) {
+    function t(e, t) {
+        if (!t) throw ((i.className = r), new Error(r + ": " + e));
+    }
+
+    function n(e) {
+        return "function" == typeof e;
+    }
+    if (!e || e.window !== e || !e.document) throw new Error("no-window");
+    var r = "no-browser",
+        i = e.document.documentElement;
+    (i.className = ""),
+    t("console", e.console && n(e.console.log)),
+        t("assign", e.Object && n(e.Object.assign)),
+        t("promise", n(e.Promise)),
+        t("xhr", e.XMLHttpRequest);
+})(this),
+(function(e) {
+    function t(r) {
+        if (n[r]) return n[r].exports;
+        var i = (n[r] = { exports: {}, id: r, loaded: !1 });
+        return e[r].call(i.exports, i, i.exports, t), (i.loaded = !0), i.exports;
+    }
+    var n = {};
+    return (t.m = e), (t.c = n), (t.p = ""), t(0);
+})([
+    function(e, t, n) {
+        "use strict";
+        n(1);
+    },
+    function(e, t, n) {
+        "use strict";
+        var r = n(2),
+            i = r.dom,
+            o = r.awaitReady,
+            a = n(7),
+            s = i("script[data-module]").attr("data-module"),
+            c = { action: "get", setup: !0, options: !0, types: !0 };
+        if ("index" === s)(c.theme = !0), (c.langs = !0);
+        else {
+            if ("info" !== s) throw new Error("no-main-module: '" + s + "'");
+            c.refresh = !0;
+        }
+        a._update(c)
+            .then(function() {
+                return o();
+            })
+            .then(function() {
+                return n(9)("./" + s);
+            });
+    },
+    function(e, t, n) {
+        "use strict";
+        e.exports = Object.assign({}, n(3), n(4), n(5), n(6));
+    },
+    function(e, t) {
+        "use strict";
+        var n =
+            "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ?
+
+            function(e) {
+                return typeof e;
+            } :
+            function(e) {
+                return e &&
+                    "function" == typeof Symbol &&
+                    e.constructor === Symbol &&
+                    e !== Symbol.prototype ?
+                    "symbol" :
+                    typeof e;
+            },
+            r = function(e) {
+                return void 0 !== e && null !== e;
+            },
+            i = function(e, t) {
+                return ("undefined" == typeof e ? "undefined" : n(e)) === t;
+            },
+            o = function(e) {
+                return i(e, "string");
+            },
+            a = function(e) {
+                return i(e, "function");
+            },
+            s = function(e) {
+                return i(e, "number");
+            },
+            c = function(e) {
+                return e && e.hasOwnProperty("length");
+            },
+            u = function(e) {
+                return !e || o(e) ?
+                    [] :
+                    (c(e) && (e = Array.from(e)), Object.keys(e));
+            },
+            l = function(e) {
+                return u(e).map(function(t) {
+                    return e[t];
+                });
+            },
+            f = function(e, t) {
+                return u(e).forEach(function(n) {
+                    return t(e[n], n);
+                });
+            },
+            d = function(e, t) {
+                return l(e).filter(t);
+            },
+            p = function(e, t) {
+                return l(e).map(t);
+            },
+            h = function(e, t) {
+                return l(e).indexOf(t) >= 0;
+            },
+            g = function(e) {
+                return d(e, function(e) {
+                    return !!e;
+                });
+            },
+            m = function(e, t) {
+                return !!e && e instanceof t;
+            },
+            v = function(e) {
+                return Array.from(e);
+            },
+            b = function(e, t) {
+                return (
+                    (t = l(t)),
+                    d(e, function(e) {
+                        return t.indexOf(e) < 0;
+                    })
+                );
+            },
+            w = function(e, t) {
+                return (
+                    (t = l(t)),
+                    d(e, function(e) {
+                        return t.indexOf(e) >= 0;
+                    })
+                );
+            },
+            y = function(e, t) {
+                return e < t ? -1 : e > t ? 1 : 0;
+            },
+            x = function(e, t) {
+                var n = a(t) ?
+                    t :
+                    function(e) {
+                        return e[t];
+                    },
+                    r = function(e, t) {
+                        return y(n(e), n(t));
+                    };
+                return l(e).sort(r);
+            },
+            k = function(e, t) {
+                var n = null;
+                return function() {
+                    clearTimeout(n), (n = setTimeout(e, t));
+                };
+            };
+        e.exports = {
+            is: r,
+            isStr: o,
+            isFn: a,
+            isNum: s,
+            hasLength: c,
+            keys: u,
+            values: l,
+            each: f,
+            filter: d,
+            map: p,
+            includes: h,
+            compact: g,
+            isInstanceOf: m,
+            toArray: v,
+            difference: b,
+            intersection: w,
+            cmp: y,
+            sortBy: x,
+            debounce: k,
+        };
+    },
+    function(e, t, n) {
+        (function(t) {
+            "use strict";
+
+            function r(e) {
+                if (Array.isArray(e)) {
+                    for (var t = 0, n = Array(e.length); t < e.length; t++) n[t] = e[t];
+                    return n;
+                }
+                return Array.from(e);
+            }
+            var i = (function() {
+                    function e(e, t) {
+                        var n = [],
+                            r = !0,
+                            i = !1,
+                            o = void 0;
+                        try {
+                            for (
+                                var a, s = e[Symbol.iterator](); !(r = (a = s.next()).done) &&
+                                (n.push(a.value), !t || n.length !== t); r = !0
+                            );
+                        } catch (e) {
+                            (i = !0), (o = e);
+                        } finally {
+                            try {
+                                !r && s.return && s.return();
+                            } finally {
+                                if (i) throw o;
+                            }
+                        }
+                        return n;
+                    }
+                    return function(t, n) {
+                        if (Array.isArray(t)) return t;
+                        if (Symbol.iterator in Object(t)) return e(t, n);
+                        throw new TypeError(
+                            "Invalid attempt to destructure non-iterable instance"
+                        );
+                    };
+                })(),
+                o = n(3),
+                a = o.each,
+                s = o.filter,
+                c = o.hasLength,
+                u = o.is,
+                l = o.isStr,
+                f = o.map,
+                d = o.isInstanceOf,
+                p = o.toArray,
+                h = t.window,
+                g = h.document,
+                m = (function() {
+                    var e = function(e) {
+                            return g.createElement(e);
+                        },
+                        t = [
+                            [/^<t(head|body|foot)|^<c(ap|olg)/i, e("table")],
+                            [/^<col/i, e("colgroup")],
+                            [/^<tr/i, e("tbody")],
+                            [/^<t[dh]/i, e("tr")],
+                        ],
+                        n = e("div"),
+                        r = function(e) {
+                            var r = !0,
+                                o = !1,
+                                a = void 0;
+                            try {
+                                for (
+                                    var s, c = t[Symbol.iterator](); !(r = (s = c.next()).done); r = !0
+                                ) {
+                                    var u = s.value,
+                                        l = i(u, 2),
+                                        f = l[0],
+                                        d = l[1];
+                                    if (f.test(e)) return d;
+                                }
+                            } catch (e) {
+                                (o = !0), (a = e);
+                            } finally {
+                                try {
+                                    !r && c.return && c.return();
+                                } finally {
+                                    if (o) throw a;
+                                }
+                            }
+                            return n;
+                        };
+                    return function(e) {
+                        var t = r(e);
+                        t.innerHTML = e;
+                        var n = p(t.childNodes);
+                        return (
+                            a(n, function(e) {
+                                return t.removeChild(e);
+                            }),
+                            (t.innerHTML = ""),
+                            n
+                        );
+                    };
+                })(),
+                v = function(e) {
+                    var t =
+                        arguments.length > 1 && void 0 !== arguments[1] ?
+                        arguments[1] :
+                        g;
+                    try {
+                        return p(t.querySelectorAll(e));
+                    } catch (e) {
+                        return [];
+                    }
+                },
+                b = function(e) {
+                    return d(e, h.Element);
+                },
+                w = function(e) {
+                    return d(e, h.Document);
+                },
+                y = function(e) {
+                    return u(e) && e.window === e && w(e.document);
+                },
+                x = function(e) {
+                    return b(e) || w(e) || y(e);
+                },
+                k = function(e, t, n) {
+                    return e.addEventListener(t, n);
+                },
+                _ = function(e, t, n) {
+                    return e.removeEventListener(t, n);
+                },
+                C = new Promise(function(e) {
+                    /^(i|c|loade)/.test(g.readyState) ?
+                        e() :
+                        k(g, "DOMContentLoaded", function() {
+                            return e();
+                        });
+                }),
+                S = function() {
+                    return C;
+                },
+                A = new Promise(function(e) {
+                    k(h, "load", function() {
+                        return e();
+                    });
+                }),
+                T = function() {
+                    return A;
+                },
+                E = function e(t) {
+                    if (d(t, e)) return t;
+                    var n = void 0;
+                    return (
+                        l(t) ?
+                        ((t = t.trim()), (n = "<" === t[0] ? m(t) : v(t))) :
+                        (n = x(t) ? [t] : c(t) ? t : [t]),
+                        (n = s(n, x)),
+                        Object.assign(Object.create(e.prototype), n, { length: n.length })
+                    );
+                };
+            (E.prototype = {
+                constructor: E,
+                each: function(e) {
+                    return a(this, e), this;
+                },
+                map: function(e) {
+                    return f(this, e);
+                },
+                find: function(e) {
+                    var t;
+                    return E(
+                        (t = []).concat.apply(
+                            t,
+                            r(
+                                this.map(function(t) {
+                                    return v(e, t);
+                                })
+                            )
+                        )
+                    );
+                },
+                on: function(e, t) {
+                    return this.each(function(n) {
+                        return k(n, e, t);
+                    });
+                },
+                off: function(e, t) {
+                    return this.each(function(n) {
+                        return _(n, e, t);
+                    });
+                },
+                attr: function(e, t) {
+                    return void 0 === t ?
+                        this.length ?
+                        this[0].getAttribute(e) :
+                        void 0 :
+                        this.each(function(n) {
+                            return n.setAttribute(e, t);
+                        });
+                },
+                rmAttr: function(e) {
+                    return this.each(function(t) {
+                        return t.removeAttribute(e);
+                    });
+                },
+                prop: function(e, t) {
+                    return void 0 === t ?
+                        this.length ?
+                        this[0][e] :
+                        void 0 :
+                        this.each(function(n) {
+                            n[e] = t;
+                        });
+                },
+                rmProp: function(e) {
+                    return this.each(function(t) {
+                        return delete t[e];
+                    });
+                },
+                val: function(e) {
+                    return void 0 === e ?
+                        this.length ?
+                        this[0].value :
+                        void 0 :
+                        this.each(function(t) {
+                            t.value = e;
+                        });
+                },
+                html: function(e) {
+                    return void 0 === e ?
+                        this.map(function(e) {
+                            return e.innerHTML;
+                        }).join("") :
+                        this.each(function(t) {
+                            t.innerHTML = e;
+                        });
+                },
+                text: function(e) {
+                    return void 0 === e ?
+                        this.map(function(e) {
+                            return e.textContent;
+                        }).join("") :
+                        this.each(function(t) {
+                            t.textContent = e;
+                        });
+                },
+                clr: function() {
+                    return this.html("");
+                },
+                rm: function() {
+                    return this.each(function(e) {
+                        var t = e.parentNode;
+                        t && t.removeChild(e);
+                    });
+                },
+                rpl: function(e) {
+                    return this.each(function(t) {
+                        var n = t.parentNode;
+                        n && n.replaceChild(E(e)[0], t);
+                    });
+                },
+                app: function(e) {
+                    return this.each(function(t) {
+                        E(e).each(function(e) {
+                            return t.appendChild(e);
+                        });
+                    });
+                },
+                appTo: function(e) {
+                    return E(e).app(this), this;
+                },
+                pre: function(e) {
+                    return this.each(function(t) {
+                        E(e).each(function(e) {
+                            var n = t.firstChild;
+                            n ? t.insertBefore(e, n) : t.appendChild(e);
+                        });
+                    });
+                },
+                preTo: function(e) {
+                    return E(e).pre(this), this;
+                },
+                cls: function() {
+                    return arguments.length ?
+                        (this.each(function(e) {
+                                e.className = "";
+                            }),
+                            this.addCls.apply(this, arguments)) :
+                        this.length ?
+                        p(this[0].classList) :
+                        [];
+                },
+                hasCls: function(e) {
+                    return p(this).every(function(t) {
+                        return t.classList.contains(e);
+                    });
+                },
+                addCls: function() {
+                    for (var e = arguments.length, t = Array(e), n = 0; n < e; n++)
+                        t[n] = arguments[n];
+                    return this.each(function(e) {
+                        var n = !0,
+                            r = !1,
+                            i = void 0;
+                        try {
+                            for (
+                                var o, a = t[Symbol.iterator](); !(n = (o = a.next()).done); n = !0
+                            ) {
+                                var s = o.value;
+                                e.classList.add(s);
+                            }
+                        } catch (e) {
+                            (r = !0), (i = e);
+                        } finally {
+                            try {
+                                !n && a.return && a.return();
+                            } finally {
+                                if (r) throw i;
+                            }
+                        }
+                    });
+                },
+                rmCls: function() {
+                    for (var e = arguments.length, t = Array(e), n = 0; n < e; n++)
+                        t[n] = arguments[n];
+                    return this.each(function(e) {
+                        var n = !0,
+                            r = !1,
+                            i = void 0;
+                        try {
+                            for (
+                                var o, a = t[Symbol.iterator](); !(n = (o = a.next()).done); n = !0
+                            ) {
+                                var s = o.value;
+                                e.classList.remove(s);
+                            }
+                        } catch (e) {
+                            (r = !0), (i = e);
+                        } finally {
+                            try {
+                                !n && a.return && a.return();
+                            } finally {
+                                if (r) throw i;
+                            }
+                        }
+                    });
+                },
+                tglCls: function() {
+                    for (var e = arguments.length, t = Array(e), n = 0; n < e; n++)
+                        t[n] = arguments[n];
+                    return this.each(function(e) {
+                        var n = !0,
+                            r = !1,
+                            i = void 0;
+                        try {
+                            for (
+                                var o, a = t[Symbol.iterator](); !(n = (o = a.next()).done); n = !0
+                            ) {
+                                var s = o.value;
+                                e.classList.contains(s) ?
+                                    e.classList.remove(s) :
+                                    e.classList.add(s);
+                            }
+                        } catch (e) {
+                            (r = !0), (i = e);
+                        } finally {
+                            try {
+                                !n && a.return && a.return();
+                            } finally {
+                                if (r) throw i;
+                            }
+                        }
+                    });
+                },
+                parent: function() {
+                    return E(
+                        this.map(function(e) {
+                            return e.parentNode;
+                        })
+                    );
+                },
+                children: function() {
+                    var e;
+                    return E(
+                        (e = []).concat.apply(
+                            e,
+                            r(
+                                this.map(function(e) {
+                                    return p(e.children);
+                                })
+                            )
+                        )
+                    );
+                },
+                hide: function() {
+                    return this.addCls("hidden");
+                },
+                show: function() {
+                    return this.rmCls("hidden");
+                },
+                isHidden: function() {
+                    return this.hasCls("hidden");
+                },
+                css: function(e) {
+                    return this.each(function(t) {
+                        return Object.assign(t.style, e);
+                    });
+                },
+            }),
+            (e.exports = { awaitReady: S, awaitLoad: T, dom: E });
+        }.call(
+            t,
+            (function() {
+                return this;
+            })()
+        ));
+    },
+    function(e, t) {
+        "use strict";
+        var n =
+            "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ?
+
+            function(e) {
+                return typeof e;
+            } :
+            function(e) {
+                return e &&
+                    "function" == typeof Symbol &&
+                    e.constructor === Symbol &&
+                    e !== Symbol.prototype ?
+                    "symbol" :
+                    typeof e;
+            },
+            r = /(^([+\-]?(?:0|[1-9]\d*)(?:\.\d*)?(?:[eE][+\-]?\d+)?)?$|^0x[0-9a-f]+$|\d+)/gi,
+            i = /(^([\w ]+,?[\w ]+)?[\w ]+,?[\w ]+\d+:\d+(:\d+)?[\w ]?|^\d{1,4}[\/\-]\d{1,4}[\/\-]\d{1,4}|^\w+, \w+ \d+, \d{4})/,
+            o = /^0x[0-9a-f]+$/i,
+            a = /^0/,
+            s = function(e, t) {
+                var s = String(e).trim(),
+                    c = String(t).trim(),
+                    u = s
+                    .replace(r, "\0$1\0")
+                    .replace(/\0$/, "")
+                    .replace(/^\0/, "")
+                    .split("\0"),
+                    l = c
+                    .replace(r, "\0$1\0")
+                    .replace(/\0$/, "")
+                    .replace(/^\0/, "")
+                    .split("\0"),
+                    f =
+                    parseInt(s.match(o), 16) ||
+                    (1 !== u.length && s.match(i) && Date.parse(s)),
+                    d =
+                    parseInt(c.match(o), 16) ||
+                    (f && c.match(i) && Date.parse(c)) ||
+                    null;
+                if (d) {
+                    if (f < d) return -1;
+                    if (f > d) return 1;
+                }
+                for (var p = 0, h = Math.max(u.length, l.length); p < h; p += 1) {
+                    var g = (!(u[p] || "").match(a) && parseFloat(u[p])) || u[p] || 0,
+                        m = (!(l[p] || "").match(a) && parseFloat(l[p])) || l[p] || 0;
+                    if (isNaN(g) !== isNaN(m)) return isNaN(g) ? 1 : -1;
+                    if (
+                        (("undefined" == typeof g ? "undefined" : n(g)) !==
+                            ("undefined" == typeof m ? "undefined" : n(m)) &&
+                            ((g = String(g)), (m = String(m))),
+                            g < m)
+                    )
+                        return -1;
+                    if (g > m) return 1;
+                }
+                return 0;
+            };
+        e.exports = { naturalCmp: s };
+    },
+    function(e, t) {
+        "use strict";
+        var n = function(e) {
+                return e.replace(/[\-\[\]{}()*+?.,\\$\^|#\s]/g, "\\$&");
+            },
+            r = function(e, t) {
+                return t ?
+                    "re:" === e.substr(0, 3) ?
+                    e.substr(3) :
+                    e
+                    .trim()
+                    .split(/\s+/)
+                    .map(function(e) {
+                        return e
+                            .split("")
+                            .map(function(e) {
+                                return n(e);
+                            })
+                            .join(".*?");
+                    })
+                    .join("|") :
+                    n(e);
+            };
+        e.exports = { parsePattern: r };
+    },
+    function(e, t, n) {
+        "use strict";
+        var r = n(8),
+            i = r.request,
+            o = (e.exports = {
+                _update: function(e) {
+                    return i(e).then(function(e) {
+                        return Object.assign(o, e);
+                    });
+                },
+            });
+    },
+    function(e, t, n) {
+        (function(t) {
+            "use strict";
+            var r = n(2),
+                i = r.each,
+                o = r.dom,
+                a = t.window.XMLHttpRequest,
+                s = function(e) {
+                    return new Promise(function(t) {
+                        var n = new a(),
+                            r = function() {
+                                if (n.readyState === a.DONE)
+                                    try {
+                                        t(JSON.parse(n.responseText));
+                                    } catch (e) {
+                                        t({ err: e, txt: n.responseText });
+                                    }
+                            };
+                        n.open("POST", "?", !0),
+                            (n.onreadystatechange = r),
+                            n.setRequestHeader(
+                                "Content-Type",
+                                "application/json;charset=utf-8"
+                            ),
+                            n.send(JSON.stringify(e));
+                    });
+                },
+                c = function(e) {
+                    var t = o('<form method="post" action="?" style="display:none;"/>');
+                    i(e, function(e, n) {
+                            o('<input type="hidden"/>')
+                                .attr("name", n)
+                                .attr("value", e)
+                                .appTo(t);
+                        }),
+                        t.appTo("body"),
+                        t[0].submit(),
+                        t.rm();
+                };
+            e.exports = { request: s, formRequest: c };
+        }.call(
+            t,
+            (function() {
+                return this;
+            })()
+        ));
+    },
+    function(e, t, n) {
+        function r(e) {
+            return n(i(e));
+        }
+
+        function i(e) {
+            return (
+                o[e] ||
+                (function() {
+                    throw new Error("Cannot find module '" + e + "'.");
+                })()
+            );
+        }
+        var o = {
+            "./index": 10,
+            "./index.js": 10,
+            "./info": 50,
+            "./info.js": 50,
+        };
+        (r.keys = function() {
+            return Object.keys(o);
+        }),
+        (r.resolve = i),
+        (e.exports = r),
+        (r.id = 9);
+    },
+    function(e, t, n) {
+        (function(e) {
+            "use strict";
+            n(11),
+                n(24),
+                n(25),
+                n(26),
+                n(27),
+                n(29),
+                n(30),
+                n(31),
+                n(32),
+                n(34),
+                n(36),
+                n(37),
+                n(44),
+                n(45),
+                n(46),
+                n(47),
+                n(48),
+                n(49);
+            var t = e.window.document.location.href;
+            n(20).setLocation(t, !0);
+        }.call(
+            t,
+            (function() {
+                return this;
+            })()
+        ));
+    },
+    function(e, t, n) {
+        "use strict";
+        var r = n(2),
+            i = r.each,
+            o = r.dom,
+            a = n(12),
+            s = n(13),
+            c = n(14),
+            u = n(15),
+            l = n(17),
+            f = n(18),
+            d = Object.assign({ modeToggle: !1 }, c.view),
+            p =
+            '<div id="viewmode-settings" class="block"><h1 class="l10n-view">View</h1></div>',
+            h =
+            '<div id="viewmode-[MODE]" class="button mode">\n            <img src="' +
+            s.image("view-[MODE]") +
+            '" alt="viewmode-[MODE]"/>\n        </div>',
+            g = '<input id="viewmode-size" type="range" min="0" max="0" value="0">',
+            m =
+            '<div id="viewmode-toggle" class="tool">\n            <img alt="viewmode"/>\n        </div>',
+            v = void 0,
+            b = void 0,
+            w = function(e, t) {
+                o("#viewmode-settings .mode").rmCls("active"),
+                    o("#viewmode-" + e).addCls("active"),
+                    o("#viewmode-size").val(b.indexOf(t)),
+                    "next" === d.modeToggle && (e = v[(v.indexOf(e) + 1) % v.length]),
+                    o("#viewmode-toggle img").attr("src", s.image("view-" + e));
+            },
+            y = function() {
+                if (!(v.length < 2 && b.length < 2)) {
+                    var e = o(p);
+                    if (
+                        (v.length > 1 &&
+                            i(v, function(t) {
+                                o(h.replace(/\[MODE\]/g, t))
+                                    .on("click", function() {
+                                        f.setMode(t);
+                                    })
+                                    .appTo(e);
+                            }),
+                            b.length > 1)
+                    ) {
+                        var t = b.length - 1;
+                        o(g)
+                            .attr("max", t)
+                            .on("input", function(e) {
+                                return f.setSize(b[e.target.valueAsNumber]);
+                            })
+                            .on("change", function(e) {
+                                return f.setSize(b[e.target.valueAsNumber]);
+                            })
+                            .appTo(e);
+                    }
+                    e.appTo(u.$el);
+                }
+            },
+            x = function() {
+                var e = f.getMode(),
+                    t = (v.indexOf(e) + 1) % v.length,
+                    n = v[t];
+                f.setMode(n);
+            },
+            k = function() {
+                d.modeToggle && v.length > 1 && o(m).on("click", x).appTo(l.$toolbar);
+            },
+            _ = function() {
+                (v = f.getModes()),
+                (b = f.getSizes()),
+                y(),
+                    k(),
+                    w(f.getMode(), f.getSize()),
+                    a.sub("view.mode.changed", w);
+            };
+        _();
+    },
+    function(e, t, n) {
+        (function(t) {
+            "use strict";
+            var r = n(2),
+                i = r.isStr,
+                o = r.isFn,
+                a = r.dom,
+                s = {},
+                c = function(e, t) {
+                    i(e) && o(t) && (s[e] || (s[e] = []), s[e].push(t));
+                },
+                u = function(e) {
+                    for (
+                        var t = arguments.length, n = Array(t > 1 ? t - 1 : 0), r = 1; r < t; r++
+                    )
+                        n[r - 1] = arguments[r];
+                    i(e) &&
+                        s[e] &&
+                        s[e].forEach(function(t) {
+                            t.apply(e, n);
+                        });
+                };
+            a(t.window).on("resize", function() {
+                    return u("resize");
+                }),
+                (e.exports = { sub: c, pub: u });
+        }.call(
+            t,
+            (function() {
+                return this;
+            })()
+        ));
+    },
+    function(e, t, n) {
+        "use strict";
+        var r = n(2),
+            i = r.includes,
+            o = n(7),
+            a = n(14),
+            s = a.publicHref + "images/",
+            c = s + "ui/",
+            u = s + "themes/",
+            l = u + "default/",
+            f = [
+                "file",
+                "folder",
+                "folder-page",
+                "folder-parent",
+                "ar",
+                "aud",
+                "bin",
+                "img",
+                "txt",
+                "vid",
+                "x",
+            ],
+            d = function(e) {
+                return c + e + ".svg";
+            },
+            p = function(e) {
+                var t = (e || "").split("-")[0],
+                    n = o.theme[e] || o.theme[t];
+                return n ?
+                    u + n :
+                    i(f, e) ?
+                    l + e + ".svg" :
+                    i(f, t) ?
+                    l + t + ".svg" :
+                    l + "file.svg";
+            };
+        e.exports = { image: d, icon: p };
+    },
+    function(e, t, n) {
+        "use strict";
+        var r = n(7);
+        e.exports = Object.assign({}, r.options, {
+            publicHref: r.setup.PUBLIC_HREF,
+            rootHref: r.setup.ROOT_HREF,
+        });
+    },
+    function(e, t, n) {
+        "use strict";
+        var r = n(2),
+            i = r.dom,
+            o = n(13),
+            a = n(14),
+            s = n(16),
+            c = n(17),
+            u = Object.assign({ disableSidebar: !1 }, a.view),
+            l = "sidebarIsVisible",
+            f = '<div id="sidebar"></div>',
+            d =
+            '<div id="sidebar-toggle" class="tool">\n            <img alt="sidebar"/>\n        </div>',
+            p = function() {
+                var e = i(f).hide(),
+                    t = i(d),
+                    n = t.find("img"),
+                    r = function(r) {
+                        var i = s.get(l);
+                        r && ((i = !i), s.put(l, i)),
+                            i ?
+                            (t.addCls("active"),
+                                n.attr("src", o.image("back")),
+                                e.show()) :
+                            (t.rmCls("active"),
+                                n.attr("src", o.image("sidebar")),
+                                e.hide());
+                    };
+                return (
+                    u.disableSidebar ||
+                    (e.appTo(c.$mainrow),
+                        t.appTo(c.$toolbar).on("click", function() {
+                            return r(!0);
+                        }),
+                        r()), { $el: e }
+                );
+            };
+        e.exports = p();
+    },
+    function(e, t) {
+        (function(t) {
+            "use strict";
+            var n = t.window.localStorage,
+                r = "_h5ai",
+                i = function() {
+                    try {
+                        return JSON.parse(n[r]);
+                    } catch (e) {}
+                    return {};
+                },
+                o = function(e) {
+                    n[r] = JSON.stringify(e);
+                },
+                a = function(e, t) {
+                    var n = i();
+                    (n[e] = t), o(n);
+                },
+                s = function(e) {
+                    return i()[e];
+                };
+            e.exports = { put: a, get: s };
+        }.call(
+            t,
+            (function() {
+                return this;
+            })()
+        ));
+    },
+    function(e, t, n) {
+        "use strict";
+        var r = n(2),
+            i = r.dom,
+            o = "body",
+            a =
+            '<div id="topbar">\n            <div id="toolbar"></div>\n            <div id="flowbar"></div>\n            <a id="backlink" href="https://larsjung.de/h5ai/" title="powered by h5ai - https://larsjung.de/h5ai/">\n                <div>powered</div>\n                <div>by h5ai</div>\n            </a>\n        </div>',
+            s =
+            '<div id="mainrow">\n            <div id="content"></div>\n        </div>',
+            c = function() {
+                var e = i(o).attr("id", "root").clr().app(a).app(s);
+                return {
+                    $root: e,
+                    $topbar: e.find("#topbar"),
+                    $toolbar: e.find("#toolbar"),
+                    $flowbar: e.find("#flowbar"),
+                    $mainrow: e.find("#mainrow"),
+                    $content: e.find("#content"),
+                };
+            };
+        e.exports = c();
+    },
+    function(e, t, n) {
+        "use strict";
+        var r = n(2),
+            i = r.each,
+            o = r.map,
+            a = r.includes,
+            s = r.intersection,
+            c = r.dom,
+            u = n(12),
+            l = n(19),
+            f = n(20),
+            d = n(13),
+            p = n(16),
+            h = n(14),
+            g = n(17),
+            m = ["details", "grid", "icons"],
+            v = [20, 40, 60, 80, 100, 150, 200, 250, 300, 350, 400],
+            b = Object.assign({
+                    binaryPrefix: !1,
+                    hideFolders: !1,
+                    hideParentFolder: !1,
+                    maxIconSize: 40,
+                    modes: m,
+                    setParentFolderLabels: !1,
+                    sizes: v,
+                },
+                h.view
+            ),
+            w = b.sizes.sort(function(e, t) {
+                return e - t;
+            }),
+            y = s(b.modes, m),
+            x = "view",
+            k =
+            '<div id="view">\n            <ul id="items" class="clearfix">\n                <li class="header">\n                    <a class="icon"></a>\n                    <a class="label" href="#"><span class="l10n-name"/></a>\n                    <a class="date" href="#"><span class="l10n-lastModified"/></a>\n                    <a class="size" href="#"><span class="l10n-size"/></a>\n                </li>\n            </ul>\n            <div id="view-hint"></div>\n        </div>',
+            _ =
+            '<li class="item">\n            <a>\n                <span class="icon square"><img/></span>\n                <span class="icon landscape"><img/></span>\n                <span class="label"></span>\n                <span class="date"></span>\n                <span class="size"></span>\n            </a>\n        </li>',
+            C = c(k),
+            S = C.find("#items"),
+            A = C.find("#view-hint"),
+            T = function(e, t, n) {
+                return Math.min(n, Math.max(t, e));
+            },
+            E = function(e) {
+                var t = T(e, 20, 80),
+                    n = T(e, 40, 160),
+                    r = T(e, 80, 1e3),
+                    i = Math.round((4 * r) / 3),
+                    o = "!important;",
+                    a = "#view.view-details.view-size-" + e,
+                    s = "#view.view-grid.view-size-" + e,
+                    c = "#view.view-icons.view-size-" + e,
+                    u = [
+                        a + " .item .label {line-height: " + (t + 14) + "px " + o + "}",
+                        a + " .item .date {line-height: " + (t + 14) + "px " + o + "}",
+                        a + " .item .size {line-height: " + (t + 14) + "px " + o + "}",
+                        a +
+                        " .square {width: " +
+                        t +
+                        "px " +
+                        o +
+                        " height: " +
+                        t +
+                        "px " +
+                        o +
+                        "}",
+                        a +
+                        " .square img {width: " +
+                        t +
+                        "px " +
+                        o +
+                        " height: " +
+                        t +
+                        "px " +
+                        o +
+                        "}",
+                        a + " .label {margin-left: " + (t + 32) + "px " + o + "}",
+                        s + " .item .label {line-height: " + n + "px " + o + "}",
+                        s +
+                        " .square {width: " +
+                        n +
+                        "px " +
+                        o +
+                        " height: " +
+                        n +
+                        "px " +
+                        o +
+                        "}",
+                        s +
+                        " .square img {width: " +
+                        n +
+                        "px " +
+                        o +
+                        " height: " +
+                        n +
+                        "px " +
+                        o +
+                        "}",
+                        c + " .item {width: " + i + "px " + o + "}",
+                        c +
+                        " .landscape {width: " +
+                        i +
+                        "px " +
+                        o +
+                        " height: " +
+                        r +
+                        "px " +
+                        o +
+                        "}",
+                        c +
+                        " .landscape img {width: " +
+                        r +
+                        "px " +
+                        o +
+                        " height: " +
+                        r +
+                        "px " +
+                        o +
+                        "}",
+                        c + " .landscape .thumb {width: " + i + "px " + o + "}",
+                    ];
+                return u.join("\n");
+            },
+            M = function() {
+                var e = o(w, function(e) {
+                    return E(e);
+                });
+                e.push(
+                        "#view .icon img {max-width: " +
+                        b.maxIconSize +
+                        "px; max-height: " +
+                        b.maxIconSize +
+                        "px;}"
+                    ),
+                    c("<style></style>").text(e.join("\n")).appTo("head");
+            },
+            D = function(e, t) {
+                var n = p.get(x);
+                (e = e || (n && n.mode)),
+                (t = t || (n && n.size)),
+                (e = a(b.modes, e) ? e : b.modes[0]),
+                (t = a(b.sizes, t) ? t : b.sizes[0]),
+                p.put(x, { mode: e, size: t }),
+                    i(y, function(t) {
+                        t === e ? C.addCls("view-" + t) : C.rmCls("view-" + t);
+                    }),
+                    i(w, function(e) {
+                        e === t ? C.addCls("view-size-" + e) : C.rmCls("view-size-" + e);
+                    }),
+                    u.pub("view.mode.changed", e, t);
+            },
+            P = function() {
+                return y;
+            },
+            z = function() {
+                return p.get(x).mode;
+            },
+            L = function(e) {
+                return D(e, null);
+            },
+            $ = function() {
+                return w;
+            },
+            H = function() {
+                return p.get(x).size;
+            },
+            O = function(e) {
+                return D(null, e);
+            },
+            B = function(e) {
+                var t = e.target._item;
+                u.pub("item.mouseenter", t);
+            },
+            R = function(e) {
+                var t = e.target._item;
+                u.pub("item.mouseleave", t);
+            },
+            N = function(e) {
+                var t = c(_),
+                    n = t.find("a"),
+                    r = t.find(".icon img"),
+                    i = t.find(".label"),
+                    o = t.find(".date"),
+                    a = t.find(".size");
+                return (
+                    t
+                    .addCls(e.isFolder() ? "folder" : "file")
+                    .on("mouseenter", B)
+                    .on("mouseleave", R),
+                    f.setLink(n, e),
+                    i.text(e.label).attr("title", e.label),
+                    o.attr("data-time", e.time).text(l.formatDate(e.time)),
+                    a.attr("data-bytes", e.size).text(l.formatSize(e.size)),
+                    (e.icon = d.icon(e.type)),
+                    e.isFolder() &&
+                    !e.isManaged &&
+                    (t.addCls("page"), (e.icon = d.icon("folder-page"))),
+                    e.isCurrentParentFolder() &&
+                    ((e.icon = d.icon("folder-parent")),
+                        b.setParentFolderLabels || i.addCls("l10n-parentDirectory"),
+                        t.addCls("folder-parent")),
+                    r.attr("src", e.icon).attr("alt", e.type),
+                    (e.$view = t),
+                    (t[0]._item = e),
+                    t
+                );
+            },
+            I = function() {
+                var e = S.find(".item").length === S.find(".folder-parent").length;
+                e ? A.show() : A.hide();
+            },
+            j = function(e) {
+                var t = o(S.find(".item"), function(e) {
+                    return e._item;
+                });
+                S.find(".item").rm(),
+                    i(e, function(e) {
+                        return S.app(N(e));
+                    }),
+                    (g.$content[0].scrollLeft = 0),
+                    (g.$content[0].scrollTop = 0),
+                    I(),
+                    u.pub("view.changed", e, t);
+            },
+            F = function(e, t) {
+                i(e, function(e) {
+                        N(e).hide().appTo(S).show();
+                    }),
+                    i(t, function(e) {
+                        e.$view.hide().rm();
+                    }),
+                    I(),
+                    u.pub("view.changed", e, t);
+            },
+            q = function(e) {
+                A.rmCls().addCls("l10n-" + e), I();
+            },
+            Y = function(e) {
+                e || (e = f.getItem());
+                var t = [];
+                e.parent && !b.hideParentFolder && t.push(e.parent),
+                    i(e.content, function(e) {
+                        (e.isFolder() && b.hideFolders) || t.push(e);
+                    }),
+                    q("empty"),
+                    j(t);
+            },
+            Z = function(e, t, n) {
+                var r = [];
+                i(t, function(e) {
+                        (e.isFolder() && b.hideFolders) || r.push(e);
+                    }),
+                    q("empty"),
+                    F(r, n);
+            },
+            U = function() {
+                var e = C[0].offsetWidth;
+                C.rmCls("width-0").rmCls("width-1"),
+                    e < 320 ? C.addCls("width-0") : e < 480 && C.addCls("width-1");
+            },
+            V = function() {
+                M(),
+                    D(),
+                    C.appTo(g.$content),
+                    A.hide(),
+                    l.setDefaultMetric(b.binaryPrefix),
+                    u.sub("location.changed", Y),
+                    u.sub("location.refreshed", Z),
+                    u.sub("resize", U),
+                    U();
+            };
+        V(),
+            (e.exports = {
+                $el: C,
+                setItems: j,
+                changeItems: F,
+                setLocation: Y,
+                setHint: q,
+                getModes: P,
+                getMode: z,
+                setMode: L,
+                getSizes: $,
+                getSize: H,
+                setSize: O,
+            });
+    },
+    function(e, t, n) {
+        "use strict";
+        var r = n(2),
+            i = r.isNum,
+            o = {
+                t: 1e3,
+                k: 1e3,
+                u: ["B", "KB", "MB", "GB", "TB", "PB", "EB", "ZB", "YB"],
+            },
+            a = {
+                t: 1024,
+                k: 1024,
+                u: ["B", "KiB", "MiB", "GiB", "TiB", "PiB", "EiB", "ZiB", "YiB"],
+            },
+            s = o,
+            c = [
+                [/YYYY/, "Y", 4],
+                [/YY/, "Y", 2],
+                [/Y/, "Y", 0],
+                [/MM/, "M", 2],
+                [/M/, "M", 0],
+                [/DD/, "D", 2],
+                [/D/, "D", 0],
+                [/HH/, "H", 2],
+                [/H/, "H", 0],
+                [/mm/, "m", 2],
+                [/m/, "m", 0],
+                [/ss/, "s", 2],
+                [/s/, "s", 0],
+            ],
+            u = "YYYY-MM-DD HH:mm",
+            l = function(e) {
+                s = e ? a : o;
+            },
+            f = function(e, t) {
+                if (((t = t || s), !i(e) || e < 0)) return "";
+                for (var n = 0, r = t.u.length - 1; e >= t.t && n < r;)
+                    (e /= t.k), (n += 1);
+                return (
+                    (n <= 1 ? Math.round(e) : e.toFixed(1)).toString() + " " + t.u[n]
+                );
+            },
+            d = function(e) {
+                u = e;
+            },
+            p = function(e, t) {
+                var n = String(e);
+                return t && (n = ("000" + n).substr(-t)), n;
+            },
+            h = function(e, t) {
+                if (!e || !i(e)) return "";
+                t = t || u;
+                var n = new Date(e),
+                    r = {
+                        Y: n.getFullYear(),
+                        M: n.getMonth() + 1,
+                        D: n.getDate(),
+                        H: n.getHours(),
+                        m: n.getMinutes(),
+                        s: n.getSeconds(),
+                    };
+                return (
+                    c.forEach(function(e) {
+                        t = t.replace(e[0], p(r[e[1]], e[2]));
+                    }),
+                    t
+                );
+            };
+        e.exports = {
+            setDefaultMetric: l,
+            formatSize: f,
+            setDefaultDateFormat: d,
+            formatDate: h,
+        };
+    },
+    function(e, t, n) {
+        (function(t) {
+            "use strict";
+            var r = n(2),
+                i = r.each,
+                o = r.values,
+                a = r.difference,
+                s = n(8),
+                c = s.request,
+                u = n(14),
+                l = n(12),
+                f = n(21),
+                d = t.window,
+                p = d.document,
+                h = Object.assign({ fastBrowsing: !0, unmanagedInNewWindow: !0 },
+                    u.view
+                ),
+                g = h.fastBrowsing ? d.history : null,
+                m = /^.*:\/\/[^\/]*|[^\/]*$/g,
+                v = [
+                    [/\/+/g, "/"],
+                    [/ /g, "%20"],
+                    [/!/g, "%21"],
+                    [/#/g, "%23"],
+                    [/\$/g, "%24"],
+                    [/&/g, "%26"],
+                    [/'/g, "%27"],
+                    [/\(/g, "%28"],
+                    [/\)/g, "%29"],
+                    [/\*/g, "%2A"],
+                    [/\+/g, "%2B"],
+                    [/\,/g, "%2C"],
+                    [/:/g, "%3A"],
+                    [/;/g, "%3B"],
+                    [/\=/g, "%3D"],
+                    [/\?/g, "%3F"],
+                    [/@/g, "%40"],
+                    [/\[/g, "%5B"],
+                    [/\]/g, "%5D"],
+                ],
+                b = null,
+                w = function(e) {
+                    return v.reduce(function(e, t) {
+                        return e.replace(t[0], t[1]);
+                    }, e);
+                },
+                y = function(e) {
+                    return e.replace(m, "");
+                },
+                x = (function() {
+                    var e = "/a b",
+                        t = p.createElement("a");
+                    return (t.href = e), y(t.href) === e;
+                })(),
+                k = function(e) {
+                    var t = p.createElement("a"),
+                        n = void 0;
+                    return (
+                        (t.href = e),
+                        (n = y(t.href)),
+                        x && (n = encodeURIComponent(n).replace(/%2F/gi, "/")),
+                        w(n)
+                    );
+                },
+                _ = function() {
+                    return p.domain;
+                },
+                C = function() {
+                    return b;
+                },
+                S = function() {
+                    return n(22).get(b);
+                },
+                A = function() {
+                    return c({ action: "get", items: { href: b, what: 1 } }).then(
+                        function(e) {
+                            var t = n(22),
+                                r = t.get(b);
+                            if (e) {
+                                var o = {};
+                                i(e.items, function(e) {
+                                        var n = t.get(e);
+                                        o[n.absHref] = !0;
+                                    }),
+                                    i(r.content, function(e) {
+                                        o[e.absHref] || t.remove(e.absHref);
+                                    });
+                            }
+                            return r;
+                        }
+                    );
+                },
+                T = function() {
+                    var e = S(),
+                        t = o(e.content);
+                    l.pub("location.beforeRefresh"),
+                        A().then(function() {
+                            var n = o(e.content),
+                                r = a(n, t),
+                                i = a(t, n);
+                            l.pub("location.refreshed", e, r, i);
+                        });
+                },
+                E = function(e, t) {
+                    l.pub("location.beforeChange"),
+                        (e = k(e)),
+                        b !== e &&
+                        ((b = e),
+                            g &&
+                            (t ?
+                                g.replaceState({ absHref: b }, "", b) :
+                                g.pushState({ absHref: b }, "", b)));
+                    var n = S();
+                    n.isLoaded ?
+                        (l.pub("location.changed", n), T()) :
+                        (f.set("loading..."),
+                            A().then(function() {
+                                (n.isLoaded = !0), f.set(), l.pub("location.changed", n);
+                            }));
+                },
+                M = function(e, t) {
+                    e.attr("href", t.absHref),
+                        g &&
+                        t.isFolder() &&
+                        t.isManaged &&
+                        e.on("click", function(e) {
+                            return E(t.absHref), e.preventDefault(), !1;
+                        }),
+                        h.unmanagedInNewWindow &&
+                        !t.isManaged &&
+                        e.attr("target", "_blank");
+                },
+                D = function(e) {
+                    e.state && e.state.absHref && E(e.state.absHref, !0);
+                };
+            (d.onpopstate = g ? D : null),
+            (e.exports = {
+                forceEncoding: w,
+                getDomain: _,
+                getAbsHref: C,
+                getItem: S,
+                setLocation: E,
+                refresh: T,
+                setLink: M,
+            });
+        }.call(
+            t,
+            (function() {
+                return this;
+            })()
+        ));
+    },
+    function(e, t, n) {
+        "use strict";
+        var r = n(2),
+            i = r.dom,
+            o = n(17),
+            a = function() {
+                var e = i('<div id="notification"></div>').hide().appTo(o.$root),
+                    t = function(t) {
+                        t ? e.html(t).show() : e.hide();
+                    };
+                return { set: t };
+            };
+        e.exports = a();
+    },
+    function(e, t, n) {
+        "use strict";
+        var r = n(2),
+            i = r.keys,
+            o = r.each,
+            a = r.filter,
+            s = r.sortBy,
+            c = r.isStr,
+            u = r.isNum,
+            l = n(8),
+            f = n(20),
+            d = n(14),
+            p = n(23),
+            h = /\/$/,
+            g = /^(.*\/)([^\/]+\/?)$/,
+            m = {},
+            v = function(e, t) {
+                return c(e) && e.startsWith(t);
+            },
+            b = function(e) {
+                e = e.replace(h, "");
+                try {
+                    e = decodeURIComponent(e);
+                } catch (e) {}
+                return e;
+            },
+            w = function(e) {
+                if ("/" === e) return { parent: null, name: "/" };
+                var t = g.exec(e);
+                if (!t) return null;
+                var n = { parent: t[1], name: t[2] };
+                return n.parent && !v(n.parent, d.rootHref) && (n.parent = null), n;
+            },
+            y = function(e) {
+                if (c(e)) e = { href: e };
+                else if (!e || !c(e.href)) return null;
+                var t = f.forceEncoding(e.href);
+                if (!v(t, d.rootHref)) return null;
+                var n = m[t] || _(t);
+                return (
+                    u(e.time) && (n.time = e.time),
+                    u(e.size) && (n.size = e.size),
+                    e.managed && (n.isManaged = !0),
+                    e.fetched && (n.isContentFetched = !0),
+                    n
+                );
+            },
+            x = function e(t) {
+                t = f.forceEncoding(t);
+                var n = m[t];
+                n &&
+                    (delete m[t],
+                        n.parent && delete n.parent.content[n.absHref],
+                        o(n.content, function(t) {
+                            e(t.absHref);
+                        }));
+            },
+            k = function(e) {
+                return new Promise(function(t) {
+                    var n = y(e);
+                    n.isContentFetched ?
+                        t(n) :
+                        l
+                        .request({
+                            action: "get",
+                            items: { href: n.absHref, what: 1 },
+                        })
+                        .then(function(e) {
+                            e.items &&
+                                o(e.items, function(e) {
+                                    y(e);
+                                }),
+                                t(n);
+                        });
+                });
+            },
+            _ = function e(t) {
+                var n = w(t),
+                    r = Object.assign(Object.create(e.prototype), {
+                        absHref: t,
+                        type: p.getType(t),
+                        label: b("/" === t ? f.getDomain() : n.name),
+                        time: null,
+                        size: null,
+                        parent: null,
+                        isManaged: null,
+                        content: {},
+                    });
+                return (
+                    (m[t] = r),
+                    n.parent &&
+                    ((r.parent = y(n.parent)),
+                        (r.parent.content[r.absHref] = r),
+                        i(r.parent.content).length > 1 &&
+                        (r.parent.isContentFetched = !0)),
+                    r
+                );
+            };
+        (_.prototype = {
+            constructor: _,
+            isFolder: function() {
+                return h.test(this.absHref);
+            },
+            isCurrentFolder: function() {
+                return this.absHref === f.getAbsHref();
+            },
+            isInCurrentFolder: function() {
+                return !!this.parent && this.parent.isCurrentFolder();
+            },
+            isCurrentParentFolder: function() {
+                var e = y(f.getAbsHref());
+                return !!e && this === e.parent;
+            },
+            isDomain: function() {
+                return "/" === this.absHref;
+            },
+            isRoot: function() {
+                return this.absHref === d.rootHref;
+            },
+            isEmpty: function() {
+                return 0 === i(this.content).length;
+            },
+            fetchContent: function() {
+                return k(this.absHref);
+            },
+            getCrumb: function() {
+                for (var e = this, t = [e]; e.parent;)(e = e.parent), t.unshift(e);
+                return t;
+            },
+            getSubfolders: function() {
+                return s(
+                    a(this.content, function(e) {
+                        return e.isFolder();
+                    }),
+                    function(e) {
+                        return e.label.toLowerCase();
+                    }
+                );
+            },
+            getStats: function() {
+                var e = 0,
+                    t = 0;
+                o(this.content, function(n) {
+                    n.isFolder() ? (e += 1) : (t += 1);
+                });
+                for (var n = 0, r = this; r.parent;)(n += 1), (r = r.parent);
+                return { folders: e, files: t, depth: n };
+            },
+        }),
+        (e.exports = { get: y, remove: x });
+    },
+    function(e, t, n) {
+        "use strict";
+        var r = n(2),
+            i = r.each,
+            o = r.map,
+            a = n(7),
+            s = /\/$/,
+            c = {},
+            u = function(e) {
+                return e.replace(/[\-\[\]\/\{\}\(\)\+\?\.\\\^\$]/g, "\\$&");
+            },
+            l = function(e) {
+                i(e, function(e, t) {
+                    var n =
+                        "^(" +
+                        o(e, function(e) {
+                            return "(" + u(e).replace(/\*/g, ".*") + ")";
+                        }).join("|") +
+                        ")$";
+                    c[t] = new RegExp(n, "i");
+                });
+            },
+            f = function(e) {
+                if (s.test(e)) return "folder";
+                var t = e.lastIndexOf("/"),
+                    n = t >= 0 ? e.substr(t + 1) : e,
+                    r = void 0;
+                return (
+                    i(c, function(e, t) {
+                        c[t].test(n) && (r = t);
+                    }),
+                    r ? r : "file"
+                );
+            };
+        l(Object.assign({}, a.types)), (e.exports = { getType: f });
+    },
+    function(e, t, n) {
+        (function(e) {
+            "use strict";
+            var t = n(12),
+                r = n(20),
+                i = n(14),
+                o = e.window,
+                a = Object.assign({ enabled: !1, interval: 5e3 }, i.autorefresh),
+                s = null,
+                c = function() {
+                    r.refresh();
+                },
+                u = function() {
+                    o.clearTimeout(s);
+                },
+                l = function() {
+                    o.clearTimeout(s), (s = o.setTimeout(c, a.interval));
+                },
+                f = function() {
+                    a.enabled &&
+                        ((a.interval = Math.max(1e3, a.interval)),
+                            t.sub("location.beforeChange", u),
+                            t.sub("location.beforeRefresh", u),
+                            t.sub("location.changed", l),
+                            t.sub("location.refreshed", l));
+                };
+            f();
+        }.call(
+            t,
+            (function() {
+                return this;
+            })()
+        ));
+    },
+    function(e, t, n) {
+        "use strict";
+        var r = n(2),
+            i = r.each,
+            o = r.dom,
+            a = n(13),
+            s = n(14),
+            c = Object.assign({ enabled: !1 }, s.contextmenu),
+            u = '<div id="cm-overlay"></div>',
+            l = '<div class="cm-panel"><ul></ul></div>',
+            f = '<li class="cm-sep"></li>',
+            d =
+            '<li class="cm-entry"><span class="cm-icon"><img/></span><span class="cm-text"></span></li>',
+            p = '<li class="cm-label"><span class="cm-text"></span></li>',
+            h = function(e) {
+                for (; !e._cmId && e.parentNode;) e = e.parentNode;
+                return e._cmId;
+            },
+            g = function(e) {
+                var t = o(u),
+                    n = function(n) {
+                        n.stopPropagation(), n.preventDefault();
+                        var r = h(n.target);
+                        (n.target !== t[0] && void 0 === r) || (t.rm(), e(r));
+                    };
+                return t.on("contextmenu", n).on("click", n);
+            },
+            m = function(e) {
+                var t = o(l),
+                    n = t.find("ul"),
+                    r = void 0;
+                return (
+                    i(e, function(e) {
+                        "-" === e.type ?
+                            o(f).appTo(n) :
+                            "l" === e.type ?
+                            o(p).appTo(n).find(".cm-text").text(e.text) :
+                            "e" === e.type &&
+                            ((r = o(d).appTo(n)),
+                                (r[0]._cmId = e.id),
+                                r.find(".cm-text").text(e.text),
+                                e.icon ?
+                                r.find(".cm-icon img").attr("src", a.icon(e.icon)) :
+                                r.find(".cm-icon").addCls("no-icon"));
+                    }),
+                    t
+                );
+            },
+            v = function(e, t, n, r) {
+                var i = 4;
+                t.css({ left: 0, top: 0, opacity: 0 }), e.show();
+                var o = e[0].getBoundingClientRect(),
+                    a = t[0].getBoundingClientRect(),
+                    s = o.left,
+                    c = o.top,
+                    u = o.width,
+                    l = o.height,
+                    f = a.width,
+                    d = a.height,
+                    p = n,
+                    h = r;
+                f > u - 2 * i && ((p = i), (f = u - 2 * i)),
+                    d > l - 2 * i && ((h = i), (d = l - 2 * i)),
+                    p < s + i && (p = s + i),
+                    p + f > s + u - i && (p = s + u - i - f),
+                    h < c + i && (h = c + i),
+                    h + d > c + l - i && (h = c + l - i - d),
+                    t.css({
+                        left: p + "px",
+                        top: h + "px",
+                        width: f + "px",
+                        height: d + "px",
+                        opacity: 1,
+                    });
+            },
+            b = function(e, t, n, r) {
+                var i = g(r),
+                    o = m(n);
+                i.hide().app(o).appTo("body"), v(i, o, e, t);
+            },
+            w = function() {
+                if (c.enabled) {
+                    var e = [
+                        { type: "e", id: "e1", text: "testing context menus" },
+                        { type: "e", id: "e2", text: "another entry" },
+                        { type: "e", id: "e3", text: "one with icon", icon: "folder" },
+                        { type: "-" },
+                        { type: "e", id: "e4", text: "one with icon", icon: "x" },
+                        { type: "e", id: "e5", text: "one with icon", icon: "img" },
+                    ];
+                    o("#view").on("contextmenu", function(t) {
+                        t.preventDefault(), b(t.pageX, t.pageY, e);
+                    });
+                }
+            };
+        w();
+    },
+    function(e, t, n) {
+        "use strict";
+        var r = n(2),
+            i = r.each,
+            o = r.dom,
+            a = n(12),
+            s = n(20),
+            c = n(13),
+            u = n(14),
+            l = n(17),
+            f = Object.assign({ enabled: !1 }, u.crumb),
+            d = '<div id="crumbbar"></div>',
+            p =
+            '<a class="crumb">\n            <img class="sep" src="' +
+            c.image("crumb") +
+            '" alt=">"/>\n            <span class="label"></span>\n        </a>',
+            h =
+            '<img class="hint" src="' +
+            c.icon("folder-page") +
+            '" alt="has index page"/>',
+            g = function(e) {
+                var t = o(p);
+                return (
+                    s.setLink(t, e),
+                    t.find(".label").text(e.label),
+                    e.isCurrentFolder() && t.addCls("active"),
+                    e.isManaged || t.app(o(h)),
+                    (e._$crumb = t),
+                    (t[0]._item = e),
+                    t
+                );
+            },
+            m = function(e) {
+                var t = e._$crumb,
+                    n = o("#crumbbar");
+                t && t.parent()[0] === n[0] ?
+                    (n.children().rmCls("active"), t.addCls("active")) :
+                    (n.clr(),
+                        i(e.getCrumb(), function(e) {
+                            n.app(g(e));
+                        }));
+            },
+            v = function() {
+                f.enabled && (o(d).appTo(l.$flowbar), a.sub("location.changed", m));
+            };
+        v();
+    },
+    function(e, t, n) {
+        "use strict";
+        var r = n(28),
+            i = n(2),
+            o = i.each,
+            a = i.dom,
+            s = n(8),
+            c = n(12),
+            u = n(14),
+            l = Object.assign({ enabled: !1 }, u.custom),
+            f = function(e, t) {
+                var n = a("#content-" + t);
+                if (e && e[t].content) {
+                    var i = e[t].content;
+                    "md" === e[t].type && (i = r(i)), n.html(i).show();
+                } else n.hide();
+            },
+            d = function(e) {
+                s.request({ action: "get", custom: e.absHref }).then(function(e) {
+                    var t = e && e.custom;
+                    o(["header", "footer"], function(e) {
+                        return f(t, e);
+                    });
+                });
+            },
+            p = function() {
+                l.enabled &&
+                    (a('<div id="content-header"></div>').hide().preTo("#content"),
+                        a('<div id="content-footer"></div>').hide().appTo("#content"),
+                        c.sub("location.changed", d));
+            };
+        p();
+    },
+    function(e, t, n) {
+        (function(t) {
+            !(function(t) {
+                "use strict";
+
+                function n(e) {
+                    (this.tokens = []),
+                    (this.tokens.links = Object.create(null)),
+                    (this.options = e || b.defaults),
+                    (this.rules = w.normal),
+                    this.options.pedantic ?
+                        (this.rules = w.pedantic) :
+                        this.options.gfm &&
+                        (this.options.tables ?
+                            (this.rules = w.tables) :
+                            (this.rules = w.gfm));
+                }
+
+                function r(e, t) {
+                    if (
+                        ((this.options = t || b.defaults),
+                            (this.links = e),
+                            (this.rules = y.normal),
+                            (this.renderer = this.options.renderer || new i()),
+                            (this.renderer.options = this.options), !this.links)
+                    )
+                        throw new Error("Tokens array requires a `links` property.");
+                    this.options.pedantic ?
+                        (this.rules = y.pedantic) :
+                        this.options.gfm &&
+                        (this.options.breaks ?
+                            (this.rules = y.breaks) :
+                            (this.rules = y.gfm));
+                }
+
+                function i(e) {
+                    this.options = e || b.defaults;
+                }
+
+                function o() {}
+
+                function a(e) {
+                    (this.tokens = []),
+                    (this.token = null),
+                    (this.options = e || b.defaults),
+                    (this.options.renderer = this.options.renderer || new i()),
+                    (this.renderer = this.options.renderer),
+                    (this.renderer.options = this.options),
+                    (this.slugger = new s());
+                }
+
+                function s() {
+                    this.seen = {};
+                }
+
+                function c(e, t) {
+                    if (t) {
+                        if (c.escapeTest.test(e))
+                            return e.replace(c.escapeReplace, function(e) {
+                                return c.replacements[e];
+                            });
+                    } else if (c.escapeTestNoEncode.test(e))
+                        return e.replace(c.escapeReplaceNoEncode, function(e) {
+                            return c.replacements[e];
+                        });
+                    return e;
+                }
+
+                function u(e) {
+                    return e.replace(
+                        /&(#(?:\d+)|(?:#x[0-9A-Fa-f]+)|(?:\w+));?/gi,
+                        function(e, t) {
+                            return (
+                                (t = t.toLowerCase()),
+                                "colon" === t ?
+                                ":" :
+                                "#" === t.charAt(0) ?
+                                "x" === t.charAt(1) ?
+                                String.fromCharCode(parseInt(t.substring(2), 16)) :
+                                String.fromCharCode(+t.substring(1)) :
+                                ""
+                            );
+                        }
+                    );
+                }
+
+                function l(e, t) {
+                    return (
+                        (e = e.source || e),
+                        (t = t || ""), {
+                            replace: function(t, n) {
+                                return (
+                                    (n = n.source || n),
+                                    (n = n.replace(/(^|[^\[])\^/g, "$1")),
+                                    (e = e.replace(t, n)),
+                                    this
+                                );
+                            },
+                            getRegex: function() {
+                                return new RegExp(e, t);
+                            },
+                        }
+                    );
+                }
+
+                function f(e, t, n) {
+                    if (e) {
+                        try {
+                            var r = decodeURIComponent(u(n))
+                                .replace(/[^\w:]/g, "")
+                                .toLowerCase();
+                        } catch (e) {
+                            return null;
+                        }
+                        if (
+                            0 === r.indexOf("javascript:") ||
+                            0 === r.indexOf("vbscript:") ||
+                            0 === r.indexOf("data:")
+                        )
+                            return null;
+                    }
+                    t && !k.test(n) && (n = d(t, n));
+                    try {
+                        n = encodeURI(n).replace(/%25/g, "%");
+                    } catch (e) {
+                        return null;
+                    }
+                    return n;
+                }
+
+                function d(e, t) {
+                    return (
+                        x[" " + e] ||
+                        (/^[^:]+:\/*[^\/]*$/.test(e) ?
+                            (x[" " + e] = e + "/") :
+                            (x[" " + e] = m(e, "/", !0))),
+                        (e = x[" " + e]),
+                        "//" === t.slice(0, 2) ?
+                        e.replace(/:[\s\S]*/, ":") + t :
+                        "/" === t.charAt(0) ?
+                        e.replace(/(:\/*[^\/]*)[\s\S]*/, "$1") + t :
+                        e + t
+                    );
+                }
+
+                function p() {}
+
+                function h(e) {
+                    for (var t, n, r = 1; r < arguments.length; r++) {
+                        t = arguments[r];
+                        for (n in t)
+                            Object.prototype.hasOwnProperty.call(t, n) && (e[n] = t[n]);
+                    }
+                    return e;
+                }
+
+                function g(e, t) {
+                    var n = e.replace(/\|/g, function(e, t, n) {
+                            for (var r = !1, i = t; --i >= 0 && "\\" === n[i];) r = !r;
+                            return r ? "|" : " |";
+                        }),
+                        r = n.split(/ \|/),
+                        i = 0;
+                    if (r.length > t) r.splice(t);
+                    else
+                        for (; r.length < t;) r.push("");
+                    for (; i < r.length; i++) r[i] = r[i].trim().replace(/\\\|/g, "|");
+                    return r;
+                }
+
+                function m(e, t, n) {
+                    if (0 === e.length) return "";
+                    for (var r = 0; r < e.length;) {
+                        var i = e.charAt(e.length - r - 1);
+                        if (i !== t || n) {
+                            if (i === t || !n) break;
+                            r++;
+                        } else r++;
+                    }
+                    return e.substr(0, e.length - r);
+                }
+
+                function v(e, t) {
+                    if (e.indexOf(t[1]) === -1) return -1;
+                    for (var n = 0, r = 0; r < e.length; r++)
+                        if ("\\" === e[r]) r++;
+                        else if (e[r] === t[0]) n++;
+                    else if (e[r] === t[1] && (n--, n < 0)) return r;
+                    return -1;
+                }
+
+                function b(e, t, r) {
+                    if ("undefined" == typeof e || null === e)
+                        throw new Error("marked(): input parameter is undefined or null");
+                    if ("string" != typeof e)
+                        throw new Error(
+                            "marked(): input parameter is of type " +
+                            Object.prototype.toString.call(e) +
+                            ", string expected"
+                        );
+                    if (r || "function" == typeof t) {
+                        r || ((r = t), (t = null)), (t = h({}, b.defaults, t || {}));
+                        var i,
+                            o,
+                            s = t.highlight,
+                            u = 0;
+                        try {
+                            i = n.lex(e, t);
+                        } catch (e) {
+                            return r(e);
+                        }
+                        o = i.length;
+                        var l = function(e) {
+                            if (e) return (t.highlight = s), r(e);
+                            var n;
+                            try {
+                                n = a.parse(i, t);
+                            } catch (t) {
+                                e = t;
+                            }
+                            return (t.highlight = s), e ? r(e) : r(null, n);
+                        };
+                        if (!s || s.length < 3) return l();
+                        if ((delete t.highlight, !o)) return l();
+                        for (; u < i.length; u++)
+                            !(function(e) {
+                                return "code" !== e.type ?
+                                    --o || l() :
+                                    s(e.text, e.lang, function(t, n) {
+                                        return t ?
+                                            l(t) :
+                                            null == n || n === e.text ?
+                                            --o || l() :
+                                            ((e.text = n), (e.escaped = !0), void(--o || l()));
+                                    });
+                            })(i[u]);
+                    } else
+                        try {
+                            return t && (t = h({}, b.defaults, t)), a.parse(n.lex(e, t), t);
+                        } catch (e) {
+                            if (
+                                ((e.message +=
+                                        "\nPlease report this to https://github.com/markedjs/marked."),
+                                    (t || b.defaults).silent)
+                            )
+                                return (
+                                    "<p>An error occurred:</p><pre>" +
+                                    c(e.message + "", !0) +
+                                    "</pre>"
+                                );
+                            throw e;
+                        }
+                }
+                var w = {
+                    newline: /^\n+/,
+                    code: /^( {4}[^\n]+\n*)+/,
+                    fences: p,
+                    hr: /^ {0,3}((?:- *){3,}|(?:_ *){3,}|(?:\* *){3,})(?:\n+|$)/,
+                    heading: /^ *(#{1,6}) *([^\n]+?) *(?:#+ *)?(?:\n+|$)/,
+                    nptable: p,
+                    blockquote: /^( {0,3}> ?(paragraph|[^\n]*)(?:\n|$))+/,
+                    list: /^( {0,3})(bull) [\s\S]+?(?:hr|def|\n{2,}(?! )(?!\1bull )\n*|\s*$)/,
+                    html: "^ {0,3}(?:<(script|pre|style)[\\s>][\\s\\S]*?(?:</\\1>[^\\n]*\\n+|$)|comment[^\\n]*(\\n+|$)|<\\?[\\s\\S]*?\\?>\\n*|<![A-Z][\\s\\S]*?>\\n*|<!\\[CDATA\\[[\\s\\S]*?\\]\\]>\\n*|</?(tag)(?: +|\\n|/?>)[\\s\\S]*?(?:\\n{2,}|$)|<(?!script|pre|style)([a-z][\\w-]*)(?:attribute)*? */?>(?=\\h*\\n)[\\s\\S]*?(?:\\n{2,}|$)|</(?!script|pre|style)[a-z][\\w-]*\\s*>(?=\\h*\\n)[\\s\\S]*?(?:\\n{2,}|$))",
+                    def: /^ {0,3}\[(label)\]: *\n? *<?([^\s>]+)>?(?:(?: +\n? *| *\n *)(title))? *(?:\n+|$)/,
+                    table: p,
+                    lheading: /^([^\n]+)\n *(=|-){2,} *(?:\n+|$)/,
+                    paragraph: /^([^\n]+(?:\n(?!hr|heading|lheading| {0,3}>|<\/?(?:tag)(?: +|\n|\/?>)|<(?:script|pre|style|!--))[^\n]+)*)/,
+                    text: /^[^\n]+/,
+                };
+                (w._label = /(?!\s*\])(?:\\[\[\]]|[^\[\]])+/),
+                (w._title = /(?:"(?:\\"?|[^"\\])*"|'[^'\n]*(?:\n[^'\n]+)*\n?'|\([^()]*\))/),
+                (w.def = l(w.def)
+                    .replace("label", w._label)
+                    .replace("title", w._title)
+                    .getRegex()),
+                (w.bullet = /(?:[*+-]|\d{1,9}\.)/),
+                (w.item = /^( *)(bull) ?[^\n]*(?:\n(?!\1bull ?)[^\n]*)*/),
+                (w.item = l(w.item, "gm").replace(/bull/g, w.bullet).getRegex()),
+                (w.list = l(w.list)
+                    .replace(/bull/g, w.bullet)
+                    .replace(
+                        "hr",
+                        "\\n+(?=\\1?(?:(?:- *){3,}|(?:_ *){3,}|(?:\\* *){3,})(?:\\n+|$))"
+                    )
+                    .replace("def", "\\n+(?=" + w.def.source + ")")
+                    .getRegex()),
+                (w._tag =
+                    "address|article|aside|base|basefont|blockquote|body|caption|center|col|colgroup|dd|details|dialog|dir|div|dl|dt|fieldset|figcaption|figure|footer|form|frame|frameset|h[1-6]|head|header|hr|html|iframe|legend|li|link|main|menu|menuitem|meta|nav|noframes|ol|optgroup|option|p|param|section|source|summary|table|tbody|td|tfoot|th|thead|title|tr|track|ul"),
+                (w._comment = /<!--(?!-?>)[\s\S]*?-->/),
+                (w.html = l(w.html, "i")
+                    .replace("comment", w._comment)
+                    .replace("tag", w._tag)
+                    .replace(
+                        "attribute",
+                        / +[a-zA-Z:_][\w.:-]*(?: *= *"[^"\n]*"| *= *'[^'\n]*'| *= *[^\s"'=<>`]+)?/
+                    )
+                    .getRegex()),
+                (w.paragraph = l(w.paragraph)
+                    .replace("hr", w.hr)
+                    .replace("heading", w.heading)
+                    .replace("lheading", w.lheading)
+                    .replace("tag", w._tag)
+                    .getRegex()),
+                (w.blockquote = l(w.blockquote)
+                    .replace("paragraph", w.paragraph)
+                    .getRegex()),
+                (w.normal = h({}, w)),
+                (w.gfm = h({}, w.normal, {
+                    fences: /^ {0,3}(`{3,}|~{3,})([^`\n]*)\n(?:|([\s\S]*?)\n)(?: {0,3}\1[~`]* *(?:\n+|$)|$)/,
+                    paragraph: /^/,
+                    heading: /^ *(#{1,6}) +([^\n]+?) *#* *(?:\n+|$)/,
+                })),
+                (w.gfm.paragraph = l(w.paragraph)
+                    .replace(
+                        "(?!",
+                        "(?!" +
+                        w.gfm.fences.source.replace("\\1", "\\2") +
+                        "|" +
+                        w.list.source.replace("\\1", "\\3") +
+                        "|"
+                    )
+                    .getRegex()),
+                (w.tables = h({}, w.gfm, {
+                    nptable: /^ *([^|\n ].*\|.*)\n *([-:]+ *\|[-| :]*)(?:\n((?:.*[^>\n ].*(?:\n|$))*)\n*|$)/,
+                    table: /^ *\|(.+)\n *\|?( *[-:]+[-| :]*)(?:\n((?: *[^>\n ].*(?:\n|$))*)\n*|$)/,
+                })),
+                (w.pedantic = h({}, w.normal, {
+                    html: l(
+                            "^ *(?:comment *(?:\\n|\\s*$)|<(tag)[\\s\\S]+?</\\1> *(?:\\n{2,}|\\s*$)|<tag(?:\"[^\"]*\"|'[^']*'|\\s[^'\"/>\\s]*)*?/?> *(?:\\n{2,}|\\s*$))"
+                        )
+                        .replace("comment", w._comment)
+                        .replace(
+                            /tag/g,
+                            "(?!(?:a|em|strong|small|s|cite|q|dfn|abbr|data|time|code|var|samp|kbd|sub|sup|i|b|u|mark|ruby|rt|rp|bdi|bdo|span|br|wbr|ins|del|img)\\b)\\w+(?!:|[^\\w\\s@]*@)\\b"
+                        )
+                        .getRegex(),
+                    def: /^ *\[([^\]]+)\]: *<?([^\s>]+)>?(?: +(["(][^\n]+[")]))? *(?:\n+|$)/,
+                })),
+                (n.rules = w),
+                (n.lex = function(e, t) {
+                    var r = new n(t);
+                    return r.lex(e);
+                }),
+                (n.prototype.lex = function(e) {
+                    return (
+                        (e = e
+                            .replace(/\r\n|\r/g, "\n")
+                            .replace(/\t/g, "    ")
+                            .replace(/\u00a0/g, " ")
+                            .replace(/\u2424/g, "\n")),
+                        this.token(e, !0)
+                    );
+                }),
+                (n.prototype.token = function(e, t) {
+                    e = e.replace(/^ +$/gm, "");
+                    for (var n, r, i, o, a, s, c, u, l, f, d, p, h, v, b, y; e;)
+                        if (
+                            ((i = this.rules.newline.exec(e)) &&
+                                ((e = e.substring(i[0].length)),
+                                    i[0].length > 1 && this.tokens.push({ type: "space" })),
+                                (i = this.rules.code.exec(e)))
+                        )
+                            (e = e.substring(i[0].length)),
+                            (i = i[0].replace(/^ {4}/gm, "")),
+                            this.tokens.push({
+                                type: "code",
+                                text: this.options.pedantic ? i : m(i, "\n"),
+                            });
+                        else if ((i = this.rules.fences.exec(e)))
+                        (e = e.substring(i[0].length)),
+                        this.tokens.push({
+                            type: "code",
+                            lang: i[2] ? i[2].trim() : i[2],
+                            text: i[3] || "",
+                        });
+                    else if ((i = this.rules.heading.exec(e)))
+                        (e = e.substring(i[0].length)),
+                        this.tokens.push({
+                            type: "heading",
+                            depth: i[1].length,
+                            text: i[2],
+                        });
+                    else if (
+                        t &&
+                        (i = this.rules.nptable.exec(e)) &&
+                        ((s = {
+                                type: "table",
+                                header: g(i[1].replace(/^ *| *\| *$/g, "")),
+                                align: i[2].replace(/^ *|\| *$/g, "").split(/ *\| */),
+                                cells: i[3] ? i[3].replace(/\n$/, "").split("\n") : [],
+                            }),
+                            s.header.length === s.align.length)
+                    ) {
+                        for (
+                            e = e.substring(i[0].length), d = 0; d < s.align.length; d++
+                        )
+                            /^ *-+: *$/.test(s.align[d]) ?
+                            (s.align[d] = "right") :
+                            /^ *:-+: *$/.test(s.align[d]) ?
+                            (s.align[d] = "center") :
+                            /^ *:-+ *$/.test(s.align[d]) ?
+                            (s.align[d] = "left") :
+                            (s.align[d] = null);
+                        for (d = 0; d < s.cells.length; d++)
+                            s.cells[d] = g(s.cells[d], s.header.length);
+                        this.tokens.push(s);
+                    } else if ((i = this.rules.hr.exec(e)))
+                        (e = e.substring(i[0].length)),
+                        this.tokens.push({ type: "hr" });
+                    else if ((i = this.rules.blockquote.exec(e)))
+                        (e = e.substring(i[0].length)),
+                        this.tokens.push({ type: "blockquote_start" }),
+                        (i = i[0].replace(/^ *> ?/gm, "")),
+                        this.token(i, t),
+                        this.tokens.push({ type: "blockquote_end" });
+                    else if ((i = this.rules.list.exec(e))) {
+                        for (
+                            e = e.substring(i[0].length),
+                            o = i[2],
+                            v = o.length > 1,
+                            c = {
+                                type: "list_start",
+                                ordered: v,
+                                start: v ? +o : "",
+                                loose: !1,
+                            },
+                            this.tokens.push(c),
+                            i = i[0].match(this.rules.item),
+                            u = [],
+                            n = !1,
+                            h = i.length,
+                            d = 0; d < h; d++
+                        )
+                            (s = i[d]),
+                            (f = s.length),
+                            (s = s.replace(/^ *([*+-]|\d+\.) */, "")), ~s.indexOf("\n ") &&
+                            ((f -= s.length),
+                                (s = this.options.pedantic ?
+                                    s.replace(/^ {1,4}/gm, "") :
+                                    s.replace(
+                                        new RegExp("^ {1," + f + "}", "gm"),
+                                        ""
+                                    ))),
+                            d !== h - 1 &&
+                            ((a = w.bullet.exec(i[d + 1])[0]),
+                                (o.length > 1 ?
+                                    1 === a.length :
+                                    a.length > 1 ||
+                                    (this.options.smartLists && a !== o)) &&
+                                ((e = i.slice(d + 1).join("\n") + e), (d = h - 1))),
+                            (r = n || /\n\n(?!\s*$)/.test(s)),
+                            d !== h - 1 &&
+                            ((n = "\n" === s.charAt(s.length - 1)), r || (r = n)),
+                            r && (c.loose = !0),
+                            (b = /^\[[ xX]\] /.test(s)),
+                            (y = void 0),
+                            b &&
+                            ((y = " " !== s[1]),
+                                (s = s.replace(/^\[[ xX]\] +/, ""))),
+                            (l = {
+                                type: "list_item_start",
+                                task: b,
+                                checked: y,
+                                loose: r,
+                            }),
+                            u.push(l),
+                            this.tokens.push(l),
+                            this.token(s, !1),
+                            this.tokens.push({ type: "list_item_end" });
+                        if (c.loose)
+                            for (h = u.length, d = 0; d < h; d++) u[d].loose = !0;
+                        this.tokens.push({ type: "list_end" });
+                    } else if ((i = this.rules.html.exec(e)))
+                        (e = e.substring(i[0].length)),
+                        this.tokens.push({
+                            type: this.options.sanitize ? "paragraph" : "html",
+                            pre:
+                                !this.options.sanitizer &&
+                                ("pre" === i[1] ||
+                                    "script" === i[1] ||
+                                    "style" === i[1]),
+                            text: i[0],
+                        });
+                    else if (t && (i = this.rules.def.exec(e)))
+                        (e = e.substring(i[0].length)),
+                        i[3] && (i[3] = i[3].substring(1, i[3].length - 1)),
+                        (p = i[1].toLowerCase().replace(/\s+/g, " ")),
+                        this.tokens.links[p] ||
+                        (this.tokens.links[p] = { href: i[2], title: i[3] });
+                    else if (
+                        t &&
+                        (i = this.rules.table.exec(e)) &&
+                        ((s = {
+                                type: "table",
+                                header: g(i[1].replace(/^ *| *\| *$/g, "")),
+                                align: i[2].replace(/^ *|\| *$/g, "").split(/ *\| */),
+                                cells: i[3] ?
+                                    i[3].replace(/(?: *\| *)?\n$/, "").split("\n") :
+                                    [],
+                            }),
+                            s.header.length === s.align.length)
+                    ) {
+                        for (
+                            e = e.substring(i[0].length), d = 0; d < s.align.length; d++
+                        )
+                            /^ *-+: *$/.test(s.align[d]) ?
+                            (s.align[d] = "right") :
+                            /^ *:-+: *$/.test(s.align[d]) ?
+                            (s.align[d] = "center") :
+                            /^ *:-+ *$/.test(s.align[d]) ?
+                            (s.align[d] = "left") :
+                            (s.align[d] = null);
+                        for (d = 0; d < s.cells.length; d++)
+                            s.cells[d] = g(
+                                s.cells[d].replace(/^ *\| *| *\| *$/g, ""),
+                                s.header.length
+                            );
+                        this.tokens.push(s);
+                    } else if ((i = this.rules.lheading.exec(e)))
+                        (e = e.substring(i[0].length)),
+                        this.tokens.push({
+                            type: "heading",
+                            depth: "=" === i[2] ? 1 : 2,
+                            text: i[1],
+                        });
+                    else if (t && (i = this.rules.paragraph.exec(e)))
+                        (e = e.substring(i[0].length)),
+                        this.tokens.push({
+                            type: "paragraph",
+                            text: "\n" === i[1].charAt(i[1].length - 1) ?
+                                i[1].slice(0, -1) :
+                                i[1],
+                        });
+                    else if ((i = this.rules.text.exec(e)))
+                        (e = e.substring(i[0].length)),
+                        this.tokens.push({ type: "text", text: i[0] });
+                    else if (e)
+                        throw new Error("Infinite loop on byte: " + e.charCodeAt(0));
+                    return this.tokens;
+                });
+                var y = {
+                    escape: /^\\([!"#$%&'()*+,\-.\/:;<=>?@\[\]\\^_`{|}~])/,
+                    autolink: /^<(scheme:[^\s\x00-\x1f<>]*|email)>/,
+                    url: p,
+                    tag: "^comment|^</[a-zA-Z][\\w:-]*\\s*>|^<[a-zA-Z][\\w-]*(?:attribute)*?\\s*/?>|^<\\?[\\s\\S]*?\\?>|^<![a-zA-Z]+\\s[\\s\\S]*?>|^<!\\[CDATA\\[[\\s\\S]*?\\]\\]>",
+                    link: /^!?\[(label)\]\(href(?:\s+(title))?\s*\)/,
+                    reflink: /^!?\[(label)\]\[(?!\s*\])((?:\\[\[\]]?|[^\[\]\\])+)\]/,
+                    nolink: /^!?\[(?!\s*\])((?:\[[^\[\]]*\]|\\[\[\]]|[^\[\]])*)\](?:\[\])?/,
+                    strong: /^__([^\s_])__(?!_)|^\*\*([^\s*])\*\*(?!\*)|^__([^\s][\s\S]*?[^\s])__(?!_)|^\*\*([^\s][\s\S]*?[^\s])\*\*(?!\*)/,
+                    em: /^_([^\s_])_(?!_)|^\*([^\s*"<\[])\*(?!\*)|^_([^\s][\s\S]*?[^\s_])_(?!_|[^\spunctuation])|^_([^\s_][\s\S]*?[^\s])_(?!_|[^\spunctuation])|^\*([^\s"<\[][\s\S]*?[^\s*])\*(?!\*)|^\*([^\s*"<\[][\s\S]*?[^\s])\*(?!\*)/,
+                    code: /^(`+)([^`]|[^`][\s\S]*?[^`])\1(?!`)/,
+                    br: /^( {2,}|\\)\n(?!\s*$)/,
+                    del: p,
+                    text: /^(`+|[^`])[\s\S]*?(?=[\\<!\[`*]|\b_| {2,}\n|$)/,
+                };
+                (y._punctuation = "!\"#$%&'()*+,\\-./:;<=>?@\\[^_{|}~"),
+                (y.em = l(y.em)
+                    .replace(/punctuation/g, y._punctuation)
+                    .getRegex()),
+                (y._escapes = /\\([!"#$%&'()*+,\-.\/:;<=>?@\[\]\\^_`{|}~])/g),
+                (y._scheme = /[a-zA-Z][a-zA-Z0-9+.-]{1,31}/),
+                (y._email = /[a-zA-Z0-9.!#$%&'*+\/=?^_`{|}~-]+(@)[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)+(?![-_])/),
+                (y.autolink = l(y.autolink)
+                    .replace("scheme", y._scheme)
+                    .replace("email", y._email)
+                    .getRegex()),
+                (y._attribute = /\s+[a-zA-Z:_][\w.:-]*(?:\s*=\s*"[^"]*"|\s*=\s*'[^']*'|\s*=\s*[^\s"'=<>`]+)?/),
+                (y.tag = l(y.tag)
+                    .replace("comment", w._comment)
+                    .replace("attribute", y._attribute)
+                    .getRegex()),
+                (y._label = /(?:\[[^\[\]]*\]|\\[\[\]]?|`[^`]*`|[^\[\]\\])*?/),
+                (y._href = /\s*(<(?:\\[<>]?|[^\s<>\\])*>|[^\s\x00-\x1f]*)/),
+                (y._title = /"(?:\\"?|[^"\\])*"|'(?:\\'?|[^'\\])*'|\((?:\\\)?|[^)\\])*\)/),
+                (y.link = l(y.link)
+                    .replace("label", y._label)
+                    .replace("href", y._href)
+                    .replace("title", y._title)
+                    .getRegex()),
+                (y.reflink = l(y.reflink).replace("label", y._label).getRegex()),
+                (y.normal = h({}, y)),
+                (y.pedantic = h({}, y.normal, {
+                    strong: /^__(?=\S)([\s\S]*?\S)__(?!_)|^\*\*(?=\S)([\s\S]*?\S)\*\*(?!\*)/,
+                    em: /^_(?=\S)([\s\S]*?\S)_(?!_)|^\*(?=\S)([\s\S]*?\S)\*(?!\*)/,
+                    link: l(/^!?\[(label)\]\((.*?)\)/)
+                        .replace("label", y._label)
+                        .getRegex(),
+                    reflink: l(/^!?\[(label)\]\s*\[([^\]]*)\]/)
+                        .replace("label", y._label)
+                        .getRegex(),
+                })),
+                (y.gfm = h({}, y.normal, {
+                    escape: l(y.escape).replace("])", "~|])").getRegex(),
+                    _extended_email: /[A-Za-z0-9._+-]+(@)[a-zA-Z0-9-_]+(?:\.[a-zA-Z0-9-_]*[a-zA-Z0-9])+(?![-_])/,
+                    url: /^((?:ftp|https?):\/\/|www\.)(?:[a-zA-Z0-9\-]+\.?)+[^\s<]*|^email/,
+                    _backpedal: /(?:[^?!.,:;*_~()&]+|\([^)]*\)|&(?![a-zA-Z0-9]+;$)|[?!.,:;*_~)]+(?!$))+/,
+                    del: /^~+(?=\S)([\s\S]*?\S)~+/,
+                    text: l(y.text)
+                        .replace("]|", "~]|")
+                        .replace(
+                            "|$",
+                            "|https?://|ftp://|www\\.|[a-zA-Z0-9.!#$%&'*+/=?^_`{\\|}~-]+@|$"
+                        )
+                        .getRegex(),
+                })),
+                (y.gfm.url = l(y.gfm.url, "i")
+                    .replace("email", y.gfm._extended_email)
+                    .getRegex()),
+                (y.breaks = h({}, y.gfm, {
+                    br: l(y.br).replace("{2,}", "*").getRegex(),
+                    text: l(y.gfm.text).replace("{2,}", "*").getRegex(),
+                })),
+                (r.rules = y),
+                (r.output = function(e, t, n) {
+                    var i = new r(t, n);
+                    return i.output(e);
+                }),
+                (r.prototype.output = function(e) {
+                    for (var t, n, i, o, a, s, u = ""; e;)
+                        if ((a = this.rules.escape.exec(e)))
+                            (e = e.substring(a[0].length)), (u += c(a[1]));
+                        else if ((a = this.rules.tag.exec(e)))
+                        !this.inLink && /^<a /i.test(a[0]) ?
+                        (this.inLink = !0) :
+                        this.inLink && /^<\/a>/i.test(a[0]) && (this.inLink = !1), !this.inRawBlock &&
+                        /^<(pre|code|kbd|script)(\s|>)/i.test(a[0]) ?
+                        (this.inRawBlock = !0) :
+                        this.inRawBlock &&
+                        /^<\/(pre|code|kbd|script)(\s|>)/i.test(a[0]) &&
+                        (this.inRawBlock = !1),
+                        (e = e.substring(a[0].length)),
+                        (u += this.options.sanitize ?
+                            this.options.sanitizer ?
+                            this.options.sanitizer(a[0]) :
+                            c(a[0]) :
+                            a[0]);
+                    else if ((a = this.rules.link.exec(e))) {
+                        var l = v(a[2], "()");
+                        if (l > -1) {
+                            var f = a[2].length - l;
+                            (a[2] = a[2].substring(0, l)),
+                            (a[0] = a[0].substring(0, a[0].length - f));
+                        }
+                        (e = e.substring(a[0].length)),
+                        (this.inLink = !0),
+                        (i = a[2]),
+                        this.options.pedantic ?
+                            ((t = /^([^'"]*[^\s])\s+(['"])(.*)\2/.exec(i)),
+                                t ? ((i = t[1]), (o = t[3])) : (o = "")) :
+                            (o = a[3] ? a[3].slice(1, -1) : ""),
+                            (i = i.trim().replace(/^<([\s\S]*)>$/, "$1")),
+                            (u += this.outputLink(a, {
+                                href: r.escapes(i),
+                                title: r.escapes(o),
+                            })),
+                            (this.inLink = !1);
+                    } else if (
+                        (a = this.rules.reflink.exec(e)) ||
+                        (a = this.rules.nolink.exec(e))
+                    ) {
+                        if (
+                            ((e = e.substring(a[0].length)),
+                                (t = (a[2] || a[1]).replace(/\s+/g, " ")),
+                                (t = this.links[t.toLowerCase()]), !t || !t.href)
+                        ) {
+                            (u += a[0].charAt(0)), (e = a[0].substring(1) + e);
+                            continue;
+                        }
+                        (this.inLink = !0),
+                        (u += this.outputLink(a, t)),
+                        (this.inLink = !1);
+                    } else if ((a = this.rules.strong.exec(e)))
+                        (e = e.substring(a[0].length)),
+                        (u += this.renderer.strong(
+                            this.output(a[4] || a[3] || a[2] || a[1])
+                        ));
+                    else if ((a = this.rules.em.exec(e)))
+                        (e = e.substring(a[0].length)),
+                        (u += this.renderer.em(
+                            this.output(a[6] || a[5] || a[4] || a[3] || a[2] || a[1])
+                        ));
+                    else if ((a = this.rules.code.exec(e)))
+                        (e = e.substring(a[0].length)),
+                        (u += this.renderer.codespan(c(a[2].trim(), !0)));
+                    else if ((a = this.rules.br.exec(e)))
+                        (e = e.substring(a[0].length)), (u += this.renderer.br());
+                    else if ((a = this.rules.del.exec(e)))
+                        (e = e.substring(a[0].length)),
+                        (u += this.renderer.del(this.output(a[1])));
+                    else if ((a = this.rules.autolink.exec(e)))
+                        (e = e.substring(a[0].length)),
+                        "@" === a[2] ?
+                        ((n = c(this.mangle(a[1]))), (i = "mailto:" + n)) :
+                        ((n = c(a[1])), (i = n)),
+                        (u += this.renderer.link(i, null, n));
+                    else if (this.inLink || !(a = this.rules.url.exec(e))) {
+                        if ((a = this.rules.text.exec(e)))
+                            (e = e.substring(a[0].length)),
+                            (u += this.inRawBlock ?
+                                this.renderer.text(a[0]) :
+                                this.renderer.text(c(this.smartypants(a[0]))));
+                        else if (e)
+                            throw new Error(
+                                "Infinite loop on byte: " + e.charCodeAt(0)
+                            );
+                    } else {
+                        if ("@" === a[2])(n = c(a[0])), (i = "mailto:" + n);
+                        else {
+                            do(s = a[0]), (a[0] = this.rules._backpedal.exec(a[0])[0]);
+                            while (s !== a[0]);
+                            (n = c(a[0])), (i = "www." === a[1] ? "http://" + n : n);
+                        }
+                        (e = e.substring(a[0].length)),
+                        (u += this.renderer.link(i, null, n));
+                    }
+                    return u;
+                }),
+                (r.escapes = function(e) {
+                    return e ? e.replace(r.rules._escapes, "$1") : e;
+                }),
+                (r.prototype.outputLink = function(e, t) {
+                    var n = t.href,
+                        r = t.title ? c(t.title) : null;
+                    return "!" !== e[0].charAt(0) ?
+                        this.renderer.link(n, r, this.output(e[1])) :
+                        this.renderer.image(n, r, c(e[1]));
+                }),
+                (r.prototype.smartypants = function(e) {
+                    return this.options.smartypants ?
+                        e
+                        .replace(/---/g, "—")
+                        .replace(/--/g, "–")
+                        .replace(/(^|[-\u2014\/(\[{"\s])'/g, "$1‘")
+                        .replace(/'/g, "’")
+                        .replace(/(^|[-\u2014\/(\[{\u2018\s])"/g, "$1“")
+                        .replace(/"/g, "”")
+                        .replace(/\.{3}/g, "…") :
+                        e;
+                }),
+                (r.prototype.mangle = function(e) {
+                    if (!this.options.mangle) return e;
+                    for (var t, n = "", r = e.length, i = 0; i < r; i++)
+                        (t = e.charCodeAt(i)),
+                        Math.random() > 0.5 && (t = "x" + t.toString(16)),
+                        (n += "&#" + t + ";");
+                    return n;
+                }),
+                (i.prototype.code = function(e, t, n) {
+                    var r = (t || "").match(/\S*/)[0];
+                    if (this.options.highlight) {
+                        var i = this.options.highlight(e, r);
+                        null != i && i !== e && ((n = !0), (e = i));
+                    }
+                    return r ?
+                        '<pre><code class="' +
+                        this.options.langPrefix +
+                        c(r, !0) +
+                        '">' +
+                        (n ? e : c(e, !0)) +
+                        "</code></pre>\n" :
+                        "<pre><code>" + (n ? e : c(e, !0)) + "</code></pre>";
+                }),
+                (i.prototype.blockquote = function(e) {
+                    return "<blockquote>\n" + e + "</blockquote>\n";
+                }),
+                (i.prototype.html = function(e) {
+                    return e;
+                }),
+                (i.prototype.heading = function(e, t, n, r) {
+                    return this.options.headerIds ?
+                        "<h" +
+                        t +
+                        ' id="' +
+                        this.options.headerPrefix +
+                        r.slug(n) +
+                        '">' +
+                        e +
+                        "</h" +
+                        t +
+                        ">\n" :
+                        "<h" + t + ">" + e + "</h" + t + ">\n";
+                }),
+                (i.prototype.hr = function() {
+                    return this.options.xhtml ? "<hr/>\n" : "<hr>\n";
+                }),
+                (i.prototype.list = function(e, t, n) {
+                    var r = t ? "ol" : "ul",
+                        i = t && 1 !== n ? ' start="' + n + '"' : "";
+                    return "<" + r + i + ">\n" + e + "</" + r + ">\n";
+                }),
+                (i.prototype.listitem = function(e) {
+                    return "<li>" + e + "</li>\n";
+                }),
+                (i.prototype.checkbox = function(e) {
+                    return (
+                        "<input " +
+                        (e ? 'checked="" ' : "") +
+                        'disabled="" type="checkbox"' +
+                        (this.options.xhtml ? " /" : "") +
+                        "> "
+                    );
+                }),
+                (i.prototype.paragraph = function(e) {
+                    return "<p>" + e + "</p>\n";
+                }),
+                (i.prototype.table = function(e, t) {
+                    return (
+                        t && (t = "<tbody>" + t + "</tbody>"),
+                        "<table>\n<thead>\n" + e + "</thead>\n" + t + "</table>\n"
+                    );
+                }),
+                (i.prototype.tablerow = function(e) {
+                    return "<tr>\n" + e + "</tr>\n";
+                }),
+                (i.prototype.tablecell = function(e, t) {
+                    var n = t.header ? "th" : "td",
+                        r = t.align ?
+                        "<" + n + ' align="' + t.align + '">' :
+                        "<" + n + ">";
+                    return r + e + "</" + n + ">\n";
+                }),
+                (i.prototype.strong = function(e) {
+                    return "<strong>" + e + "</strong>";
+                }),
+                (i.prototype.em = function(e) {
+                    return "<em>" + e + "</em>";
+                }),
+                (i.prototype.codespan = function(e) {
+                    return "<code>" + e + "</code>";
+                }),
+                (i.prototype.br = function() {
+                    return this.options.xhtml ? "<br/>" : "<br>";
+                }),
+                (i.prototype.del = function(e) {
+                    return "<del>" + e + "</del>";
+                }),
+                (i.prototype.link = function(e, t, n) {
+                    if (
+                        ((e = f(this.options.sanitize, this.options.baseUrl, e)),
+                            null === e)
+                    )
+                        return n;
+                    var r = '<a href="' + c(e) + '"';
+                    return t && (r += ' title="' + t + '"'), (r += ">" + n + "</a>");
+                }),
+                (i.prototype.image = function(e, t, n) {
+                    if (
+                        ((e = f(this.options.sanitize, this.options.baseUrl, e)),
+                            null === e)
+                    )
+                        return n;
+                    var r = '<img src="' + e + '" alt="' + n + '"';
+                    return (
+                        t && (r += ' title="' + t + '"'),
+                        (r += this.options.xhtml ? "/>" : ">")
+                    );
+                }),
+                (i.prototype.text = function(e) {
+                    return e;
+                }),
+                (o.prototype.strong = o.prototype.em = o.prototype.codespan = o.prototype.del = o.prototype.text = function(
+                    e
+                ) {
+                    return e;
+                }),
+                (o.prototype.link = o.prototype.image = function(e, t, n) {
+                    return "" + n;
+                }),
+                (o.prototype.br = function() {
+                    return "";
+                }),
+                (a.parse = function(e, t) {
+                    var n = new a(t);
+                    return n.parse(e);
+                }),
+                (a.prototype.parse = function(e) {
+                    (this.inline = new r(e.links, this.options)),
+                    (this.inlineText = new r(
+                        e.links,
+                        h({}, this.options, { renderer: new o() })
+                    )),
+                    (this.tokens = e.reverse());
+                    for (var t = ""; this.next();) t += this.tok();
+                    return t;
+                }),
+                (a.prototype.next = function() {
+                    return (this.token = this.tokens.pop());
+                }),
+                (a.prototype.peek = function() {
+                    return this.tokens[this.tokens.length - 1] || 0;
+                }),
+                (a.prototype.parseText = function() {
+                    for (var e = this.token.text;
+                        "text" === this.peek().type;)
+                        e += "\n" + this.next().text;
+                    return this.inline.output(e);
+                }),
+                (a.prototype.tok = function() {
+                    switch (this.token.type) {
+                        case "space":
+                            return "";
+                        case "hr":
+                            return this.renderer.hr();
+                        case "heading":
+                            return this.renderer.heading(
+                                this.inline.output(this.token.text),
+                                this.token.depth,
+                                u(this.inlineText.output(this.token.text)),
+                                this.slugger
+                            );
+                        case "code":
+                            return this.renderer.code(
+                                this.token.text,
+                                this.token.lang,
+                                this.token.escaped
+                            );
+                        case "table":
+                            var e,
+                                t,
+                                n,
+                                r,
+                                i = "",
+                                o = "";
+                            for (n = "", e = 0; e < this.token.header.length; e++)
+                                n += this.renderer.tablecell(
+                                    this.inline.output(this.token.header[e]), { header: !0, align: this.token.align[e] }
+                                );
+                            for (
+                                i += this.renderer.tablerow(n), e = 0; e < this.token.cells.length; e++
+                            ) {
+                                for (
+                                    t = this.token.cells[e], n = "", r = 0; r < t.length; r++
+                                )
+                                    n += this.renderer.tablecell(this.inline.output(t[r]), {
+                                        header: !1,
+                                        align: this.token.align[r],
+                                    });
+                                o += this.renderer.tablerow(n);
+                            }
+                            return this.renderer.table(i, o);
+                        case "blockquote_start":
+                            for (o = "";
+                                "blockquote_end" !== this.next().type;)
+                                o += this.tok();
+                            return this.renderer.blockquote(o);
+                        case "list_start":
+                            o = "";
+                            for (
+                                var a = this.token.ordered, s = this.token.start;
+                                "list_end" !== this.next().type;
+
+                            )
+                                o += this.tok();
+                            return this.renderer.list(o, a, s);
+                        case "list_item_start":
+                            o = "";
+                            var c = this.token.loose;
+                            for (
+                                this.token.task &&
+                                (o += this.renderer.checkbox(this.token.checked));
+                                "list_item_end" !== this.next().type;
+
+                            )
+                                o +=
+                                c || "text" !== this.token.type ?
+                                this.tok() :
+                                this.parseText();
+                            return this.renderer.listitem(o);
+                        case "html":
+                            return this.renderer.html(this.token.text);
+                        case "paragraph":
+                            return this.renderer.paragraph(
+                                this.inline.output(this.token.text)
+                            );
+                        case "text":
+                            return this.renderer.paragraph(this.parseText());
+                        default:
+                            var l =
+                                'Token with "' + this.token.type + '" type was not found.';
+                            if (!this.options.silent) throw new Error(l);
+                            console.log(l);
+                    }
+                }),
+                (s.prototype.slug = function(e) {
+                    var t = e
+                        .toLowerCase()
+                        .trim()
+                        .replace(
+                            /[\u2000-\u206F\u2E00-\u2E7F\\'!"#$%&()*+,.\/:;<=>?@[\]^`{|}~]/g,
+                            ""
+                        )
+                        .replace(/\s/g, "-");
+                    if (this.seen.hasOwnProperty(t)) {
+                        var n = t;
+                        do this.seen[n]++, (t = n + "-" + this.seen[n]);
+                        while (this.seen.hasOwnProperty(t));
+                    }
+                    return (this.seen[t] = 0), t;
+                }),
+                (c.escapeTest = /[&<>"']/),
+                (c.escapeReplace = /[&<>"']/g),
+                (c.replacements = {
+                    "&": "&",
+                    "<": "<",
+                    ">": ">",
+                    '"': """,
+                    "'": "'",
+                }),
+                (c.escapeTestNoEncode = /[<>"']|&(?!#?\w+;)/),
+                (c.escapeReplaceNoEncode = /[<>"']|&(?!#?\w+;)/g);
+                var x = {},
+                    k = /^$|^[a-z][a-z0-9+.-]*:|^[?#]/i;
+                (p.exec = p),
+                (b.options = b.setOptions = function(e) {
+                    return h(b.defaults, e), b;
+                }),
+                (b.getDefaults = function() {
+                    return {
+                        baseUrl: null,
+                        breaks: !1,
+                        gfm: !0,
+                        headerIds: !0,
+                        headerPrefix: "",
+                        highlight: null,
+                        langPrefix: "language-",
+                        mangle: !0,
+                        pedantic: !1,
+                        renderer: new i(),
+                        sanitize: !1,
+                        sanitizer: null,
+                        silent: !1,
+                        smartLists: !1,
+                        smartypants: !1,
+                        tables: !0,
+                        xhtml: !1,
+                    };
+                }),
+                (b.defaults = b.getDefaults()),
+                (b.Parser = a),
+                (b.parser = a.parse),
+                (b.Renderer = i),
+                (b.TextRenderer = o),
+                (b.Lexer = n),
+                (b.lexer = n.lex),
+                (b.InlineLexer = r),
+                (b.inlineLexer = r.output),
+                (b.Slugger = s),
+                (b.parse = b),
+                (e.exports = b);
+            })(this || ("undefined" != typeof window ? window : t));
+        }.call(
+            t,
+            (function() {
+                return this;
+            })()
+        ));
+    },
+    function(e, t, n) {
+        "use strict";
+        var r = n(2),
+            i = r.each,
+            o = r.dom,
+            a = n(8),
+            s = n(12),
+            c = n(20),
+            u = n(13),
+            l = n(14),
+            f = Object.assign({
+                    enabled: !1,
+                    type: "php-tar",
+                    packageName: "package",
+                    alwaysVisible: !1,
+                },
+                l.download
+            ),
+            d =
+            '<div id="download" class="tool">\n            <img src="' +
+            u.image("download") +
+            '" alt="download"/>\n        </div>',
+            p = [],
+            h = void 0,
+            g = function(e) {
+                (p = e.slice(0)), p.length ? h.show() : f.alwaysVisible || h.hide();
+            },
+            m = function() {
+                var e = f.type,
+                    t = f.packageName,
+                    n = "shell-zip" === e ? "zip" : "tar";
+                t || (t = 1 === p.length ? p[0].label : c.getItem().label);
+                var r = {
+                    action: "download",
+                    as: t + "." + n,
+                    type: e,
+                    baseHref: c.getAbsHref(),
+                    hrefs: "",
+                };
+                i(p, function(e, t) {
+                        r["hrefs[" + t + "]"] = e.absHref;
+                    }),
+                    a.formRequest(r);
+            },
+            v = function() {
+                f.enabled &&
+                    ((h = o(d).hide().appTo("#toolbar").on("click", m)),
+                        f.alwaysVisible && h.show(),
+                        s.sub("selection", g));
+            };
+        v();
+    },
+    function(e, t, n) {
+        "use strict";
+        var r = n(2),
+            i = r.filter,
+            o = r.debounce,
+            a = r.parsePattern,
+            s = r.dom,
+            c = n(12),
+            u = n(20),
+            l = n(13),
+            f = n(14),
+            d = n(18),
+            p = Object.assign({ enabled: !1, advanced: !1, debounceTime: 100, ignorecase: !0 },
+                f.filter
+            ),
+            h =
+            '<div id="filter" class="tool">\n            <img src="' +
+            l.image("filter") +
+            '" alt="filter"/>\n            <input class="l10n_ph-filter" type="text" value=""/>\n        </div>',
+            g = !1,
+            m = "",
+            v = void 0,
+            b = void 0,
+            w = function() {
+                var e =
+                    arguments.length > 0 && void 0 !== arguments[0] ? arguments[0] : "";
+                if (e !== m) {
+                    if (((m = e), !e)) return void d.setLocation();
+                    v.addCls("pending");
+                    var t = new RegExp(e, p.ignorecase ? "i" : ""),
+                        n = i(u.getItem().content, function(e) {
+                            return t.test(e.label);
+                        });
+                    v.rmCls("pending"), d.setHint("noMatch"), d.setItems(n);
+                }
+            },
+            y = function() {
+                g
+                    ?
+                    (v.addCls("active"), b[0].focus(), w(a(b.val(), p.advanced))) :
+                    (w(), v.rmCls("active"));
+            },
+            x = function() {
+                (g = !g), y();
+            },
+            k = function() {
+                (g = !1), b.val(""), y();
+            },
+            _ = function() {
+                p.enabled &&
+                    ((v = s(h).appTo("#toolbar")),
+                        (b = v.find("input")),
+                        v.find("img").on("click", x),
+                        b.on("keyup", o(y, p.debounceTime)),
+                        c.sub("location.changed", k));
+            };
+        _();
+    },
+    function(e, t, n) {
+        (function(e) {
+            "use strict";
+            var t = n(2),
+                r = t.map,
+                i = n(12),
+                o = n(14),
+                a = e.window,
+                s = Object.assign({ enabled: !1, id: "UA-000000-0" },
+                    o["google-analytics-ua"]
+                ),
+                c = function() {
+                    !(function(e, t, n, r, i, o, a) {
+                        (e.GoogleAnalyticsObject = i),
+                        (e[i] =
+                            e[i] ||
+                            function() {
+                                (e[i].q = e[i].q || []).push(arguments);
+                            }),
+                        (e[i].l = 1 * new Date()),
+                        (o = t.createElement(n)),
+                        (a = t.getElementsByTagName(n)[0]),
+                        (o.async = 1),
+                        (o.src = r),
+                        a.parentNode.insertBefore(o, a);
+                    })(
+                        window,
+                        document,
+                        "script",
+                        "//www.google-analytics.com/analytics.js",
+                        "ga"
+                    );
+                },
+                u = function() {
+                    s.enabled &&
+                        (c(),
+                            a.ga("create", s.id, "auto"),
+                            i.sub("location.changed", function(e) {
+                                var t = a.location;
+                                a.ga("send", "pageview", {
+                                    location: t.protocol + "//" + t.host + e.absHref,
+                                    title: r(e.getCrumb(), function(e) {
+                                        return e.label;
+                                    }).join(" > "),
+                                });
+                            }));
+                };
+            u();
+        }.call(
+            t,
+            (function() {
+                return this;
+            })()
+        ));
+    },
+    function(e, t, n) {
+        (function(e) {
+            "use strict";
+            var t = n(33),
+                r = n(2),
+                i = r.isNum,
+                o = r.dom,
+                a = n(12),
+                s = n(19),
+                c = n(13),
+                u = n(14),
+                l = n(16),
+                f = Object.assign({ enabled: !1, show: !1, qrcode: !0, qrColor: "#999" },
+                    u.info
+                ),
+                d =
+                '<div id="info">\n            <div class="icon"><img/></div>\n            <div class="block">\n                <div class="label"></div>\n                <div class="time"></div>\n                <div class="size"></div>\n                <div class="content">\n                    <span class="folders"></span> <span class="l10n-folders"></span>,\n                    <span class="files"></span> <span class="l10n-files"></span>\n                </div>\n            </div>\n            <div class="qrcode"/>\n        </div>',
+                p =
+                '<div class="block">\n            <h1 class="l10n-info">Info</h1>\n            <div id="view-info" class="button view">\n                <img src="' +
+                c.image("info-toggle") +
+                '" alt="view-info"/>\n            </div>\n        </div>',
+                h = "ext/info",
+                g = void 0,
+                m = void 0,
+                v = void 0,
+                b = void 0,
+                w = void 0,
+                y = void 0,
+                x = void 0,
+                k = void 0,
+                _ = void 0,
+                C = function() {
+                    l.get(h) ?
+                        (o("#view-info").addCls("active"), o("#info").show()) :
+                        (o("#view-info").rmCls("active"), o("#info").hide());
+                },
+                S = function(n) {
+                    var r = n.thumbRational || n.icon,
+                        o = !!n.thumbRational;
+                    if (
+                        ((!n.isCurrentFolder() && r) || (r = c.icon("folder")),
+                            g.attr("src", r),
+                            o ? g.addCls("thumb") : g.rmCls("thumb"),
+                            m.text(n.label),
+                            i(n.time) ? v.text(s.formatDate(n.time)) : v.text("."),
+                            i(n.size) ? (b.text(s.formatSize(n.size)), b.show()) : b.hide(),
+                            n.isContentFetched)
+                    ) {
+                        var a = n.getStats();
+                        y.text(a.folders), x.text(a.files), w.show();
+                    } else w.hide();
+                    if (f.qrcode) {
+                        var u = e.window.location;
+                        k.clr().app(
+                            t({
+                                render: "image",
+                                size: 200,
+                                fill: f.qrFill,
+                                back: f.qrBack,
+                                text: u.protocol + "//" + u.host + n.absHref,
+                                crisp: !0,
+                                quiet: 1,
+                            })
+                        );
+                    }
+                },
+                A = function(e) {
+                    S(e);
+                },
+                T = function() {
+                    S(_);
+                },
+                E = function(e) {
+                    (_ = e), S(_);
+                },
+                M = function() {
+                    if (f.enabled) {
+                        var e = o(d).hide().appTo("#mainrow");
+                        (g = e.find(".icon img")),
+                        (m = e.find(".label")),
+                        (v = e.find(".time")),
+                        (b = e.find(".size")),
+                        (w = e.find(".content")),
+                        (y = e.find(".folders")),
+                        (x = e.find(".files")),
+                        (k = e.find(".qrcode")),
+                        f.qrcode || k.rm(),
+                            o(p)
+                            .appTo("#sidebar")
+                            .find("#view-info")
+                            .on("click", function(e) {
+                                l.put(h, !l.get(h)),
+                                    C(),
+                                    a.pub("resize"),
+                                    e.preventDefault();
+                            }),
+                            "boolean" != typeof l.get(h) && l.put(h, f.show),
+                            C(),
+                            a.sub("location.changed", E),
+                            a.sub("item.mouseenter", A),
+                            a.sub("item.mouseleave", T);
+                    }
+                };
+            M();
+        }.call(
+            t,
+            (function() {
+                return this;
+            })()
+        ));
+    },
+    function(e, t, n) {
+        var r, i, o;
+        !(function(t, n) {
+            e.exports = n();
+        })(this, function() {
+            return (function(e) {
+                function t(r) {
+                    if (n[r]) return n[r].exports;
+                    var i = (n[r] = { exports: {}, id: r, loaded: !1 });
+                    return (
+                        e[r].call(i.exports, i, i.exports, t), (i.loaded = !0), i.exports
+                    );
+                }
+                var n = {};
+                return (t.m = e), (t.c = n), (t.p = ""), t(0);
+            })([
+                function(e, t, n) {
+                    "use strict";
+                    var r = n(1),
+                        i = r.create_canvas,
+                        o = r.canvas_to_img,
+                        a = r.dpr,
+                        s = n(2),
+                        c = n(3),
+                        u = n(4);
+                    e.exports = function(e) {
+                        var t = Object.assign({}, s, e),
+                            n = c(t.text, t.ecLevel, t.minVersion, t.quiet),
+                            r = t.ratio || a,
+                            l = i(t.size, r),
+                            f = l.getContext("2d");
+                        return f.scale(r, r), u(n, f, t), "image" === t.render ? o(l) : l;
+                    };
+                },
+                function(e, t) {
+                    "use strict";
+                    var n = window,
+                        r = n.document,
+                        i = n.devicePixelRatio || 1,
+                        o = function(e) {
+                            return r.createElement(e);
+                        },
+                        a = function(e, t) {
+                            return e.getAttribute(t);
+                        },
+                        s = function(e, t, n) {
+                            return e.setAttribute(t, n);
+                        },
+                        c = function(e, t) {
+                            var n = o("canvas");
+                            return (
+                                s(n, "width", e * t),
+                                s(n, "height", e * t),
+                                (n.style.width = e + "px"),
+                                (n.style.height = e + "px"),
+                                n
+                            );
+                        },
+                        u = function(e) {
+                            var t = o("img");
+                            return (
+                                s(t, "crossorigin", "anonymous"),
+                                s(t, "src", e.toDataURL("image/png")),
+                                s(t, "width", a(e, "width")),
+                                s(t, "height", a(e, "height")),
+                                (t.style.width = e.style.width),
+                                (t.style.height = e.style.height),
+                                t
+                            );
+                        };
+                    e.exports = { create_canvas: c, canvas_to_img: u, dpr: i };
+                },
+                function(e, t) {
+                    "use strict";
+                    e.exports = {
+                        render: "image",
+                        crisp: !0,
+                        minVersion: 1,
+                        ecLevel: "L",
+                        size: 200,
+                        ratio: null,
+                        fill: "#333",
+                        back: "#fff",
+                        text: "no text",
+                        rounded: 0,
+                        quiet: 0,
+                        mode: "plain",
+                        mSize: 30,
+                        mPosX: 50,
+                        mPosY: 50,
+                        label: "no label",
+                        fontname: "sans",
+                        fontcolor: "#333",
+                        image: null,
+                    };
+                },
+                function(n, a) {
+                    "use strict";
+                    var s =
+                        "function" == typeof Symbol &&
+                        "symbol" == typeof Symbol.iterator ?
+
+                        function(e) {
+                            return typeof e;
+                        } :
+                        function(e) {
+                            return e &&
+                                "function" == typeof Symbol &&
+                                e.constructor === Symbol &&
+                                e !== Symbol.prototype ?
+                                "symbol" :
+                                typeof e;
+                        },
+                        c = /code length overflow/i,
+                        u = (function() {
+                            var n = (function() {
+                                function e(t, n) {
+                                    if ("undefined" == typeof t.length)
+                                        throw new Error(t.length + "/" + n);
+                                    var r = (function() {
+                                            for (var e = 0; e < t.length && 0 == t[e];) e += 1;
+                                            for (
+                                                var r = new Array(t.length - e + n), i = 0; i < t.length - e; i += 1
+                                            )
+                                                r[i] = t[i + e];
+                                            return r;
+                                        })(),
+                                        i = {};
+                                    return (
+                                        (i.getAt = function(e) {
+                                            return r[e];
+                                        }),
+                                        (i.getLength = function() {
+                                            return r.length;
+                                        }),
+                                        (i.multiply = function(t) {
+                                            for (
+                                                var n = new Array(i.getLength() + t.getLength() - 1),
+                                                    r = 0; r < i.getLength(); r += 1
+                                            )
+                                                for (var o = 0; o < t.getLength(); o += 1)
+                                                    n[r + o] ^= a.gexp(
+                                                        a.glog(i.getAt(r)) + a.glog(t.getAt(o))
+                                                    );
+                                            return e(n, 0);
+                                        }),
+                                        (i.mod = function(t) {
+                                            if (i.getLength() - t.getLength() < 0) return i;
+                                            for (
+                                                var n = a.glog(i.getAt(0)) - a.glog(t.getAt(0)),
+                                                    r = new Array(i.getLength()),
+                                                    o = 0; o < i.getLength(); o += 1
+                                            )
+                                                r[o] = i.getAt(o);
+                                            for (var o = 0; o < t.getLength(); o += 1)
+                                                r[o] ^= a.gexp(a.glog(t.getAt(o)) + n);
+                                            return e(r, 0).mod(t);
+                                        }),
+                                        i
+                                    );
+                                }
+                                var t = function(t, n) {
+                                    var i = 236,
+                                        a = 17,
+                                        l = t,
+                                        f = r[n],
+                                        d = null,
+                                        p = 0,
+                                        g = null,
+                                        m = new Array(),
+                                        v = {},
+                                        b = function(e, t) {
+                                            (p = 4 * l + 17),
+                                            (d = (function(e) {
+                                                for (var t = new Array(e), n = 0; n < e; n += 1) {
+                                                    t[n] = new Array(e);
+                                                    for (var r = 0; r < e; r += 1) t[n][r] = null;
+                                                }
+                                                return t;
+                                            })(p)),
+                                            w(0, 0),
+                                                w(p - 7, 0),
+                                                w(0, p - 7),
+                                                k(),
+                                                x(),
+                                                C(e, t),
+                                                l >= 7 && _(e),
+                                                null == g && (g = T(l, f, m)),
+                                                S(g, t);
+                                        },
+                                        w = function(e, t) {
+                                            for (var n = -1; n <= 7; n += 1)
+                                                if (!(e + n <= -1 || p <= e + n))
+                                                    for (var r = -1; r <= 7; r += 1)
+                                                        t + r <= -1 ||
+                                                        p <= t + r ||
+                                                        ((0 <= n && n <= 6 && (0 == r || 6 == r)) ||
+                                                            (0 <= r && r <= 6 && (0 == n || 6 == n)) ||
+                                                            (2 <= n && n <= 4 && 2 <= r && r <= 4) ?
+                                                            (d[e + n][t + r] = !0) :
+                                                            (d[e + n][t + r] = !1));
+                                        },
+                                        y = function() {
+                                            for (var e = 0, t = 0, n = 0; n < 8; n += 1) {
+                                                b(!0, n);
+                                                var r = o.getLostPoint(v);
+                                                (0 == n || e > r) && ((e = r), (t = n));
+                                            }
+                                            return t;
+                                        },
+                                        x = function() {
+                                            for (var e = 8; e < p - 8; e += 1)
+                                                null == d[e][6] && (d[e][6] = e % 2 == 0);
+                                            for (var t = 8; t < p - 8; t += 1)
+                                                null == d[6][t] && (d[6][t] = t % 2 == 0);
+                                        },
+                                        k = function() {
+                                            for (
+                                                var e = o.getPatternPosition(l), t = 0; t < e.length; t += 1
+                                            )
+                                                for (var n = 0; n < e.length; n += 1) {
+                                                    var r = e[t],
+                                                        i = e[n];
+                                                    if (null == d[r][i])
+                                                        for (var a = -2; a <= 2; a += 1)
+                                                            for (var s = -2; s <= 2; s += 1)
+                                                                a == -2 ||
+                                                                2 == a ||
+                                                                s == -2 ||
+                                                                2 == s ||
+                                                                (0 == a && 0 == s) ?
+                                                                (d[r + a][i + s] = !0) :
+                                                                (d[r + a][i + s] = !1);
+                                                }
+                                        },
+                                        _ = function(e) {
+                                            for (
+                                                var t = o.getBCHTypeNumber(l), n = 0; n < 18; n += 1
+                                            ) {
+                                                var r = !e && 1 == ((t >> n) & 1);
+                                                d[Math.floor(n / 3)][(n % 3) + p - 8 - 3] = r;
+                                            }
+                                            for (var n = 0; n < 18; n += 1) {
+                                                var r = !e && 1 == ((t >> n) & 1);
+                                                d[(n % 3) + p - 8 - 3][Math.floor(n / 3)] = r;
+                                            }
+                                        },
+                                        C = function(e, t) {
+                                            for (
+                                                var n = (f << 3) | t, r = o.getBCHTypeInfo(n), i = 0; i < 15; i += 1
+                                            ) {
+                                                var a = !e && 1 == ((r >> i) & 1);
+                                                i < 6 ?
+                                                    (d[i][8] = a) :
+                                                    i < 8 ?
+                                                    (d[i + 1][8] = a) :
+                                                    (d[p - 15 + i][8] = a);
+                                            }
+                                            for (var i = 0; i < 15; i += 1) {
+                                                var a = !e && 1 == ((r >> i) & 1);
+                                                i < 8 ?
+                                                    (d[8][p - i - 1] = a) :
+                                                    i < 9 ?
+                                                    (d[8][15 - i - 1 + 1] = a) :
+                                                    (d[8][15 - i - 1] = a);
+                                            }
+                                            d[p - 8][8] = !e;
+                                        },
+                                        S = function(e, t) {
+                                            for (
+                                                var n = -1,
+                                                    r = p - 1,
+                                                    i = 7,
+                                                    a = 0,
+                                                    s = o.getMaskFunction(t),
+                                                    c = p - 1; c > 0; c -= 2
+                                            )
+                                                for (6 == c && (c -= 1);;) {
+                                                    for (var u = 0; u < 2; u += 1)
+                                                        if (null == d[r][c - u]) {
+                                                            var l = !1;
+                                                            a < e.length && (l = 1 == ((e[a] >>> i) & 1));
+                                                            var f = s(r, c - u);
+                                                            f && (l = !l),
+                                                                (d[r][c - u] = l),
+                                                                (i -= 1),
+                                                                i == -1 && ((a += 1), (i = 7));
+                                                        }
+                                                    if (((r += n), r < 0 || p <= r)) {
+                                                        (r -= n), (n = -n);
+                                                        break;
+                                                    }
+                                                }
+                                        },
+                                        A = function(t, n) {
+                                            for (
+                                                var r = 0,
+                                                    i = 0,
+                                                    a = 0,
+                                                    s = new Array(n.length),
+                                                    c = new Array(n.length),
+                                                    u = 0; u < n.length; u += 1
+                                            ) {
+                                                var l = n[u].dataCount,
+                                                    f = n[u].totalCount - l;
+                                                (i = Math.max(i, l)),
+                                                (a = Math.max(a, f)),
+                                                (s[u] = new Array(l));
+                                                for (var d = 0; d < s[u].length; d += 1)
+                                                    s[u][d] = 255 & t.getBuffer()[d + r];
+                                                r += l;
+                                                var p = o.getErrorCorrectPolynomial(f),
+                                                    h = e(s[u], p.getLength() - 1),
+                                                    g = h.mod(p);
+                                                c[u] = new Array(p.getLength() - 1);
+                                                for (var d = 0; d < c[u].length; d += 1) {
+                                                    var m = d + g.getLength() - c[u].length;
+                                                    c[u][d] = m >= 0 ? g.getAt(m) : 0;
+                                                }
+                                            }
+                                            for (var v = 0, d = 0; d < n.length; d += 1)
+                                                v += n[d].totalCount;
+                                            for (var b = new Array(v), w = 0, d = 0; d < i; d += 1)
+                                                for (var u = 0; u < n.length; u += 1)
+                                                    d < s[u].length && ((b[w] = s[u][d]), (w += 1));
+                                            for (var d = 0; d < a; d += 1)
+                                                for (var u = 0; u < n.length; u += 1)
+                                                    d < c[u].length && ((b[w] = c[u][d]), (w += 1));
+                                            return b;
+                                        },
+                                        T = function(e, t, n) {
+                                            for (
+                                                var r = s.getRSBlocks(e, t), u = c(), l = 0; l < n.length; l += 1
+                                            ) {
+                                                var f = n[l];
+                                                u.put(f.getMode(), 4),
+                                                    u.put(
+                                                        f.getLength(),
+                                                        o.getLengthInBits(f.getMode(), e)
+                                                    ),
+                                                    f.write(u);
+                                            }
+                                            for (var d = 0, l = 0; l < r.length; l += 1)
+                                                d += r[l].dataCount;
+                                            if (u.getLengthInBits() > 8 * d)
+                                                throw new Error(
+                                                    "code length overflow. (" +
+                                                    u.getLengthInBits() +
+                                                    ">" +
+                                                    8 * d +
+                                                    ")"
+                                                );
+                                            for (
+                                                u.getLengthInBits() + 4 <= 8 * d && u.put(0, 4); u.getLengthInBits() % 8 != 0;
+
+                                            )
+                                                u.putBit(!1);
+                                            for (; !(u.getLengthInBits() >= 8 * d) &&
+                                                (u.put(i, 8), !(u.getLengthInBits() >= 8 * d));
+
+                                            )
+                                                u.put(a, 8);
+                                            return A(u, r);
+                                        };
+                                    return (
+                                        (v.addData = function(e) {
+                                            var t = u(e);
+                                            m.push(t), (g = null);
+                                        }),
+                                        (v.isDark = function(e, t) {
+                                            if (e < 0 || p <= e || t < 0 || p <= t)
+                                                throw new Error(e + "," + t);
+                                            return d[e][t];
+                                        }),
+                                        (v.getModuleCount = function() {
+                                            return p;
+                                        }),
+                                        (v.make = function() {
+                                            b(!1, y());
+                                        }),
+                                        (v.createTableTag = function(e, t) {
+                                            (e = e || 2), (t = "undefined" == typeof t ? 4 * e : t);
+                                            var n = "";
+                                            (n += '<table style="'),
+                                            (n += " border-width: 0px; border-style: none;"),
+                                            (n += " border-collapse: collapse;"),
+                                            (n += " padding: 0px; margin: " + t + "px;"),
+                                            (n += '">'),
+                                            (n += "<tbody>");
+                                            for (var r = 0; r < v.getModuleCount(); r += 1) {
+                                                n += "<tr>";
+                                                for (var i = 0; i < v.getModuleCount(); i += 1)
+                                                    (n += '<td style="'),
+                                                    (n += " border-width: 0px; border-style: none;"),
+                                                    (n += " border-collapse: collapse;"),
+                                                    (n += " padding: 0px; margin: 0px;"),
+                                                    (n += " width: " + e + "px;"),
+                                                    (n += " height: " + e + "px;"),
+                                                    (n += " background-color: "),
+                                                    (n += v.isDark(r, i) ? "#000000" : "#ffffff"),
+                                                    (n += ";"),
+                                                    (n += '"/>');
+                                                n += "</tr>";
+                                            }
+                                            return (n += "</tbody>"), (n += "</table>");
+                                        }),
+                                        (v.createImgTag = function(e, t) {
+                                            (e = e || 2), (t = "undefined" == typeof t ? 4 * e : t);
+                                            var n = v.getModuleCount() * e + 2 * t,
+                                                r = t,
+                                                i = n - t;
+                                            return h(n, n, function(t, n) {
+                                                if (r <= t && t < i && r <= n && n < i) {
+                                                    var o = Math.floor((t - r) / e),
+                                                        a = Math.floor((n - r) / e);
+                                                    return v.isDark(a, o) ? 0 : 1;
+                                                }
+                                                return 1;
+                                            });
+                                        }),
+                                        v
+                                    );
+                                };
+                                (t.stringToBytes = function(e) {
+                                    for (var t = new Array(), n = 0; n < e.length; n += 1) {
+                                        var r = e.charCodeAt(n);
+                                        t.push(255 & r);
+                                    }
+                                    return t;
+                                }),
+                                (t.createStringToBytes = function(e, t) {
+                                    var n = (function() {
+                                            for (
+                                                var n = d(e),
+                                                    r = function() {
+                                                        var e = n.read();
+                                                        if (e == -1) throw new Error();
+                                                        return e;
+                                                    },
+                                                    i = 0,
+                                                    o = {};;
+
+                                            ) {
+                                                var a = n.read();
+                                                if (a == -1) break;
+                                                var s = r(),
+                                                    c = r(),
+                                                    u = r(),
+                                                    l = String.fromCharCode((a << 8) | s),
+                                                    f = (c << 8) | u;
+                                                (o[l] = f), (i += 1);
+                                            }
+                                            if (i != t) throw new Error(i + " != " + t);
+                                            return o;
+                                        })(),
+                                        r = "?".charCodeAt(0);
+                                    return function(e) {
+                                        for (var t = new Array(), i = 0; i < e.length; i += 1) {
+                                            var o = e.charCodeAt(i);
+                                            if (o < 128) t.push(o);
+                                            else {
+                                                var a = n[e.charAt(i)];
+                                                "number" == typeof a
+                                                    ?
+                                                    (255 & a) == a ?
+                                                    t.push(a) :
+                                                    (t.push(a >>> 8), t.push(255 & a)) :
+                                                    t.push(r);
+                                            }
+                                        }
+                                        return t;
+                                    };
+                                });
+                                var n = {
+                                        MODE_NUMBER: 1,
+                                        MODE_ALPHA_NUM: 2,
+                                        MODE_8BIT_BYTE: 4,
+                                        MODE_KANJI: 8,
+                                    },
+                                    r = { L: 1, M: 0, Q: 3, H: 2 },
+                                    i = {
+                                        PATTERN000: 0,
+                                        PATTERN001: 1,
+                                        PATTERN010: 2,
+                                        PATTERN011: 3,
+                                        PATTERN100: 4,
+                                        PATTERN101: 5,
+                                        PATTERN110: 6,
+                                        PATTERN111: 7,
+                                    },
+                                    o = (function() {
+                                        var t = [
+                                                [],
+                                                [6, 18],
+                                                [6, 22],
+                                                [6, 26],
+                                                [6, 30],
+                                                [6, 34],
+                                                [6, 22, 38],
+                                                [6, 24, 42],
+                                                [6, 26, 46],
+                                                [6, 28, 50],
+                                                [6, 30, 54],
+                                                [6, 32, 58],
+                                                [6, 34, 62],
+                                                [6, 26, 46, 66],
+                                                [6, 26, 48, 70],
+                                                [6, 26, 50, 74],
+                                                [6, 30, 54, 78],
+                                                [6, 30, 56, 82],
+                                                [6, 30, 58, 86],
+                                                [6, 34, 62, 90],
+                                                [6, 28, 50, 72, 94],
+                                                [6, 26, 50, 74, 98],
+                                                [6, 30, 54, 78, 102],
+                                                [6, 28, 54, 80, 106],
+                                                [6, 32, 58, 84, 110],
+                                                [6, 30, 58, 86, 114],
+                                                [6, 34, 62, 90, 118],
+                                                [6, 26, 50, 74, 98, 122],
+                                                [6, 30, 54, 78, 102, 126],
+                                                [6, 26, 52, 78, 104, 130],
+                                                [6, 30, 56, 82, 108, 134],
+                                                [6, 34, 60, 86, 112, 138],
+                                                [6, 30, 58, 86, 114, 142],
+                                                [6, 34, 62, 90, 118, 146],
+                                                [6, 30, 54, 78, 102, 126, 150],
+                                                [6, 24, 50, 76, 102, 128, 154],
+                                                [6, 28, 54, 80, 106, 132, 158],
+                                                [6, 32, 58, 84, 110, 136, 162],
+                                                [6, 26, 54, 82, 110, 138, 166],
+                                                [6, 30, 58, 86, 114, 142, 170],
+                                            ],
+                                            r = 1335,
+                                            o = 7973,
+                                            s = 21522,
+                                            c = {},
+                                            u = function(e) {
+                                                for (var t = 0; 0 != e;)(t += 1), (e >>>= 1);
+                                                return t;
+                                            };
+                                        return (
+                                            (c.getBCHTypeInfo = function(e) {
+                                                for (var t = e << 10; u(t) - u(r) >= 0;)
+                                                    t ^= r << (u(t) - u(r));
+                                                return ((e << 10) | t) ^ s;
+                                            }),
+                                            (c.getBCHTypeNumber = function(e) {
+                                                for (var t = e << 12; u(t) - u(o) >= 0;)
+                                                    t ^= o << (u(t) - u(o));
+                                                return (e << 12) | t;
+                                            }),
+                                            (c.getPatternPosition = function(e) {
+                                                return t[e - 1];
+                                            }),
+                                            (c.getMaskFunction = function(e) {
+                                                switch (e) {
+                                                    case i.PATTERN000:
+                                                        return function(e, t) {
+                                                            return (e + t) % 2 == 0;
+                                                        };
+                                                    case i.PATTERN001:
+                                                        return function(e, t) {
+                                                            return e % 2 == 0;
+                                                        };
+                                                    case i.PATTERN010:
+                                                        return function(e, t) {
+                                                            return t % 3 == 0;
+                                                        };
+                                                    case i.PATTERN011:
+                                                        return function(e, t) {
+                                                            return (e + t) % 3 == 0;
+                                                        };
+                                                    case i.PATTERN100:
+                                                        return function(e, t) {
+                                                            return (
+                                                                (Math.floor(e / 2) + Math.floor(t / 3)) % 2 ==
+                                                                0
+                                                            );
+                                                        };
+                                                    case i.PATTERN101:
+                                                        return function(e, t) {
+                                                            return ((e * t) % 2) + ((e * t) % 3) == 0;
+                                                        };
+                                                    case i.PATTERN110:
+                                                        return function(e, t) {
+                                                            return (((e * t) % 2) + ((e * t) % 3)) % 2 == 0;
+                                                        };
+                                                    case i.PATTERN111:
+                                                        return function(e, t) {
+                                                            return (((e * t) % 3) + ((e + t) % 2)) % 2 == 0;
+                                                        };
+                                                    default:
+                                                        throw new Error("bad maskPattern:" + e);
+                                                }
+                                            }),
+                                            (c.getErrorCorrectPolynomial = function(t) {
+                                                for (var n = e([1], 0), r = 0; r < t; r += 1)
+                                                    n = n.multiply(e([1, a.gexp(r)], 0));
+                                                return n;
+                                            }),
+                                            (c.getLengthInBits = function(e, t) {
+                                                if (1 <= t && t < 10)
+                                                    switch (e) {
+                                                        case n.MODE_NUMBER:
+                                                            return 10;
+                                                        case n.MODE_ALPHA_NUM:
+                                                            return 9;
+                                                        case n.MODE_8BIT_BYTE:
+                                                            return 8;
+                                                        case n.MODE_KANJI:
+                                                            return 8;
+                                                        default:
+                                                            throw new Error("mode:" + e);
+                                                    }
+                                                else if (t < 27)
+                                                    switch (e) {
+                                                        case n.MODE_NUMBER:
+                                                            return 12;
+                                                        case n.MODE_ALPHA_NUM:
+                                                            return 11;
+                                                        case n.MODE_8BIT_BYTE:
+                                                            return 16;
+                                                        case n.MODE_KANJI:
+                                                            return 10;
+                                                        default:
+                                                            throw new Error("mode:" + e);
+                                                    }
+                                                else {
+                                                    if (!(t < 41)) throw new Error("type:" + t);
+                                                    switch (e) {
+                                                        case n.MODE_NUMBER:
+                                                            return 14;
+                                                        case n.MODE_ALPHA_NUM:
+                                                            return 13;
+                                                        case n.MODE_8BIT_BYTE:
+                                                            return 16;
+                                                        case n.MODE_KANJI:
+                                                            return 12;
+                                                        default:
+                                                            throw new Error("mode:" + e);
+                                                    }
+                                                }
+                                            }),
+                                            (c.getLostPoint = function(e) {
+                                                for (
+                                                    var t = e.getModuleCount(), n = 0, r = 0; r < t; r += 1
+                                                )
+                                                    for (var i = 0; i < t; i += 1) {
+                                                        for (
+                                                            var o = 0, a = e.isDark(r, i), s = -1; s <= 1; s += 1
+                                                        )
+                                                            if (!(r + s < 0 || t <= r + s))
+                                                                for (var c = -1; c <= 1; c += 1)
+                                                                    i + c < 0 ||
+                                                                    t <= i + c ||
+                                                                    (0 == s && 0 == c) ||
+                                                                    (a == e.isDark(r + s, i + c) && (o += 1));
+                                                        o > 5 && (n += 3 + o - 5);
+                                                    }
+                                                for (var r = 0; r < t - 1; r += 1)
+                                                    for (var i = 0; i < t - 1; i += 1) {
+                                                        var u = 0;
+                                                        e.isDark(r, i) && (u += 1),
+                                                            e.isDark(r + 1, i) && (u += 1),
+                                                            e.isDark(r, i + 1) && (u += 1),
+                                                            e.isDark(r + 1, i + 1) && (u += 1),
+                                                            (0 != u && 4 != u) || (n += 3);
+                                                    }
+                                                for (var r = 0; r < t; r += 1)
+                                                    for (var i = 0; i < t - 6; i += 1)
+                                                        e.isDark(r, i) &&
+                                                        !e.isDark(r, i + 1) &&
+                                                        e.isDark(r, i + 2) &&
+                                                        e.isDark(r, i + 3) &&
+                                                        e.isDark(r, i + 4) &&
+                                                        !e.isDark(r, i + 5) &&
+                                                        e.isDark(r, i + 6) &&
+                                                        (n += 40);
+                                                for (var i = 0; i < t; i += 1)
+                                                    for (var r = 0; r < t - 6; r += 1)
+                                                        e.isDark(r, i) &&
+                                                        !e.isDark(r + 1, i) &&
+                                                        e.isDark(r + 2, i) &&
+                                                        e.isDark(r + 3, i) &&
+                                                        e.isDark(r + 4, i) &&
+                                                        !e.isDark(r + 5, i) &&
+                                                        e.isDark(r + 6, i) &&
+                                                        (n += 40);
+                                                for (var l = 0, i = 0; i < t; i += 1)
+                                                    for (var r = 0; r < t; r += 1)
+                                                        e.isDark(r, i) && (l += 1);
+                                                var f = Math.abs((100 * l) / t / t - 50) / 5;
+                                                return (n += 10 * f);
+                                            }),
+                                            c
+                                        );
+                                    })(),
+                                    a = (function() {
+                                        for (
+                                            var e = new Array(256), t = new Array(256), n = 0; n < 8; n += 1
+                                        )
+                                            e[n] = 1 << n;
+                                        for (var n = 8; n < 256; n += 1)
+                                            e[n] = e[n - 4] ^ e[n - 5] ^ e[n - 6] ^ e[n - 8];
+                                        for (var n = 0; n < 255; n += 1) t[e[n]] = n;
+                                        var r = {};
+                                        return (
+                                            (r.glog = function(e) {
+                                                if (e < 1) throw new Error("glog(" + e + ")");
+                                                return t[e];
+                                            }),
+                                            (r.gexp = function(t) {
+                                                for (; t < 0;) t += 255;
+                                                for (; t >= 256;) t -= 255;
+                                                return e[t];
+                                            }),
+                                            r
+                                        );
+                                    })(),
+                                    s = (function() {
+                                        var e = [
+                                                [1, 26, 19],
+                                                [1, 26, 16],
+                                                [1, 26, 13],
+                                                [1, 26, 9],
+                                                [1, 44, 34],
+                                                [1, 44, 28],
+                                                [1, 44, 22],
+                                                [1, 44, 16],
+                                                [1, 70, 55],
+                                                [1, 70, 44],
+                                                [2, 35, 17],
+                                                [2, 35, 13],
+                                                [1, 100, 80],
+                                                [2, 50, 32],
+                                                [2, 50, 24],
+                                                [4, 25, 9],
+                                                [1, 134, 108],
+                                                [2, 67, 43],
+                                                [2, 33, 15, 2, 34, 16],
+                                                [2, 33, 11, 2, 34, 12],
+                                                [2, 86, 68],
+                                                [4, 43, 27],
+                                                [4, 43, 19],
+                                                [4, 43, 15],
+                                                [2, 98, 78],
+                                                [4, 49, 31],
+                                                [2, 32, 14, 4, 33, 15],
+                                                [4, 39, 13, 1, 40, 14],
+                                                [2, 121, 97],
+                                                [2, 60, 38, 2, 61, 39],
+                                                [4, 40, 18, 2, 41, 19],
+                                                [4, 40, 14, 2, 41, 15],
+                                                [2, 146, 116],
+                                                [3, 58, 36, 2, 59, 37],
+                                                [4, 36, 16, 4, 37, 17],
+                                                [4, 36, 12, 4, 37, 13],
+                                                [2, 86, 68, 2, 87, 69],
+                                                [4, 69, 43, 1, 70, 44],
+                                                [6, 43, 19, 2, 44, 20],
+                                                [6, 43, 15, 2, 44, 16],
+                                                [4, 101, 81],
+                                                [1, 80, 50, 4, 81, 51],
+                                                [4, 50, 22, 4, 51, 23],
+                                                [3, 36, 12, 8, 37, 13],
+                                                [2, 116, 92, 2, 117, 93],
+                                                [6, 58, 36, 2, 59, 37],
+                                                [4, 46, 20, 6, 47, 21],
+                                                [7, 42, 14, 4, 43, 15],
+                                                [4, 133, 107],
+                                                [8, 59, 37, 1, 60, 38],
+                                                [8, 44, 20, 4, 45, 21],
+                                                [12, 33, 11, 4, 34, 12],
+                                                [3, 145, 115, 1, 146, 116],
+                                                [4, 64, 40, 5, 65, 41],
+                                                [11, 36, 16, 5, 37, 17],
+                                                [11, 36, 12, 5, 37, 13],
+                                                [5, 109, 87, 1, 110, 88],
+                                                [5, 65, 41, 5, 66, 42],
+                                                [5, 54, 24, 7, 55, 25],
+                                                [11, 36, 12, 7, 37, 13],
+                                                [5, 122, 98, 1, 123, 99],
+                                                [7, 73, 45, 3, 74, 46],
+                                                [15, 43, 19, 2, 44, 20],
+                                                [3, 45, 15, 13, 46, 16],
+                                                [1, 135, 107, 5, 136, 108],
+                                                [10, 74, 46, 1, 75, 47],
+                                                [1, 50, 22, 15, 51, 23],
+                                                [2, 42, 14, 17, 43, 15],
+                                                [5, 150, 120, 1, 151, 121],
+                                                [9, 69, 43, 4, 70, 44],
+                                                [17, 50, 22, 1, 51, 23],
+                                                [2, 42, 14, 19, 43, 15],
+                                                [3, 141, 113, 4, 142, 114],
+                                                [3, 70, 44, 11, 71, 45],
+                                                [17, 47, 21, 4, 48, 22],
+                                                [9, 39, 13, 16, 40, 14],
+                                                [3, 135, 107, 5, 136, 108],
+                                                [3, 67, 41, 13, 68, 42],
+                                                [15, 54, 24, 5, 55, 25],
+                                                [15, 43, 15, 10, 44, 16],
+                                                [4, 144, 116, 4, 145, 117],
+                                                [17, 68, 42],
+                                                [17, 50, 22, 6, 51, 23],
+                                                [19, 46, 16, 6, 47, 17],
+                                                [2, 139, 111, 7, 140, 112],
+                                                [17, 74, 46],
+                                                [7, 54, 24, 16, 55, 25],
+                                                [34, 37, 13],
+                                                [4, 151, 121, 5, 152, 122],
+                                                [4, 75, 47, 14, 76, 48],
+                                                [11, 54, 24, 14, 55, 25],
+                                                [16, 45, 15, 14, 46, 16],
+                                                [6, 147, 117, 4, 148, 118],
+                                                [6, 73, 45, 14, 74, 46],
+                                                [11, 54, 24, 16, 55, 25],
+                                                [30, 46, 16, 2, 47, 17],
+                                                [8, 132, 106, 4, 133, 107],
+                                                [8, 75, 47, 13, 76, 48],
+                                                [7, 54, 24, 22, 55, 25],
+                                                [22, 45, 15, 13, 46, 16],
+                                                [10, 142, 114, 2, 143, 115],
+                                                [19, 74, 46, 4, 75, 47],
+                                                [28, 50, 22, 6, 51, 23],
+                                                [33, 46, 16, 4, 47, 17],
+                                                [8, 152, 122, 4, 153, 123],
+                                                [22, 73, 45, 3, 74, 46],
+                                                [8, 53, 23, 26, 54, 24],
+                                                [12, 45, 15, 28, 46, 16],
+                                                [3, 147, 117, 10, 148, 118],
+                                                [3, 73, 45, 23, 74, 46],
+                                                [4, 54, 24, 31, 55, 25],
+                                                [11, 45, 15, 31, 46, 16],
+                                                [7, 146, 116, 7, 147, 117],
+                                                [21, 73, 45, 7, 74, 46],
+                                                [1, 53, 23, 37, 54, 24],
+                                                [19, 45, 15, 26, 46, 16],
+                                                [5, 145, 115, 10, 146, 116],
+                                                [19, 75, 47, 10, 76, 48],
+                                                [15, 54, 24, 25, 55, 25],
+                                                [23, 45, 15, 25, 46, 16],
+                                                [13, 145, 115, 3, 146, 116],
+                                                [2, 74, 46, 29, 75, 47],
+                                                [42, 54, 24, 1, 55, 25],
+                                                [23, 45, 15, 28, 46, 16],
+                                                [17, 145, 115],
+                                                [10, 74, 46, 23, 75, 47],
+                                                [10, 54, 24, 35, 55, 25],
+                                                [19, 45, 15, 35, 46, 16],
+                                                [17, 145, 115, 1, 146, 116],
+                                                [14, 74, 46, 21, 75, 47],
+                                                [29, 54, 24, 19, 55, 25],
+                                                [11, 45, 15, 46, 46, 16],
+                                                [13, 145, 115, 6, 146, 116],
+                                                [14, 74, 46, 23, 75, 47],
+                                                [44, 54, 24, 7, 55, 25],
+                                                [59, 46, 16, 1, 47, 17],
+                                                [12, 151, 121, 7, 152, 122],
+                                                [12, 75, 47, 26, 76, 48],
+                                                [39, 54, 24, 14, 55, 25],
+                                                [22, 45, 15, 41, 46, 16],
+                                                [6, 151, 121, 14, 152, 122],
+                                                [6, 75, 47, 34, 76, 48],
+                                                [46, 54, 24, 10, 55, 25],
+                                                [2, 45, 15, 64, 46, 16],
+                                                [17, 152, 122, 4, 153, 123],
+                                                [29, 74, 46, 14, 75, 47],
+                                                [49, 54, 24, 10, 55, 25],
+                                                [24, 45, 15, 46, 46, 16],
+                                                [4, 152, 122, 18, 153, 123],
+                                                [13, 74, 46, 32, 75, 47],
+                                                [48, 54, 24, 14, 55, 25],
+                                                [42, 45, 15, 32, 46, 16],
+                                                [20, 147, 117, 4, 148, 118],
+                                                [40, 75, 47, 7, 76, 48],
+                                                [43, 54, 24, 22, 55, 25],
+                                                [10, 45, 15, 67, 46, 16],
+                                                [19, 148, 118, 6, 149, 119],
+                                                [18, 75, 47, 31, 76, 48],
+                                                [34, 54, 24, 34, 55, 25],
+                                                [20, 45, 15, 61, 46, 16],
+                                            ],
+                                            t = function(e, t) {
+                                                var n = {};
+                                                return (n.totalCount = e), (n.dataCount = t), n;
+                                            },
+                                            n = {},
+                                            i = function(t, n) {
+                                                switch (n) {
+                                                    case r.L:
+                                                        return e[4 * (t - 1) + 0];
+                                                    case r.M:
+                                                        return e[4 * (t - 1) + 1];
+                                                    case r.Q:
+                                                        return e[4 * (t - 1) + 2];
+                                                    case r.H:
+                                                        return e[4 * (t - 1) + 3];
+                                                    default:
+                                                        return;
+                                                }
+                                            };
+                                        return (
+                                            (n.getRSBlocks = function(e, n) {
+                                                var r = i(e, n);
+                                                if ("undefined" == typeof r)
+                                                    throw new Error(
+                                                        "bad rs block @ typeNumber:" +
+                                                        e +
+                                                        "/errorCorrectLevel:" +
+                                                        n
+                                                    );
+                                                for (
+                                                    var o = r.length / 3, a = new Array(), s = 0; s < o; s += 1
+                                                )
+                                                    for (
+                                                        var c = r[3 * s + 0],
+                                                            u = r[3 * s + 1],
+                                                            l = r[3 * s + 2],
+                                                            f = 0; f < c; f += 1
+                                                    )
+                                                        a.push(t(u, l));
+                                                return a;
+                                            }),
+                                            n
+                                        );
+                                    })(),
+                                    c = function() {
+                                        var e = new Array(),
+                                            t = 0,
+                                            n = {};
+                                        return (
+                                            (n.getBuffer = function() {
+                                                return e;
+                                            }),
+                                            (n.getAt = function(t) {
+                                                var n = Math.floor(t / 8);
+                                                return 1 == ((e[n] >>> (7 - (t % 8))) & 1);
+                                            }),
+                                            (n.put = function(e, t) {
+                                                for (var r = 0; r < t; r += 1)
+                                                    n.putBit(1 == ((e >>> (t - r - 1)) & 1));
+                                            }),
+                                            (n.getLengthInBits = function() {
+                                                return t;
+                                            }),
+                                            (n.putBit = function(n) {
+                                                var r = Math.floor(t / 8);
+                                                e.length <= r && e.push(0),
+                                                    n && (e[r] |= 128 >>> t % 8),
+                                                    (t += 1);
+                                            }),
+                                            n
+                                        );
+                                    },
+                                    u = function(e) {
+                                        var r = n.MODE_8BIT_BYTE,
+                                            i = t.stringToBytes(e),
+                                            o = {};
+                                        return (
+                                            (o.getMode = function() {
+                                                return r;
+                                            }),
+                                            (o.getLength = function(e) {
+                                                return i.length;
+                                            }),
+                                            (o.write = function(e) {
+                                                for (var t = 0; t < i.length; t += 1) e.put(i[t], 8);
+                                            }),
+                                            o
+                                        );
+                                    },
+                                    l = function() {
+                                        var e = new Array(),
+                                            t = {};
+                                        return (
+                                            (t.writeByte = function(t) {
+                                                e.push(255 & t);
+                                            }),
+                                            (t.writeShort = function(e) {
+                                                t.writeByte(e), t.writeByte(e >>> 8);
+                                            }),
+                                            (t.writeBytes = function(e, n, r) {
+                                                (n = n || 0), (r = r || e.length);
+                                                for (var i = 0; i < r; i += 1) t.writeByte(e[i + n]);
+                                            }),
+                                            (t.writeString = function(e) {
+                                                for (var n = 0; n < e.length; n += 1)
+                                                    t.writeByte(e.charCodeAt(n));
+                                            }),
+                                            (t.toByteArray = function() {
+                                                return e;
+                                            }),
+                                            (t.toString = function() {
+                                                var t = "";
+                                                t += "[";
+                                                for (var n = 0; n < e.length; n += 1)
+                                                    n > 0 && (t += ","), (t += e[n]);
+                                                return (t += "]");
+                                            }),
+                                            t
+                                        );
+                                    },
+                                    f = function() {
+                                        var e = 0,
+                                            t = 0,
+                                            n = 0,
+                                            r = "",
+                                            i = {},
+                                            o = function(e) {
+                                                r += String.fromCharCode(a(63 & e));
+                                            },
+                                            a = function(e) {
+                                                if (e < 0);
+                                                else {
+                                                    if (e < 26) return 65 + e;
+                                                    if (e < 52) return 97 + (e - 26);
+                                                    if (e < 62) return 48 + (e - 52);
+                                                    if (62 == e) return 43;
+                                                    if (63 == e) return 47;
+                                                }
+                                                throw new Error("n:" + e);
+                                            };
+                                        return (
+                                            (i.writeByte = function(r) {
+                                                for (
+                                                    e = (e << 8) | (255 & r), t += 8, n += 1; t >= 6;
+
+                                                )
+                                                    o(e >>> (t - 6)), (t -= 6);
+                                            }),
+                                            (i.flush = function() {
+                                                if (
+                                                    (t > 0 && (o(e << (6 - t)), (e = 0), (t = 0)),
+                                                        n % 3 != 0)
+                                                )
+                                                    for (var i = 3 - (n % 3), a = 0; a < i; a += 1)
+                                                        r += "=";
+                                            }),
+                                            (i.toString = function() {
+                                                return r;
+                                            }),
+                                            i
+                                        );
+                                    },
+                                    d = function(e) {
+                                        var t = e,
+                                            n = 0,
+                                            r = 0,
+                                            i = 0,
+                                            o = {};
+                                        o.read = function() {
+                                            for (; i < 8;) {
+                                                if (n >= t.length) {
+                                                    if (0 == i) return -1;
+                                                    throw new Error("unexpected end of file./" + i);
+                                                }
+                                                var e = t.charAt(n);
+                                                if (((n += 1), "=" == e)) return (i = 0), -1;
+                                                e.match(/^\s$/) ||
+                                                    ((r = (r << 6) | a(e.charCodeAt(0))), (i += 6));
+                                            }
+                                            var o = (r >>> (i - 8)) & 255;
+                                            return (i -= 8), o;
+                                        };
+                                        var a = function(e) {
+                                            if (65 <= e && e <= 90) return e - 65;
+                                            if (97 <= e && e <= 122) return e - 97 + 26;
+                                            if (48 <= e && e <= 57) return e - 48 + 52;
+                                            if (43 == e) return 62;
+                                            if (47 == e) return 63;
+                                            throw new Error("c:" + e);
+                                        };
+                                        return o;
+                                    },
+                                    p = function(e, t) {
+                                        var n = e,
+                                            r = t,
+                                            i = new Array(e * t),
+                                            o = {};
+                                        (o.setPixel = function(e, t, r) {
+                                            i[t * n + e] = r;
+                                        }),
+                                        (o.write = function(e) {
+                                            e.writeString("GIF87a"),
+                                                e.writeShort(n),
+                                                e.writeShort(r),
+                                                e.writeByte(128),
+                                                e.writeByte(0),
+                                                e.writeByte(0),
+                                                e.writeByte(0),
+                                                e.writeByte(0),
+                                                e.writeByte(0),
+                                                e.writeByte(255),
+                                                e.writeByte(255),
+                                                e.writeByte(255),
+                                                e.writeString(","),
+                                                e.writeShort(0),
+                                                e.writeShort(0),
+                                                e.writeShort(n),
+                                                e.writeShort(r),
+                                                e.writeByte(0);
+                                            var t = 2,
+                                                i = s(t);
+                                            e.writeByte(t);
+                                            for (var o = 0; i.length - o > 255;)
+                                                e.writeByte(255),
+                                                e.writeBytes(i, o, 255),
+                                                (o += 255);
+                                            e.writeByte(i.length - o),
+                                                e.writeBytes(i, o, i.length - o),
+                                                e.writeByte(0),
+                                                e.writeString(";");
+                                        });
+                                        var a = function(e) {
+                                                var t = e,
+                                                    n = 0,
+                                                    r = 0,
+                                                    i = {};
+                                                return (
+                                                    (i.write = function(e, i) {
+                                                        if (e >>> i != 0) throw new Error("length over");
+                                                        for (; n + i >= 8;)
+                                                            t.writeByte(255 & ((e << n) | r)),
+                                                            (i -= 8 - n),
+                                                            (e >>>= 8 - n),
+                                                            (r = 0),
+                                                            (n = 0);
+                                                        (r |= e << n), (n += i);
+                                                    }),
+                                                    (i.flush = function() {
+                                                        n > 0 && t.writeByte(r);
+                                                    }),
+                                                    i
+                                                );
+                                            },
+                                            s = function(e) {
+                                                for (
+                                                    var t = 1 << e,
+                                                        n = (1 << e) + 1,
+                                                        r = e + 1,
+                                                        o = c(),
+                                                        s = 0; s < t; s += 1
+                                                )
+                                                    o.add(String.fromCharCode(s));
+                                                o.add(String.fromCharCode(t)),
+                                                    o.add(String.fromCharCode(n));
+                                                var u = l(),
+                                                    f = a(u);
+                                                f.write(t, r);
+                                                var d = 0,
+                                                    p = String.fromCharCode(i[d]);
+                                                for (d += 1; d < i.length;) {
+                                                    var h = String.fromCharCode(i[d]);
+                                                    (d += 1),
+                                                    o.contains(p + h) ?
+                                                        (p += h) :
+                                                        (f.write(o.indexOf(p), r),
+                                                            o.size() < 4095 &&
+                                                            (o.size() == 1 << r && (r += 1),
+                                                                o.add(p + h)),
+                                                            (p = h));
+                                                }
+                                                return (
+                                                    f.write(o.indexOf(p), r),
+                                                    f.write(n, r),
+                                                    f.flush(),
+                                                    u.toByteArray()
+                                                );
+                                            },
+                                            c = function() {
+                                                var e = {},
+                                                    t = 0,
+                                                    n = {};
+                                                return (
+                                                    (n.add = function(r) {
+                                                        if (n.contains(r))
+                                                            throw new Error("dup key:" + r);
+                                                        (e[r] = t), (t += 1);
+                                                    }),
+                                                    (n.size = function() {
+                                                        return t;
+                                                    }),
+                                                    (n.indexOf = function(t) {
+                                                        return e[t];
+                                                    }),
+                                                    (n.contains = function(t) {
+                                                        return "undefined" != typeof e[t];
+                                                    }),
+                                                    n
+                                                );
+                                            };
+                                        return o;
+                                    },
+                                    h = function(e, t, n, r) {
+                                        for (var i = p(e, t), o = 0; o < t; o += 1)
+                                            for (var a = 0; a < e; a += 1)
+                                                i.setPixel(a, o, n(a, o));
+                                        var s = l();
+                                        i.write(s);
+                                        for (
+                                            var c = f(), u = s.toByteArray(), d = 0; d < u.length; d += 1
+                                        )
+                                            c.writeByte(u[d]);
+                                        c.flush();
+                                        var h = "";
+                                        return (
+                                            (h += "<img"),
+                                            (h += ' src="'),
+                                            (h += "data:image/gif;base64,"),
+                                            (h += c),
+                                            (h += '"'),
+                                            (h += ' width="'),
+                                            (h += e),
+                                            (h += '"'),
+                                            (h += ' height="'),
+                                            (h += t),
+                                            (h += '"'),
+                                            r && ((h += ' alt="'), (h += r), (h += '"')),
+                                            (h += "/>")
+                                        );
+                                    };
+                                return t;
+                            })();
+                            return (
+                                (function(n) {
+                                    (i = []),
+                                    (r = n),
+                                    (o = "function" == typeof r ? r.apply(t, i) : r), !(void 0 !== o && (e.exports = o));
+                                })(function() {
+                                    return n;
+                                }), !(function(e) {
+                                    e.stringToBytes = function(e) {
+                                        function t(e) {
+                                            for (var t = [], n = 0; n < e.length; n++) {
+                                                var r = e.charCodeAt(n);
+                                                r < 128 ?
+                                                    t.push(r) :
+                                                    r < 2048 ?
+                                                    t.push(192 | (r >> 6), 128 | (63 & r)) :
+                                                    r < 55296 || r >= 57344 ?
+                                                    t.push(
+                                                        224 | (r >> 12),
+                                                        128 | ((r >> 6) & 63),
+                                                        128 | (63 & r)
+                                                    ) :
+                                                    (n++,
+                                                        (r =
+                                                            65536 +
+                                                            (((1023 & r) << 10) |
+                                                                (1023 & e.charCodeAt(n)))),
+                                                        t.push(
+                                                            240 | (r >> 18),
+                                                            128 | ((r >> 12) & 63),
+                                                            128 | ((r >> 6) & 63),
+                                                            128 | (63 & r)
+                                                        ));
+                                            }
+                                            return t;
+                                        }
+                                        return t(e);
+                                    };
+                                })(n),
+                                n
+                            );
+                        })(),
+                        l = function(e, t) {
+                            var n =
+                                arguments.length > 2 && void 0 !== arguments[2] ?
+                                arguments[2] :
+                                1;
+                            n = Math.max(1, n);
+                            for (var r = n; r <= 40; r += 1)
+                                try {
+                                    var i = (function() {
+                                        var n = u(r, t);
+                                        n.addData(e), n.make();
+                                        var i = n.getModuleCount(),
+                                            o = function(e, t) {
+                                                return (
+                                                    e >= 0 && e < i && t >= 0 && t < i && n.isDark(e, t)
+                                                );
+                                            };
+                                        return {
+                                            v: {
+                                                text: e,
+                                                level: t,
+                                                version: r,
+                                                moduleCount: i,
+                                                isDark: o,
+                                            },
+                                        };
+                                    })();
+                                    if (
+                                        "object" ===
+                                        ("undefined" == typeof i ? "undefined" : s(i))
+                                    )
+                                        return i.v;
+                                } catch (e) {
+                                    if (!(r < 40 && c.test(e.message))) throw e;
+                                }
+                            return null;
+                        },
+                        f = function() {
+                            var e =
+                                arguments.length > 0 && void 0 !== arguments[0] ?
+                                arguments[0] :
+                                "",
+                                t =
+                                arguments.length > 1 && void 0 !== arguments[1] ?
+                                arguments[1] :
+                                "L",
+                                n =
+                                arguments.length > 2 && void 0 !== arguments[2] ?
+                                arguments[2] :
+                                1,
+                                r =
+                                arguments.length > 3 && void 0 !== arguments[3] ?
+                                arguments[3] :
+                                0,
+                                i = l(e, t, n);
+                            if (i) {
+                                var o = i.isDark;
+                                (i.moduleCount += 2 * r),
+                                (i.isDark = function(e, t) {
+                                    return o(e - r, t - r);
+                                });
+                            }
+                            return i;
+                        };
+                    n.exports = f;
+                },
+                function(e, t, n) {
+                    "use strict";
+                    var r = n(5),
+                        i = n(6),
+                        o = function(e, t) {
+                            (e.fillStyle = t.back), e.fillRect(0, 0, t.size, t.size);
+                        },
+                        a = function(e, t, n, r, i, o) {
+                            e.isDark(i, o) && t.rect(o * r, i * r, r, r);
+                        },
+                        s = function(e, t, n) {
+                            if (e) {
+                                var i = n.rounded > 0 && n.rounded <= 100 ? r : a,
+                                    o = e.moduleCount,
+                                    s = n.size / o,
+                                    c = 0;
+                                n.crisp &&
+                                    ((s = Math.floor(s)),
+                                        (c = Math.floor((n.size - s * o) / 2))),
+                                    t.translate(c, c),
+                                    t.beginPath();
+                                for (var u = 0; u < o; u += 1)
+                                    for (var l = 0; l < o; l += 1) i(e, t, n, s, u, l);
+                                (t.fillStyle = n.fill), t.fill(), t.translate(-c, -c);
+                            }
+                        },
+                        c = function(e, t, n) {
+                            o(t, n), s(e, t, n), i(t, n);
+                        };
+                    e.exports = c;
+                },
+                function(e, t) {
+                    "use strict";
+                    var n = function(e) {
+                            return {
+                                c: e,
+                                m: function() {
+                                    var e;
+                                    return (e = this.c).moveTo.apply(e, arguments), this;
+                                },
+                                l: function() {
+                                    var e;
+                                    return (e = this.c).lineTo.apply(e, arguments), this;
+                                },
+                                a: function() {
+                                    var e;
+                                    return (e = this.c).arcTo.apply(e, arguments), this;
+                                },
+                            };
+                        },
+                        r = function(e, t, n, r, i, o, a, s, c, u) {
+                            a ? e.m(t + o, n) : e.m(t, n),
+                                s ? e.l(r - o, n).a(r, n, r, i, o) : e.l(r, n),
+                                c ? e.l(r, i - o).a(r, i, t, i, o) : e.l(r, i),
+                                u ? e.l(t + o, i).a(t, i, t, n, o) : e.l(t, i),
+                                a ? e.l(t, n + o).a(t, n, r, n, o) : e.l(t, n);
+                        },
+                        i = function(e, t, n, r, i, o, a, s, c, u) {
+                            a &&
+                                e
+                                .m(t + o, n)
+                                .l(t, n)
+                                .l(t, n + o)
+                                .a(t, n, t + o, n, o),
+                                s &&
+                                e
+                                .m(r - o, n)
+                                .l(r, n)
+                                .l(r, n + o)
+                                .a(r, n, r - o, n, o),
+                                c &&
+                                e
+                                .m(r - o, i)
+                                .l(r, i)
+                                .l(r, i - o)
+                                .a(r, i, r - o, i, o),
+                                u &&
+                                e
+                                .m(t + o, i)
+                                .l(t, i)
+                                .l(t, i - o)
+                                .a(t, i, t + o, i, o);
+                        },
+                        o = function(e, t, o, a, s, c) {
+                            var u = c * a,
+                                l = s * a,
+                                f = u + a,
+                                d = l + a,
+                                p = 0.005 * o.rounded * a,
+                                h = e.isDark,
+                                g = s - 1,
+                                m = s + 1,
+                                v = c - 1,
+                                b = c + 1,
+                                w = h(s, c),
+                                y = h(g, v),
+                                x = h(g, c),
+                                k = h(g, b),
+                                _ = h(s, b),
+                                C = h(m, b),
+                                S = h(m, c),
+                                A = h(m, v),
+                                T = h(s, v);
+                            (t = n(t)),
+                            w
+                                ?
+                                r(
+                                    t,
+                                    u,
+                                    l,
+                                    f,
+                                    d,
+                                    p, !x && !T, !x && !_, !S && !_, !S && !T
+                                ) :
+                                i(
+                                    t,
+                                    u,
+                                    l,
+                                    f,
+                                    d,
+                                    p,
+                                    x && T && y,
+                                    x && _ && k,
+                                    S && _ && C,
+                                    S && T && A
+                                );
+                        };
+                    e.exports = o;
+                },
+                function(e, t) {
+                    "use strict";
+                    var n = function(e, t) {
+                            var n = t.size,
+                                r = "bold " + 0.01 * t.mSize * n + "px " + t.fontname;
+                            (e.strokeStyle = t.back),
+                            (e.lineWidth = 0.01 * t.mSize * n * 0.1),
+                            (e.fillStyle = t.fontcolor),
+                            (e.font = r);
+                            var i = e.measureText(t.label).width,
+                                o = 0.01 * t.mSize,
+                                a = i / n,
+                                s = (1 - a) * t.mPosX * 0.01,
+                                c = (1 - o) * t.mPosY * 0.01,
+                                u = s * n,
+                                l = c * n + 0.75 * t.mSize * 0.01 * n;
+                            e.strokeText(t.label, u, l), e.fillText(t.label, u, l);
+                        },
+                        r = function(e, t) {
+                            var n = t.size,
+                                r = t.image.naturalWidth || 1,
+                                i = t.image.naturalHeight || 1,
+                                o = 0.01 * t.mSize,
+                                a = (o * r) / i,
+                                s = (1 - a) * t.mPosX * 0.01,
+                                c = (1 - o) * t.mPosY * 0.01,
+                                u = s * n,
+                                l = c * n,
+                                f = a * n,
+                                d = o * n;
+                            e.draw_image(t.image, u, l, f, d);
+                        },
+                        i = function(e, t) {
+                            var i = t.mode;
+                            "label" === i ? n(e, t) : "image" === i && r(e, t);
+                        };
+                    e.exports = i;
+                },
+            ]);
+        });
+    },
+    function(e, t, n) {
+        (function(e) {
+            "use strict";
+            var t = n(2),
+                r = t.each,
+                i = t.isStr,
+                o = t.dom,
+                a = n(8),
+                s = n(12),
+                c = n(19),
+                u = n(35),
+                l = n(14),
+                f = n(16),
+                d = e.window,
+                p = Object.assign({ enabled: !1, lang: "en", useBrowserLang: !0 },
+                    l.l10n
+                ),
+                h = {
+                    isoCode: "en",
+                    lang: "english",
+                    dateFormat: "YYYY-MM-DD HH:mm",
+                    details: "details",
+                    download: "download",
+                    empty: "empty",
+                    files: "files",
+                    filter: "filter",
+                    folders: "folders",
+                    grid: "grid",
+                    icons: "icons",
+                    language: "Language",
+                    lastModified: "Last modified",
+                    name: "Name",
+                    noMatch: "no match",
+                    parentDirectory: "Parent Directory",
+                    search: "search",
+                    size: "Size",
+                    tree: "Tree",
+                    view: "View",
+                },
+                g =
+                '<div class="block">\n            <h1 class="l10n-language">Language</h1>\n            <div class="select">\n                <select id="langs"/>\n            </div>\n        </div>',
+                m = "<option/>",
+                v = "ext/l10n",
+                b = { en: Object.assign({}, h) },
+                w = b.en,
+                y = function(e) {
+                    e && (w = e);
+                    var t = "selected";
+                    o("#langs option").rmAttr(t).rmProp(t),
+                        o("#langs ." + w.isoCode)
+                        .attr(t, "")
+                        .prop(t, !0),
+                        r(w, function(e, t) {
+                            o(".l10n-" + t).text(e),
+                                o(".l10n_ph-" + t).attr("placeholder", e);
+                        }),
+                        c.setDefaultDateFormat(w.dateFormat),
+                        o("#items .item").each(function(e) {
+                            o(e).find(".date").text(c.formatDate(e._item.time));
+                        });
+                },
+                x = function(e) {
+                    return b[e] ?
+                        Promise.resolve(b[e]) :
+                        a.request({ action: "get", l10n: [e] }).then(function(t) {
+                            return (
+                                (b[e] = Object.assign({}, h, t.l10n && t.l10n[e], {
+                                    isoCode: e,
+                                })),
+                                b[e]
+                            );
+                        });
+                },
+                k = function(e, t, n) {
+                    var r = f.get(v);
+                    if (e[r]) t = r;
+                    else if (n) {
+                        var i = d.navigator.language || d.navigator.browserLanguage;
+                        i &&
+                            (e[i] ?
+                                (t = i) :
+                                i.length > 2 && e[i.substr(0, 2)] && (t = i.substr(0, 2)));
+                    }
+                    e[t] || (t = "en"), x(t).then(y);
+                },
+                _ = function(e) {
+                    var t = o(g),
+                        n = t.find("select").on("change", function(t) {
+                            var n = t.target.value;
+                            f.put(v, n), k(e, n, !1);
+                        });
+                    r(e, function(e, t) {
+                            o(m)
+                                .attr("value", t)
+                                .addCls(t)
+                                .text(t + " - " + (i(e) ? e : e.lang))
+                                .appTo(n);
+                        }),
+                        t.appTo("#sidebar");
+                },
+                C = function() {
+                    p.enabled && _(u),
+                        s.sub("view.changed", function() {
+                            k(u, p.lang, p.useBrowserLang);
+                        });
+                };
+            C();
+        }.call(
+            t,
+            (function() {
+                return this;
+            })()
+        ));
+    },
+    function(e, t, n) {
+        "use strict";
+        var r = n(7),
+            i = r.langs;
+        e.exports = Object.assign({}, i);
+    },
+    function(e, t, n) {
+        (function(e) {
+            "use strict";
+            var t = n(2),
+                r = t.dom,
+                i = t.awaitLoad,
+                o = n(12),
+                a = n(14),
+                s = e.window,
+                c = Object.assign({ enabled: !1, baseURL: "not-set", idSite: 0 },
+                    a["piwik-analytics"]
+                ),
+                u = function() {
+                    if (c.enabled) {
+                        var e =
+                            ("https:" === s.location.protocol ? "https://" : "http://") +
+                            c.baseURL +
+                            "/",
+                            t = [],
+                            n = null;
+                        r("<script></script>")
+                            .attr("src", e + "piwik.js")
+                            .appTo("body"),
+                            i().then(function() {
+                                if (
+                                    (n =
+                                        s.Piwik && s.Piwik.getTracker(e + "piwik.php", c.idSite))
+                                )
+                                    for (n.enableLinkTracking(); t.length;)
+                                        n.trackPageView(t.shift());
+                            }),
+                            o.sub("location.changed", function(e) {
+                                var r = e
+                                    .getCrumb()
+                                    .map(function(e) {
+                                        return e.label;
+                                    })
+                                    .join(" > ");
+                                n ? n.trackPageView(r) : t.push(r);
+                            });
+                    }
+                };
+            u();
+        }.call(
+            t,
+            (function() {
+                return this;
+            })()
+        ));
+    },
+    function(e, t, n) {
+        "use strict";
+        n(38), n(39), n(40), n(41), n(43);
+    },
+    function(e, t, n) {
+        (function(t) {
+            "use strict";
+            var r = n(2),
+                i = r.each,
+                o = r.isFn,
+                a = r.dom,
+                s = r.includes,
+                c = r.compact,
+                u = n(12),
+                l = n(13),
+                f = n(14),
+                d = n(16),
+                p = t.window,
+                h = Object.assign({ enabled: !0 }, f.preview),
+                g =
+                '<div id="pv-overlay">\n            <div id="pv-container"></div>\n            <div id="pv-spinner"><img class="back"/><img class="spinner" src="' +
+                l.image("spinner") +
+                '"/></div>\n            <div id="pv-prev-area" class="hof"><img src="' +
+                l.image("preview-prev") +
+                '"/></div>\n            <div id="pv-next-area" class="hof"><img src="' +
+                l.image("preview-next") +
+                '"/></div>\n            <div id="pv-bottombar" class="clearfix hof">\n                <ul id="pv-buttons">\n                    <li id="pv-bar-close" class="bar-right bar-button"><img src="' +
+                l.image("preview-close") +
+                '"/></li>\n                    <li id="pv-bar-raw" class="bar-right"><a class="bar-button" target="_blank"><img src="' +
+                l.image("preview-raw") +
+                '"/></a></li>\n                    <li id="pv-bar-fullscreen" class="bar-right bar-button"><img src="' +
+                l.image("preview-fullscreen") +
+                '"/></li>\n                    <li id="pv-bar-next" class="bar-right bar-button"><img src="' +
+                l.image("preview-next") +
+                '"/></li>\n                    <li id="pv-bar-idx" class="bar-right bar-label"></li>\n                    <li id="pv-bar-prev" class="bar-right bar-button"><img src="' +
+                l.image("preview-prev") +
+                '"/></li>\n                </ul>\n            </div>\n        </div>',
+                m = "ext/preview",
+                v = d.get(m) || !1,
+                b = null,
+                w = !1,
+                y = null,
+                x = null,
+                k = function() {
+                    var e = a("#pv-container"),
+                        t = e[0],
+                        n = e.children()[0];
+                    if (t && n) {
+                        var r = t.offsetWidth,
+                            i = t.offsetHeight,
+                            o = n.offsetWidth,
+                            s = n.offsetHeight;
+                        a(n).css({
+                            left: 0.5 * (r - o) + "px",
+                            top: 0.5 * (i - s) + "px",
+                        });
+                    }
+                },
+                _ = function() {
+                    var e = p.document.documentElement,
+                        t = e.clientWidth,
+                        n = e.clientHeight,
+                        r = v ? 0 : 20,
+                        i = v ? 0 : 48;
+                    a("#pv-container").css({
+                            width: t - 2 * r + "px",
+                            height: n - 2 * r - i + "px",
+                            left: r + "px",
+                            top: r + "px",
+                        }),
+                        a("#pv-spinner").css({
+                            left: 0.5 * t + "px",
+                            top: 0.5 * n + "px",
+                        }),
+                        v ?
+                        (a("#pv-overlay").addCls("fullscreen"),
+                            a("#pv-bar-fullscreen")
+                            .find("img")
+                            .attr("src", l.image("preview-no-fullscreen"))) :
+                        (a("#pv-overlay").rmCls("fullscreen"),
+                            a("#pv-bar-fullscreen")
+                            .find("img")
+                            .attr("src", l.image("preview-fullscreen"))),
+                        k(),
+                        o(x && x.adjust) && x.adjust();
+                },
+                C = function(e, t) {
+                    a("#pv-bar-idx")
+                        .text(e + "/" + t)
+                        .show();
+                },
+                S = function(e) {
+                    a("#pv-bar-raw").show().find("a").attr("href", e);
+                },
+                A = function(e) {
+                    a("#pv-buttons .bar-left").rm(),
+                        i(e, function(e) {
+                            a("<li></li>")
+                                .addCls("bar-left")
+                                .addCls("bar-label")
+                                .text(e)
+                                .appTo("#pv-buttons");
+                        });
+                },
+                T = function() {
+                    var e = a("#pv-overlay .hof");
+                    p.clearTimeout(b),
+                        e.show(),
+                        v &&
+                        (b = p.setTimeout(function() {
+                            return e.hide();
+                        }, 2e3));
+                },
+                E = function() {
+                    return x && x.moveIdx(1);
+                },
+                M = function() {
+                    return x && x.moveIdx(-1);
+                },
+                D = function() {
+                    (v = !v), d.put(m, v), T(), _();
+                },
+                P = function(e) {
+                    e.stopPropagation(), e.preventDefault();
+                },
+                z = function(e) {
+                    var t = e.keyCode;
+                    27 === t ?
+                        (P(e), $()) :
+                        8 === t || 37 === t ?
+                        (P(e), M()) :
+                        13 === t || 32 === t || 39 === t ?
+                        (P(e), E()) :
+                        70 === t && (P(e), D());
+                },
+                L = function() {
+                    A([]),
+                        a("#pv-container").clr(),
+                        a("#pv-overlay").show(),
+                        a(p).on("keydown", z),
+                        _();
+                },
+                $ = function() {
+                    A([]),
+                        a("#pv-container").clr(),
+                        a("#pv-overlay").hide(),
+                        a(p).off("keydown", z);
+                },
+                H = function e(t, n, r) {
+                    p.clearTimeout(y);
+                    var i = a("#pv-spinner");
+                    if (!t) return (w = !1), void i.hide();
+                    if (!w && r)
+                        return void(y = p.setTimeout(function() {
+                            return e(!0, n);
+                        }, r));
+                    var o = i.find(".back");
+                    n ? o.attr("src", n).show() : o.hide(), (w = !0), i.show();
+                },
+                O = function e(t, n, r, i) {
+                    var o = Object.assign(Object.create(e.prototype), {
+                        items: t,
+                        load: r,
+                        adjust: i,
+                    });
+                    return o.setIdx(n), o;
+                };
+            O.prototype = {
+                setIdx: function(e) {
+                    var t = this;
+                    (this.idx = (e + this.items.length) % this.items.length),
+                    (this.item = this.items[this.idx]),
+                    C(this.idx + 1, this.items.length),
+                        S(this.item.absHref),
+                        A([this.item.label]);
+                    var n = this.item;
+                    Promise.resolve()
+                        .then(function() {
+                            i(a("#pv-container *"), function(e) {
+                                    "function" == typeof e.unload && e.unload();
+                                }),
+                                a("#pv-container").hide().clr(),
+                                H(!0, n.thumbSquare || n.icon, 200);
+                        })
+                        .then(function() {
+                            return t.load(n);
+                        })
+                        .then(function(e) {
+                            n === t.item &&
+                                (a("#pv-container").clr().app(e).show(), H(!1), _());
+                        });
+                },
+                moveIdx: function(e) {
+                    this.setIdx(this.idx + e);
+                },
+            };
+            var B = function(e, t, n) {
+                    var r = function(r) {
+                        r.$view &&
+                            s(e, r.type) &&
+                            r.$view.find("a").on("click", function(i) {
+                                i.preventDefault();
+                                var o = c(
+                                    a("#items .item").map(function(t) {
+                                        var n = t._item;
+                                        return s(e, n.type) ? n : null;
+                                    })
+                                );
+                                (x = O(o, o.indexOf(r), t, n)), L();
+                            });
+                    };
+                    u.sub("view.changed", function(e) {
+                        return i(e, r);
+                    });
+                },
+                R = function() {
+                    h.enabled &&
+                        (a(g)
+                            .hide()
+                            .appTo("body")
+                            .on("keydown", z)
+                            .on("mousemove", T)
+                            .on("mousedown", T)
+                            .on("click", function(e) {
+                                ("pv-overlay" !== e.target.id &&
+                                    "pv-container" !== e.target.id) ||
+                                $();
+                            })
+                            .on("mousedown", P)
+                            .on("mousemove", P)
+                            .on("keydown", P)
+                            .on("keypress", P),
+                            a("#pv-spinner").hide(),
+                            a("#pv-bar-prev, #pv-prev-area").on("click", M),
+                            a("#pv-bar-next, #pv-next-area").on("click", E),
+                            a("#pv-bar-close").on("click", $),
+                            a("#pv-bar-fullscreen").on("click", D),
+                            a(p).on("resize", _).on("load", _));
+                };
+            (e.exports = {
+                setLabels: A,
+                register: B,
+                get item() {
+                    return x && x.item;
+                },
+            }),
+            R();
+        }.call(
+            t,
+            (function() {
+                return this;
+            })()
+        ));
+    },
+    function(e, t, n) {
+        "use strict";
+        var r = n(2),
+            i = r.dom,
+            o = n(19),
+            a = n(14),
+            s = n(38),
+            c = Object.assign({ enabled: !1, autoplay: !0, types: [] },
+                a["preview-aud"]
+            ),
+            u = '<audio id="pv-content-aud"/>',
+            l = function() {
+                var e = i("#pv-content-aud")[0];
+                e &&
+                    s.setLabels([s.item.label, o.formatDate(1e3 * e.duration, "m:ss")]);
+            },
+            f = function(e) {
+                e.unload = function() {
+                    (e.src = ""), e.load();
+                };
+            },
+            d = function(e) {
+                return new Promise(function(t) {
+                    var n = i(u)
+                        .on("loadedmetadata", function() {
+                            return t(n);
+                        })
+                        .attr("controls", "controls");
+                    c.autoplay && n.attr("autoplay", "autoplay"),
+                        f(n[0]),
+                        n.attr("src", e.absHref);
+                });
+            },
+            p = function() {
+                c.enabled && s.register(c.types, d, l);
+            };
+        p();
+    },
+    function(e, t, n) {
+        "use strict";
+        var r = n(2),
+            i = r.dom,
+            o = n(8),
+            a = n(14),
+            s = n(38),
+            c = Object.assign({ enabled: !1, size: null, types: [] },
+                a["preview-img"]
+            ),
+            u = '<img id="pv-content-img"/>',
+            l = function() {
+                var e = i("#pv-content-img")[0];
+                if (e) {
+                    var t = e.offsetWidth,
+                        n = [s.item.label];
+                    if (!c.size) {
+                        var r = e.naturalWidth,
+                            o = e.naturalHeight;
+                        n.push(String(r) + "x" + String(o)),
+                            n.push(String(((100 * t) / r).toFixed(0)) + "%");
+                    }
+                    s.setLabels(n);
+                }
+            },
+            f = function(e) {
+                return o
+                    .request({
+                        action: "get",
+                        thumbs: [{ type: "img", href: e, width: c.size, height: 0 }],
+                    })
+                    .then(function(e) {
+                        return e && e.thumbs && e.thumbs[0] ? e.thumbs[0] : null;
+                    });
+            },
+            d = function(e) {
+                return Promise.resolve(e.absHref)
+                    .then(function(e) {
+                        return c.size ? f(e) : e;
+                    })
+                    .then(function(e) {
+                        return new Promise(function(t) {
+                            var n = i(u)
+                                .on("load", function() {
+                                    return t(n);
+                                })
+                                .attr("src", e);
+                        });
+                    });
+            },
+            p = function() {
+                c.enabled && s.register(c.types, d, l);
+            };
+        p();
+    },
+    function(e, t, n) {
+        (function(e) {
+            "use strict";
+            var t = n(42),
+                r = n(28),
+                i = n(2),
+                o = i.keys,
+                a = i.dom,
+                s = n(14),
+                c = n(38),
+                u = e.window,
+                l = u.XMLHttpRequest,
+                f = Object.assign({ enabled: !1, styles: {} }, s["preview-txt"]),
+                d = '<pre id="pv-content-txt"></pre>',
+                p = '<div id="pv-content-txt"></div>',
+                h = function() {
+                    var e = a("#pv-content-txt")[0];
+                    if (e) {
+                        var t = a("#pv-container")[0];
+                        (e.style.height = t.offsetHeight + "px"),
+                        c.setLabels([c.item.label, c.item.size + " bytes"]);
+                    }
+                },
+                g = function(e) {
+                    return new Promise(function(t, n) {
+                        var r = new l(),
+                            i = function() {
+                                if (r.readyState === l.DONE)
+                                    try {
+                                        t(r.responseText || "");
+                                    } catch (e) {
+                                        n(String(e));
+                                    }
+                            };
+                        r.open("GET", e, !0), (r.onreadystatechange = i), r.send();
+                    });
+                },
+                m = function(e) {
+                    return g(e.absHref)
+                        .catch(function(e) {
+                            return "[request failed] " + e;
+                        })
+                        .then(function(n) {
+                            var i = f.styles[e.type];
+                            if (1 === i) return a(d).text(n);
+                            if (2 === i) return a(p).html(r(n));
+                            if (3 === i) {
+                                var o = a("<code></code>").text(n);
+                                return (
+                                    u.setTimeout(
+                                        function() {
+                                            t.el(o[0]);
+                                        },
+                                        n.length < 2e4 ? 0 : 500
+                                    ),
+                                    a(d).app(o)
+                                );
+                            }
+                            return a(p).text(n);
+                        });
+                },
+                v = function() {
+                    f.enabled && c.register(o(f.styles), m, h);
+                };
+            v();
+        }.call(
+            t,
+            (function() {
+                return this;
+            })()
+        ));
+    },
+    function(e, t, n) {
+        !(function(t, n) {
+            e.exports = n();
+        })(this, function() {
+            var e = ".lolight",
+                t = "ll-",
+                n = "_nam#2196f3}_num#ec407a}_str#43a047}_rex#ef6c00}_pct#666}_key#555;font-weight:bold}_com#aaa;font-style:italic}"
+                .replace(/_/g, "." + t)
+                .replace(/#/g, "{color:#"),
+                r = /^(a(bstract|lias|nd|rguments|rray|s(m|sert)?|uto)|b(ase|egin|ool(ean)?|reak|yte)|c(ase|atch|har|hecked|lass|lone|ompl|onst|ontinue)|de(bugger|cimal|clare|f(ault|er)?|init|l(egate|ete)?)|do|double|e(cho|ls?if|lse(if)?|nd|nsure|num|vent|x(cept|ec|p(licit|ort)|te(nds|nsion|rn)))|f(allthrough|alse|inal(ly)?|ixed|loat|or(each)?|riend|rom|unc(tion)?)|global|goto|guard|i(f|mp(lements|licit|ort)|n(it|clude(_once)?|line|out|stanceof|t(erface|ernal)?)?|s)|l(ambda|et|ock|ong)|m(odule|utable)|NaN|n(amespace|ative|ext|ew|il|ot|ull)|o(bject|perator|r|ut|verride)|p(ackage|arams|rivate|rotected|rotocol|ublic)|r(aise|e(adonly|do|f|gister|peat|quire(_once)?|scue|strict|try|turn))|s(byte|ealed|elf|hort|igned|izeof|tatic|tring|truct|ubscript|uper|ynchronized|witch)|t(emplate|hen|his|hrows?|ransient|rue|ry|ype(alias|def|id|name|of))|u(n(checked|def(ined)?|ion|less|signed|til)|se|sing)|v(ar|irtual|oid|olatile)|w(char_t|hen|here|hile|ith)|xor|yield)$/,
+                i = "com",
+                o = "key",
+                a = "nam",
+                s = "num",
+                c = "pct",
+                u = "rex",
+                l = "spc",
+                f = "str",
+                d = "unk",
+                p = [
+                    [s, /#([0-9a-f]{6}|[0-9a-f]{3})\b/],
+                    [i, /(\/\/|#).*?(?=\n|$)/],
+                    [i, /\/\*[\s\S]*?\*\//],
+                    [i, /<!--[\s\S]*?-->/],
+                    [u, /\/(\\\/|[^\n])*?\//],
+                    [f, /(['"`])(\\\1|[\s\S])*?\1/],
+                    [s, /[+-]?([0-9]*\.?[0-9]+|[0-9]+\.?[0-9]*)([eE][+-]?[0-9]+)?/],
+                    [c, /[\\.,:;+\-*\/=<>()[\]{}|?!&@~]/],
+                    [l, /\s+/],
+                    [a, /[\w$]+/],
+                    [d, /./],
+                ],
+                h = function(e) {
+                    if ("string" != typeof e) throw new Error("tok: no string");
+                    for (var t = [], n = p.length, i = !1; e;)
+                        for (var c = 0; c < n; c += 1) {
+                            var f = p[c][1].exec(e);
+                            if (f && 0 === f.index) {
+                                var d = p[c][0];
+                                if (d !== u || !i) {
+                                    var h = f[0];
+                                    d === a && r.test(h) && (d = o),
+                                        d === l ?
+                                        h.indexOf("\n") >= 0 && (i = !1) :
+                                        (i = d === s || d === a),
+                                        (e = e.slice(h.length)),
+                                        t.push([d, h]);
+                                    break;
+                                }
+                            }
+                        }
+                    return t;
+                },
+                g = function(e, t) {
+                    if ("undefined" != typeof document) t(document);
+                    else if (e) throw new Error("no doc");
+                },
+                m = function(e) {
+                    g(!0, function(n) {
+                        var r = h(e.textContent);
+                        (e.innerHTML = ""),
+                        r.forEach(function(r) {
+                            var i = n.createElement("span");
+                            (i.className = t + r[0]),
+                            (i.textContent = r[1]),
+                            e.appendChild(i);
+                        });
+                    });
+                },
+                v = function(t) {
+                    g(!0, function(n) {
+                        [].forEach.call(n.querySelectorAll(t || e), function(e) {
+                            m(e);
+                        });
+                    });
+                };
+            return (
+                g(!1, function(e) {
+                    var t = e.querySelector("head"),
+                        r = e.createElement("style");
+                    (r.textContent = n),
+                    t.insertBefore(r, t.firstChild),
+                        /^(i|c|loade)/.test(e.readyState) ?
+                        v() :
+                        e.addEventListener("DOMContentLoaded", function() {
+                            v();
+                        });
+                }),
+                (v.tok = h),
+                (v.el = m),
+                v
+            );
+        });
+    },
+    function(e, t, n) {
+        "use strict";
+        var r = n(2),
+            i = r.dom,
+            o = n(14),
+            a = n(38),
+            s = Object.assign({ enabled: !1, autoplay: !0, types: [] },
+                o["preview-vid"]
+            ),
+            c = '<video id="pv-content-vid"/>',
+            u = function() {
+                var e = i("#pv-content-vid")[0];
+                if (e) {
+                    var t = e.offsetWidth,
+                        n = e.videoWidth,
+                        r = e.videoHeight;
+                    a.setLabels([
+                        a.item.label,
+                        String(n) + "x" + String(r),
+                        String(((100 * t) / n).toFixed(0)) + "%",
+                    ]);
+                }
+            },
+            l = function(e) {
+                e.unload = function() {
+                    (e.src = ""), e.load();
+                };
+            },
+            f = function(e) {
+                return new Promise(function(t) {
+                    var n = i(c)
+                        .on("loadedmetadata", function() {
+                            return t(n);
+                        })
+                        .attr("controls", "controls");
+                    s.autoplay && n.attr("autoplay", "autoplay"),
+                        l(n[0]),
+                        n.attr("src", e.absHref);
+                });
+            },
+            d = function() {
+                s.enabled && a.register(s.types, f, u);
+            };
+        d();
+    },
+    function(e, t, n) {
+        "use strict";
+        var r = n(2),
+            i = r.map,
+            o = r.debounce,
+            a = r.parsePattern,
+            s = r.dom,
+            c = n(8),
+            u = n(12),
+            l = n(20),
+            f = n(13),
+            d = n(14),
+            p = n(22),
+            h = n(18),
+            g = Object.assign({ enabled: !1, advanced: !1, debounceTime: 300, ignorecase: !0 },
+                d.search
+            ),
+            m =
+            '<div id="search" class="tool">\n            <img src="' +
+            f.image("search") +
+            '" alt="search"/>\n            <input class="l10n_ph-search" type="text" value=""/>\n        </div>',
+            v = !1,
+            b = "",
+            w = void 0,
+            y = void 0,
+            x = function() {
+                var e =
+                    arguments.length > 0 && void 0 !== arguments[0] ? arguments[0] : "";
+                if (e !== b) {
+                    if (((b = e), !e)) return void h.setLocation();
+                    w.addCls("pending"),
+                        c
+                        .request({
+                            action: "get",
+                            search: {
+                                href: l.getAbsHref(),
+                                pattern: e,
+                                ignorecase: g.ignorecase,
+                            },
+                        })
+                        .then(function(e) {
+                            w.rmCls("pending"),
+                                h.setHint("noMatch"),
+                                h.setItems(
+                                    i(e.search, function(e) {
+                                        return p.get(e);
+                                    })
+                                );
+                        });
+                }
+            },
+            k = function() {
+                v
+                    ?
+                    (w.addCls("active"), y[0].focus(), x(a(y.val(), g.advanced))) :
+                    (x(), w.rmCls("active"));
+            },
+            _ = function() {
+                (v = !v), k();
+            },
+            C = function() {
+                (v = !1), y.val(""), k();
+            },
+            S = function() {
+                g.enabled &&
+                    ((w = s(m).appTo("#toolbar")),
+                        (y = w.find("input")),
+                        w.find("img").on("click", _),
+                        y.on("keyup", o(k, g.debounceTime)),
+                        u.sub("location.changed", C));
+            };
+        S();
+    },
+    function(e, t, n) {
+        (function(e) {
+            "use strict";
+            var t = n(2),
+                r = t.each,
+                i = t.dom,
+                o = n(12),
+                a = n(13),
+                s = n(14),
+                c = e.window.document,
+                u = Object.assign({ enabled: !1, clickndrag: !1, checkboxes: !1 },
+                    s.select
+                ),
+                l =
+                '<span class="selector">\n            <img src="' +
+                a.image("selected") +
+                '" alt="selected"/>\n        </span>',
+                f = i(c),
+                d = i("html"),
+                p = i('<div id="selection-rect"></div>'),
+                h = Math.max,
+                g = Math.min,
+                m = Math.abs,
+                v = 0,
+                b = 0,
+                w = function() {
+                    var e = i("#items .item.selected").map(function(e) {
+                        return e._item;
+                    });
+                    o.pub("selection", e);
+                },
+                y = function(e) {
+                    var t = i(e);
+                    if (!t.length || t.isHidden()) return null;
+                    var n = t[0].getBoundingClientRect();
+                    return { l: n.left, t: n.top, r: n.right, b: n.bottom };
+                },
+                x = function(e, t) {
+                    return (!!e &&
+                        !!t &&
+                        e.l === t.l &&
+                        e.t === t.t &&
+                        e.r === t.r &&
+                        e.b === t.b
+                    );
+                },
+                k = function(e) {
+                    var t = e[0];
+                    x(y(t), t && t._rect) ||
+                        e.each(function(e) {
+                            e._rect = y(e);
+                        });
+                },
+                _ = function(e, t) {
+                    if (!e || !t) return !1;
+                    var n = h(e.l, t.l),
+                        r = g(e.r, t.r),
+                        i = h(e.t, t.t),
+                        o = g(e.b, t.b);
+                    return n <= r && i <= o;
+                },
+                C = function(e) {
+                    var t = i("#content")[0],
+                        n = y(t),
+                        r = e.pageX - n.l + t.scrollLeft,
+                        o = e.pageY - n.t + t.scrollTop;
+                    return { x: r, y: o };
+                },
+                S = function(e) {
+                    var t = C(e),
+                        n = t.x,
+                        r = t.y,
+                        o = g(v, n),
+                        a = g(b, r),
+                        s = m(v - n),
+                        c = m(b - r),
+                        u = e.ctrlKey || e.metaKey;
+                    if (!(!u && s < 4 && c < 4)) {
+                        u || i("#items .item").rmCls("selected"),
+                            d.addCls("drag-select"),
+                            p
+                            .show()
+                            .css({
+                                left: o + "px",
+                                top: a + "px",
+                                width: s + "px",
+                                height: c + "px",
+                            });
+                        var l = y(p),
+                            f = i("#items .item:not(.folder-parent)");
+                        k(f),
+                            f.rmCls("selecting").each(function(e) {
+                                _(l, e._rect) && i(e).addCls("selecting");
+                            });
+                    }
+                },
+                A = function e(t) {
+                    f.off("mousemove", S).off("mouseup", e),
+                        S(t),
+                        i("#items .item.selecting.selected")
+                        .rmCls("selecting")
+                        .rmCls("selected"),
+                        i("#items .item.selecting").rmCls("selecting").addCls("selected"),
+                        w(),
+                        d.rmCls("drag-select"),
+                        p.hide(),
+                        t.stopPropagation(),
+                        t.preventDefault();
+                },
+                T = function(e) {
+                    if (!(
+                            0 !== e.button || e.offsetX >= i("#content")[0].offsetWidth - 16
+                        )) {
+                        var t = C(e),
+                            n = t.x,
+                            r = t.y;
+                        (v = n),
+                        (b = r),
+                        f.on("mousemove", S).on("mouseup", A),
+                            S(e),
+                            e.preventDefault();
+                    }
+                },
+                E = function(e) {
+                    for (; !e._item && e.parentNode;) e = e.parentNode;
+                    return e._item;
+                },
+                M = function(e) {
+                    E(e.target).$view.tglCls("selected"),
+                        w(),
+                        e.stopPropagation(),
+                        e.preventDefault();
+                },
+                D = function(e) {
+                    e.$view &&
+                        !e.isCurrentParentFolder() &&
+                        i(l).on("click", M).appTo(e.$view.find("a"));
+                },
+                P = function(e, t) {
+                    u.checkboxes && r(e, D),
+                        r(t, function(e) {
+                            e.$view && e.$view.rmCls("selected");
+                        }),
+                        w();
+                },
+                z = function() {
+                    u.enabled &&
+                        (u.clickndrag || u.checkboxes) &&
+                        (o.sub("view.changed", P),
+                            u.clickndrag &&
+                            (p.hide().appTo("#content"),
+                                i("#content")
+                                .on("mousedown", T)
+                                .on("drag", function(e) {
+                                    return e.preventDefault();
+                                })
+                                .on("dragstart", function(e) {
+                                    return e.preventDefault();
+                                })));
+                };
+            z();
+        }.call(
+            t,
+            (function() {
+                return this;
+            })()
+        ));
+    },
+    function(e, t, n) {
+        "use strict";
+        var r = n(2),
+            i = r.each,
+            o = r.toArray,
+            a = r.dom,
+            s = r.cmp,
+            c = r.naturalCmp,
+            u = n(12),
+            l = n(13),
+            f = n(14),
+            d = n(16),
+            p = Object.assign({
+                    enabled: !1,
+                    column: 0,
+                    reverse: !1,
+                    ignorecase: !0,
+                    natural: !1,
+                    folders: 0,
+                },
+                f.sort
+            ),
+            h = "ext/sort",
+            g =
+            '<img src="' + l.image("sort") + '" class="sort" alt="sort order"/>',
+            m = function(e) {
+                return e.isFolder() ? p.folders : 1;
+            },
+            v = { 0: "label", 1: "time", 2: "size" },
+            b = { 0: "label", 1: "date", 2: "size" },
+            w = function(e, t, n, r) {
+                return function(i, o) {
+                    var a = i._item,
+                        u = o._item,
+                        l = m(a) - m(u);
+                    if (0 !== l) return l;
+                    var f = a[e],
+                        d = u[e];
+                    return (
+                        (isNaN(f) || isNaN(d)) &&
+                        ((f = String(f)),
+                            (d = String(d)),
+                            n && ((f = f.toLowerCase()), (d = d.toLowerCase()))),
+                        (l = r ? c(f, d) : s(f, d)),
+                        t ? -l : l
+                    );
+                };
+            },
+            y = function(e, t) {
+                var n = a("#items li.header a"),
+                    r = a("#items li.header a." + b[e]),
+                    i = w(v[e], t, p.ignorecase, p.natural);
+                d.put(h, { column: e, reverse: t }),
+                    n.rmCls("ascending").rmCls("descending"),
+                    r.addCls(t ? "descending" : "ascending"),
+                    a(o(a("#items .item:not(.folder-parent)")).sort(i)).appTo("#items");
+            },
+            x = function() {
+                var e = d.get(h),
+                    t = (e && e.column) || p.column,
+                    n = (e && e.reverse) || p.reverse;
+                y(t, n);
+            },
+            k = function() {
+                var e = a("#items li.header");
+                i(b, function(t, n) {
+                    var r = "0" === n ? "app" : "pre";
+                    e.find("a." + t)[r](g)
+                        .on("click", function(e) {
+                            y(n, a(e.currentTarget).hasCls("ascending")),
+                                e.preventDefault();
+                        });
+                });
+            },
+            _ = function() {
+                p.enabled && (k(), u.sub("view.changed", x));
+            };
+        _();
+    },
+    function(e, t, n) {
+        "use strict";
+        var r = n(2),
+            i = r.each,
+            o = r.map,
+            a = r.includes,
+            s = n(8),
+            c = n(12),
+            u = n(14),
+            l = Object.assign({
+                    enabled: !1,
+                    img: ["img-bmp", "img-gif", "img-ico", "img-jpg", "img-png"],
+                    mov: [
+                        "vid-avi",
+                        "vid-flv",
+                        "vid-mkv",
+                        "vid-mov",
+                        "vid-mp4",
+                        "vid-mpg",
+                        "vid-webm",
+                    ],
+                    doc: ["x-pdf", "x-ps"],
+                    delay: 1,
+                    size: 100,
+                    exif: !1,
+                    chunksize: 20,
+                },
+                u.thumbnails
+            ),
+            f = 4 / 3,
+            d = function(e, t) {
+                var n = null;
+                if (a(l.img, t.type)) n = "img";
+                else if (a(l.mov, t.type)) n = "mov";
+                else {
+                    if (!a(l.doc, t.type)) return;
+                    n = "doc";
+                }
+                t.thumbSquare ?
+                    t.$view
+                    .find(".icon.square img")
+                    .addCls("thumb")
+                    .attr("src", t.thumbSquare) :
+                    e.push({
+                        type: n,
+                        href: t.absHref,
+                        ratio: 1,
+                        callback: function(e) {
+                            e &&
+                                t.$view &&
+                                ((t.thumbSquare = e),
+                                    t.$view
+                                    .find(".icon.square img")
+                                    .addCls("thumb")
+                                    .attr("src", e));
+                        },
+                    }),
+                    t.thumbRational ?
+                    t.$view
+                    .find(".icon.landscape img")
+                    .addCls("thumb")
+                    .attr("src", t.thumbRational) :
+                    e.push({
+                        type: n,
+                        href: t.absHref,
+                        ratio: f,
+                        callback: function(e) {
+                            e &&
+                                t.$view &&
+                                ((t.thumbRational = e),
+                                    t.$view
+                                    .find(".icon.landscape img")
+                                    .addCls("thumb")
+                                    .attr("src", e));
+                        },
+                    });
+            },
+            p = function(e) {
+                var t = o(e, function(e) {
+                    return {
+                        type: e.type,
+                        href: e.href,
+                        width: Math.round(l.size * e.ratio),
+                        height: l.size,
+                    };
+                });
+                return s.request({ action: "get", thumbs: t }).then(function(t) {
+                    i(e, function(e, n) {
+                        e.callback(t && t.thumbs ? t.thumbs[n] : null);
+                    });
+                });
+            },
+            h = function(e) {
+                for (
+                    var t = e.length,
+                        n = l.chunksize,
+                        r = Promise.resolve(),
+                        i = function(t) {
+                            r = r.then(function() {
+                                return p(e.slice(t, t + n));
+                            });
+                        },
+                        o = 0; o < t; o += n
+                )
+                    i(o);
+            },
+            g = function(e) {
+                var t = [];
+                i(e, function(e) {
+                        return d(t, e);
+                    }),
+                    h(t);
+            },
+            m = function(e) {
+                setTimeout(function() {
+                    return g(e);
+                }, l.delay);
+            },
+            v = function() {
+                l.enabled && c.sub("view.changed", m);
+            };
+        v();
+    },
+    function(e, t, n) {
+        (function(e) {
+            "use strict";
+            var t = n(12),
+                r = n(14),
+                i = e.window.document,
+                o = Object.assign({ enabled: !1 }, r.title),
+                a = function(e) {
+                    var t = e.getCrumb().map(function(e) {
+                            return e.label;
+                        }),
+                        n = t.join(" > ");
+                    t.length > 1 && (n = t[t.length - 1] + " - " + n), (i.title = n);
+                },
+                s = function() {
+                    o.enabled && t.sub("location.changed", a);
+                };
+            s();
+        }.call(
+            t,
+            (function() {
+                return this;
+            })()
+        ));
+    },
+    function(e, t, n) {
+        "use strict";
+        var r = n(2),
+            i = r.each,
+            o = r.dom,
+            a = r.cmp,
+            s = r.naturalCmp,
+            c = n(12),
+            u = n(20),
+            l = n(13),
+            f = n(14),
+            d = n(16),
+            p = Object.assign({
+                    enabled: !1,
+                    show: !0,
+                    maxSubfolders: 50,
+                    naturalSort: !1,
+                    ignorecase: !0,
+                },
+                f.tree
+            ),
+            h =
+            '<div class="item folder">\n            <span class="indicator">\n                <img src="' +
+            l.image("tree-indicator") +
+            '"/>\n            </span>\n            <a>\n                <span class="icon"><img src="' +
+            l.icon("folder") +
+            '"/></span>\n                <span class="label"></span>\n            </a>\n        </span>',
+            g =
+            '<div class="block">\n            <h1 class="l10n-tree">Tree</h1>\n            <div id="view-tree" class="button view">\n                <img src="' +
+            l.image("tree-toggle") +
+            '" alt="view-tree"/>\n            </div>\n        </div>',
+            m = "ext/tree",
+            v = function(e) {
+                for (; !e._item && e.parentNode;) e = e.parentNode;
+                return e._item;
+            },
+            b = function(e) {
+                var t = v(e.target);
+                "unknown" === t._treeState ?
+                    t.fetchContent().then(function() {
+                        (t._treeState = "open"), y(t);
+                    }) :
+                    "open" === t._treeState ?
+                    ((t._treeState = "closed"),
+                        t._$tree.rmCls("open").addCls("closed")) :
+                    "closed" === t._treeState &&
+                    ((t._treeState = "open"),
+                        t._$tree.rmCls("closed").addCls("open"));
+            },
+            w = function(e, t) {
+                var n = e.label,
+                    r = t.label;
+                return (
+                    p.ignorecase && ((n = n.toLowerCase()), (r = r.toLowerCase())),
+                    p.naturalSort ? s(n, r) : a(n, r)
+                );
+            },
+            y = function e(t) {
+                var n = t.getSubfolders(),
+                    r = n.length,
+                    a = p.maxSubfolders,
+                    s = o(h);
+                if (
+                    (s.find(".indicator").on("click", b),
+                        s.find(".label").text(t.label),
+                        u.setLink(s.find("a"), t),
+                        t.isCurrentFolder() && s.addCls("active"),
+                        t.isManaged ||
+                        s.find(".icon img").attr("src", l.icon("folder-page")),
+                        (t._treeState = t._treeState || "none"),
+                        t.isManaged && !t.isContentFetched ?
+                        (t._treeState = "unknown") :
+                        r || (t._treeState = "none"),
+                        s.addCls(t._treeState),
+                        r)
+                ) {
+                    var c = o('<div class="content"></div>').appTo(s);
+                    n.sort(w),
+                        i(n.slice(0, a), function(t) {
+                            return c.app(e(t));
+                        }),
+                        r > a &&
+                        c.app(
+                            '<div class="summary">… ' + (r - a) + " more subfolders</div>"
+                        );
+                }
+                return (
+                    t._$tree && t._$tree.rpl(s), (t._$tree = s), (s[0]._item = t), s
+                );
+            },
+            x = function e(t) {
+                return (
+                    (t._treeState = "open"),
+                    t.fetchContent().then(function() {
+                        return t.parent ? e(t.parent) : t;
+                    })
+                );
+            },
+            k = function() {
+                d.get(m) ?
+                    (o("#view-tree").addCls("active"), o("#tree").show()) :
+                    (o("#view-tree").rmCls("active"), o("#tree").hide());
+            },
+            _ = function(e) {
+                x(e).then(function(e) {
+                    o("#tree").clr().app(y(e)), k();
+                });
+            },
+            C = function() {
+                p.enabled &&
+                    (o('<div id="tree"></div>').hide().appTo("#mainrow"),
+                        o(g)
+                        .appTo("#sidebar")
+                        .find("#view-tree")
+                        .on("click", function(e) {
+                            d.put(m, !d.get(m)), k(), c.pub("resize"), e.preventDefault();
+                        }),
+                        "boolean" != typeof d.get(m) && d.put(m, p.show),
+                        k(),
+                        c.sub("location.changed", _));
+            };
+        C();
+    },
+    function(e, t, n) {
+        (function(e) {
+            "use strict";
+            var t = n(2),
+                r = t.dom,
+                i = n(7),
+                o = n(8),
+                a = n(13),
+                s = '<ul id="tests"></ul>',
+                c =
+                '<li class="test">\n            <span class="label"></span>\n            <span class="result"></span>\n            <div class="info"></div>\n        </li>',
+                u =
+                '<div id="login-wrapper">\n            <input id="pass" type="password" placeholder="password"/>\n            <span id="login">login</span>\n            <span id="logout">logout</span>\n            <div id="hint">\n                The preset password is the empty string, just click login.\n                Change it in \'_h5ai/private/conf/options.json\'.\n            </div>\n        </div>',
+                l =
+                '<div id="support">\n            Show your support with a donation!\n            <div class="paypal">\n                <form action="https://www.paypal.com/cgi-bin/webscr" method="post" target="_blank">\n                    <input type="hidden" name="cmd" value="_s-xclick"/>\n                    <input type="hidden" name="hosted_button_id" value="8WSPKWT7YBTSQ"/>\n                    <input type="image" src="' +
+                a.image("paypal") +
+                '" name="submit" alt="PayPal"/>\n                </form>\n            </div>\n        </div>',
+                f = i.setup,
+                d = function(e, t, n, i) {
+                    var o = r(c).appTo("#tests");
+                    o.find(".label").text(e),
+                        o
+                        .find(".result")
+                        .addCls(n ? "passed" : "failed")
+                        .text(i ? i : n ? "yes" : "no"),
+                        o.find(".info").html(t);
+                },
+                p = function() {
+                    f.AS_ADMIN &&
+                        (r(s).appTo("#content"),
+                            d(
+                                "h5ai version",
+                                "Only green if this is an official h5ai release",
+                                /^\d+\.\d+\.\d+$/.test(f.VERSION),
+                                f.VERSION
+                            ),
+                            d(
+                                "Index file found",
+                                "Add <code>" + f.INDEX_HREF + "</code> to your index file list",
+                                f.INDEX_HREF
+                            ),
+                            d(
+                                "Options parsable",
+                                "File <code>options.json</code> is readable and syntax is correct",
+                                null !== i.options
+                            ),
+                            d(
+                                "Types parsable",
+                                "File <code>types.json</code> is readable and syntax is correct",
+                                null !== i.types
+                            ),
+                            d(
+                                "Server software",
+                                "Server is one of apache, lighttpd, nginx or cherokee",
+                                f.HAS_SERVER,
+                                f.SERVER_NAME + " " + f.SERVER_VERSION
+                            ),
+                            d(
+                                "PHP version",
+                                "PHP version >= " + f.MIN_PHP_VERSION, !0,
+                                f.PHP_VERSION
+                            ),
+                            d(
+                                "PHP arch",
+                                "64-bit required to correctly display file/folder sizes > ~2GB",
+                                "64-bit" === f.PHP_ARCH,
+                                f.PHP_ARCH
+                            ),
+                            d(
+                                "Public Cache directory",
+                                "Web server has write access",
+                                f.HAS_WRITABLE_CACHE_PUB
+                            ),
+                            d(
+                                "Private Cache directory",
+                                "Web server has write access",
+                                f.HAS_WRITABLE_CACHE_PRV
+                            ),
+                            d(
+                                "Image thumbs",
+                                "PHP GD extension with JPEG support available",
+                                f.HAS_PHP_JPEG
+                            ),
+                            d(
+                                "Use EXIF thumbs",
+                                "PHP EXIF extension available",
+                                f.HAS_PHP_EXIF
+                            ),
+                            d(
+                                "Movie thumbs",
+                                "Command line program <code>avconv</code> or <code>ffmpeg</code> available",
+                                f.HAS_CMD_AVCONV || f.HAS_CMD_FFMPEG
+                            ),
+                            d(
+                                "PDF thumbs",
+                                "Command line program <code>convert</code> or <code>gm</code> available",
+                                f.HAS_CMD_CONVERT || f.HAS_CMD_GM
+                            ),
+                            d(
+                                "Shell tar",
+                                "Command line program <code>tar</code> available",
+                                f.HAS_CMD_TAR
+                            ),
+                            d(
+                                "Shell zip",
+                                "Command line program <code>zip</code> available",
+                                f.HAS_CMD_ZIP
+                            ),
+                            d(
+                                "Shell du",
+                                "Command line program <code>du</code> available",
+                                f.HAS_CMD_DU
+                            ));
+                },
+                h = function() {
+                    e.window.location.reload();
+                },
+                g = function() {
+                    o.request({ action: "login", pass: r("#pass").val() }).then(h);
+                },
+                m = function() {
+                    o.request({ action: "logout" }).then(h);
+                },
+                v = function(e) {
+                    13 === e.which && g();
+                },
+                b = function() {
+                    r(l).appTo("#content");
+                },
+                w = function() {
+                    r(u).appTo("#content"),
+                        f.AS_ADMIN ?
+                        (r("#pass").rm(),
+                            r("#login").rm(),
+                            r("#logout").on("click", m)) :
+                        (r("#pass").on("keydown", v)[0].focus(),
+                            r("#login").on("click", g),
+                            r("#logout").rm()),
+                        i.options.hasCustomPasshash && r("#hint").rm();
+                },
+                y = function() {
+                    b(), w(), p();
+                };
+            y();
+        }.call(
+            t,
+            (function() {
+                return this;
+            })()
+        ));
+    },
+]);
\ No newline at end of file
-- 
2.23.0
                    
                  
                  
                          
                            
                            2
                            
                          
                          
                            
                            3
                            
                          
                          
                            
    
                          
                        
                    
                    
                        We need to create the access_key in the dir which we want to upload
file, it is hard to handle that.
So we save the upload_dirs in redis, then we can set the field in
scheduler, the result-webdav container will read the value by job id and check the upload dir.
Signed-off-by: Cao Xueliang <caoxl78320(a)163.com>
---
 src/lib/job.cr                 | 23 ++++++++++++++---------
 src/scheduler/close_job.cr     |  6 ------
 src/scheduler/find_job_boot.cr | 10 +++++-----
 3 files changed, 19 insertions(+), 20 deletions(-)
diff --git a/src/lib/job.cr b/src/lib/job.cr
index 0083a7d..083a233 100644
--- a/src/lib/job.cr
+++ b/src/lib/job.cr
@@ -88,8 +88,7 @@ class Job
     pp_params
     submit_date
     result_root
-    access_key
-    access_key_file
+    upload_dirs
     lkp_initrd_user
     user_lkp_src
     kernel_uri
@@ -243,15 +242,21 @@ class Job
   def set_result_root
     update_tbox_group_from_testbox # id must exists, need update tbox_group
     self["result_root"] = File.join("/result/#{suite}/#{submit_date}/#{tbox_group}/#{rootfs}", "#{pp_params}", "#{id}")
-
-    # access_key has information based on "result_root"
-    #  so when set result_root, we need redo set_ to update it
-    set_access_key()
+    set_upload_dirs()
   end
 
-  private def set_access_key
-    self["access_key"] = "#{Random::Secure.hex(10)}-#{id}"
-    self["access_key_file"] = File.join("/srv/", "#{result_root}", ".#{access_key}")
+  def set_upload_dirs
+    if @hash["cci-makepkg"]?
+      package_dir = ",/initrd/pkg"
+    elsif @hash["cci-depends"]?
+      package_dir = ",/initrd/deps"
+    elsif @hash["build-pkg"]?
+      package_dir = ",/initrd/build-pkg"
+    else
+      package_dir = ""
+    end
+
+    self["upload_dirs"] = "#{result_root}#{package_dir}"
   end
 
   private def set_result_service
diff --git a/src/scheduler/close_job.cr b/src/scheduler/close_job.cr
index 579c2c0..d8f80d7 100644
--- a/src/scheduler/close_job.cr
+++ b/src/scheduler/close_job.cr
@@ -8,8 +8,6 @@ class Sched
 
     job = @redis.get_job(job_id)
 
-    delete_access_key_file(job) if job
-
     response = @es.set_job_content(job)
     if response["_id"] == nil
       # es update fail, raise exception
@@ -27,8 +25,4 @@ class Sched
 
     @log.info(%({"job_id": "#{job_id}", "job_state": "complete"}))
   end
-
-  def delete_access_key_file(job : Job)
-    File.delete(job.access_key_file) if File.exists?(job.access_key_file)
-  end
 end
diff --git a/src/scheduler/find_job_boot.cr b/src/scheduler/find_job_boot.cr
index 5a11523..6623a5e 100644
--- a/src/scheduler/find_job_boot.cr
+++ b/src/scheduler/find_job_boot.cr
@@ -141,10 +141,6 @@ class Sched
     return response
   end
 
-  def touch_access_key_file(job : Job)
-    FileUtils.touch(job.access_key_file)
-  end
-
   private def get_boot_ipxe(job : Job)
     response = "#!ipxe\n\n"
     response += Array(String).from_json(job.initrds_uri).join("\n") + "\n"
@@ -155,8 +151,12 @@ class Sched
     return response
   end
 
+  def set_id2upload_dirs(job)
+    @redis.hash_set("sched/id2upload_dirs", job.id, job.upload_dirs)
+  end
+
   def boot_content(job : Job | Nil, boot_type : String)
-    touch_access_key_file(job) if job
+    set_id2upload_dirs(job) if job
 
     case boot_type
     when "ipxe"
-- 
2.23.0
                    
                  
                  
                          
                            
                            1
                            
                          
                          
                            
                            0
                            
                          
                          
                            
    
                          
                        
                    
                        
                            
                                
                            
                             [PATCH v1 compass-ci] lib/mail_bisect_result: bisect email use new content
                        
                        
by Cao Xueliang 14 Dec '20
                    by Cao Xueliang 14 Dec '20
14 Dec '20
                    
                        1. Add software name and first error message in subject
2. Add gcc version, error messages and job url in mail body
Signed-off-by: Cao Xueliang <caoxl78320(a)163.com>
---
 lib/git_bisect.rb         |  2 +-
 lib/mail_bisect_result.rb | 20 +++++++++-----------
 2 files changed, 10 insertions(+), 12 deletions(-)
diff --git a/lib/git_bisect.rb b/lib/git_bisect.rb
index 189edb8..97ad467 100644
--- a/lib/git_bisect.rb
+++ b/lib/git_bisect.rb
@@ -95,7 +95,7 @@ class GitBisect
     error_messages = ErrorMessages.new(@build_pkg_dir).obtain_error_messages_by_errorid(@error_id)
 
     return Hash['repo' => @upstream_repo, 'commit' => first_bad_commit,
-                'error_messages' => error_messages.join("\n")]
+                'error_messages' => error_messages]
   end
 
   # first search the good commit in db
diff --git a/lib/mail_bisect_result.rb b/lib/mail_bisect_result.rb
index 5a208c4..c0a2731 100644
--- a/lib/mail_bisect_result.rb
+++ b/lib/mail_bisect_result.rb
@@ -19,23 +19,21 @@ class MailBisectResult
   end
 
   def compose_mail
-    subject = "[Compass-CI] #{(a)repo}.git: bisect result"
+    subject = "[Compass-CI][#{(a)repo.split('/')[1]}]: #{@error_messages[0]}"
+    job_url = "job url: #{ENV['SRV_HTTP_HOST']}:#{ENV['SRV_HTTP_PORT']}/#{ENV['result_root']}\n" ? ENV['result_root'] : ''
     body = <<~BODY
     Hi #{(a)git_commit.author_name},
 
-      Bisect completed for
+      git url: #{(a)git_commit.url}
+      git commit: #{@commit_id[0..11]} ("#{(a)git_commit.subject}")
 
-      url: #{(a)git_commit.url}
-
-      This is a bisect email from compass-ci. We met some problems when test with new commits.
-      Would you help to check what happend?
-      After submitting a job we noticed an error response due to the commit:
-
-      commit: #{@commit_id[0..11]} ("#{(a)git_commit.subject}")
+      gcc version: 7.3.0
       error_messages:
-      #{@error_messages}
+      #{(a)error_messages.join("\n")}
 
-    https://gitee.com/openeuler/compass-ci
+      #{job_url}
+    Regards,
+    Compass CI team
     BODY
     to = 'caoxl(a)crystal.ci'
     @hash = { 'to' => to, 'body' => body, 'subject' => subject }
-- 
2.23.0
                    
                  
                  
                          
                            
                            1
                            
                          
                          
                            
                            0
                            
                          
                          
                            
    
                          
                        
                    
                        
                            
                                
                            
                             [PATCH v2 lkp-tests] Redirect stderr only for functions that may use lkp-tests customized make
                        
                        
by Lin Jiaxin 14 Dec '20
                    by Lin Jiaxin 14 Dec '20
14 Dec '20
                    
                        [Why]
  we use makepkg 2>&1 so that many errors are not output to the file stderr now.
  Like these:
  ==> WARNING: Skipping verification of source file PGP signatures.
      leptonica-1.79.0.tar.gz ... FAILED
  ==> ERROR: One or more files did not pass the validity check!
  And stats/build-pkg can not analyze them so it ignores them.
[How]
  Redirect stderr in functions build(), check(), package() when STDERR_REDIR = y.
Signed-off-by: Lin Jiaxin <ljx.joe(a)qq.com>
---
 sbin/makepkg    | 18 +++++++++++++++---
 tests/build-pkg |  4 ++--
 2 files changed, 17 insertions(+), 5 deletions(-)
diff --git a/sbin/makepkg b/sbin/makepkg
index 498b4872..131ae690 100755
--- a/sbin/makepkg
+++ b/sbin/makepkg
@@ -1761,11 +1761,19 @@ run_build() {
 		[[ -d /usr/lib/ccache/bin ]] && export PATH="/usr/lib/ccache/bin:$PATH"
 	fi
 
-	run_function_safe "build"
+	if [[ $STDERR_REDIR == y ]];then
+		run_function_safe "build" 2>&1
+	else
+		run_function_safe "build"
+	fi
 }
 
 run_check() {
-	run_function_safe "check"
+	if [[ $STDERR_REDIR == y ]];then
+		run_function_safe "check" 2>&1
+	else
+		run_function_safe "check"
+	fi
 }
 
 run_package() {
@@ -1776,7 +1784,11 @@ run_package() {
 		pkgfunc="package_$1"
 	fi
 
-	run_function_safe "$pkgfunc"
+	if [[ $STDERR_REDIR == y ]];then
+		run_function_safe "$pkgfunc" 2>&1
+	else
+		run_function_safe "$pkgfunc"
+	fi
 }
 
 build_id() {
diff --git a/tests/build-pkg b/tests/build-pkg
index c6717d48..aafc120e 100755
--- a/tests/build-pkg
+++ b/tests/build-pkg
@@ -125,8 +125,8 @@ build_source_pkg()
 	[ -n "$PKGBUILD_TAG" ] && replace_source "PKGBUILD-$PKGBUILD_TAG"
 
 	cgz_name="$PKG_MNT/${pack_to}/${pkgname}/${upstream_commit}.cgz"
-	PACMAN=true BUILDDIR=$TMP CARCH=$os_arch PKGEXT=.cgz CGZDEST="$cgz_name" \
-		$LKP_SRC/sbin/makepkg -A --check --skippgpcheck --config $LKP_SRC/etc/makepkg.conf 2>&1
+	PACMAN=true BUILDDIR=$TMP CARCH=$os_arch PKGEXT=.cgz CGZDEST="$cgz_name" STDERR_REDIR=y\
+		$LKP_SRC/sbin/makepkg -A --check --skippgpcheck --config $LKP_SRC/etc/makepkg.conf
 
 	[ "$?" == 0 ] || exit 1
 	create_softlink
-- 
2.23.0
                    
                  
                  
                          
                            
                            1
                            
                          
                          
                            
                            0
                            
                          
                          
                            
    
                          
                        
                    
                        
                            
                                
                            
                             [PATCH lkp-tests] Redirect stderr only for functions that may use lkp-tests customized make
                        
                        
by Lin Jiaxin 14 Dec '20
                    by Lin Jiaxin 14 Dec '20
14 Dec '20
                    
                        [Why]
  we use makepkg 2>&1 so that many errors are not output to the file stderr now.
  Like these:
  ==> WARNING: Skipping verification of source file PGP signatures.
      leptonica-1.79.0.tar.gz ... FAILED
  ==> ERROR: One or more files did not pass the validity check!
  And stats/build-pkg can not analyze them so it ignores them.
[How]
  Redirect stderr in functions build(), check(), packages() when STDERR_REDIR = y.
Signed-off-by: Lin Jiaxin <ljx.joe(a)qq.com>
---
 sbin/makepkg    | 18 +++++++++++++++---
 tests/build-pkg |  4 ++--
 2 files changed, 17 insertions(+), 5 deletions(-)
diff --git a/sbin/makepkg b/sbin/makepkg
index 498b4872..131ae690 100755
--- a/sbin/makepkg
+++ b/sbin/makepkg
@@ -1761,11 +1761,19 @@ run_build() {
 		[[ -d /usr/lib/ccache/bin ]] && export PATH="/usr/lib/ccache/bin:$PATH"
 	fi
 
-	run_function_safe "build"
+	if [[ $STDERR_REDIR == y ]];then
+		run_function_safe "build" 2>&1
+	else
+		run_function_safe "build"
+	fi
 }
 
 run_check() {
-	run_function_safe "check"
+	if [[ $STDERR_REDIR == y ]];then
+		run_function_safe "check" 2>&1
+	else
+		run_function_safe "check"
+	fi
 }
 
 run_package() {
@@ -1776,7 +1784,11 @@ run_package() {
 		pkgfunc="package_$1"
 	fi
 
-	run_function_safe "$pkgfunc"
+	if [[ $STDERR_REDIR == y ]];then
+		run_function_safe "$pkgfunc" 2>&1
+	else
+		run_function_safe "$pkgfunc"
+	fi
 }
 
 build_id() {
diff --git a/tests/build-pkg b/tests/build-pkg
index c6717d48..aafc120e 100755
--- a/tests/build-pkg
+++ b/tests/build-pkg
@@ -125,8 +125,8 @@ build_source_pkg()
 	[ -n "$PKGBUILD_TAG" ] && replace_source "PKGBUILD-$PKGBUILD_TAG"
 
 	cgz_name="$PKG_MNT/${pack_to}/${pkgname}/${upstream_commit}.cgz"
-	PACMAN=true BUILDDIR=$TMP CARCH=$os_arch PKGEXT=.cgz CGZDEST="$cgz_name" \
-		$LKP_SRC/sbin/makepkg -A --check --skippgpcheck --config $LKP_SRC/etc/makepkg.conf 2>&1
+	PACMAN=true BUILDDIR=$TMP CARCH=$os_arch PKGEXT=.cgz CGZDEST="$cgz_name" STDERR_REDIR=y\
+		$LKP_SRC/sbin/makepkg -A --check --skippgpcheck --config $LKP_SRC/etc/makepkg.conf
 
 	[ "$?" == 0 ] || exit 1
 	create_softlink
-- 
2.23.0
                    
                  
                  
                          
                            
                            1
                            
                          
                          
                            
                            0