diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..496ee2c --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +.DS_Store \ No newline at end of file diff --git a/Backgrounds/.gitkeep b/Backgrounds/.gitkeep deleted file mode 100644 index e69de29..0000000 diff --git a/Banners/.gitkeep b/Banners/.gitkeep deleted file mode 100644 index e69de29..0000000 diff --git a/COLOURS.md b/COLOURS.md deleted file mode 100644 index e69de29..0000000 diff --git a/CSS/.gitkeep b/CSS/.gitkeep deleted file mode 100644 index e69de29..0000000 diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..a2b7d57 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,42 @@ +FROM nginx:1.27-alpine3.19 +LABEL maintainer="Deokgyu Yang " \ + description="Lightweight h5ai 0.30.0 container with Nginx 1.27 & PHP 8.2 based on Alpine Linux." + +RUN apk update +RUN apk add --no-cache \ + bash bash-completion supervisor tzdata shadow \ + php82 php82-fpm php82-session php82-json php82-xml php82-mbstring php82-exif \ + php82-intl php82-gd php82-pecl-imagick php82-zip php82-opcache \ + ffmpeg imagemagick zip apache2-utils patch + +# Environments +ENV PUID=911 +ENV PGID=911 +ENV TZ='Europe/Berlin' +ENV HTPASSWD='false' +ENV HTPASSWD_USER='guest' +ENV HTPASSWD_PW='' + +# Copy configuration files +COPY config/h5ai.conf /etc/nginx/conf.d/h5ai.conf +COPY config/php_set_timezone.ini /etc/php82/conf.d/00_timezone.ini +COPY config/php_set_jit.ini /etc/php82/conf.d/00_jit.ini +COPY config/php_set_memory_limit.ini /etc/php82/conf.d/00_memlimit.ini +COPY config/supervisord.conf /etc/supervisor/conf.d/supervisord.conf + +# Copy h5ai +COPY config/_h5ai /usr/share/h5ai/_h5ai + +# Configure Nginx server +RUN sed --in-place=.bak 's/worker_processes 1/worker_processes auto/g' /etc/nginx/nginx.conf +RUN mv /etc/nginx/conf.d/default.conf /etc/nginx/conf.d/default.conf.bak + +# Add shell script, patch files +ADD config/init.sh / +ADD config/h5ai.conf.htpasswd.patch / +# Set entry point file permission +RUN chmod a+x /init.sh + +EXPOSE 80 +VOLUME [ "/config", "/h5ai" ] +ENTRYPOINT [ "/init.sh" ] diff --git a/FONTS.md b/FONTS.md deleted file mode 100644 index e69de29..0000000 diff --git a/GUIDELINES.md b/GUIDELINES.md deleted file mode 100644 index e69de29..0000000 diff --git a/LICENSE b/LICENSE index baee873..a497b75 100644 --- a/LICENSE +++ b/LICENSE @@ -1,170 +1,31 @@ -Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International +MIT License - Creative Commons Corporation (“Creative Commons”) is not a law firm and does not provide legal services or legal advice. Distribution of Creative Commons public licenses does not create a lawyer-client or other relationship. Creative Commons makes its licenses and related information available on an “as-is” basis. Creative Commons gives no warranties regarding its licenses, any material licensed under their terms and conditions, or any related information. Creative Commons disclaims all liability for damages resulting from their use to the fullest extent possible. +Copyright (c) 2018-2024 Deokgyu Yang -Using Creative Commons Public Licenses +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: -Creative Commons public licenses provide a standard set of terms and conditions that creators and other rights holders may use to share original works of authorship and other material subject to copyright and certain other rights specified in the public license below. The following considerations are for informational purposes only, are not exhaustive, and do not form part of our licenses. +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. -Considerations for licensors: Our public licenses are intended for use by those authorized to give the public permission to use material in ways otherwise restricted by copyright and certain other rights. Our licenses are irrevocable. Licensors should read and understand the terms and conditions of the license they choose before applying it. Licensors should also secure all rights necessary before applying our licenses so that the public can reuse the material as expected. Licensors should clearly mark any material not subject to the license. This includes other CC-licensed material, or material used under an exception or limitation to copyright. More considerations for licensors. +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. -Considerations for the public: By using one of our public licenses, a licensor grants the public permission to use the licensed material under specified terms and conditions. If the licensor’s permission is not necessary for any reason–for example, because of any applicable exception or limitation to copyright–then that use is not regulated by the license. Our licenses grant only permissions under copyright and certain other rights that a licensor has authority to grant. Use of the licensed material may still be restricted for other reasons, including because others have copyright or other rights in the material. A licensor may make special requests, such as asking that all changes be marked or described. Although not required by our licenses, you are encouraged to respect those requests where reasonable. More considerations for the public. +The MIT License (MIT) -Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International Public License +Copyright (c) 2016 Lars Jung (https://larsjung.de) -By exercising the Licensed Rights (defined below), You accept and agree to be bound by the terms and conditions of this Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International Public License ("Public License"). To the extent this Public License may be interpreted as a contract, You are granted the Licensed Rights in consideration of Your acceptance of these terms and conditions, and the Licensor grants You such rights in consideration of benefits the Licensor receives from making the Licensed Material available under these terms and conditions. +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: -Section 1 – Definitions. +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. - a. Adapted Material means material subject to Copyright and Similar Rights that is derived from or based upon the Licensed Material and in which the Licensed Material is translated, altered, arranged, transformed, or otherwise modified in a manner requiring permission under the Copyright and Similar Rights held by the Licensor. For purposes of this Public License, where the Licensed Material is a musical work, performance, or sound recording, Adapted Material is always produced where the Licensed Material is synched in timed relation with a moving image. - - b. Adapter's License means the license You apply to Your Copyright and Similar Rights in Your contributions to Adapted Material in accordance with the terms and conditions of this Public License. - - c. BY-NC-SA Compatible License means a license listed at creativecommons.org/compatiblelicenses, approved by Creative Commons as essentially the equivalent of this Public License. - - d. Copyright and Similar Rights means copyright and/or similar rights closely related to copyright including, without limitation, performance, broadcast, sound recording, and Sui Generis Database Rights, without regard to how the rights are labeled or categorized. For purposes of this Public License, the rights specified in Section 2(b)(1)-(2) are not Copyright and Similar Rights. - - e. Effective Technological Measures means those measures that, in the absence of proper authority, may not be circumvented under laws fulfilling obligations under Article 11 of the WIPO Copyright Treaty adopted on December 20, 1996, and/or similar international agreements. - - f. Exceptions and Limitations means fair use, fair dealing, and/or any other exception or limitation to Copyright and Similar Rights that applies to Your use of the Licensed Material. - - g. License Elements means the license attributes listed in the name of a Creative Commons Public License. The License Elements of this Public License are Attribution, NonCommercial, and ShareAlike. - - h. Licensed Material means the artistic or literary work, database, or other material to which the Licensor applied this Public License. - - i. Licensed Rights means the rights granted to You subject to the terms and conditions of this Public License, which are limited to all Copyright and Similar Rights that apply to Your use of the Licensed Material and that the Licensor has authority to license. - - j. Licensor means the individual(s) or entity(ies) granting rights under this Public License. - - k. NonCommercial means not primarily intended for or directed towards commercial advantage or monetary compensation. For purposes of this Public License, the exchange of the Licensed Material for other material subject to Copyright and Similar Rights by digital file-sharing or similar means is NonCommercial provided there is no payment of monetary compensation in connection with the exchange. - - l. Share means to provide material to the public by any means or process that requires permission under the Licensed Rights, such as reproduction, public display, public performance, distribution, dissemination, communication, or importation, and to make material available to the public including in ways that members of the public may access the material from a place and at a time individually chosen by them. - - m. Sui Generis Database Rights means rights other than copyright resulting from Directive 96/9/EC of the European Parliament and of the Council of 11 March 1996 on the legal protection of databases, as amended and/or succeeded, as well as other essentially equivalent rights anywhere in the world. - - n. You means the individual or entity exercising the Licensed Rights under this Public License. Your has a corresponding meaning. - -Section 2 – Scope. - - a. License grant. - - 1. Subject to the terms and conditions of this Public License, the Licensor hereby grants You a worldwide, royalty-free, non-sublicensable, non-exclusive, irrevocable license to exercise the Licensed Rights in the Licensed Material to: - - A. reproduce and Share the Licensed Material, in whole or in part, for NonCommercial purposes only; and - - B. produce, reproduce, and Share Adapted Material for NonCommercial purposes only. - - 2. Exceptions and Limitations. For the avoidance of doubt, where Exceptions and Limitations apply to Your use, this Public License does not apply, and You do not need to comply with its terms and conditions. - - 3. Term. The term of this Public License is specified in Section 6(a). - - 4. Media and formats; technical modifications allowed. The Licensor authorizes You to exercise the Licensed Rights in all media and formats whether now known or hereafter created, and to make technical modifications necessary to do so. The Licensor waives and/or agrees not to assert any right or authority to forbid You from making technical modifications necessary to exercise the Licensed Rights, including technical modifications necessary to circumvent Effective Technological Measures. For purposes of this Public License, simply making modifications authorized by this Section 2(a)(4) never produces Adapted Material. - - 5. Downstream recipients. - - A. Offer from the Licensor – Licensed Material. Every recipient of the Licensed Material automatically receives an offer from the Licensor to exercise the Licensed Rights under the terms and conditions of this Public License. - - B. Additional offer from the Licensor – Adapted Material. Every recipient of Adapted Material from You automatically receives an offer from the Licensor to exercise the Licensed Rights in the Adapted Material under the conditions of the Adapter’s License You apply. - - C. No downstream restrictions. You may not offer or impose any additional or different terms or conditions on, or apply any Effective Technological Measures to, the Licensed Material if doing so restricts exercise of the Licensed Rights by any recipient of the Licensed Material. - - 6. No endorsement. Nothing in this Public License constitutes or may be construed as permission to assert or imply that You are, or that Your use of the Licensed Material is, connected with, or sponsored, endorsed, or granted official status by, the Licensor or others designated to receive attribution as provided in Section 3(a)(1)(A)(i). - - b. Other rights. - - 1. Moral rights, such as the right of integrity, are not licensed under this Public License, nor are publicity, privacy, and/or other similar personality rights; however, to the extent possible, the Licensor waives and/or agrees not to assert any such rights held by the Licensor to the limited extent necessary to allow You to exercise the Licensed Rights, but not otherwise. - - 2. Patent and trademark rights are not licensed under this Public License. - - 3. To the extent possible, the Licensor waives any right to collect royalties from You for the exercise of the Licensed Rights, whether directly or through a collecting society under any voluntary or waivable statutory or compulsory licensing scheme. In all other cases the Licensor expressly reserves any right to collect such royalties, including when the Licensed Material is used other than for NonCommercial purposes. - -Section 3 – License Conditions. - -Your exercise of the Licensed Rights is expressly made subject to the following conditions. - - a. Attribution. - - 1. If You Share the Licensed Material (including in modified form), You must: - - A. retain the following if it is supplied by the Licensor with the Licensed Material: - - i. identification of the creator(s) of the Licensed Material and any others designated to receive attribution, in any reasonable manner requested by the Licensor (including by pseudonym if designated); - - ii. a copyright notice; - - iii. a notice that refers to this Public License; - - iv. a notice that refers to the disclaimer of warranties; - - v. a URI or hyperlink to the Licensed Material to the extent reasonably practicable; - - B. indicate if You modified the Licensed Material and retain an indication of any previous modifications; and - - C. indicate the Licensed Material is licensed under this Public License, and include the text of, or the URI or hyperlink to, this Public License. - - 2. You may satisfy the conditions in Section 3(a)(1) in any reasonable manner based on the medium, means, and context in which You Share the Licensed Material. For example, it may be reasonable to satisfy the conditions by providing a URI or hyperlink to a resource that includes the required information. - - 3. If requested by the Licensor, You must remove any of the information required by Section 3(a)(1)(A) to the extent reasonably practicable. - - b. ShareAlike.In addition to the conditions in Section 3(a), if You Share Adapted Material You produce, the following conditions also apply. - - 1. The Adapter’s License You apply must be a Creative Commons license with the same License Elements, this version or later, or a BY-NC-SA Compatible License. - - 2. You must include the text of, or the URI or hyperlink to, the Adapter's License You apply. You may satisfy this condition in any reasonable manner based on the medium, means, and context in which You Share Adapted Material. - - 3. You may not offer or impose any additional or different terms or conditions on, or apply any Effective Technological Measures to, Adapted Material that restrict exercise of the rights granted under the Adapter's License You apply. - -Section 4 – Sui Generis Database Rights. - -Where the Licensed Rights include Sui Generis Database Rights that apply to Your use of the Licensed Material: - - a. for the avoidance of doubt, Section 2(a)(1) grants You the right to extract, reuse, reproduce, and Share all or a substantial portion of the contents of the database for NonCommercial purposes only; - - b. if You include all or a substantial portion of the database contents in a database in which You have Sui Generis Database Rights, then the database in which You have Sui Generis Database Rights (but not its individual contents) is Adapted Material, including for purposes of Section 3(b); and - - c. You must comply with the conditions in Section 3(a) if You Share all or a substantial portion of the contents of the database. -For the avoidance of doubt, this Section 4 supplements and does not replace Your obligations under this Public License where the Licensed Rights include other Copyright and Similar Rights. - -Section 5 – Disclaimer of Warranties and Limitation of Liability. - - a. Unless otherwise separately undertaken by the Licensor, to the extent possible, the Licensor offers the Licensed Material as-is and as-available, and makes no representations or warranties of any kind concerning the Licensed Material, whether express, implied, statutory, or other. This includes, without limitation, warranties of title, merchantability, fitness for a particular purpose, non-infringement, absence of latent or other defects, accuracy, or the presence or absence of errors, whether or not known or discoverable. Where disclaimers of warranties are not allowed in full or in part, this disclaimer may not apply to You. - - b. To the extent possible, in no event will the Licensor be liable to You on any legal theory (including, without limitation, negligence) or otherwise for any direct, special, indirect, incidental, consequential, punitive, exemplary, or other losses, costs, expenses, or damages arising out of this Public License or use of the Licensed Material, even if the Licensor has been advised of the possibility of such losses, costs, expenses, or damages. Where a limitation of liability is not allowed in full or in part, this limitation may not apply to You. - - c. The disclaimer of warranties and limitation of liability provided above shall be interpreted in a manner that, to the extent possible, most closely approximates an absolute disclaimer and waiver of all liability. - -Section 6 – Term and Termination. - - a. This Public License applies for the term of the Copyright and Similar Rights licensed here. However, if You fail to comply with this Public License, then Your rights under this Public License terminate automatically. - - b. Where Your right to use the Licensed Material has terminated under Section 6(a), it reinstates: - - 1. automatically as of the date the violation is cured, provided it is cured within 30 days of Your discovery of the violation; or - - 2. upon express reinstatement by the Licensor. - - For the avoidance of doubt, this Section 6(b) does not affect any right the Licensor may have to seek remedies for Your violations of this Public License. - - c. For the avoidance of doubt, the Licensor may also offer the Licensed Material under separate terms or conditions or stop distributing the Licensed Material at any time; however, doing so will not terminate this Public License. - - d. Sections 1, 5, 6, 7, and 8 survive termination of this Public License. - -Section 7 – Other Terms and Conditions. - - a. The Licensor shall not be bound by any additional or different terms or conditions communicated by You unless expressly agreed. - - b. Any arrangements, understandings, or agreements regarding the Licensed Material not stated herein are separate from and independent of the terms and conditions of this Public License. - -Section 8 – Interpretation. - - a. For the avoidance of doubt, this Public License does not, and shall not be interpreted to, reduce, limit, restrict, or impose conditions on any use of the Licensed Material that could lawfully be made without permission under this Public License. - - b. To the extent possible, if any provision of this Public License is deemed unenforceable, it shall be automatically reformed to the minimum extent necessary to make it enforceable. If the provision cannot be reformed, it shall be severed from this Public License without affecting the enforceability of the remaining terms and conditions. - - c. No term or condition of this Public License will be waived and no failure to comply consented to unless expressly agreed to by the Licensor. - - d. Nothing in this Public License constitutes or may be interpreted as a limitation upon, or waiver of, any privileges and immunities that apply to the Licensor or You, including from the legal processes of any jurisdiction or authority. - -Creative Commons is not a party to its public licenses. Notwithstanding, Creative Commons may elect to apply one of its public licenses to material it publishes and in those instances will be considered the “Licensor.” Except for the limited purpose of indicating that material is shared under a Creative Commons public license or as otherwise permitted by the Creative Commons policies published at creativecommons.org/policies, Creative Commons does not authorize the use of the trademark “Creative Commons” or any other trademark or logo of Creative Commons without its prior written consent including, without limitation, in connection with any unauthorized modifications to any of its public licenses or any other arrangements, understandings, or agreements concerning use of licensed material. For the avoidance of doubt, this paragraph does not form part of the public licenses. - -Creative Commons may be contacted at creativecommons.org. +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. diff --git a/Logo/.gitkeep b/Logo/.gitkeep deleted file mode 100644 index e69de29..0000000 diff --git a/Misc/.gitkeep b/Misc/.gitkeep deleted file mode 100644 index e69de29..0000000 diff --git a/Pictures/.gitkeep b/Pictures/.gitkeep deleted file mode 100644 index e69de29..0000000 diff --git a/Press/.gitkeep b/Press/.gitkeep deleted file mode 100644 index e69de29..0000000 diff --git a/Press/README.md b/Press/README.md deleted file mode 100644 index e69de29..0000000 diff --git a/config/_h5ai/.htaccess b/config/_h5ai/.htaccess new file mode 100755 index 0000000..95e775b --- /dev/null +++ b/config/_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 + + Order allow,deny + Deny from all + Satisfy All + + +# Apache ≥ 2.3 + + Require all denied + + + + Header set X-Content-Type-Options "nosniff" + Header unset ETag + Header unset X-Powered-By + + + + Options -Indexes + + + + +## COMPAT ##################################################################### + +AddDefaultCharset utf-8 + + + 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 + + + + +## SPEED ###################################################################### + + + 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" + + + + + + 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 + + + + # Apache ≥ 2.3 + + # mod_filter as module only available for Apache ≥ 2.3.7 + + 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" + + + + # Apache < 2.3 + + 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" + + + + AddEncoding gzip gz + AddEncoding gzip svgz + + diff --git a/config/_h5ai/CHANGELOG.md b/config/_h5ai/CHANGELOG.md new file mode 100755 index 0000000..9158795 --- /dev/null +++ b/config/_h5ai/CHANGELOG.md @@ -0,0 +1,619 @@ +# Changelog + + +* now require PHP 7.0.0+ +* fix archive-single-item problem +* add header/footer search stop condition +* update languages (`id`, `it`, `pt-br`, `pt-pt`) +* add EXIF-based image rotation +* add `where` to command detection command list +* fix #758 +* fix #760 +* add `@babel/core` 7.12.10 +* add `@babel/preset-env` 7.12.11 +* remove `babel-loader` +* update `eslint` to 7.18.0 +* update `ghu` to 0.26.0 +* update `jsdom` to 16.4.0 +* update `kjua` to 0.9.0 +* update `lolight` to 1.4.0 +* update `marked` to 1.2.7 +* update `null-loader` to 4.0.1 +* update `scar` to 2.3.0 + + +## 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-440718295) +* 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/config/_h5ai/README.md b/config/_h5ai/README.md new file mode 100755 index 0000000..b7ebb5d --- /dev/null +++ b/config/_h5ai/README.md @@ -0,0 +1,73 @@ +# h5ai + +[![license][license-img]][github] [![web][web-img]][web] [![github][github-img]][github] + +A modern HTTP web server index for Apache httpd, lighttpd, and nginx. + + +## 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 10.0+`][node] to be installed, might work on other +configurations). + +~~~sh +> npm install +> npm run build +~~~ + + +## License + +The MIT License (MIT) + +Copyright (c) 2020 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-square +[github-img]: https://img.shields.io/badge/github-lrsjng/h5ai-a0a060.svg?style=flat-square diff --git a/config/_h5ai/private/cache/README.md b/config/_h5ai/private/cache/README.md new file mode 100755 index 0000000..60bc416 --- /dev/null +++ b/config/_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/config/_h5ai/private/conf/l10n/af.json b/config/_h5ai/private/conf/l10n/af.json new file mode 100755 index 0000000..5150c7b --- /dev/null +++ b/config/_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/config/_h5ai/private/conf/l10n/bg.json b/config/_h5ai/private/conf/l10n/bg.json new file mode 100755 index 0000000..6808e62 --- /dev/null +++ b/config/_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/config/_h5ai/private/conf/l10n/cs.json b/config/_h5ai/private/conf/l10n/cs.json new file mode 100755 index 0000000..1e34e61 --- /dev/null +++ b/config/_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/config/_h5ai/private/conf/l10n/da.json b/config/_h5ai/private/conf/l10n/da.json new file mode 100755 index 0000000..3b8fa06 --- /dev/null +++ b/config/_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/config/_h5ai/private/conf/l10n/de.json b/config/_h5ai/private/conf/l10n/de.json new file mode 100755 index 0000000..6d8c613 --- /dev/null +++ b/config/_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/config/_h5ai/private/conf/l10n/el.json b/config/_h5ai/private/conf/l10n/el.json new file mode 100755 index 0000000..2d9c00d --- /dev/null +++ b/config/_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/config/_h5ai/private/conf/l10n/en.json b/config/_h5ai/private/conf/l10n/en.json new file mode 100755 index 0000000..05e9b4e --- /dev/null +++ b/config/_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/config/_h5ai/private/conf/l10n/es.json b/config/_h5ai/private/conf/l10n/es.json new file mode 100755 index 0000000..e42a5b9 --- /dev/null +++ b/config/_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/config/_h5ai/private/conf/l10n/et.json b/config/_h5ai/private/conf/l10n/et.json new file mode 100755 index 0000000..8f3d1dc --- /dev/null +++ b/config/_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/config/_h5ai/private/conf/l10n/fi.json b/config/_h5ai/private/conf/l10n/fi.json new file mode 100755 index 0000000..c19c0ed --- /dev/null +++ b/config/_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/config/_h5ai/private/conf/l10n/fr.json b/config/_h5ai/private/conf/l10n/fr.json new file mode 100755 index 0000000..9a4ac45 --- /dev/null +++ b/config/_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/config/_h5ai/private/conf/l10n/he.json b/config/_h5ai/private/conf/l10n/he.json new file mode 100755 index 0000000..bb37f7f --- /dev/null +++ b/config/_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/config/_h5ai/private/conf/l10n/hi.json b/config/_h5ai/private/conf/l10n/hi.json new file mode 100755 index 0000000..5941733 --- /dev/null +++ b/config/_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/config/_h5ai/private/conf/l10n/hr.json b/config/_h5ai/private/conf/l10n/hr.json new file mode 100755 index 0000000..c044db4 --- /dev/null +++ b/config/_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/config/_h5ai/private/conf/l10n/hu.json b/config/_h5ai/private/conf/l10n/hu.json new file mode 100755 index 0000000..b2c1b34 --- /dev/null +++ b/config/_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/config/_h5ai/private/conf/l10n/id.json b/config/_h5ai/private/conf/l10n/id.json new file mode 100755 index 0000000..1987f59 --- /dev/null +++ b/config/_h5ai/private/conf/l10n/id.json @@ -0,0 +1,22 @@ +{ + "lang": "Bahasa Indonesia", + + "dateFormat": "DD-MM-YYYY HH:mm", + "details": "rincian", + "download": "unduh", + "empty": "kosong", + "files": "berkas", + "filter": "saring", + "folders": "pelipat", + "grid": "jaring", + "icons": "ikon", + "language": "Bahasa", + "lastModified": "Di modifikasi", + "name": "Nama", + "noMatch": "tidak cocok", + "parentDirectory": "Direktori induk", + "search": "cari", + "size": "Ukuran", + "tree": "Pohon", + "view": "Tampil" +} diff --git a/config/_h5ai/private/conf/l10n/it.json b/config/_h5ai/private/conf/l10n/it.json new file mode 100755 index 0000000..4547c62 --- /dev/null +++ b/config/_h5ai/private/conf/l10n/it.json @@ -0,0 +1,22 @@ +{ + "lang": "italiano", + + "dateFormat": "DD-MM-YYYY HH:mm", + "details": "dettagli", + "download": "download", + "empty": "vuota", + "files": "file", + "filter": "filtra", + "folders": "cartelle", + "grid": "griglia", + "icons": "icone", + "language": "Linugua", + "lastModified": "Ultima modifica", + "name": "Nome", + "noMatch": "nessun risultato", + "parentDirectory": "Cartella Superiore", + "search": "cerca", + "size": "Dimensione", + "tree": "Albero", + "view": "Vista" +} diff --git a/config/_h5ai/private/conf/l10n/ja.json b/config/_h5ai/private/conf/l10n/ja.json new file mode 100755 index 0000000..88266e7 --- /dev/null +++ b/config/_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/config/_h5ai/private/conf/l10n/ko.json b/config/_h5ai/private/conf/l10n/ko.json new file mode 100755 index 0000000..8c48cdb --- /dev/null +++ b/config/_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/config/_h5ai/private/conf/l10n/lv.json b/config/_h5ai/private/conf/l10n/lv.json new file mode 100755 index 0000000..fa672ce --- /dev/null +++ b/config/_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/config/_h5ai/private/conf/l10n/nb.json b/config/_h5ai/private/conf/l10n/nb.json new file mode 100755 index 0000000..44a1797 --- /dev/null +++ b/config/_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/config/_h5ai/private/conf/l10n/nl.json b/config/_h5ai/private/conf/l10n/nl.json new file mode 100755 index 0000000..8310f05 --- /dev/null +++ b/config/_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/config/_h5ai/private/conf/l10n/pl.json b/config/_h5ai/private/conf/l10n/pl.json new file mode 100755 index 0000000..da56967 --- /dev/null +++ b/config/_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/config/_h5ai/private/conf/l10n/pt-br.json b/config/_h5ai/private/conf/l10n/pt-br.json new file mode 100755 index 0000000..1b0d609 --- /dev/null +++ b/config/_h5ai/private/conf/l10n/pt-br.json @@ -0,0 +1,22 @@ +{ + "lang": "português do Brasil", + + "dateFormat": "DD-MM-YYYY HH:mm", + "details": "detalhes", + "download": "download", + "empty": "vazio", + "files": "arquivos", + "filter": "filtro", + "folders": "pastas", + "grid": "grade", + "icons": "ícones", + "language": "Idioma", + "lastModified": "Última modificação", + "name": "Nome", + "noMatch": "sem resultados", + "parentDirectory": "Diretório acima", + "search": "pesquisa", + "size": "Tamanho", + "tree": "Árvore", + "view": "Visualização" +} diff --git a/config/_h5ai/private/conf/l10n/pt-pt.json b/config/_h5ai/private/conf/l10n/pt-pt.json new file mode 100755 index 0000000..bc95686 --- /dev/null +++ b/config/_h5ai/private/conf/l10n/pt-pt.json @@ -0,0 +1,22 @@ +{ + "lang": "português de Portugal", + + "dateFormat": "DD-MM-YYYY HH:mm", + "details": "detalhes", + "download": "descarregar", + "empty": "vazio", + "files": "arquivos", + "filter": "filtro", + "folders": "pastas", + "grid": "grelha", + "icons": "ícones", + "language": "Idioma", + "lastModified": "última modificação", + "name": "Nome", + "noMatch": "sem resultados", + "parentDirectory": "Diretório acima", + "search": "pesquisa", + "size": "Tamanho", + "tree": "Árvore", + "view": "Visualização" +} diff --git a/config/_h5ai/private/conf/l10n/ro.json b/config/_h5ai/private/conf/l10n/ro.json new file mode 100755 index 0000000..4981dfe --- /dev/null +++ b/config/_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/config/_h5ai/private/conf/l10n/ru.json b/config/_h5ai/private/conf/l10n/ru.json new file mode 100755 index 0000000..8056a0d --- /dev/null +++ b/config/_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/config/_h5ai/private/conf/l10n/sk.json b/config/_h5ai/private/conf/l10n/sk.json new file mode 100755 index 0000000..cfc9e45 --- /dev/null +++ b/config/_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/config/_h5ai/private/conf/l10n/sl.json b/config/_h5ai/private/conf/l10n/sl.json new file mode 100755 index 0000000..5cdda21 --- /dev/null +++ b/config/_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/config/_h5ai/private/conf/l10n/sr.json b/config/_h5ai/private/conf/l10n/sr.json new file mode 100755 index 0000000..845eeab --- /dev/null +++ b/config/_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/config/_h5ai/private/conf/l10n/sv.json b/config/_h5ai/private/conf/l10n/sv.json new file mode 100755 index 0000000..75638e5 --- /dev/null +++ b/config/_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/config/_h5ai/private/conf/l10n/tr.json b/config/_h5ai/private/conf/l10n/tr.json new file mode 100755 index 0000000..45cfc92 --- /dev/null +++ b/config/_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/config/_h5ai/private/conf/l10n/uk.json b/config/_h5ai/private/conf/l10n/uk.json new file mode 100755 index 0000000..62908f5 --- /dev/null +++ b/config/_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/config/_h5ai/private/conf/l10n/zh-cn.json b/config/_h5ai/private/conf/l10n/zh-cn.json new file mode 100755 index 0000000..7cdba51 --- /dev/null +++ b/config/_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/config/_h5ai/private/conf/l10n/zh-tw.json b/config/_h5ai/private/conf/l10n/zh-tw.json new file mode 100755 index 0000000..7567f0d --- /dev/null +++ b/config/_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/config/_h5ai/private/conf/options.json b/config/_h5ai/private/conf/options.json new file mode 100755 index 0000000..384d8de --- /dev/null +++ b/config/_h5ai/private/conf/options.json @@ -0,0 +1,397 @@ +/* h5ai v0.30.0 - 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/public/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
tag above/below the main content. + If a file's extension is ".md" instead of ".html" its content will be interpreted as markdown. + + - stopSearchingAtRoot: boolean, only search for header and footer files until the web root + directory. if `false`, will search for header/footer up the entire directory structure, + even above the web root + */ + "custom": { + "enabled": true, + "stopSearchingAtRoot": 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/public/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/config/_h5ai/private/conf/types.json b/config/_h5ai/private/conf/types.json new file mode 100755 index 0000000..faaffae --- /dev/null +++ b/config/_h5ai/private/conf/types.json @@ -0,0 +1,76 @@ +/* h5ai v0.30.0 - 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/config/_h5ai/private/php/class-bootstrap.php b/config/_h5ai/private/php/class-bootstrap.php new file mode 100755 index 0000000..4356523 --- /dev/null +++ b/config/_h5ai/private/php/class-bootstrap.php @@ -0,0 +1,45 @@ +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/config/_h5ai/private/php/core/class-api.php b/config/_h5ai/private/php/core/class-api.php new file mode 100755 index 0000000..d850e65 --- /dev/null +++ b/config/_h5ai/private/php/core/class-api.php @@ -0,0 +1,110 @@ +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); + session_write_close(); + 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/config/_h5ai/private/php/core/class-context.php b/config/_h5ai/private/php/core/class-context.php new file mode 100755 index 0000000..0a72cea --- /dev/null +++ b/config/_h5ai/private/php/core/class-context.php @@ -0,0 +1,304 @@ +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) { + if (!in_array($iso_code, Context::$L10N_ISO_CODES)) { + continue; + } + + $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 = ''; + + 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 .= ''; + } + + foreach ($scripts as $href) { + $html .= ''; + } + + $html .= $this->get_fonts_html(); + + return $html; + } +} diff --git a/config/_h5ai/private/php/core/class-fallback.php b/config/_h5ai/private/php/core/class-fallback.php new file mode 100755 index 0000000..7bd317f --- /dev/null +++ b/config/_h5ai/private/php/core/class-fallback.php @@ -0,0 +1,54 @@ +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 = ''; + + $html .= ''; + $html .= ''; + $html .= ''; + $html .= ''; + $html .= ''; + $html .= ''; + + if ($folder->get_parent($cache)) { + $html .= ''; + $html .= ''; + $html .= ''; + $html .= ''; + $html .= ''; + $html .= ''; + } + + foreach ($items as $item) { + $type = $item->is_folder ? 'folder' : 'file'; + + $html .= ''; + $html .= ''; + $html .= ''; + $html .= ''; + $html .= ''; + $html .= ''; + } + + $html .= '
NameLast modifiedSize
folder-parentParent Directory
' . $type . '' . basename($item->path) . '' . date('Y-m-d H:i', $item->date) . '' . ($item->size !== null ? intval($item->size / 1000) . ' KB' : '' ) . '
'; + + return $html; + } +} diff --git a/config/_h5ai/private/php/core/class-filesize.php b/config/_h5ai/private/php/core/class-filesize.php new file mode 100755 index 0000000..477f9e2 --- /dev/null +++ b/config/_h5ai/private/php/core/class-filesize.php @@ -0,0 +1,96 @@ +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/config/_h5ai/private/php/core/class-item.php b/config/_h5ai/private/php/core/class-item.php new file mode 100755 index 0000000..2b9ce34 --- /dev/null +++ b/config/_h5ai/private/php/core/class-item.php @@ -0,0 +1,91 @@ +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/config/_h5ai/private/php/core/class-json.php b/config/_h5ai/private/php/core/class-json.php new file mode 100755 index 0000000..f662b9f --- /dev/null +++ b/config/_h5ai/private/php/core/class-json.php @@ -0,0 +1,65 @@ +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/config/_h5ai/private/php/core/class-session.php b/config/_h5ai/private/php/core/class-session.php new file mode 100755 index 0000000..630d78f --- /dev/null +++ b/config/_h5ai/private/php/core/class-session.php @@ -0,0 +1,20 @@ +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/config/_h5ai/private/php/core/class-setup.php b/config/_h5ai/private/php/core/class-setup.php new file mode 100755 index 0000000..5d703a1 --- /dev/null +++ b/config/_h5ai/private/php/core/class-setup.php @@ -0,0 +1,188 @@ +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', '/h5ai'); + + $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'); + $cmds['where'] = Util::exec_0('where where.exe'); + + $cmd = false; + if ($cmds['command']) { + $cmd = 'command -v'; + } elseif ($cmds['which']) { + $cmd = 'which'; + } elseif ($cmds['where']) { + $cmd = 'where'; + } + + 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/config/_h5ai/private/php/core/class-theme.php b/config/_h5ai/private/php/core/class-theme.php new file mode 100755 index 0000000..8fcaddd --- /dev/null +++ b/config/_h5ai/private/php/core/class-theme.php @@ -0,0 +1,32 @@ +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/config/_h5ai/private/php/core/class-util.php b/config/_h5ai/private/php/core/class-util.php new file mode 100755 index 0000000..ce6c802 --- /dev/null +++ b/config/_h5ai/private/php/core/class-util.php @@ -0,0 +1,89 @@ + $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/config/_h5ai/private/php/ext/class-archive.php b/config/_h5ai/private/php/ext/class-archive.php new file mode 100755 index 0000000..e1d9001 --- /dev/null +++ b/config/_h5ai/private/php/ext/class-archive.php @@ -0,0 +1,188 @@ +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) { + if (!is_array($hrefs)) { + $hrefs = array($hrefs); + } + + foreach ($hrefs as $href) { + if (trim($href) === '') { + continue; + } + + $href = Util::normalize_path($href, false); + $d = dirname($href); + $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/config/_h5ai/private/php/ext/class-custom.php b/config/_h5ai/private/php/ext/class-custom.php new file mode 100755 index 0000000..1a84bd2 --- /dev/null +++ b/config/_h5ai/private/php/ext/class-custom.php @@ -0,0 +1,73 @@ +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; + } + + // Stop once we reach the root + if ( + $this->context->query_option('custom.stopSearchingAtRoot', true) && + $path === $this->context->get_setup()->get('ROOT_PATH') + ) { + break; + } + $path = $parent_path; + } + + return [ + 'header' => ['content' => $header, 'type' => $header_type], + 'footer' => ['content' => $footer, 'type' => $footer_type] + ]; + } +} diff --git a/config/_h5ai/private/php/ext/class-search.php b/config/_h5ai/private/php/ext/class-search.php new file mode 100755 index 0000000..124954d --- /dev/null +++ b/config/_h5ai/private/php/ext/class-search.php @@ -0,0 +1,40 @@ +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/config/_h5ai/private/php/ext/class-thumb.php b/config/_h5ai/private/php/ext/class-thumb.php new file mode 100755 index 0000000..d52d3e8 --- /dev/null +++ b/config/_h5ai/private/php/ext/class-thumb.php @@ -0,0 +1,253 @@ +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/config/_h5ai/private/php/pages/index.php b/config/_h5ai/private/php/pages/index.php new file mode 100755 index 0000000..be2aabd --- /dev/null +++ b/config/_h5ai/private/php/pages/index.php @@ -0,0 +1,2 @@ +index - powered by h5ai v0.30.0 (https://larsjung.de/h5ai/) +
Works best with JavaScript enabled!Works best in modern browsers!powered by h5ai
\ No newline at end of file diff --git a/config/_h5ai/private/php/pages/info.php b/config/_h5ai/private/php/pages/info.php new file mode 100755 index 0000000..9f46f14 --- /dev/null +++ b/config/_h5ai/private/php/pages/info.php @@ -0,0 +1,2 @@ +h5ai info page - v0.30.0 +
Works best with JavaScript enabled!Works best in modern browsers!powered by h5ai
\ No newline at end of file diff --git a/config/_h5ai/public/.htaccess b/config/_h5ai/public/.htaccess new file mode 100755 index 0000000..3f14990 --- /dev/null +++ b/config/_h5ai/public/.htaccess @@ -0,0 +1,13 @@ +## make this folder accessible + +# Apache < 2.3 + + Order allow,deny + Allow from all + Satisfy All + + +# Apache ≥ 2.3 + + Require all granted + diff --git a/config/_h5ai/public/cache/README.md b/config/_h5ai/public/cache/README.md new file mode 100755 index 0000000..fd2974c --- /dev/null +++ b/config/_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/config/_h5ai/public/css/styles.css b/config/_h5ai/public/css/styles.css new file mode 100755 index 0000000..4edf3ff --- /dev/null +++ b/config/_h5ai/public/css/styles.css @@ -0,0 +1,2 @@ +/* h5ai v0.30.0 - 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;image-orientation:from-image;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{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;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%;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/config/_h5ai/public/ext/README.md b/config/_h5ai/public/ext/README.md new file mode 100755 index 0000000..7f9460c --- /dev/null +++ b/config/_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/config/_h5ai/public/images/fallback/file.png b/config/_h5ai/public/images/fallback/file.png new file mode 100755 index 0000000..c796a82 Binary files /dev/null and b/config/_h5ai/public/images/fallback/file.png differ diff --git a/config/_h5ai/public/images/fallback/folder-parent.png b/config/_h5ai/public/images/fallback/folder-parent.png new file mode 100755 index 0000000..38da20d Binary files /dev/null and b/config/_h5ai/public/images/fallback/folder-parent.png differ diff --git a/config/_h5ai/public/images/fallback/folder.png b/config/_h5ai/public/images/fallback/folder.png new file mode 100755 index 0000000..d4722e7 Binary files /dev/null and b/config/_h5ai/public/images/fallback/folder.png differ diff --git a/config/_h5ai/public/images/favicon/favicon-152.png b/config/_h5ai/public/images/favicon/favicon-152.png new file mode 100755 index 0000000..3666dfc Binary files /dev/null and b/config/_h5ai/public/images/favicon/favicon-152.png differ diff --git a/config/_h5ai/public/images/favicon/favicon-16-32.ico b/config/_h5ai/public/images/favicon/favicon-16-32.ico new file mode 100755 index 0000000..be17223 Binary files /dev/null and b/config/_h5ai/public/images/favicon/favicon-16-32.ico differ diff --git a/config/_h5ai/public/images/favicon/favicon-16.png b/config/_h5ai/public/images/favicon/favicon-16.png new file mode 100755 index 0000000..d7dd0f9 Binary files /dev/null and b/config/_h5ai/public/images/favicon/favicon-16.png differ diff --git a/config/_h5ai/public/images/favicon/favicon-32.png b/config/_h5ai/public/images/favicon/favicon-32.png new file mode 100755 index 0000000..2f97d12 Binary files /dev/null and b/config/_h5ai/public/images/favicon/favicon-32.png differ diff --git a/config/_h5ai/public/images/favicon/favicon.svg b/config/_h5ai/public/images/favicon/favicon.svg new file mode 100755 index 0000000..489efbe --- /dev/null +++ b/config/_h5ai/public/images/favicon/favicon.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/config/_h5ai/public/images/themes/README.md b/config/_h5ai/public/images/themes/README.md new file mode 100755 index 0000000..650e0f7 --- /dev/null +++ b/config/_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: `/.`, +with `` 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/config/_h5ai/public/images/themes/comity/ar-apk.svg b/config/_h5ai/public/images/themes/comity/ar-apk.svg new file mode 100755 index 0000000..a7cc5cd --- /dev/null +++ b/config/_h5ai/public/images/themes/comity/ar-apk.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/config/_h5ai/public/images/themes/comity/ar-deb.svg b/config/_h5ai/public/images/themes/comity/ar-deb.svg new file mode 100755 index 0000000..f1efae9 --- /dev/null +++ b/config/_h5ai/public/images/themes/comity/ar-deb.svg @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/config/_h5ai/public/images/themes/comity/ar-rpm.svg b/config/_h5ai/public/images/themes/comity/ar-rpm.svg new file mode 100755 index 0000000..4146098 --- /dev/null +++ b/config/_h5ai/public/images/themes/comity/ar-rpm.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/config/_h5ai/public/images/themes/comity/txt-css.svg b/config/_h5ai/public/images/themes/comity/txt-css.svg new file mode 100755 index 0000000..487a535 --- /dev/null +++ b/config/_h5ai/public/images/themes/comity/txt-css.svg @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/config/_h5ai/public/images/themes/comity/txt-go.svg b/config/_h5ai/public/images/themes/comity/txt-go.svg new file mode 100755 index 0000000..0d21bb0 --- /dev/null +++ b/config/_h5ai/public/images/themes/comity/txt-go.svg @@ -0,0 +1,29 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/config/_h5ai/public/images/themes/comity/txt-html.svg b/config/_h5ai/public/images/themes/comity/txt-html.svg new file mode 100755 index 0000000..356e855 --- /dev/null +++ b/config/_h5ai/public/images/themes/comity/txt-html.svg @@ -0,0 +1,10 @@ + + + + + + + + + + \ No newline at end of file diff --git a/config/_h5ai/public/images/themes/comity/txt-js.svg b/config/_h5ai/public/images/themes/comity/txt-js.svg new file mode 100755 index 0000000..91a3279 --- /dev/null +++ b/config/_h5ai/public/images/themes/comity/txt-js.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/config/_h5ai/public/images/themes/comity/txt-less.svg b/config/_h5ai/public/images/themes/comity/txt-less.svg new file mode 100755 index 0000000..fd15b02 --- /dev/null +++ b/config/_h5ai/public/images/themes/comity/txt-less.svg @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/config/_h5ai/public/images/themes/comity/txt-md.svg b/config/_h5ai/public/images/themes/comity/txt-md.svg new file mode 100755 index 0000000..a2fba14 --- /dev/null +++ b/config/_h5ai/public/images/themes/comity/txt-md.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/config/_h5ai/public/images/themes/comity/txt-php.svg b/config/_h5ai/public/images/themes/comity/txt-php.svg new file mode 100755 index 0000000..84e1e22 --- /dev/null +++ b/config/_h5ai/public/images/themes/comity/txt-php.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/config/_h5ai/public/images/themes/comity/txt-py.svg b/config/_h5ai/public/images/themes/comity/txt-py.svg new file mode 100755 index 0000000..d5dc003 --- /dev/null +++ b/config/_h5ai/public/images/themes/comity/txt-py.svg @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/config/_h5ai/public/images/themes/comity/txt-rb.svg b/config/_h5ai/public/images/themes/comity/txt-rb.svg new file mode 100755 index 0000000..a642dc2 --- /dev/null +++ b/config/_h5ai/public/images/themes/comity/txt-rb.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/config/_h5ai/public/images/themes/comity/txt-rust.svg b/config/_h5ai/public/images/themes/comity/txt-rust.svg new file mode 100755 index 0000000..0a71e77 --- /dev/null +++ b/config/_h5ai/public/images/themes/comity/txt-rust.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/config/_h5ai/public/images/themes/comity/txt-script.svg b/config/_h5ai/public/images/themes/comity/txt-script.svg new file mode 100755 index 0000000..f8704e8 --- /dev/null +++ b/config/_h5ai/public/images/themes/comity/txt-script.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/config/_h5ai/public/images/themes/comity/x-pdf.svg b/config/_h5ai/public/images/themes/comity/x-pdf.svg new file mode 100755 index 0000000..5266630 --- /dev/null +++ b/config/_h5ai/public/images/themes/comity/x-pdf.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/config/_h5ai/public/images/themes/default/ar.svg b/config/_h5ai/public/images/themes/default/ar.svg new file mode 100755 index 0000000..e25cded --- /dev/null +++ b/config/_h5ai/public/images/themes/default/ar.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/config/_h5ai/public/images/themes/default/aud.svg b/config/_h5ai/public/images/themes/default/aud.svg new file mode 100755 index 0000000..dd955fc --- /dev/null +++ b/config/_h5ai/public/images/themes/default/aud.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/config/_h5ai/public/images/themes/default/bin.svg b/config/_h5ai/public/images/themes/default/bin.svg new file mode 100755 index 0000000..34f1f45 --- /dev/null +++ b/config/_h5ai/public/images/themes/default/bin.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/config/_h5ai/public/images/themes/default/file.svg b/config/_h5ai/public/images/themes/default/file.svg new file mode 100755 index 0000000..66bcac7 --- /dev/null +++ b/config/_h5ai/public/images/themes/default/file.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/config/_h5ai/public/images/themes/default/folder-page.svg b/config/_h5ai/public/images/themes/default/folder-page.svg new file mode 100755 index 0000000..4ca3ec2 --- /dev/null +++ b/config/_h5ai/public/images/themes/default/folder-page.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/config/_h5ai/public/images/themes/default/folder-parent.svg b/config/_h5ai/public/images/themes/default/folder-parent.svg new file mode 100755 index 0000000..e114689 --- /dev/null +++ b/config/_h5ai/public/images/themes/default/folder-parent.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/config/_h5ai/public/images/themes/default/folder.svg b/config/_h5ai/public/images/themes/default/folder.svg new file mode 100755 index 0000000..3e971cf --- /dev/null +++ b/config/_h5ai/public/images/themes/default/folder.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/config/_h5ai/public/images/themes/default/img.svg b/config/_h5ai/public/images/themes/default/img.svg new file mode 100755 index 0000000..e754e82 --- /dev/null +++ b/config/_h5ai/public/images/themes/default/img.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/config/_h5ai/public/images/themes/default/txt.svg b/config/_h5ai/public/images/themes/default/txt.svg new file mode 100755 index 0000000..d5c0dc9 --- /dev/null +++ b/config/_h5ai/public/images/themes/default/txt.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/config/_h5ai/public/images/themes/default/vid.svg b/config/_h5ai/public/images/themes/default/vid.svg new file mode 100755 index 0000000..dd955fc --- /dev/null +++ b/config/_h5ai/public/images/themes/default/vid.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/config/_h5ai/public/images/themes/default/x.svg b/config/_h5ai/public/images/themes/default/x.svg new file mode 100755 index 0000000..66bcac7 --- /dev/null +++ b/config/_h5ai/public/images/themes/default/x.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/config/_h5ai/public/images/ui/back.svg b/config/_h5ai/public/images/ui/back.svg new file mode 100755 index 0000000..3275e21 --- /dev/null +++ b/config/_h5ai/public/images/ui/back.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/config/_h5ai/public/images/ui/crumb.svg b/config/_h5ai/public/images/ui/crumb.svg new file mode 100755 index 0000000..8dfd404 --- /dev/null +++ b/config/_h5ai/public/images/ui/crumb.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/config/_h5ai/public/images/ui/download.svg b/config/_h5ai/public/images/ui/download.svg new file mode 100755 index 0000000..5721c4e --- /dev/null +++ b/config/_h5ai/public/images/ui/download.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/config/_h5ai/public/images/ui/filter.svg b/config/_h5ai/public/images/ui/filter.svg new file mode 100755 index 0000000..3e5f19a --- /dev/null +++ b/config/_h5ai/public/images/ui/filter.svg @@ -0,0 +1,3 @@ + + + diff --git a/config/_h5ai/public/images/ui/info-toggle.svg b/config/_h5ai/public/images/ui/info-toggle.svg new file mode 100755 index 0000000..ebc0e5c --- /dev/null +++ b/config/_h5ai/public/images/ui/info-toggle.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/config/_h5ai/public/images/ui/paypal.svg b/config/_h5ai/public/images/ui/paypal.svg new file mode 100755 index 0000000..a17415e --- /dev/null +++ b/config/_h5ai/public/images/ui/paypal.svg @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/config/_h5ai/public/images/ui/preview-close.svg b/config/_h5ai/public/images/ui/preview-close.svg new file mode 100755 index 0000000..ef5f8a0 --- /dev/null +++ b/config/_h5ai/public/images/ui/preview-close.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/config/_h5ai/public/images/ui/preview-fullscreen.svg b/config/_h5ai/public/images/ui/preview-fullscreen.svg new file mode 100755 index 0000000..bf04ad7 --- /dev/null +++ b/config/_h5ai/public/images/ui/preview-fullscreen.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/config/_h5ai/public/images/ui/preview-next.svg b/config/_h5ai/public/images/ui/preview-next.svg new file mode 100755 index 0000000..1b72100 --- /dev/null +++ b/config/_h5ai/public/images/ui/preview-next.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/config/_h5ai/public/images/ui/preview-no-fullscreen.svg b/config/_h5ai/public/images/ui/preview-no-fullscreen.svg new file mode 100755 index 0000000..d2a3efb --- /dev/null +++ b/config/_h5ai/public/images/ui/preview-no-fullscreen.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/config/_h5ai/public/images/ui/preview-prev.svg b/config/_h5ai/public/images/ui/preview-prev.svg new file mode 100755 index 0000000..a592b22 --- /dev/null +++ b/config/_h5ai/public/images/ui/preview-prev.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/config/_h5ai/public/images/ui/preview-raw.svg b/config/_h5ai/public/images/ui/preview-raw.svg new file mode 100755 index 0000000..7a8a69d --- /dev/null +++ b/config/_h5ai/public/images/ui/preview-raw.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/config/_h5ai/public/images/ui/search.svg b/config/_h5ai/public/images/ui/search.svg new file mode 100755 index 0000000..d6d4c78 --- /dev/null +++ b/config/_h5ai/public/images/ui/search.svg @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/config/_h5ai/public/images/ui/selected.svg b/config/_h5ai/public/images/ui/selected.svg new file mode 100755 index 0000000..50ac249 --- /dev/null +++ b/config/_h5ai/public/images/ui/selected.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/config/_h5ai/public/images/ui/sidebar.svg b/config/_h5ai/public/images/ui/sidebar.svg new file mode 100755 index 0000000..4e38c05 --- /dev/null +++ b/config/_h5ai/public/images/ui/sidebar.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/config/_h5ai/public/images/ui/sort.svg b/config/_h5ai/public/images/ui/sort.svg new file mode 100755 index 0000000..5b0ed8d --- /dev/null +++ b/config/_h5ai/public/images/ui/sort.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/config/_h5ai/public/images/ui/spinner.svg b/config/_h5ai/public/images/ui/spinner.svg new file mode 100755 index 0000000..a5f7a7b --- /dev/null +++ b/config/_h5ai/public/images/ui/spinner.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/config/_h5ai/public/images/ui/tree-indicator.svg b/config/_h5ai/public/images/ui/tree-indicator.svg new file mode 100755 index 0000000..8dfd404 --- /dev/null +++ b/config/_h5ai/public/images/ui/tree-indicator.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/config/_h5ai/public/images/ui/tree-toggle.svg b/config/_h5ai/public/images/ui/tree-toggle.svg new file mode 100755 index 0000000..9914792 --- /dev/null +++ b/config/_h5ai/public/images/ui/tree-toggle.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/config/_h5ai/public/images/ui/view-details.svg b/config/_h5ai/public/images/ui/view-details.svg new file mode 100755 index 0000000..5e756e0 --- /dev/null +++ b/config/_h5ai/public/images/ui/view-details.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/config/_h5ai/public/images/ui/view-grid.svg b/config/_h5ai/public/images/ui/view-grid.svg new file mode 100755 index 0000000..8f4c48c --- /dev/null +++ b/config/_h5ai/public/images/ui/view-grid.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/config/_h5ai/public/images/ui/view-icons.svg b/config/_h5ai/public/images/ui/view-icons.svg new file mode 100755 index 0000000..8601293 --- /dev/null +++ b/config/_h5ai/public/images/ui/view-icons.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/config/_h5ai/public/index.php b/config/_h5ai/public/index.php new file mode 100755 index 0000000..6fb89c3 --- /dev/null +++ b/config/_h5ai/public/index.php @@ -0,0 +1,17 @@ +=e.length?{done:!0}:{done:!1,value:e[i++]}},e:function(e){throw e},f:r}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var o,a=!0,s=!1;return{s:function(){n=e[Symbol.iterator]()},n:function(){var e=n.next();return a=e.done,e},e:function(e){s=!0,o=e},f:function(){try{a||null==n.return||n.return()}finally{if(s)throw o}}}}function l(e,t){if(e){if("string"==typeof e)return r(e,t);var n=Object.prototype.toString.call(e).slice(8,-1);return"Object"===n&&e.constructor&&(n=e.constructor.name),"Map"===n||"Set"===n?Array.from(e):"Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?r(e,t):void 0}}function r(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=new Array(t);n');r(e,function(e,t){i('').attr("name",t).attr("value",e).appTo(n)}),n.appTo("body"),n[0].submit(),n.rm()}}}).call(this,a(5))},function(e,t,n){var r={"./":11,"./index":11,"./index.js":11,"./info":52,"./info.js":52};function i(e){var t=o(e);return n(t)}function o(e){if(n.o(r,e))return r[e];var t=new Error("Cannot find module '"+e+"'");throw t.code="MODULE_NOT_FOUND",t}i.keys=function(){return Object.keys(r)},i.resolve=o,(e.exports=i).id=10},function(e,t,n){(function(e){n(12),n(25),n(26),n(27),n(28),n(30),n(31),n(32),n(33),n(36),n(38),n(39),n(46),n(47),n(48),n(49),n(50),n(51);var t=e.window.document.location.href;n(21).setLocation(t,!0)}).call(this,n(5))},function(e,t,n){function r(e,t){f("#viewmode-settings .mode").rmCls("active"),f("#viewmode-"+e).addCls("active"),f("#viewmode-size").val(a.indexOf(t)),"next"===b.modeToggle&&(e=o[(o.indexOf(e)+1)%o.length]),f("#viewmode-toggle img").attr("src",p.image("view-"+e))}function i(){var e=v.getMode(),t=(o.indexOf(e)+1)%o.length,n=o[t];v.setMode(n)}var o,a,s,l,c=n(2),u=c.each,f=c.dom,d=n(13),p=n(14),h=n(15),g=n(16),m=n(18),v=n(19),b=Object.assign({modeToggle:!1},h.view),w='
\n viewmode-[MODE]\n
');o=v.getModes(),a=v.getSizes(),o.length<2&&a.length<2||(s=f('

View

'),1').attr("max",l).on("input",function(e){return v.setSize(a[e.target.valueAsNumber])}).on("change",function(e){return v.setSize(a[e.target.valueAsNumber])}).appTo(s)),s.appTo(g.$el)),b.modeToggle&&1\n viewmode\n
').on("click",i).appTo(m.$toolbar),r(v.getMode(),v.getSize()),d.sub("view.mode.changed",r)},function(s,e,l){(function(e){function t(t){for(var e=arguments.length,n=new Array(1').hide(),i=a(''),o=i.find("img"),f.disableSidebar||(r.appTo(u.$mainrow),i.appTo(u.$toolbar).on("click",function(){return p(!0)}),p()),{$el:r})},function(t,e,n){(function(e){function i(){try{return JSON.parse(o._h5ai)}catch(e){}return{}}var o=e.window.localStorage;t.exports={put:function(e,t){var n,r=i();r[e]=t,n=r,o._h5ai=JSON.stringify(n)},get:function(e){return i()[e]}}}).call(this,n(5))},function(e,t,n){var r,i=n(2).dom;e.exports={$root:r=i("body").attr("id","root").clr().app('').app('
\n
\n
'),$topbar:r.find("#topbar"),$toolbar:r.find("#toolbar"),$flowbar:r.find("#flowbar"),$mainrow:r.find("#mainrow"),$content:r.find("#content")}},function(e,t,n){function u(e,t,n){return Math.min(n,Math.max(t,e))}function r(t,n){var e=C.get(j);t=t||e&&e.mode,n=n||e&&e.size,t=b($.modes,t)?t:$.modes[0],n=b($.sizes,n)?n:$.sizes[0],C.put(j,{mode:t,size:n}),m(O,function(e){e===t?P.addCls("view-"+e):P.rmCls("view-"+e)}),m(M,function(e){e===n?P.addCls("view-size-"+e):P.rmCls("view-size-"+e)}),x.pub("view.mode.changed",t,n)}function s(e){var t=e.target._item;x.pub("item.mouseenter",t)}function l(e){var t=e.target._item;x.pub("item.mouseleave",t)}function i(e){var t=y('
  • \n \n \n \n \n \n \n \n
  • '),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",s).on("mouseleave",l),S.setLink(n,e),i.text(e.label).attr("title",e.label),o.attr("data-time",e.time).text(k.formatDate(e.time)),a.attr("data-bytes",e.size).text(k.formatSize(e.size)),e.icon=_.icon(e.type),e.isFolder()&&!e.isManaged&&(t.addCls("page"),e.icon=_.icon("folder-page")),e.isCurrentParentFolder()&&(e.icon=_.icon("folder-parent"),$.setParentFolderLabels||i.addCls("l10n-parentDirectory"),t.addCls("folder-parent")),r.attr("src",e.icon).attr("alt",e.type),(e.$view=t)[0]._item=e,t}function o(){D.find(".item").length===D.find(".folder-parent").length?I.show():I.hide()}function a(e){var t=v(D.find(".item"),function(e){return e._item});D.find(".item").rm(),m(e,function(e){return D.app(i(e))}),A.$content[0].scrollLeft=0,A.$content[0].scrollTop=0,o(),x.pub("view.changed",e,t)}function c(e,t){m(e,function(e){i(e).hide().appTo(D).show()}),m(t,function(e){e.$view.hide().rm()}),o(),x.pub("view.changed",e,t)}function f(e){I.rmCls().addCls("l10n-"+e),o()}function d(e){e=e||S.getItem();var t=[];e.parent&&!$.hideParentFolder&&t.push(e.parent),m(e.content,function(e){e.isFolder()&&$.hideFolders||t.push(e)}),f("empty"),a(t)}function p(e,t,n){var r=[];m(t,function(e){e.isFolder()&&$.hideFolders||r.push(e)}),f("empty"),c(r,n)}function h(){var e=P[0].offsetWidth;P.rmCls("width-0").rmCls("width-1"),e<320?P.addCls("width-0"):e<480&&P.addCls("width-1")}var g=n(2),m=g.each,v=g.map,b=g.includes,w=g.intersection,y=g.dom,x=n(13),k=n(20),S=n(21),_=n(14),C=n(17),z=n(15),A=n(18),T=["details","grid","icons"],$=Object.assign({binaryPrefix:!1,hideFolders:!1,hideParentFolder:!1,maxIconSize:40,modes:T,setParentFolderLabels:!1,sizes:[20,40,60,80,100,150,200,250,300,350,400]},z.view),M=$.sizes.sort(function(e,t){return e-t}),O=w($.modes,T),j="view",P=y('
    \n
      \n
    • \n \n \n \n \n
    • \n
    \n
    \n
    '),D=P.find("#items"),I=P.find("#view-hint");(function(){var e=v(M,function(e){return n=u(t=e,20,80),r=u(t,40,160),i=u(t,80,1e3),o=Math.round(4*i/3),a="!important;",s="#view.view-details.view-size-".concat(t),l="#view.view-grid.view-size-".concat(t),c="#view.view-icons.view-size-".concat(t),["".concat(s," .item .label {line-height: ").concat(n+14,"px ").concat(a,"}"),"".concat(s," .item .date {line-height: ").concat(n+14,"px ").concat(a,"}"),"".concat(s," .item .size {line-height: ").concat(n+14,"px ").concat(a,"}"),"".concat(s," .square {width: ").concat(n,"px ").concat(a," height: ").concat(n,"px ").concat(a,"}"),"".concat(s," .square img {width: ").concat(n,"px ").concat(a," height: ").concat(n,"px ").concat(a,"}"),"".concat(s," .label {margin-left: ").concat(n+32,"px ").concat(a,"}"),"".concat(l," .item .label {line-height: ").concat(r,"px ").concat(a,"}"),"".concat(l," .square {width: ").concat(r,"px ").concat(a," height: ").concat(r,"px ").concat(a,"}"),"".concat(l," .square img {width: ").concat(r,"px ").concat(a," height: ").concat(r,"px ").concat(a,"}"),"".concat(c," .item {width: ").concat(o,"px ").concat(a,"}"),"".concat(c," .landscape {width: ").concat(o,"px ").concat(a," height: ").concat(i,"px ").concat(a,"}"),"".concat(c," .landscape img {width: ").concat(i,"px ").concat(a," height: ").concat(i,"px ").concat(a,"}"),"".concat(c," .landscape .thumb {width: ").concat(o,"px ").concat(a,"}")].join("\n");var t,n,r,i,o,a,s,l,c});e.push("#view .icon img {max-width: ".concat($.maxIconSize,"px; max-height: ").concat($.maxIconSize,"px;}")),y("").text(e.join("\n")).appTo("head")})(),r(),P.appTo(A.$content),I.hide(),k.setDefaultMetric($.binaryPrefix),x.sub("location.changed",d),x.sub("location.refreshed",p),x.sub("resize",h),h(),e.exports={$el:P,setItems:a,changeItems:c,setLocation:d,setHint:f,getModes:function(){return O},getMode:function(){return C.get(j).mode},setMode:function(e){return r(e,null)},getSizes:function(){return M},getSize:function(){return C.get(j).size},setSize:function(e){return r(null,e)}}},function(e,t,n){var a=n(2).isNum,r={t:1e3,k:1e3,u:["B","KB","MB","GB","TB","PB","EB","ZB","YB"]},i={t:1024,k:1024,u:["B","KiB","MiB","GiB","TiB","PiB","EiB","ZiB","YiB"]},o=r,s=[[/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]],l="YYYY-MM-DD HH:mm";e.exports={setDefaultMetric:function(e){o=e?i:r},formatSize:function(e,t){if(t=t||o,!a(e)||e<0)return"";for(var n=0,r=t.u.length-1;e>=t.t&&n').hide().appTo(o.$root),{set:function(e){e?r.html(e).show():r.hide()}})},function(e,t,n){function i(e,t){return u(e)&&e.startsWith(t)}function o(e){if(u(e))e={href:e};else if(!e||!u(e.href))return null;var t=p.forceEncoding(e.href);if(!i(t,h.rootHref))return null;var n=b[t]||w(t);return f(e.time)&&(n.time=e.time),f(e.size)&&(n.size=e.size),e.managed&&(n.isManaged=!0),e.fetched&&(n.isContentFetched=!0),n}var r=n(2),a=r.keys,s=r.each,l=r.filter,c=r.sortBy,u=r.isStr,f=r.isNum,d=n(9),p=n(21),h=n(15),g=n(24),m=/\/$/,v=/^(.*\/)([^\/]+\/?)$/,b={},w=function e(t){var n=function(e){if("/"===e)return{parent:null,name:"/"};var t=v.exec(e);if(!t)return null;var n={parent:t[1],name:t[2]};return n.parent&&!i(n.parent,h.rootHref)&&(n.parent=null),n}(t),r=Object.assign(Object.create(e.prototype),{absHref:t,type:g.getType(t),label:function(e){e=e.replace(m,"");try{e=decodeURIComponent(e)}catch(e){}return e}("/"===t?p.getDomain():n.name),time:null,size:null,parent:null,isManaged:null,content:{}});return b[t]=r,n.parent&&(r.parent=o(n.parent),r.parent.content[r.absHref]=r,1');return r.on("contextmenu",e).on("click",e)}function r(e,t,n,r){var i,o,a,s,l=u(r),c=(i=n,a=d('
      '),s=a.find("ul"),f(i,function(e){"-"===e.type?d('
    • ').appTo(s):"l"===e.type?d('
    • ').appTo(s).find(".cm-text").text(e.text):"e"===e.type&&((o=d('
    • ').appTo(s))[0]._cmId=e.id,o.find(".cm-text").text(e.text),e.icon?o.find(".cm-icon img").attr("src",p.icon(e.icon)):o.find(".cm-icon").addCls("no-icon"))}),a);l.hide().app(c).appTo("body"),function(e,t,n,r){t.css({left:0,top:0,opacity:0}),e.show();var i=e[0].getBoundingClientRect(),o=t[0].getBoundingClientRect(),a=i.left,s=i.top,l=i.width,c=i.height,u=o.width,f=o.height,d=n,p=r;l-8\n >\n \n '),h='has index page');d.enabled&&(a('
      ').appTo(f.$flowbar),s.sub("location.changed",r))},function(e,t,n){function r(e){o.request({action:"get",custom:e.absHref}).then(function(e){var o=e&&e.custom;s(["header","footer"],function(e){return t=o,i=l("#content-".concat(n=e)),void(t&&t[n].content?(r=t[n].content,"md"===t[n].type&&(r=a(r)),i.html(r).show()):i.hide());var t,n,r,i})})}var a=n(29),i=n(2),s=i.each,l=i.dom,o=n(9),c=n(13),u=n(15),f=Object.assign({enabled:!1},u.custom);f.enabled&&(l('
      ').hide().preTo("#content"),l('').hide().appTo("#content"),c.sub("location.changed",r))},function(e,t,n){var r,i,o;function a(e){return(a="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})(e)}o=function(){"use strict";function o(e,t){for(var n=0;ne.length)&&(t=e.length);for(var n=0,r=new Array(t);n=e.length?{done:!0}:{done:!1,value:e[r++]}}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}function n(e){return c[e]}var e,t=(function(t){function e(){return{baseUrl:null,breaks:!1,gfm:!0,headerIds:!0,headerPrefix:"",highlight:null,langPrefix:"language-",mangle:!0,pedantic:!1,renderer:null,sanitize:!1,sanitizer:null,silent:!1,smartLists:!1,smartypants:!1,tokenizer:null,walkTokens:null,xhtml:!1}}t.exports={defaults:e(),getDefaults:e,changeDefaults:function(e){t.exports.defaults=e}}}(e={exports:{}}),e.exports),r=(t.defaults,t.getDefaults,t.changeDefaults,/[&<>"']/),a=/[&<>"']/g,s=/[<>"']|&(?!#?\w+;)/,l=/[<>"']|&(?!#?\w+;)/g,c={"&":"&","<":"<",">":">",'"':""","'":"'"};var u=/&(#(?:\d+)|(?:#x[0-9A-Fa-f]+)|(?:\w+));?/gi;function f(e){return e.replace(u,function(e,t){return"colon"===(t=t.toLowerCase())?":":"#"===t.charAt(0)?"x"===t.charAt(1)?String.fromCharCode(parseInt(t.substring(2),16)):String.fromCharCode(+t.substring(1)):""})}var d=/(^|[^\[])\^/g;var h=/[^\w:]/g,g=/^$|^[a-z][a-z0-9+.-]*:|^[?#]/i;var m={},v=/^[^:]+:\/*[^/]*$/,b=/^([^:]+:)[\s\S]*$/,w=/^([^:]+:\/*[^/]*)[\s\S]*$/;function y(e,t){m[" "+e]||(v.test(e)?m[" "+e]=e+"/":m[" "+e]=x(e,"/",!0));var n=-1===(e=m[" "+e]).indexOf(":");return"//"===t.substring(0,2)?n?t:e.replace(b,"$1")+t:"/"===t.charAt(0)?n?t:e.replace(w,"$1")+t:e+t}function x(e,t,n){var r=e.length;if(0===r)return"";for(var i=0;it)n.splice(t);else for(;n.length>=1,e+=e;return n+e},j=t.defaults,P=x,D=T,I=k,L=$;function H(e,t,n){var r=t.href,i=t.title?I(t.title):null,o=e[1].replace(/\\([\[\]])/g,"$1");return"!"!==e[0].charAt(0)?{type:"link",raw:n,href:r,title:i,text:o}:{type:"image",raw:n,href:r,title:i,text:I(o)}}var B=function(){function e(e){this.options=e||j}var t=e.prototype;return t.space=function(e){var t=this.rules.block.newline.exec(e);if(t)return 1=r.length?e.slice(r.length):e}).join("\n")}(n,t[3]||"");return{type:"code",raw:n,lang:t[2]?t[2].trim():t[2],text:r}}},t.heading=function(e){var t=this.rules.block.heading.exec(e);if(t){var n,r=t[2].trim();return/#$/.test(r)&&(n=P(r,"#"),!this.options.pedantic&&n&&!/ $/.test(n)||(r=n.trim())),{type:"heading",raw:t[0],depth:t[1].length,text:r}}},t.nptable=function(e){var t=this.rules.block.nptable.exec(e);if(t){var n={type:"table",header:D(t[1].replace(/^ *| *\| *$/g,"")),align:t[2].replace(/^ *|\| *$/g,"").split(/ *\| */),cells:t[3]?t[3].replace(/\n$/,"").split("\n"):[],raw:t[0]};if(n.header.length===n.align.length){for(var r=n.align.length,i=0;i ?/gm,"");return{type:"blockquote",raw:t[0],text:n}}},t.list=function(e){var t=this.rules.block.list.exec(e);if(t){for(var n,r,i,o,a,s,l,c=t[0],u=t[2],f=1m[0].length||3/i.test(r[0])&&(t=!1),!n&&/^<(pre|code|kbd|script)(\s|>)/i.test(r[0])?n=!0:n&&/^<\/(pre|code|kbd|script)(\s|>)/i.test(r[0])&&(n=!1),{type:this.options.sanitize?"text":"html",raw:r[0],inLink:t,inRawBlock:n,text:this.options.sanitize?this.options.sanitizer?this.options.sanitizer(r[0]):I(r[0]):r[0]}},t.link=function(e){var t=this.rules.inline.link.exec(e);if(t){var n=t[2].trim();if(!this.options.pedantic&&/^$/.test(n))return;var r=P(n.slice(0,-1),"\\");if((n.length-r.length)%2==0)return}else{var i,o=L(t[2],"()");-1$/.test(n)?s.slice(1):s.slice(1,-1)),H(t,{href:s?s.replace(this.rules.inline._escapes,"$1"):s,title:l?l.replace(this.rules.inline._escapes,"$1"):l},t[0])}},t.reflink=function(e,t){var n;if((n=this.rules.inline.reflink.exec(e))||(n=this.rules.inline.nolink.exec(e))){var r=(n[2]||n[1]).replace(/\s+/g," ");if((r=t[r.toLowerCase()])&&r.href)return H(n,r,n[0]);var i=n[0].charAt(0);return{type:"text",raw:i,text:i}}},t.strong=function(e,t,n){void 0===n&&(n="");var r=this.rules.inline.strong.start.exec(e);if(r&&(!r[1]||r[1]&&(""===n||this.rules.inline.punctuation.exec(n)))){t=t.slice(-1*e.length);var i,o="**"===r[0]?this.rules.inline.strong.endAst:this.rules.inline.strong.endUnd;for(o.lastIndex=0;null!=(r=o.exec(t));)if(i=this.rules.inline.strong.middle.exec(t.slice(0,r.index+3)))return{type:"strong",raw:e.slice(0,i[0].length),text:e.slice(2,i[0].length-2)}}},t.em=function(e,t,n){void 0===n&&(n="");var r=this.rules.inline.em.start.exec(e);if(r&&(!r[1]||r[1]&&(""===n||this.rules.inline.punctuation.exec(n)))){t=t.slice(-1*e.length);var i,o="*"===r[0]?this.rules.inline.em.endAst:this.rules.inline.em.endUnd;for(o.lastIndex=0;null!=(r=o.exec(t));)if(i=this.rules.inline.em.middle.exec(t.slice(0,r.index+2)))return{type:"em",raw:e.slice(0,i[0].length),text:e.slice(1,i[0].length-1)}}},t.codespan=function(e){var t=this.rules.inline.code.exec(e);if(t){var n=t[2].replace(/\n/g," "),r=/[^ ]/.test(n),i=/^ /.test(n)&&/ $/.test(n);return r&&i&&(n=n.substring(1,n.length-1)),n=I(n,!0),{type:"codespan",raw:t[0],text:n}}},t.br=function(e){var t=this.rules.inline.br.exec(e);if(t)return{type:"br",raw:t[0]}},t.del=function(e){var t=this.rules.inline.del.exec(e);if(t)return{type:"del",raw:t[0],text:t[2]}},t.autolink=function(e,t){var n=this.rules.inline.autolink.exec(e);if(n){var r,i="@"===n[2]?"mailto:"+(r=I(this.options.mangle?t(n[1]):n[1])):r=I(n[1]);return{type:"link",raw:n[0],text:r,href:i,tokens:[{type:"text",raw:r,text:r}]}}},t.url=function(e,t){var n,r,i,o;if(n=this.rules.inline.url.exec(e)){if("@"===n[2])i="mailto:"+(r=I(this.options.mangle?t(n[0]):n[0]));else{for(;o=n[0],n[0]=this.rules.inline._backpedal.exec(n[0])[0],o!==n[0];);r=I(n[0]),i="www."===n[1]?"http://"+r:r}return{type:"link",raw:n[0],text:r,href:i,tokens:[{type:"text",raw:r,text:r}]}}},t.inlineText=function(e,t,n){var r=this.rules.inline.text.exec(e);if(r){var i=t?this.options.sanitize?this.options.sanitizer?this.options.sanitizer(r[0]):I(r[0]):r[0]:I(this.options.smartypants?n(r[0]):r[0]);return{type:"text",raw:r[0],text:i}}},e}(),R=z,E=_,q=A,F={newline:/^\n+/,code:/^( {4}[^\n]+\n*)+/,fences:/^ {0,3}(`{3,}(?=[^`\n]*\n)|~{3,})([^\n]*)\n(?:|([\s\S]*?)\n)(?: {0,3}\1[~`]* *(?:\n+|$)|$)/,hr:/^ {0,3}((?:- *){3,}|(?:_ *){3,}|(?:\* *){3,})(?:\n+|$)/,heading:/^ {0,3}(#{1,6})(?=\s|$)(.*)(?:\n+|$)/,blockquote:/^( {0,3}> ?(paragraph|[^\n]*)(?:\n|$))+/,list:/^( {0,3})(bull) [\s\S]+?(?:hr|def|\n{2,}(?! )(?! {0,3}bull )\n*|\s*$)/,html:"^ {0,3}(?:<(script|pre|style)[\\s>][\\s\\S]*?(?:[^\\n]*\\n+|$)|comment[^\\n]*(\\n+|$)|<\\?[\\s\\S]*?(?:\\?>\\n*|$)|\\n*|$)|\\n*|$)|)[\\s\\S]*?(?:\\n{2,}|$)|<(?!script|pre|style)([a-z][\\w-]*)(?:attribute)*? */?>(?=[ \\t]*(?:\\n|$))[\\s\\S]*?(?:\\n{2,}|$)|(?=[ \\t]*(?:\\n|$))[\\s\\S]*?(?:\\n{2,}|$))",def:/^ {0,3}\[(label)\]: *\n? *]+)>?(?:(?: +\n? *| *\n *)(title))? *(?:\n+|$)/,nptable:R,table:R,lheading:/^([^\n]+)\n {0,3}(=+|-+) *(?:\n+|$)/,_paragraph:/^([^\n]+(?:\n(?!hr|heading|lheading|blockquote|fences|list|html)[^\n]+)*)/,text:/^[^\n]+/,_label:/(?!\s*\])(?:\\[\[\]]|[^\[\]])+/,_title:/(?:"(?:\\"?|[^"\\])*"|'[^'\n]*(?:\n[^'\n]+)*\n?'|\([^()]*\))/};F.def=E(F.def).replace("label",F._label).replace("title",F._title).getRegex(),F.bullet=/(?:[*+-]|\d{1,9}[.)])/,F.item=/^( *)(bull) ?[^\n]*(?:\n(?! *bull ?)[^\n]*)*/,F.item=E(F.item,"gm").replace(/bull/g,F.bullet).getRegex(),F.listItemStart=E(/^( *)(bull)/).replace("bull",F.bullet).getRegex(),F.list=E(F.list).replace(/bull/g,F.bullet).replace("hr","\\n+(?=\\1?(?:(?:- *){3,}|(?:_ *){3,}|(?:\\* *){3,})(?:\\n+|$))").replace("def","\\n+(?="+F.def.source+")").getRegex(),F._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",F._comment=/|$)/,F.html=E(F.html,"i").replace("comment",F._comment).replace("tag",F._tag).replace("attribute",/ +[a-zA-Z:_][\w.:-]*(?: *= *"[^"\n]*"| *= *'[^'\n]*'| *= *[^\s"'=<>`]+)?/).getRegex(),F.paragraph=E(F._paragraph).replace("hr",F.hr).replace("heading"," {0,3}#{1,6} ").replace("|lheading","").replace("blockquote"," {0,3}>").replace("fences"," {0,3}(?:`{3,}(?=[^`\\n]*\\n)|~{3,})[^\\n]*\\n").replace("list"," {0,3}(?:[*+-]|1[.)]) ").replace("html",")|<(?:script|pre|style|!--)").replace("tag",F._tag).getRegex(),F.blockquote=E(F.blockquote).replace("paragraph",F.paragraph).getRegex(),F.normal=q({},F),F.gfm=q({},F.normal,{nptable:"^ *([^|\\n ].*\\|.*)\\n {0,3}([-:]+ *\\|[-| :]*)(?:\\n((?:(?!\\n|hr|heading|blockquote|code|fences|list|html).*(?:\\n|$))*)\\n*|$)",table:"^ *\\|(.+)\\n {0,3}\\|?( *[-:]+[-| :]*)(?:\\n *((?:(?!\\n|hr|heading|blockquote|code|fences|list|html).*(?:\\n|$))*)\\n*|$)"}),F.gfm.nptable=E(F.gfm.nptable).replace("hr",F.hr).replace("heading"," {0,3}#{1,6} ").replace("blockquote"," {0,3}>").replace("code"," {4}[^\\n]").replace("fences"," {0,3}(?:`{3,}(?=[^`\\n]*\\n)|~{3,})[^\\n]*\\n").replace("list"," {0,3}(?:[*+-]|1[.)]) ").replace("html",")|<(?:script|pre|style|!--)").replace("tag",F._tag).getRegex(),F.gfm.table=E(F.gfm.table).replace("hr",F.hr).replace("heading"," {0,3}#{1,6} ").replace("blockquote"," {0,3}>").replace("code"," {4}[^\\n]").replace("fences"," {0,3}(?:`{3,}(?=[^`\\n]*\\n)|~{3,})[^\\n]*\\n").replace("list"," {0,3}(?:[*+-]|1[.)]) ").replace("html",")|<(?:script|pre|style|!--)").replace("tag",F._tag).getRegex(),F.pedantic=q({},F.normal,{html:E("^ *(?:comment *(?:\\n|\\s*$)|<(tag)[\\s\\S]+? *(?:\\n{2,}|\\s*$)|\\s]*)*?/?> *(?:\\n{2,}|\\s*$))").replace("comment",F._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:/^ *\[([^\]]+)\]: *]+)>?(?: +(["(][^\n]+[")]))? *(?:\n+|$)/,heading:/^(#{1,6})(.*)(?:\n+|$)/,fences:R,paragraph:E(F.normal._paragraph).replace("hr",F.hr).replace("heading"," *#{1,6} *[^\n]").replace("lheading",F.lheading).replace("blockquote"," {0,3}>").replace("|fences","").replace("|list","").replace("|html","").getRegex()});var N={escape:/^\\([!"#$%&'()*+,\-./:;<=>?@\[\]\\^_`{|}~])/,autolink:/^<(scheme:[^\s\x00-\x1f<>]*|email)>/,url:R,tag:"^comment|^|^<[a-zA-Z][\\w-]*(?:attribute)*?\\s*/?>|^<\\?[\\s\\S]*?\\?>|^|^",link:/^!?\[(label)\]\(\s*(href)(?:\s+(title))?\s*\)/,reflink:/^!?\[(label)\]\[(?!\s*\])((?:\\[\[\]]?|[^\[\]\\])+)\]/,nolink:/^!?\[(?!\s*\])((?:\[[^\[\]]*\]|\\[\[\]]|[^\[\]])*)\](?:\[\])?/,reflinkSearch:"reflink|nolink(?!\\()",strong:{start:/^(?:(\*\*(?=[*punctuation]))|\*\*)(?![\s])|__/,middle:/^\*\*(?:(?:(?!overlapSkip)(?:[^*]|\\\*)|overlapSkip)|\*(?:(?!overlapSkip)(?:[^*]|\\\*)|overlapSkip)*?\*)+?\*\*$|^__(?![\s])((?:(?:(?!overlapSkip)(?:[^_]|\\_)|overlapSkip)|_(?:(?!overlapSkip)(?:[^_]|\\_)|overlapSkip)*?_)+?)__$/,endAst:/[^punctuation\s]\*\*(?!\*)|[punctuation]\*\*(?!\*)(?:(?=[punctuation_\s]|$))/,endUnd:/[^\s]__(?!_)(?:(?=[punctuation*\s])|$)/},em:{start:/^(?:(\*(?=[punctuation]))|\*)(?![*\s])|_/,middle:/^\*(?:(?:(?!overlapSkip)(?:[^*]|\\\*)|overlapSkip)|\*(?:(?!overlapSkip)(?:[^*]|\\\*)|overlapSkip)*?\*)+?\*$|^_(?![_\s])(?:(?:(?!overlapSkip)(?:[^_]|\\_)|overlapSkip)|_(?:(?!overlapSkip)(?:[^_]|\\_)|overlapSkip)*?_)+?_$/,endAst:/[^punctuation\s]\*(?!\*)|[punctuation]\*(?!\*)(?:(?=[punctuation_\s]|$))/,endUnd:/[^\s]_(?!_)(?:(?=[punctuation*\s])|$)/},code:/^(`+)([^`]|[^`][\s\S]*?[^`])\1(?!`)/,br:/^( {2,}|\\)\n(?!\s*$)/,del:R,text:/^(`+|[^`])(?:(?= {2,}\n)|[\s\S]*?(?:(?=[\\?@\\[\\]`^{|}~"};N.punctuation=E(N.punctuation).replace(/punctuation/g,N._punctuation).getRegex(),N._blockSkip="\\[[^\\]]*?\\]\\([^\\)]*?\\)|`[^`]*?`|<[^>]*?>",N._overlapSkip="__[^_]*?__|\\*\\*\\[^\\*\\]*?\\*\\*",N._comment=E(F._comment).replace("(?:--\x3e|$)","--\x3e").getRegex(),N.em.start=E(N.em.start).replace(/punctuation/g,N._punctuation).getRegex(),N.em.middle=E(N.em.middle).replace(/punctuation/g,N._punctuation).replace(/overlapSkip/g,N._overlapSkip).getRegex(),N.em.endAst=E(N.em.endAst,"g").replace(/punctuation/g,N._punctuation).getRegex(),N.em.endUnd=E(N.em.endUnd,"g").replace(/punctuation/g,N._punctuation).getRegex(),N.strong.start=E(N.strong.start).replace(/punctuation/g,N._punctuation).getRegex(),N.strong.middle=E(N.strong.middle).replace(/punctuation/g,N._punctuation).replace(/overlapSkip/g,N._overlapSkip).getRegex(),N.strong.endAst=E(N.strong.endAst,"g").replace(/punctuation/g,N._punctuation).getRegex(),N.strong.endUnd=E(N.strong.endUnd,"g").replace(/punctuation/g,N._punctuation).getRegex(),N.blockSkip=E(N._blockSkip,"g").getRegex(),N.overlapSkip=E(N._overlapSkip,"g").getRegex(),N._escapes=/\\([!"#$%&'()*+,\-./:;<=>?@\[\]\\^_`{|}~])/g,N._scheme=/[a-zA-Z][a-zA-Z0-9+.-]{1,31}/,N._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])?)+(?![-_])/,N.autolink=E(N.autolink).replace("scheme",N._scheme).replace("email",N._email).getRegex(),N._attribute=/\s+[a-zA-Z:_][\w.:-]*(?:\s*=\s*"[^"]*"|\s*=\s*'[^']*'|\s*=\s*[^\s"'=<>`]+)?/,N.tag=E(N.tag).replace("comment",N._comment).replace("attribute",N._attribute).getRegex(),N._label=/(?:\[(?:\\.|[^\[\]\\])*\]|\\.|`[^`]*`|[^\[\]\\`])*?/,N._href=/<(?:\\.|[^\n<>\\])+>|[^\s\x00-\x1f]*/,N._title=/"(?:\\"?|[^"\\])*"|'(?:\\'?|[^'\\])*'|\((?:\\\)?|[^)\\])*\)/,N.link=E(N.link).replace("label",N._label).replace("href",N._href).replace("title",N._title).getRegex(),N.reflink=E(N.reflink).replace("label",N._label).getRegex(),N.reflinkSearch=E(N.reflinkSearch,"g").replace("reflink",N.reflink).replace("nolink",N.nolink).getRegex(),N.normal=q({},N),N.pedantic=q({},N.normal,{strong:{start:/^__|\*\*/,middle:/^__(?=\S)([\s\S]*?\S)__(?!_)|^\*\*(?=\S)([\s\S]*?\S)\*\*(?!\*)/,endAst:/\*\*(?!\*)/g,endUnd:/__(?!_)/g},em:{start:/^_|\*/,middle:/^()\*(?=\S)([\s\S]*?\S)\*(?!\*)|^_(?=\S)([\s\S]*?\S)_(?!_)/,endAst:/\*(?!\*)/g,endUnd:/_(?!_)/g},link:E(/^!?\[(label)\]\((.*?)\)/).replace("label",N._label).getRegex(),reflink:E(/^!?\[(label)\]\s*\[([^\]]*)\]/).replace("label",N._label).getRegex()}),N.gfm=q({},N.normal,{escape:E(N.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~])\1(?=[^~]|$)/,text:/^([`~]+|[^`~])(?:(?= {2,}\n)|[\s\S]*?(?:(?=[\\'+(n?e:ee(e,!0))+"\n":"
      "+(n?e:ee(e,!0))+"
      \n"},t.blockquote=function(e){return"
      \n"+e+"
      \n"},t.html=function(e){return e},t.heading=function(e,t,n,r){return this.options.headerIds?"'+e+"\n":""+e+"\n"},t.hr=function(){return this.options.xhtml?"
      \n":"
      \n"},t.list=function(e,t,n){var r=t?"ol":"ul";return"<"+r+(t&&1!==n?' start="'+n+'"':"")+">\n"+e+"\n"},t.listitem=function(e){return"
    • "+e+"
    • \n"},t.checkbox=function(e){return" "},t.paragraph=function(e){return"

      "+e+"

      \n"},t.table=function(e,t){return"\n\n"+e+"\n"+(t=t&&""+t+"")+"
      \n"},t.tablerow=function(e){return"\n"+e+"\n"},t.tablecell=function(e,t){var n=t.header?"th":"td";return(t.align?"<"+n+' align="'+t.align+'">':"<"+n+">")+e+"\n"},t.strong=function(e){return""+e+""},t.em=function(e){return""+e+""},t.codespan=function(e){return""+e+""},t.br=function(){return this.options.xhtml?"
      ":"
      "},t.del=function(e){return""+e+""},t.link=function(e,t,n){if(null===(e=Q(this.options.sanitize,this.options.baseUrl,e)))return n;var r='"},t.image=function(e,t,n){if(null===(e=Q(this.options.sanitize,this.options.baseUrl,e)))return n;var r=''+n+'":">"},t.text=function(e){return e},e}(),ne=function(){function e(){}var t=e.prototype;return t.strong=function(e){return e},t.em=function(e){return e},t.codespan=function(e){return e},t.del=function(e){return e},t.html=function(e){return e},t.text=function(e){return e},t.link=function(e,t,n){return""+n},t.image=function(e,t,n){return""+n},t.br=function(){return""},e}(),re=function(){function e(){this.seen={}}var t=e.prototype;return t.serialize=function(e){return e.toLowerCase().trim().replace(/<[!\/a-z].*?>/gi,"").replace(/[\u2000-\u206F\u2E00-\u2E7F\\'!"#$%&()*+,./:;<=>?@[\]^`{|}~]/g,"").replace(/\s/g,"-")},t.getNextSafeSlug=function(e,t){var n=e,r=0;if(this.seen.hasOwnProperty(n))for(r=this.seen[e];n=e+"-"+ ++r,this.seen.hasOwnProperty(n););return t||(this.seen[e]=r,this.seen[n]=0),n},t.slug=function(e,t){void 0===t&&(t={});var n=this.serialize(e);return this.getNextSafeSlug(n,t.dryrun)},e}(),ie=t.defaults,oe=S,ae=function(){function n(e){this.options=e||ie,this.options.renderer=this.options.renderer||new te,this.renderer=this.options.renderer,this.renderer.options=this.options,this.textRenderer=new ne,this.slugger=new re}n.parse=function(e,t){return new n(t).parse(e)},n.parseInline=function(e,t){return new n(t).parseInline(e)};var e=n.prototype;return e.parse=function(e,t){void 0===t&&(t=!0);for(var n,r,i,o,a,s,l,c,u,f,d,p,h,g,m,v,b,w="",y=e.length,x=0;xAn error occurred:

      "+ce(e.message+"",!0)+"
      ";throw e}}return pe.options=pe.setOptions=function(e){return se(pe.defaults,e),fe(pe.defaults),pe},pe.getDefaults=ue,pe.defaults=de,pe.use=function(s){var t,n=se({},s);s.renderer&&function(){var a=pe.defaults.renderer||new te;for(var e in s.renderer)!function(i){var o=a[i];a[i]=function(){for(var e=arguments.length,t=new Array(e),n=0;nAn error occurred:

      "+ce(e.message+"",!0)+"
      ";throw e}},pe.Parser=ae,pe.parser=ae.parse,pe.Renderer=te,pe.TextRenderer=ne,pe.Lexer=J,pe.lexer=J.lex,pe.Tokenizer=B,pe.Slugger=re,pe.parse=pe},"object"===a(t)&&void 0!==e?e.exports=o():void 0===(i="function"==typeof(r=o)?r.call(t,n,t,e):r)||(e.exports=i)},function(e,t,n){function r(e){(m=e.slice(0)).length?o.show():h.alwaysVisible||o.hide()}function i(){var e=h.type,t=h.packageName,n="shell-zip"===e?"zip":"tar",r={action:"download",as:(t=t||(1===m.length?m[0].label:f.getItem().label))+"."+n,type:e,baseHref:f.getAbsHref(),hrefs:""};s(m,function(e,t){r["hrefs[".concat(t,"]")]=e.absHref}),c.formRequest(r)}var o,a=n(2),s=a.each,l=a.dom,c=n(9),u=n(13),f=n(21),d=n(14),p=n(15),h=Object.assign({enabled:!1,type:"php-tar",packageName:"package",alwaysVisible:!1},p.download),g='
      \n download\n
      '),m=[];h.enabled&&(o=l(g).hide().appTo("#toolbar").on("click",i),h.alwaysVisible&&o.show(),u.sub("selection",r))},function(e,t,n){function r(e){var t,n,r=0\n filter\n \n '),x=!1,k="";w.enabled&&(s=p(y).appTo("#toolbar"),l=s.find("input"),s.find("img").on("click",o),l.on("keyup",f(i,w.debounceTime)),h.sub("location.changed",a))},function(e,t,f){(function(e){var t,n,r,i,o,a=f(2).map,s=f(13),l=f(15),c=e.window,u=Object.assign({enabled:!1,id:"UA-000000-0"},l["google-analytics-ua"]);u.enabled&&(t=window,n=document,r="ga",t.GoogleAnalyticsObject=r,t.ga=t.ga||function(){(t.ga.q=t.ga.q||[]).push(arguments)},t.ga.l=+new Date,i=n.createElement("script"),o=n.getElementsByTagName("script")[0],i.async=1,i.src="//www.google-analytics.com/analytics.js",o.parentNode.insertBefore(i,o),c.ga("create",u.id,"auto"),s.sub("location.changed",function(e){var t=c.location;c.ga("send","pageview",{location:t.protocol+"//"+t.host+e.absHref,title:a(e.getCrumb(),function(e){return e.label}).join(" > ")})}))}).call(this,f(5))},function(e,t,T){(function(o){function t(){_.get(A)?(w("#view-info").addCls("active"),w("#info").show()):(w("#view-info").rmCls("active"),w("#info").hide())}function n(e){var t,n,r=e.thumbRational||e.icon,i=!!e.thumbRational;!e.isCurrentFolder()&&r||(r=k.icon("folder")),a.attr("src",r),i?a.addCls("thumb"):a.rmCls("thumb"),s.text(e.label),b(e.time)?l.text(x.formatDate(e.time)):l.text("."),b(e.size)?(c.text(x.formatSize(e.size)),c.show()):c.hide(),e.isContentFetched?(t=e.getStats(),f.text(t.folders),d.text(t.files),u.show()):u.hide(),C.qrcode&&(n=o.window.location,p.clr().app(m({render:"image",size:200,fill:C.qrFill,back:C.qrBack,text:n.protocol+"//"+n.host+e.absHref,crisp:!0,quiet:1})))}function e(e){n(e)}function r(){n(h)}function i(e){n(h=e)}var a,s,l,c,u,f,d,p,h,g,m=T(34),v=T(2),b=v.isNum,w=v.dom,y=T(13),x=T(20),k=T(14),S=T(15),_=T(17),C=Object.assign({enabled:!1,show:!1,qrcode:!0,qrColor:"#999"},S.info),z='
      \n

      Info

      \n
      \n view-info\n
      \n
      '),A="ext/info";C.enabled&&(g=w('
      \n
      \n
      \n
      \n
      \n
      \n
      \n ,\n \n
      \n
      \n
      \n
      ').hide().appTo("#mainrow"),a=g.find(".icon img"),s=g.find(".label"),l=g.find(".time"),c=g.find(".size"),u=g.find(".content"),f=g.find(".folders"),d=g.find(".files"),p=g.find(".qrcode"),C.qrcode||p.rm(),w(z).appTo("#sidebar").find("#view-info").on("click",function(e){_.put(A,!_.get(A)),t(),y.pub("resize"),e.preventDefault()}),"boolean"!=typeof _.get(A)&&_.put(A,C.show),t(),y.sub("location.changed",i),y.sub("item.mouseenter",e),y.sub("item.mouseleave",r))}).call(this,T(5))},function(e,o,t){(function(e){var t,n,r,i;function $(e){return($="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})(e)}i=function(){return r={},i.m=n=[function(e,t,n){function r(e){var t=Object.assign({},i,e),n=o(t.text,t.ecLevel,t.minVersion,t.quiet);return"svg"===t.render?s(n,t):a(n,t,"image"===t.render)}var i=n(1),o=n(2),a=n(4),s=n(8);e.exports=r;try{jQuery.fn.kjua=function(n){return this.each(function(e,t){return t.appendChild(r(n))})}}catch(e){}},function(e,t){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(e,t,n){function s(e){return(s="function"==typeof Symbol&&"symbol"==$(Symbol.iterator)?function(e){return $(e)}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":$(e)})(e)}var l=/code length overflow/i,c=n(3);c.stringToBytes=c.stringToBytesFuncs["UTF-8"],e.exports=function(e,t,n,r){var i,o=3>n&1);u[Math.floor(n/3)][n%3+f-8-3]=r}for(n=0;n<18;n+=1)r=!e&&1==(t>>n&1),u[n%3+f-8-3][Math.floor(n/3)]=r},h=function(e,t){for(var n=l<<3|t,r=w.getBCHTypeInfo(n),i=0;i<15;i+=1){var o=!e&&1==(r>>i&1);i<6?u[i][8]=o:i<8?u[i+1][8]=o:u[f-15+i][8]=o}for(i=0;i<15;i+=1)o=!e&&1==(r>>i&1),i<8?u[8][f-i-1]=o:i<9?u[8][15-i-1+1]=o:u[8][15-i-1]=o;u[f-8][8]=!e},g=function(e,t){for(var n=-1,r=f-1,i=7,o=0,a=w.getMaskFunction(t),s=f-1;0>>i&1)),a(r,s-c)&&(l=!l),u[r][s-c]=l,-1==--i&&(o+=1,i=7));if((r+=n)<0||f<=r){r-=n,n=-n;break}}},m=function(e,t,n){for(var r=x.getRSBlocks(e,t),i=k(),o=0;o8*s)throw"code length overflow. ("+i.getLengthInBits()+">"+8*s+")";for(i.getLengthInBits()+4<=8*s&&i.put(0,4);i.getLengthInBits()%8!=0;)i.putBit(!1);for(;!(i.getLengthInBits()>=8*s||(i.put(236,8),i.getLengthInBits()>=8*s));)i.put(17,8);return function(e,t){for(var n=0,r=0,i=0,o=new Array(t.length),a=new Array(t.length),s=0;s',n+="";for(var r=0;r";for(var i=0;i';n+=""}return(n+="")+""},p.createSvgTag=function(e,t,n,r){var i={};"object"==$(arguments[0])&&(e=(i=arguments[0]).cellSize,t=i.margin,n=i.alt,r=i.title),e=e||2,t=void 0===t?4*e:t,(n="string"==typeof n?{text:n}:n||{}).text=n.text||null,n.id=n.text?n.id||"qrcode-description":null,(r="string"==typeof r?{text:r}:r||{}).text=r.text||null,r.id=r.text?r.id||"qrcode-title":null;var o,a,s,l=p.getModuleCount()*e+2*t,c="",u="l"+e+",0 0,"+e+" -"+e+",0 0,-"+e+"z ";for(c+=''+v(r.text)+"":"",c+=n.text?''+v(n.text)+"":"",c+='',c+='"},p.createDataURL=function(i,e){i=i||2,e=void 0===e?4*i:e;var t=p.getModuleCount()*i+2*e,o=e,a=t-e;return T(t,t,function(e,t){if(o<=e&&e"};var v=function(e){for(var t="",n=0;n":t+=">";break;case"&":t+="&";break;case'"':t+=""";break;default:t+=r}}return t};return p.createASCII=function(e,t){if((e=e||1)<2)return function(e){e=void 0===e?2:e;for(var t,n,r,i,o=+p.getModuleCount()+2*e,a=e,s=o-e,l={"██":"█","█ ":"▀"," █":"▄"," ":" "},c={"██":"▀","█ ":"▀"," █":" "," ":" "},u="",f=0;f>>8),t.push(255&r)):t.push(a)}return t}};var t,e,b={L:1,M:0,Q:3,H:2},w=(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]],(e={}).getBCHTypeInfo=function(e){for(var t=e<<10;0<=n(t)-n(1335);)t^=1335<>>=1;return t}var a=function(){for(var t=new Array(256),n=new Array(256),e=0;e<8;e+=1)t[e]=1<>>8)},writeBytes:function(e,t,n){t=t||0,n=n||e.length;for(var r=0;r>>7-e%8&1)},put:function(e,t){for(var n=0;n>>t-n-1&1))},getLengthInBits:function(){return r},putBit:function(e){var t=Math.floor(r/8);n.length<=t&&n.push(0),e&&(n[t]|=128>>>r%8),r+=1}};return i},S=function(e){var r=e,t={getMode:function(){return 1},getLength:function(){return r.length},write:function(e){for(var t=r,n=0;n+2>>8&255)+(255&r),e.put(r,13),n+=2}if(n=n.length){if(0==o)return-1;throw"unexpected end of file./"+o}var e=n.charAt(r);if(r+=1,"="==e)return o=0,-1;e.match(/^\s$/)||(i=i<<6|a(e.charCodeAt(0)),o+=6)}var t=i>>>o-8&255;return o-=8,t}},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"c:"+e};return t},T=function(e,t,n){for(var r,i,o,a,h,s,l,g,c=(o=r=e,a=i=t,h=new Array(r*i),s={setPixel:function(e,t,n){h[t*o+e]=n},write:function(e){e.writeString("GIF87a"),e.writeShort(o),e.writeShort(a),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(o),e.writeShort(a),e.writeByte(0);var t=l(2);e.writeByte(2);for(var n=0;255>>t!=0)throw"length over";for(;8<=s+t;)a.writeByte(255&(e<>>=8-s,s=l=0;l|=e<>>m-6),m-=6},w.flush=function(){if(0>6,128|63&r):r<55296||57344<=r?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},void 0===(i="function"==typeof(r=function(){return o})?r.apply(t,[]):r)||(e.exports=i)},function(e,t,n){function f(e,t,n,r,i,o){e.is_dark(i,o)&&t.rect(o*r,i*r,r,r)}var d=n(5),p=n(6),h=n(7);e.exports=function(e,t,n){var r,i,o,a,s,l=t.ratio||d.dpr,c=d.create_canvas(t.size,l),u=c.getContext("2d");return u.scale(l,l),r=e,s=i=u,(a=o=t).back&&(s.fillStyle=a.back,s.fillRect(0,0,a.size,a.size)),function(e,t,n){if(e){var r=0\n

      Language

      \n
      \n